论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

原文地址

https://openaccess.thecvf.com/content_cvpr_2014/papers/Girshick_Rich_Feature_Hierarchies_2014_CVPR_paper.pdf

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

与分类任务不同,检测需要定位一张图像中的一个/多个物体。目前的方法有将localization视为regression问题来做的,但是效果不好;还有的方法是使用sliding-window检测器来做,但随着网络的加深,感受野会逐渐增大,这对定位的精准性带来挑战。本文不同于那些方法,采用“recognition using proposal”的方式来进行目标检测:从input image中生成大概2000个类别无关的proposals,对于每个proposal使用CNN提取固定维度的特征,然后使用特定类别的线性SVM进行分类
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》
并且作者提到在过去几年中(2014年前)目标检测任务的发展已经处于瓶颈,本文提出的算法,简单而有效,将VOC 2012的目标检测mAP提高了30%。主要包含两个创新点:

  • 在bottom-up的region proposal使用CNN用于物体定位和分割;
  • 由于标注数据的稀缺,在辅助任务(eg. classification)中使用监督预训练,然后针对特定任务(detection)再进行fine-tuning。

由于本文的方法结合了region proposal和CNNs,所以本文提出的方法也称为R-CNN

相知(Body)

2. Object detection with R-CNN

本文的object detection system包含3个模块:第一个是生成类别无关的region proposals;第二个是从region捕获特征的CNN;第三个是一组用于分类的线性SVM。

2.1 Module design

Region proposals:使用的方法为selective search,关于这个算法,可以看这篇博客,讲的比较好:https://blog.csdn.net/qq_37764129/article/details/86362503

Feature extraction:使用AlexNet对每个region提取一个4096维的特征向量,网络细节下文会提到。但由于生成的proposal大小不一,而CNN的输入是固定的尺寸(227x227x3),所以先要对图像进行一个变化,作者采用了最简单的一种变换(各向异性缩放),在变换之前,在原始候选框周围加上一圈context padding(use pad=16),关于变换这部分可以参考这篇博客:https://blog.csdn.net/v1_vivian/article/details/80245397
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

2.2 Test-time detection

在测试阶段,使用selective search(整个实验使用ss算法的‘fast mode’模式)得到2000个左右的proposals,进行形状变换后传入CNN得到对应特征,然后将特征向量送入SVM中得到对应的类别。现在,我们得到图像中所有已经打分的region,应用greedy non-maximum suppression(不同类别独立运行),去除重复框。关于非极大值抑制的方法,可以参照这篇博客:https://www.cnblogs.com/makefile/p/nms.html

Run-time analysis:有两个关键点使得检测过程变得高效:1. CNN的参数是权重共享的;2. 从CNN中得到的特征向量是low-dimensional。这使得计算region proposal和feature的时间可以在所有class上分摊,与特定类别相关的计算只在SVM和NMS上。并且,R-CNN不借助任何近似技术就可以很容易地扩展到上千种类别。

2.3 Training

Supervised pre-training:在ImageNet数据集上对CNN进行预训练(分类任务)

Domain-specific fine-tuning:为了将预训练的CNN迁移到本任务(warped proposal windows分类)上,我们在warped region proposals上使用SGD进行fine-tune,不改变整体的网络结构,只将最后的1000-way分类层改为(N+1)-way,其中N为物体类别数,1为背景类别。SGD的初始学习率为预训练的1/10,这样可以进行fine-tune,并且不破坏初始化。batch size为128,其中32个positive windows(所有类别,将IoU≥0.5的proposal视为该类别的positive,其他的为negative),96个背景windows。 并且,在采样时倾向于采样positive windows,因为与背景相比它们是罕见的。

Object category classifiers:考虑一个用于检测汽车的简单二分类器,对于一个紧密包裹着汽车的区域,标签肯定是正类;对于那些完全没有汽车的区域,肯定为负类;麻烦的是那些既包含汽车又包含背景的区域,标签应该是什么。和上一段CNN类似,本文用IoU阈值来决定。在validation set上使用grid search,选择0.3作为阈值(这个阈值的设定对于最后performance影响很大)。对于R-CNN的分类器,正例就是每一类ground -truth bounding box,IoU小于0.3的作为负类,其他的全部丢弃,不考虑。再训练SVM过程中,为了加速收敛使用了"Hard Negative Mining"策略(将每次loss很大的样本继续送到下一次训练中)。

