目标检测(object detection)是计算机视觉中非常重要的一个领域。在卷积神经网络出现之前,都利用一些传统方法手动提取图像特征进行目标检测及定位,这些方法不仅耗时而且性能较低。而在卷积神经网络出现之后,目标检测领域发生了翻天覆地的变化。最著名的目标检测系统有RCNN系列、YOLO和SSD,本文将介绍RCNN系列的开篇作RCNN。
RCNN系列的技术演进过程可参见基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN。
前言
目标检测分为两步:第一步是对图像进行分类,即图像中的内容是什么;第二步则是对图像进行定位,找出图像中物体的具体位置。简单来说就是图像里面有什么,位置在哪。
然而,由于不同图片中物体出现的大小可能不同(多尺度),位置也可能不同,而且摆放角度,姿态等都可以不同,同时一张图片中还可以出现多个类别。这使得目标检测任务异常艰难。
从图像识别说起
现在有一个图像任务:对于下面的最左面的图片,既要把其中的猫识别出来,还要用方框框出其位置。上面任务用专业的说法就是:图像识别+定位
而定位(localization)则需要找出猫早图片中的位置,给出一个精确的位置框。
卷积神经网络帮我们解决了图像识别(分类)的任务了,现在,我们只需要添加一些额外的功能来完成定位任务即可。
目标定位
思路一:看做回归问题
看做回归问题,我们需要预测出(x, y, w, h)四个参数的值,从而得出方框的位置。步骤1:先解决简单问题,搭建一个识别图像的神经网络,譬如AlexNet、VGG等。
步骤2:在上述神经网络的尾部展开(也就是说CNN前面卷积部分不变,对后面的全连接层进行改变),添加两个分支:分类分支(classification)和回归分支(regression)。其中分类分支用来对图像中的物体进行分类(分类softmax loss),而回归分支则是用来计算bounding box的位置(使用欧氏距离来计算loss)。
两个不同的分支分别完成不同的功能,分类和定位。回归(regression)分支与分类分支(classification)共享网络卷积部分的参数值。
思路二:取图像窗口
还是刚才的分类识别+回归定位思路。只是现在我们提前先取好不同位置的框,然后将这个框输入到网络中而不是像思路一将原始图像直接输入到网络中。然后计算出这个框的得分,取得分最高的框。
如上,对于同一个图像中猫的识别定位。分别取了四个角四个框进行分类和回归。其得分分别为0.5,0.75,0.6,0.8,因此右下角得分最高,选择右下角的黑框作为目标位置的预测(这里即完成了定位任务)。
这里还有一个问题——检测位置时的框要怎么取,取多大?在上面我们是在257x257的图像中取了221x221的4个角。以不同大小的窗口从左上角到右下角依次扫描的话,数据量会非常大。而且,如果考虑多尺度问题的话,还需要在将图像放缩到不同水平的大小来进行计算,这样又大大增加了计算量。如何取框这个问题可以说是目标检测的核心问题之一了,RCNN,fast RCNN以及faster RCNN对于这个问题的解决办法不断地进行优化,这个到了后面再讲。
总结一下思路:
对于一张图片,用各种大小的框将图片截取出来,输入到CNN,然后CNN会输出这个框的类别以及其位置得分。
对于检测框的选取,一般是采用某种方法先找出可能含有物体的框(也就是候选框,比如1000个候选框),这些框是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。
选定候选框的方法很多,比如EdgeBoxes和Selective Search(RCNN使用的方法)。以下是各种选定框的方法的性能对比。讲完了思路,我们下面具体仔细来看看RCNN系列的实现,本篇先介绍RCNN的方法。
R-CNN:Region proposals + CNN
R-CNN相比于之前的各种目标检测算法,不仅在准确率上有了很大的提升,在运行效率上同样提升很大。R-CNN的过程分为4个阶段:
- 1、候选区域提出阶段(Proposal):采用selective-search方法,从一幅图像生成1k~2k个候选区域;
- 2、特征提取:使用CNN网络对每个候选框提取特征;
- 3、类别判断:将候选框特征送入SVM分类器,判断是图像类别;
-
4、位置精修:使用回归器精修候选框位置。
Selective Search:
这个方法主要有三个优势: 捕捉不同尺度(Capture All Scales)、多样化(Diversification)、快速计算(Fast to Compute)总结为:选择性搜索是用于目标检测的区域提议算法,它计算速度快,具有很高的召回率,基于颜色,纹理,大小和形状兼容计算相似区域的分层分组。
- 1、使用一种过分割手段,将图像分割成小区域(1k-2k个);
- 2、查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置;
- 3、输出所有最后存在的区域,即候选区域;
其中合并规则如下:
- 颜色(颜色直方图)相近的 ;
- 纹理(梯度直方图)相近的;
- 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域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)
- 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。
更详细的课参见目标检测(1)-Selective Search。
候选框搜索
在前面我们已经简单介绍了selective search方法,通过这个方法我们筛选出了2k左右的候选框。然而搜索出的矩形框大小是不同的。而在AlexNet中由于最后全连接层的存在,对于图像尺寸有固定的要求,因此在将候选框输入之前,作者对这些候选框的大小进行了统一处理——放缩到了统一大小。文章中作者使用的处理方法有两种:
(1)各向异性缩放
(2)各向同性缩放
因为图片扭曲可能会对后续CNN模型训练产生影响,于是作者也测试了各向同性缩放的方法。有两种方法:
- 1、先扩充后裁剪:即在取出bounding box之前,先在原图上把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那就把剩余部分用bounding box中的颜色均值填充,如上图(B)所示;
- 2、先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景色填充成正方形图片(背景色也是采用bounding box的像素颜色均值),如上图(c)所示。
此外,作者对于bounding box还尝试了padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
卷积神经网络训练
卷积神经网络训练分为两步:(1)预训练;(2)fine-tune。
先在一个大的数据集上面训练模型(R-CNN中的卷机模型使用的是AlexNet),然后利用这个训练好的模型进行fine-tune(或称为迁移学习),即使用这个预训练好的模型参数初始化模型参数,然后在目标数据集上面进行训练。
此外,在训练时,作者还尝试采用不同层数的全连接层,发现一个全连接层比两个全连接层效果要好,这可能是因为使用两个全连接层后过拟合导致的。
另一个比较有意思的地方是:对于CNN模型,卷积层学到的特征其实就是基础的共享特征提取层,类似于传统的图像特征提取算法。而最后的全连接层学到的则是针对特定任务的特征。譬如对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
最后,利用训练好的模型对候选框提取特征。
关于正负样本的问题:由于选取的bounding box不可能与人工label的完全相同,因此在CNN训练阶段需要设置IOU阈值来为bounding box打标签。在文章中作者将阈值设置为0.5,即如果候选框bounding box与人工label的区域重叠面积大于0.5,则将其标注为物体类别(正样本),否则我们就把他当做背景类别(负样本)。
IoU
IoU是图像分割中的一个重要概念,用来计算两个区域的重叠度,通过下图可以简单理解:
IoU就是上图中矩形框A、B的重叠面积占A、B并集的面积比例。
SVM训练
作者针对每一个类别都训练了一个二分类的SVM。这里定义正负样本的方法与上面卷积网络训练的定义方法又不相同。作者在文章中尝试了多种IoU阈值(0.1~0.5)。最后通过训练发现,IoU阈值为0.3的时候效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点)。即当IoU小于0.3的时候我们将其视为负样本,否则为正样本。
其实在这里还有两个重要的问题:
第一个:为什么在微调CNN和训练目标检测SVM时定义的正负样本不同?
首先简要回顾下正负样本的定义,对于微调,我们将每个目标提案映射到它具有最大IoU重叠(如果有的话)的检测框真值上,如果其IoU至少为0.5,并将其标记为对应类别的正样本。剩下的提案都标记为“背景”(即所有类的负样本)。对于训练SVM,相比之下,我们只采用检测框真值作为各自类别的正样本。与某一类别所有的正样本的IoU都小于0.3的目标提案将被标记为该类别的负样本。其它(IoU超过0.3,但不是检测框真值)的提案被忽略。
从发展历史来讲,SVM训练的所使用的特征最初是来自在ImageNet上面预训练的CNN模型,此时还没有考虑到fine-tune。在这种情况下,发现在评估的一组设置中,当前使用的SVM的设置是最佳的(包括现在使用了fine-tune后的模型系统)。当开始使用fine-tune时,(CNN模型)最初使用的也是与SVM相同的正负样本定义。然而,发现结果比当前定义的正负样本获得的结果差得多。
作者的假设是,如何定义正负样本对训练结果影响不大,结果的差异主要是由于fine-tune的数据不足造成的。因此在当前的方案中引入了许多“抖动”的样本,(这些预选框与ground truth的重叠在0.5和1之间,但并不是预选框ground truth),这将正样本的数量增加了大约30倍。我们推测,需要使用如此大量的样本以避免在微调网络时的过拟合。然而,我们还注意到,使用这些抖动的例子可能不是最佳的,因为网络没有被微调以进行精确的定位。这导致了第二个问题:为什么微调之后,训练SVM呢?简单地将最后一层微调网络(Softmax回归分类器)作为对象检测器将变得更加简洁。我们尝试了这一点,发现VOC 2007的表现从54.2%下降到了50.9%的mAP。这种性能下降可能来自几个因素的组合,包括微调中使用的正样本的定义不强调精确定位,并且softmax分类器是在随机抽样的负样本上训练的,而不是用于训练SVM的“更严格的负样本”子集。
这个结果表明,微调之后可以获得接近SVM水平的性能,而无需训练SVM。我们推测,通过一些额外的调整来微调以达到更接近的水平。如果是这样,这样可以简化和加速R-CNN训练,而不会在检测性能方面有任何损失。
预选框使用回归器精修
目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
作者使用一个简单的检测框回归来提高定位性能。在使用类特定检测SVM对每个选择性搜索提案进行评分之后,使用类别特定的边界回归器预测新的检测框。在实现边界回归的过程中发现了两个微妙的问题。第一是正则化是重要的:我们基于验证集,设置λ=1000。第二个问题是,选择使用哪些训练对(P,G)时必须小心。直观地说,如果P远离所有的检测框真值,那么将P转换为检测框真值G的任务就没有意义。使用像P这样的例子会导致一个无望的学习问题。因此,只有当提案P至少在一个检测框真值附近时,我们才执行学习任务。“附近”即,将P分配给具有最大IoU的检测框真值G(在重叠多于一个的情况下),并且仅当重叠大于阈值(基于验证集,我们使用的阈值为0.6)。所有未分配的提案都被丢弃。我们为每个目标类别执行一次,以便学习一组特定于类别的检测框回归器。
在测试时,我们对每个提案进行评分,并预测其新的检测框一次。原则上,我们可以迭代这个过程(即重新评估新预测的检测框,然后从它预测一个新的检测框,等等)。但是,我们发现迭代不会改进结果。
测试阶段
使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。
非极大值抑制(NMS):
RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
参考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-将CNN引入目标检测的开山之作-晓雷的文章
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 论文翻译