小田学CV掉头发之路——目标检测算法之R-CNN
随着AlexNet的出现,各种各样的卷积神经网络出现,如VGG、GoogleNet、ResNet 等等。这些网络的出现让一些大佬开始尝试,将卷积神经网络在ImageNet上的目标识别能力泛化到目标检测中,但想要在目标检测中起到比较好的效果,那就需要考虑两个问题:
- 如何利用深度卷积神经网络去做目标定位
- 如何在一个小规模的数据集上训练出泛化能力比较好的网络模型
于是Ross Girshick借鉴HOG的思想,提出了可以利用候选区域与CNN结合做目标定位
R-CNN
github基于Caffe的源码
Region Proposals(候选区域提取):
Selective Search
工作原理
- 使用图像分割算法(http://cvcl.mit.edu/SUNSeminar/FelzenszwalbIJCV04.pdf)创建候选区域
- 使用贪心算法合并候选区域
- 计算所有相邻区域的相似度
- 将最相似的两个区域合并为一个区域
- 重复迭代第二步直到某个设定的停止条件
其他Region Proposals方法比较
R-CNN工作流程
R-CNN 系统分为 3 个阶段,反应到架构上由 3 个模块完成。
- 生产类别独立的候选区域,这些候选区域其中包含了 R-CNN 最终定位的结果。
- 神经网络去针对每个候选区域提取固定长度的特征向量。
- 一系列的 SVM 分类器。
R-CNN大致流程:
- 在图像中确定约1000-2000个候选框(使用选择性搜索)
- 每个候选框图像块缩放到CNN网络需要的大小,并输入到CNN网络中进行特征提取
- 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
- 对于属于某一特征的候选框,用回归器进一步调整其位置
这里以VOC数据集为例子
步骤一:下载一个分类模型(比如AlexNet)
步骤二:对该模型做fine-tuning
- 将分类数从1000改为21
- 去掉最后一个全连接层
步骤三:特征提取
- 提取图像的所有候选框(选择性搜索)
- 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别,每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative,比如下图,就是狗分类的SVM
步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。
特征抽取
- 采用在ImageNet上面训练好的模型,在自己的训练集上进行fine-tuning
- 使用Selective Search找出候选区域
- fine-tuning:在自己的训练数据集中fine-tune CNN,作为一个识别K+1种类别的分类问题,K为感兴趣的目标种类数,1位背景类别,Fine-tune使用比较小的learning-rate,在正样本上面oversample(selective search出来的候选区域大多为背景)
- fine-tune就是在别人已经训练好的模型上进行微调
- 去掉fine-tune后的CNN的最后一个分类层,将每个候选区域通过CNN,输出为一个特征向量
- R-CNN采用AlexNet抽取一个4096维的特征向量,但通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227*227 的尺寸。
- 有一个细节,在对 Region 进行变换的时候,首先对这些区域进行膨胀处理,在其 box 周围附加了 p 个像素,也就是人为添加了边框,在这里 p=16。
训练
分类器
- R-CNN 采取迁移学习,采用在ImageNet上面训练好的模型,在自己的训练集上进行fine-tune,这里在ImageNet模型上训练的是模型识别物体类型的能力,而不是预测bbox位置的能力。
- R-CNN 将候选区域与 GroundTrue 中的 box 标签相比较,使用特征向量为每一个类别训练一个二元SVM分类器。
- 使用Hard Negative Mining生成负样本。
- 正样本为候选区域和真实区域IoU大于等于0.3的区域,其它为负样本
- 训练策略是:采用 SGD 训练,初始学习率为 0.001,mini-batch 大小为 128。
回归器,框的位置精修
-
目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
-
对每一类目标,使用Bounding Box Regression进行精修。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
-
训练样本:判定为本类的候选框中,和真值重叠面积大于0.6的候选框。
-
为了减少Selective Search候选区域定位误差,使用regression模型预测新的定位
测试阶段
- 在测试阶段,R-CNN 在每张图片上抽取近 2000 个候选区域。然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用 SVM 进行类别的识别,并产生分数。
- 候选区域有 2000 个,所以很多会进行重叠,因此针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
Bounding Box Regression(边界框)预测原理
- 正则化的值是通过交叉验证(cross validation)确定的
- 并非所有Selection Search输出的候选区域都包含真实的目标,对于这些区域,无需加入Bounding Box Regression的计算过程
- R-CNN只把IoU的值大于等于0.6的候选区域加入Bounding Box Regression的计算过程
可视化
在卷积神经网络中,第一层可以直接用来显示,而且肉眼可视,通常他们是为了捕捉物体边缘,及突出的颜色信息,但越往后的卷积层越抽象,这个时候进行可视化就是一个挑战了。
Zeiler 和 Fergus 提出了一种基于反卷积手段的可视化研究,但 R-CNN 的作者直接提供了一个没有参数的方法,简单直接。
思路是挑选一个特征出来,把它直接当成一个物体分类器,然后计算它们处理不同的候选区域时,activation 的值,这个值代表了特征对这块区域的响应情况,然后将 activation 作为分数排名,取前几位,然后显示这些候选区域,自然也可以清楚明白,这个 feature 大概是什么。
R-CNN 作者将 pool5 作为可视化对象,它的 feature map 是 6x6x255 的规格,可以理解为有 256 个小方块,每个方块对应一个特征。
下面的图表中显示了这以可视化的效果,这里只显示了 256 个特征中的 6 个,每个特征取 activation 值最高的 16 个区域。
上图应该很明白了,对于同一类特征,activation 相差不大,这也是卷积神经网络能够准确识别物体的直观体现。
框架精简
作者发现,如果不做fine-tune,把AlexNet网络的fc6,fc7这两个全连接层去掉,对于结果并没有产生什么影响,甚至结果会更好。
所以,神经网络最神奇的力量来自卷积层,而不是全连接层。
但如果做fine-tune,在fine-tune后fc6和fc7提升的效果明显。
所以结论就是,pool5 从 ImageNet 训练集中学习了物体的泛化能力,而能力的提升则是通过特定领域的 fine-tune。
举个例子,神经网络在 ImageNet 数据集中学习到了 100 种猫的特征,而我自己的数据集只有两种猫,经过 fine-tune训练后,这个神经网络可以更准确识别这两种猫了。
R-CNN 还与其他的特征方法进行了能力比较,作者选取了两种基于 DPM 的方法,DPM ST 和 DPM HSC,结果都证明,R-CNN 要好于它们。
R-CNN的计算瓶颈
- 对于每一幅图,使用Selective Search选择2000个候选区域,这个过程本身比较慢
- 2000个区域都要使用CNN网络预测图像特征,这些区域还会有重叠的部分
- 4个分离的部件没有重用计算:
- Selective Search:选择候选区域
- CNN:提取图像特征
- SVM:目标分类识别
- Regression模型:定位
区域都要使用CNN网络预测图像特征,这些区域还会有重叠的部分
- 4个分离的部件没有重用计算:
- Selective Search:选择候选区域
- CNN:提取图像特征
- SVM:目标分类识别
- Regression模型:定位