对于玩过Opencv人脸检测的人来说,基本都会形成一个思维定势,那就是检测就是不同大小的滑动窗进行穷举,然后使用分类器判断哪个滑动窗是人脸。对于深度学习这样超大计算量的分类器来说,这样的方法肯定是让人觉得太过于笨重的。于是乎,有人灵光一闪,说我干嘛要穷举嘛,我用简单的方法,根据颜色,纹理之类的信息去把图片划分成不同区域,哪怕是精度不高也可以相对于穷举搜索大量减少计算量。就是这么简单的搜索剪枝思路,几乎成为了当前深度学习物体识别领域的基本原则之一了。
待解决问题:
(1)如何保证划分相对完全,有的object之间是纹理不一样,有的是颜色不一样,单一的判断标准肯定无法完全cover所有的候选区域,这样的话selective-search就没有了最基础的用处了。对应原始的穷举搜索,就是扫描这个过程,扫描就是保证能够划分完全。
(2)hierarchical(层次)关系,划分不能简单只是划分小区域,简单思考下就能发现,object肯定存在层次关系。轮胎是object,车子也是obeject,车子包含了轮胎。桌子是,桌子上的东西也是,桌子在图像上包含了桌子上的东西。所以Selective Search也应该要能够将各个层次的object的区域都给出来。对应原始的穷举搜索,就是不同大小的搜索框,只有不同大小的搜索框才能保证不同层次的object都被选择出来。
(3)速度,比起穷举搜索这样无脑的方法,selective search肯定在划分时有一定计算量的,如何保证计算量相对小,也是一个需要考虑的问题。
在目标检测时,为了定位到目标的具体位置,通常会把图像分成许多子块(sub-regions / patches),然后把子块作为输入,送到目标识别的模型中。分子块的最直接方法叫滑动窗口法(sliding window approach)。滑动窗口的方法就是按照子块的大小在整幅图像上穷举所有子图像块。这种方法产生的数据量想想都头大。和滑动窗口法相对的是另外一类基于区域(region proposal)的方法。
selective search
selective search是region proposal方法的一种。作者的实现思路是,首先通过简单的区域划分算法,将图片划分成很多小区域,再通过相似度和区域大小(小的区域先聚合,这样是防止大的区域不断的聚合小区域,导致层次关系不完全)不断的聚合相邻小区域,类似于聚类的思路。这样就能解决object层次问题。其次,作者为了保证能够划分的完全,对于相似度,作者提出了可以多样化的思路,不但使用多样的颜色空间(RGB,Lab,HSV等等),还有很多不同的相似度计算方法。最后,对于计算速度来说,只能说这个思路在相对穷举,大大减少了后期分类过程中的计算量,但是本身的计算量还是有很大的优化空间,后来很多人在这个思路上改进,得到了性能好的多的算法。下面是此种方法的流程:
分层分组算法
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
三、相似度计算
论文考虑了颜色、纹理、尺寸和空间交叠这4个参数。
1、颜色相似度(color similarity)
将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。 对直方图除以区域尺寸做归一化后使用下式计算相似度:
2、纹理相似度(texture similarity)
论文采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8*3*10=240(使用RGB色彩空间)。
其中,是直方图中第
个bin的值。
3、尺寸相似度(size similarity)
保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。
例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。
4、交叠相似度(shape compatibility measure)
3.5、最终的相似度
选择搜索物体识别
通过前面的区域合并,可以得到一些列物体的位置假设L。接下来的任务就是如何从中找出物体的真正位置并确定物体的类别。
(1)特征生成
系统在实现过程中,使用spatial pyramid divsion提取特征。
(2)迭代训练
首先选择包含真实结果(ground truth)的物体窗口作为正样本(positive examples),选择与正样本窗口重叠20%~50%的窗口作为负样本(negative examples)。在选择样本的过程中剔除彼此重叠70%的负样本,这样可以提供一个较好的初始化结果。在重复迭代过程中加入得分很高的负样本,这样是为了增加困难样本数。使用其进行模型训练,直到收敛(精度不在产生变化)。