小田学CV掉头发之路——目标检测算法之R-CNN

随着AlexNet的出现,各种各样的卷积神经网络出现,如VGG、GoogleNet、ResNet 等等。这些网络的出现让一些大佬开始尝试,将卷积神经网络在ImageNet上的目标识别能力泛化到目标检测中,但想要在目标检测中起到比较好的效果,那就需要考虑两个问题:

  1. 如何利用深度卷积神经网络去做目标定位
  2. 如何在一个小规模的数据集上训练出泛化能力比较好的网络模型

于是Ross Girshick借鉴HOG的思想,提出了可以利用候选区域与CNN结合做目标定位

R-CNN

github基于Caffe的源码

1600845338046

Region Proposals(候选区域提取):

Selective Search

1600845597145

工作原理

  • 使用图像分割算法(http://cvcl.mit.edu/SUNSeminar/FelzenszwalbIJCV04.pdf)创建候选区域
  • 使用贪心算法合并候选区域
    • 计算所有相邻区域的相似度
    • 将最相似的两个区域合并为一个区域
  • 重复迭代第二步直到某个设定的停止条件

其他Region Proposals方法比较

1600845724061

R-CNN工作流程

R-CNN 系统分为 3 个阶段,反应到架构上由 3 个模块完成。

  1. 生产类别独立的候选区域,这些候选区域其中包含了 R-CNN 最终定位的结果。
  2. 神经网络去针对每个候选区域提取固定长度的特征向量。
  3. 一系列的 SVM 分类器。

R-CNN大致流程:

  1. 在图像中确定约1000-2000个候选框(使用选择性搜索)
  2. 每个候选框图像块缩放到CNN网络需要的大小,并输入到CNN网络中进行特征提取
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置

这里以VOC数据集为例子

步骤一:下载一个分类模型(比如AlexNet)

  • image-20201104201149172

步骤二:对该模型做fine-tuning

  • 将分类数从1000改为21
  • 去掉最后一个全连接层
  • image-20201104201936194

步骤三:特征提取

  • 提取图像的所有候选框(选择性搜索)
  • 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
  • image-20201104202052089

步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别,每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative,比如下图,就是狗分类的SVM

  • image-20201104202428318

步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

  • image-20201104202500365

特征抽取

  • 采用在ImageNet上面训练好的模型,在自己的训练集上进行fine-tuning
  • 使用Selective Search找出候选区域
  • fine-tuning:在自己的训练数据集中fine-tune CNN,作为一个识别K+1种类别的分类问题,K为感兴趣的目标种类数,1位背景类别,Fine-tune使用比较小的learning-rate,在正样本上面oversampleselective 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(边界框)预测原理

1600857198907

  • 正则化的值是通过交叉验证(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 个区域。

image-20201104192746957

上图应该很明白了,对于同一类特征,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模型:定位