(finetuning阶段由于CNN需要大量数据驱动,所以IOU的阈值设置比较宽松;而SVM适用于小样本训练,故IoU阈值设置较为严格;为什么还要额外使用SVM而不直接用softmax呢?这是因为CNN在fine-tuning时,由于数据量的需求,IoU设置为0.5,这样的定位准确度是很差的,而SVM的正例只为groundtruth,这样定位的精度更高)

2.4 Results on Pascal VOC 2010-12

均有两个结果,R-CNN BB表示使用了bounding box regression后处理。
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

2.5 Results on ILSVRC2013 detection

论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

3.Visualization, ablation and modes of error

3.1 Visualizing learned features

作者在这里提出了一个可视化的想法,核心思想就是让神经元"speak for itself":挑选出网络中的某个特定uint(当做检测器),计算所有proposal在这个uint上的输出,按输出大小进行排序之后使用非极大值抑制(NNS)显示那些top-scoring区域。下图为关于CNN的池化层pool5的一个可视化效果。
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

3.2 Ablation Study

论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》
Performance layer-by-layer, without fine-tuning:为了探索各层的作用,在没有fine-tuning的情况下(上表前3行),进行实验,可以看到fc7比fc6的泛化效果差很多,这也意味着可以移除fc7而不对mAP造成影响。并且,同时移除fc6和fc7的情况下,大大减少了参数量,但mAP并不会受到太大影响,证明CNN的表征能力基本来自卷积层

Performance layer-by-layer, with fine-tuning:在进行fine-tuning后(FT),mAP均提高了不少,可以看到fc6、fc7比pool5的效果好很多,这也意味着Pool5提取的特征通用性很强,获得的改进主要为**在Pool5后学习domain-specific的非线性分类器(fc层)**带来的。

3.3 Network architecture

论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》
虽然本文绝大多数结果都是基于AlexNet(T-Net),但是作者还探索了VGG-16(O-Net)对于结果的影响,VGG-16的提升很大,但同样它的时间消耗也很长。

3.4 Detection error analysis

这里作者介绍了对于错误类型的分析,简单提几句,有兴趣可以阅读原文相关段落:引入Bounding Box Regression可以减少定位问题,fine-tuning可以提高模型的鲁棒性等。
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

3.5 Bounding-box regression

基于之前的错误分析,可以看到很大一部分都是localization错误,因此作者训练了一个线性回归模型,以基于ss算法选择的region proposals的pool5特征作为输入,预测一个新detection window。

(主要是利用线性回归来对detection windows做微调,使得其更贴近真正的groundtruth,具体可参见这两篇博客:https://blog.csdn.net/Bixiwen_liu/article/details/53840913?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf,https://blog.csdn.net/v1_vivian/article/details/80292569)

4. The ILSVRC2013 detection Dataset

这里作者介绍了在ILSVRC2013目标检测比赛上的具体实验结果,就不过多赘述了。
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

5. Semantic Segmentation

作者还基于O2P框架进行了语义分割任务的尝试,O2P使用CPMC为每张image生成150个region proposals,对于每一类,使用支持向量回归(support vector regression, SVR),由于方法过于老旧,这里就不提具体细节了。
论文解读:R-CNN《Rich feature hierarchies for accurate object detection and semantic segmentation》

回顾(Review)

RCNN的思路清晰简单:使用Selective Search算法筛选region proposals,然后利用CNN进行特征提取,接着使用class-specific的线性SVM做分类,最后使用bounding box regression矫正坐标。但缺点就是每一部分都需要单独的训练,不是end-to-end,这样加大了训练的困难,也使得整个方法显得繁琐、笨重。

R-CNN是object detection领域RCNN系列的开篇之作,发表于CVPR2014。以今天的视角来回顾本文,不难看出整篇文章的思路过于繁琐,并且现在也基本没人用RCNN来做目标检测了,但RCNN奠定了two-stage方法的基本流程,并遥遥领先于传统方法,在目标检测领域掀起了深度学习浪潮。

关于代码

本文所用方法过老,这里就贴代码链接以及复现了,大家有兴趣可以自行去github上搜素。


以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。