一般物体检测--Binarized Normed Gradients for Objectness Estimation at 300fps

转自:一般物体检测--Binarized Normed Gradients for Objectness Estimation at 300fps - 姜文晖的博客 - 博客频道 - CSDN.NET


       前一段时间很多人在网上传程明明在CVPR14年上即将发表的Objectness文章,Project Page在这里,和这里。最近,正好想用一般物体检测做点事情,上周也在实验室做了一个这个方面的报告,今天用文字总结一下。 网上已经有一些评论和分享讨论作者分享的代码如何在不同机器和vs版本上进行配置的帖子了,大家可以看这里和这里。

       所谓一般物体(class-independent object, Generic objects),或者Objectness,顾名思义,就是与类别无关的一切物体。对于行人检测这样的经典问题,我们的目标是在图像中判断哪些位置出现了人------人就是一种物体。在更难的问题中,比如VOC和ImageNet的竞赛中,问题变得更难了-----不仅需要参赛者标注出图片中出现了哪些物体,而且得标出物体出现在哪些位置。顺便插一句,还有更难的问题------训练样本中只给出图片,并告诉你图片中出现了哪些东西(这里的东西不仅仅是指物体啦,还可以是蓝天白云),但是不告诉你这些东西出现在哪,要求大家在测试图像中不仅给出测试图像的label,而且标注出这些东西出现在哪。这个问题在南京大学周志华教授的一系列多示例多标签学习的问题中得到研究,大家有兴趣可以去看看。

      当然言归正传,我们现在要讨论的问题属于前两类,就是要检测的东西都是物体。以行人检测为例,传统的方法就是sliding windows,但是对于一幅NXN的图像来说,可能的sub-windows有N^4的数量级之多。这样对于一个实时的行人检测系统来说,我们只好选择弱特征(为快速计算,如HOG),以及弱的分类器(也是为了计算快速,如SVM)。如果我们能够利用人是“物体”这种先验知识,快速地从N^4个候选的sub-windows中过滤掉绝大部分,而选择出10^3数量级的可能是物体的sub-windows,那就太好了,我们就能用一些稍微复杂的特征和分类器用在这10^3个候选windows上过滤就可以了。对于这种要求实时的系统来说,这第一步,就是找出10^3数量级的sub-windows,一定要快速才行。(当然对于某些只是要离线过程中处理的情况下,这一步要求可以稍微降低一些。哪些场合是离线处理的,以后时机成熟了我会再说。)以往的selective search的方法,速度上也需要1-2秒。而Cheng的这项工作使速度能达到300fps。

        “物体”的最大特点就是有Well-defined closed boundary,而背景则是杂乱无章的。而文章中最主要的发现则是,在梯度空间图(normed gradient space)上,无论物体是长的还是宽的,只要归一化到一个相同的尺度上(例如8*8),它们的就变得十分有共性了,这时用SVM分类器就能把物体和非物体区分出来。所以作者采用的特征就是简单的像素梯度的幅值(norm of gradient),并且只选择36种不同的size(比如8*8,16*16,32*64等),而分类器则是采用cascaded SVM。级联的SVM中第一级SVM对所有的候选窗口进行粗过滤,第二级SVM,则是对每一个size的窗口分别设计(也就是设计了36个不同的SVM),这也比较合理,因为不同的size会是物体的概率是不一样的,正方形的窗口就更可能是物体,而8*256这种长条形的窗口就不太可能是。训练样本是直接用VOC的training set的ground truth,而负样本是每个training set image中随机采100个。如果这36种size中,某个size的正样本数少于50个,这个size就直接被忽略。为了获取不同size的候选框,作者采样首先对原始图像进行不同尺度的resize,然后用训练好的SVM在resize后的每个8*8的模板上进行卷积,达到效果。(以200*200的图像为例,如要检测每个32*32的窗口大小是否会是物体,一般的做法就是先算整个图的梯度,然后隔点取32*32大小的框,再把框中的子图归一化到8*8的大小,最后送到cascaded SVM当中看得分。而作者的做法则是先把图像resize到50*50,然后计算梯度,然后再逐点取8*8大小的框,送到cascaded SVM当中看得分。这两步骤效果是差不多的,只是计算梯度的尺度不一样,但是后者只用做一次resize)。

     本来说到这里,大家就以为要做完了,但是作者最重要的部分就是做速度上的优化。这是通过二值表示的优化完成的。SVM的分类器无非是y=w·x,这里w和x都是64维的向量。作者首先将w用一组基来表示(这组基一共Nw个,Nw应小于64,作者在程序中取了2。这个Nw是很重要的,直接减少计算量。感谢Yi Jun师兄在组会上的提醒),这组基中每个向量的64维都只由0和1来表达。至于x,normed gradient中每个像素的梯度是0-255的值,在计算机中是用一个byte来表示的,作者做了“二值化”,仅由这个byte的头Ng位来代替(这样产生Ng个二值化的图)。我们假设Ng=1,就是最典型的二值化操作。这样做,y=w·x的大部分计算都是位运算,只有Nw次浮点/整型的乘法和Nw·Ng次浮点/整型加法。还有一个优点就是遍历图像中每一个8*8的框的时候,也可以用位操作做滑动,而不用每次都遍历64个值。我讲的比较粗糙,具体点的大家可以看下面两个截图:

一般物体检测--Binarized Normed Gradients for Objectness Estimation at 300fps_第1张图片

一般物体检测--Binarized Normed Gradients for Objectness Estimation at 300fps_第2张图片

       这里面优化的部分应该是最重要的,motivation倒不是很难(鄙人无眼光的看法,诸位莫喷)。model本身也许大家会疑问为什么是8*8之类的参数,我更觉得这些参数有些是为了优化而故意这么设计的。年初老万和我说Objectness代替sliding windows会是大趋势了,当时我还很迷糊,不确定一般物体检测会有多靠谱,现在等我反应过来的时候,这个方向很快就已经做到又快又准了。哎,我还是一个没眼光看长远的人。

       还要提一下,作者的准确的度量是用了VOC的检测的准则:intersection/union超过50%就算是框对了。其实这个条件还算比较宽松的-----对VOC的检测问题来说,这个指标达到50%确实可以检测的准确性是八九不离十的了,但是objectness只是用于检测的第一步,只有50%的intersection/union实在是就有点说不过去了(大家看看效果便知),这多少对后面的recognition有点影响。所以,别看这96.2%的准确性就觉得这个方向没啥做的了,其实光从准确性的方面来说,就还有蛮大的上升空间的,更别提如何把候选的regions降低到1000以下了(我好像又和上一段话自相矛盾了,哈哈)。



你可能感兴趣的:(bing,物体检测)