本篇博客将要解析的论文是Rich feature hierarchies for accurate object detection and semantic segmentation,论文地址为: https://arxiv.org/abs/1311.2524
一、介绍
本文是Ross Girshick、Jeff Donahue、Trevor Darrell、Jitendra Malik等人于2013年发表的一篇文章,该论文提出了R-CNN模型,在ILSVRC2013detection任务中,大幅度超越了之前的OverFeat模型(OverFeat论文解析可以参考我的另外一篇博客:OverFeat论文解析),并且开创了一个目标检测系列的先河。
二、拟解决的问题以及解决方法
之前的目标检测系统主要都是通过融合低级的图像特征和高级的上下文特征来实现,本文则是提出了一个简单并且可扩展的目标检测算法,并获得了大幅超越之前结果的mean average precision。
本文重点解决了两个问题:
- 如何定位目标?
- 方案一:
将目标定位问题视为一个简单的回归问题,直接对目标的bounding box 坐标进行回归分析。
但这种简单粗暴的方法得到的结果不甚理想,毕竟由图片直接得到一系列点的坐标这个任务还是比较具有挑战性的。- 方案二:
采用滑动窗口的方式,进行密集的检测,这也是OverFeat采用的主要思路。
但对于R-CNN来说,其特征提取的CNN具有较大的stride(stride=32,也就是说CNN提取得到的特征图的大小是原图的1/32),使得产生的滑窗过大(32 * 32),并且也损失了很多重要的定位信息,结果也不甚理想。- 方案三:
也就是本文采取的方式,那就是区域推荐。
- 在测试阶段,R-CNN首先采用区域生成算法,例如selective search,产生2000个与类别无关的推荐区域
- 采用仿射变换,将2000个大小不同个的推荐区域,变形到固定的size,例如227 * 227
- 将变形后的所有推荐区域送入一个CNN中进行特征提取,得到一系列大小相同的特征向量
- 基于这些特征向量,训练一系列与类别相关的线性SVM分类器(待检测类别有多少个,就训练多少个SVM分类器),对推荐区域进行分类
- 利用CNN中的最后的卷积-池化层提取到的feature map训练一个bounding box regressor,用于对推荐区域框进行修正,提高生成框的精度
至此,便可以完成目标检测任务。实际这是一种用分类做检测的思路,后续大部分的目标检测网络大都采用类似的思路。
- 少量标注数据如何去训练一个高容量的模型
个人感觉,深度学习领域目前仍然以有监督的学习为主,而有监督的学习就需要大量标注数据。目标检测任务中,数据标注较为麻烦,需要去对目标进行框选,因此,其数据量级相较于分类数据来说较小。如何用少量的标注数据去训练一个高容量(特征表达能力强)的模型是本文解决的第二个问题。
- 方案一:
无监督预训练+有监督微调。- 方案二:
在一个大型辅助数据集上进行辅助任务的有监督预训练,然后再在小数据集上进行特定领域的微调。
本文采用的方案二,并且实验证明,这种方法对于获取高准确率模型至关重要。
三、R-CNN模型
1. 组成模块
R-CNN主要包含四大模块:
- 生成类别无关的推荐区域
R-CNN论文中采用的是Selective Search作为区域推荐模块,除此之外也还有其他算法可供选择,如objectness,category-independent object proposal,constrained parametric min-cuts等。这个部分由于不是文章重点,并且自从RPN网络提出后,使用也较少,因此,不做详细介绍,感兴趣的读者可以参考这篇博客:理解Selective Search。 - 一个大型卷积网络用于提取特征
- 每个推荐区域,不管其size和长宽比,直接resize为227 * 227(在resize前,扩大推荐区域的大小,padding=16)
resize的策略,原文在Appendix中有给出详细介绍。
主要有三种策略,如下图所示:
图1 不同的推荐区域变换 - 首先对推荐区域进行各向同性缩放,使得缩放后的推荐区域被指定大小(227 *227)的正方形最紧密包裹,此时,由于推荐区域的长宽比并不一定就是1:1,所以可能存在着空缺,为了填补这部分空缺。
- tightest square with context(对应上图B) 方法会尽可能的优先使用原图中的像素值进行填充,不够时,则再使用灰色或者其他颜色进行填充。
- 而tightest square without context(对应上图C) 则仅使用灰色或者其他颜色进行填充,不使用原图中的其他像素。
- 最简单粗暴的方法就是不考虑原图的大小以及比例,直接变形(对应上图D) 得到指定大小,这也是本文采用的策略
- 除此之外,本文还会为推荐区域添加padding
- 减去均值的227*227 RGB推荐区域通过5个卷积层和2个全连接层(AlexNet),进行特征向量的提取,最终针对每个推荐区域得到一个4096维特征向量。这个特征向量主要用于后续分类任务中。
- 每个推荐区域,不管其size和长宽比,直接resize为227 * 227(在resize前,扩大推荐区域的大小,padding=16)
- 类别相关的线性SVM分类器
针对每个类别,R-CNN都训练一个SVM线性分类器,每个分类器都将预测送入的推荐区域是否属于当前类别。并且实验证明,多个SVM分类器的性能优于使用Softmax进行分类的结果。 - 类别相关的Bounding Box Regressor
这个部分也是较为经典的部分,后续目标检测算法中的bounding box regression大体采用类似设置,这里找到一篇博客,讲解得较为详细,供大家参考:边框回归:BoundingBox-Regression(BBR)。需要强调的一点是Bounding Box Regression使用的特征与分类器的特征不同,它使用的特征是 p o o l 5 pool_5 pool5得到的特征图。这也比较好理解,全连接层由于使用了reshape的操作,一定程度上破坏了原特征图内部的位置关系信息,Bounding Box Regression由于需要较为准确的位置信息,因此,会舍弃最后的全连接层,而只使用卷积层结果。
2. 训练过程
- 有监督预训练
在一个大型辅助数据集(ILSVRC2012)上对CNN进行分类任务预训练,仅使用图片级标注 - 特定领域微调
- 新的任务:目标检测
- 新的领域:变形后的建议框
- 在预训练模型上替换最后分类层,然后再变形后的建议框上进行分类任务微调(类别数加1(背景))
- 正负样本的确定
当推荐区域与某个ground truth box的IOU超过0.5时,则认为该推荐区域为该类别的正例,反之为负例
batch的组成:32个正例windows,96个背景windows ==> mini-batch size为128
- 目标类别分类
- 为每个类别训练一个二元分类器。例如对训练一个car的分类器来说:
- 一个完整包括car的window应该是个正例
- 一个完全不包括car的window应该是个负例
- 根据IOU threshold(grid search in {0,0.1,…,0.5})去确定正负例(大于为正例,小于为负例)
- 针对每个类别,训练一个线性SVM分类器
四、R-CNN与OverFeat的关系
在本文中指出,OverFeat是R-CNN的一个特例。对于OverFeat来说,类比于R-CNN,其使用的“推荐区域”实际上是一系列不同尺度的固定大小的正方形window,也就是所谓的滑窗;而OverFeat的bounding box regressor是与类别无关的;具体的分类器还有回归器的形式也不太相同(R-CNN:SVM,OverFeat:FC层)。
这里实际上揭示了目前大部分目标检测网络的本质:用分类做检测。
具体而言就是,通过某种方式率先产生一系列可能的检测框,然后再用分类器对检测框进行分类,回归器对检测框进行修正,最终完成检测任务。
五、总结
R-CNN作为R-CNN系列的开山鼻祖,提出了一种简单、扩展性强的一种思路,为后续目标检测算法的蓬勃发展奠定了基础,随后本文作者Ross Girshick与Kaiming He大佬即将开始怒刷目标检测SOTA。
最后附上一下参考博客。
六、参考文献
[1] https://blog.csdn.net/v1_vivian/article/details/78599229
[2] https://blog.csdn.net/v1_vivian/article/details/80292569
[3] https://zhuanlan.zhihu.com/p/44304353
[4] https://zhuanlan.zhihu.com/p/39927488