目标检测系列(一):R-CNN
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了目标检测系列(一):R-CNN相关的知识,希望对你有一定的参考价值。
参考技术A 目标检测(object detection)是计算机视觉中非常重要的一个领域。在卷积神经网络出现之前,都利用一些传统方法手动提取图像特征进行目标检测及定位,这些方法不仅耗时而且性能较低。而在卷积神经网络出现之后,目标检测领域发生了翻天覆地的变化。最著名的目标检测系统有RCNN系列、YOLO和SSD,本文将介绍RCNN系列的开篇作RCNN。RCNN系列的技术演进过程可参见 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN 。
目标检测分为两步:第一步是对图像进行分类,即图像中的内容是什么;第二步则是对图像进行定位,找出图像中物体的具体位置。简单来说就是图像里面有什么,位置在哪。
然而,由于不同图片中物体出现的大小可能不同(多尺度),位置也可能不同,而且摆放角度,姿态等都可以不同,同时一张图片中还可以出现多个类别。这使得目标检测任务异常艰难。
上面任务用专业的说法就是:图像识别+定位
两个不同的分支分别完成不同的功能,分类和定位。回归(regression)分支与分类分支(classification)共享网络卷积部分的参数值。
还是刚才的分类识别+回归定位思路。只是现在我们提前先取好不同位置的框,然后将这个框输入到网络中而不是像思路一将原始图像直接输入到网络中。然后计算出这个框的得分,取得分最高的框。
如上,对于同一个图像中猫的识别定位。分别取了四个角四个框进行分类和回归。其得分分别为0.5,0.75,0.6,0.8,因此右下角得分最高,选择右下角的黑框作为目标位置的预测(这里即完成了定位任务)。
这里还有一个问题——检测位置时的框要怎么取,取多大?在上面我们是在257x257的图像中取了221x221的4个角。以不同大小的窗口从左上角到右下角依次扫描的话,数据量会非常大。而且,如果考虑多尺度问题的话,还需要在将图像放缩到不同水平的大小来进行计算,这样又大大增加了计算量。如何取框这个问题可以说是目标检测的核心问题之一了,RCNN,fast RCNN以及faster RCNN对于这个问题的解决办法不断地进行优化,这个到了后面再讲。
总结一下思路:
对于一张图片,用各种大小的框将图片截取出来,输入到CNN,然后CNN会输出这个框的类别以及其位置得分。
对于检测框的选取,一般是采用某种方法先找出可能含有物体的框(也就是候选框,比如1000个候选框),这些框是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。
讲完了思路,我们下面具体仔细来看看RCNN系列的实现,本篇先介绍RCNN的方法。
R-CNN相比于之前的各种目标检测算法,不仅在准确率上有了很大的提升,在运行效率上同样提升很大。R-CNN的过程分为4个阶段:
在前面我们已经简单介绍了selective search方法,通过这个方法我们筛选出了2k左右的候选框。然而搜索出的矩形框大小是不同的。而在AlexNet中由于最后全连接层的存在,对于图像尺寸有固定的要求,因此在将候选框输入之前,作者对这些候选框的大小进行了统一处理——放缩到了统一大小。文章中作者使用的处理方法有两种:
(1)各向异性缩放
因为图片扭曲可能会对后续CNN模型训练产生影响,于是作者也测试了各向同性缩放的方法。有两种方法:
此外,作者对于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,则将其标注为物体类别(正样本),否则我们就把他当做背景类别(负样本)。
作者针对每一个类别都训练了一个二分类的SVM。这里定义正负样本的方法与上面卷积网络训练的定义方法又不相同。作者在文章中尝试了多种IoU阈值(0.1~0.5)。最后通过训练发现,IoU阈值为0.3的时候效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点)。即当IoU小于0.3的时候我们将其视为负样本,否则为正样本。
目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
在实现边界回归的过程中发现了两个微妙的问题。第一是正则化是重要的:我们基于验证集,设置λ=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)。
参考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-将CNN引入目标检测的开山之作-晓雷的文章
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 论文翻译
以上是关于目标检测系列(一):R-CNN的主要内容,如果未能解决你的问题,请参考以下文章
深度学习和目标检测系列教程 7-300:先进的目标检测Faster R-CNN架构