最近在做复杂文档的版面分析,发现很多论文都是利用目标检测的方法来做,因此对该领域进行了一个比较系统的学习。接下来的几篇文章,是自己看完一些经典Paper以及具体实践之后的总结。
根据2018年综述论文Object Detection with Deep Learning: A Review 的归纳,目标检测神经网络框架基本可以归为两大类:
本系列文章也将沿着这两条线索,重读经典论文,分享阅读纪要心得。
R-CNN
论文地址:Rich feature hierarchies for accurate object detection and semantic segmentation
代码地址:https://github.com/rbgirshick/rcnn
短评:R-CNN在2014年提出后,在许多重要的目标检测任务上明显超越传统方法,而且不断得到发展形成了R-CNN大家族(后面会介绍到)。论文非常详尽的介绍了目标检测任务中,CNNs的应用与训练,以及一些很有启发性的可视化分析,很值得细细品味。
简介
上个世纪到本世纪初,目标检测模型很多还是基于经典的一些图像特征例如SIFT、HOG来实现的,这些特征提取算法很慢、效果较差。2012年,Hinton的学生Alex Krizhevsky在寝室用GPU死磕了一个CNN模型(AlexNet),一举摘下了视觉领域竞赛ILSVRC 2012的桂冠,大幅超越传统方法。于是有人提出,CNN在图像分类任务上的优异表现能否复制到PASCAL VOC的目标检测任务上呢?
本篇论文就是顺着这个思路,使用神经网络结合规则产生的区域提议定位物体,并且利用fine-tune技术仅用少量带标注的检测数据训练了一个高性能模型。因为结合了region proposals和CNNs,所以该方法取名为R-CNN (Regions with CNN features)。
值得一提的是,利用CNN在目标检测上搞事情的,在此之前已有不少,例如在ILSVRC2013目标检测任务上的冠军Overfeat就是一个典型的例子,通过在输入图片上的滑动窗口同时实现目标定位和识别(为了实现高效的计算,需要利用1×1卷积将最后的全连接层也变换为全卷积层,即全卷积网络)。其实,如果用一个多尺度正方形区域的金字塔取代选择性搜索区域提议,Overfeat可以看着是R-CNN的一个特例,并将每个类别的检测框回归器改变为一个单一的检测框回归函数,则两个系统将是非常相似的(训练上有一些潜在的显著差异:CNN微调、使用SVM等)。
模型框架
R-CNN的模型框架示意图如下:
Region proposals
区域提议是用的选择性搜索(selective search),思想很简单:先产生细粒度(例如根据颜色)的分割区域,然后根据相似度不断向上合并(每一步迭代得到的外框都加入到候选区域列表中),因此得到的建议区域通常被称为bottom-up region proposals,一个直观的示意图如下:
Selective Search for Object Recognition
Feature extraction
利用大规模ILSVRC2012图像分类数据集(1000类)有监督训练(Supervised pre-training)得到基础模型即AlexNet,然后在目标检测数据集上进行调优(Domain-specific fine-tuning)。目标检测数据集来源于VOC(N=20类)和ILSVRC2013(N=200类),包括真实标注框及与其IoU(intersection-overunion,交并比)≥ 0.5的建议框都当作对应类正例,其余则为背景框,AlexNet最后的分类层需要更替为N+1分类层。使用SGD算法进行优化,学习率设置为0.001(是预训时的1/10),批量大小为128(包含32个正例及96个背景框)。
AlexNet只接受大小固定(227×227)的输入图像,所以图像切片需要做一些转换,论文在附录A提出了几种转换方法,简单介绍如下:
4个举例种第1行和第2行的区别是边界框外延伸大小,前者不做外延,后者四周外延16(如果外延超出原图边界,填灰补充)。A列是图像切片,B列是在原图上的等比例缩放(不足填灰),C列类似B列不过不考虑原图,D列则是强制宽高缩放。论文使用的是方法D。
Object category classifiers
经过特征提取后,对每个提议区域都有了一个固定长度的特征向量,作者在此基础上继续针对每一类都训练了一个SVM模型。比较特殊的是,这里训练集正例构造时的IoU阈值是设置为0.3(IoU落在0.3~0.5之间的proposals是被忽略的),这个是在在验证集上通过{0,0.1,…,0.5}的网格搜索(grid search)得到的最优取值。为了加快训练,采用了standard hard negative mining method(基本原理是更加侧重考虑很难区分的负例)。
关于为什么不直接使用AlexNet的分类结果,以及IoU阈值设置的不同,作者在附录B中进行了更多说明。基本就是试验结果驱动。其实,在如今的强悍图像分类基础模型下(例如darknet/resnet等),SVM已无必要。不过,在当时的受限条件下,这些组合的细节还是很值得学习的。
Bouding-box regression
这部分是论文的附录C内容,其实也是整个改进模型的一部分,所以放在这里一起说一下。
记标注的真实框(中心坐标及宽高),区域提议框
,回归目标并不是直接让
拟合
,而是定义为
:
这样子操作是有具体的物理意义的,和
的转换主要是为了将绝对尺度变换为相对尺度,而图片宽高必须大于0,所以需要通过对数变换去除不等式约束(否则无法用SGD优化)。这个技巧在后面的yolo等模型中都有应用,更多分析可参考https://zhuanlan.zhihu.com/p/49995236。
BBox回归器是在上接一个线性回归函数实现的,设该函数变换为
,可以通过最小二乘法求解:
特别的,预测时回归公式为:
注:所有回归训练仅在非背景且IoU大于0.6的框上进行。
实验分析
直观看到R-CNN的巨大提升,因为ILSVRC2013有200类检测目标,所以右下角用了箱形图来呈现。
为了更细致的分析CNN模型学习到的特征,论文提出了一种简单直观的可视化方法:以CNN的层为例,该特征图大小为
,假设输入为
,则每个单元的感受野(receptive field)大小为
(边缘单元会略小,但是中央单元已经接近全局的视野);接下来要做的是计算近1千万的建议区域在9216个单元的激活值,并按大到小排序,取Top的图像便可直观看到不同单元的关注焦点的不同,以下是其中6个单元的Top16结果(激活值应该是按本通道的最大激活进行了归一)。
注:白框的大小差异,即上面说到的边缘单元的视野要小些
论文还做了更多挺有意思的消融实验(Ablation studies),如下:
行1-行3是没有微调的结果,表明了CNN的大部分表达能力来源于卷积层,而不是更密集的全连接层(和
);行4-行6进行了微调,取得较大提升,密集的全连接层在特定任务上得到了更多学习。行7增加了一个Bounding-box的回归器(这是从错误分析中得到的启发),进一步提升了效果。
横轴按我的理解是不同分数阈值下(从高到低)的FP数量,整体上看Loc类错误占据了主要部分(看面积),所以催生了BBox回归器。这种从错误分析中得到改进思路的做法很值得借鉴。
论文还实验了使用更强的基线模型替换AlexNet,能取得更大的性能提升,如下图:
这进一步表明了深度神经网络的巨大潜力。
其他说明
进行微调训练时,对于一些并不显而易见的特殊操作,作者补充了说明。例如ILSVR2013的train集有近40万张图片,但是每张图片都是部分标注的(即有很多物体没有被标注出来),只有验证集和测试集进行了详尽标注。因此,在构造训练集时其实是严重依赖验证集的,训练集只用于辅助正样本的来源。
另外一个问题是,不同类的数量差异巨大(最少的物体只有31张标注图片,超过1半只有少于110张),为了产生一个比较均衡的切分——val1和val2,做法是:先产生大量的候选分割,然后选择最大相对类间不平衡的最小值(相对不平衡度被定义为|a−b|/(a+b),其中a和b是两个集合各自的类计数)。
在数据使用、微调选择、BBox回归上进行的消融实验结果如下:
val2和test上的mAP非常接近,有信心相信,val2上的mAP是测试集性能的良好指标。总的来看,数据越多越好。
论文还说到了R-CNN在语义分割上的应用,好像没有说的很详细,看上去就是用CNN抽特征,没搞太明白,有清楚的欢迎留言告知。
SPP-net
论文地址:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
代码地址:https://github.com/ShaoqingRen/SPP_net
短评:2015年,何凯明(CV领域真正的大牛,后面还会反复出现)等人通过引入空间金字塔池化层(Spatial pyramid pooling),去除了深度卷积神经网络对于输入图片的固定大小限制,增强了模型的灵活性,在图片分类和目标检测等任务上都取得了优异效果。
简介
回到问题本身,为什么CNN网络要规定图片输入大小呢?观察发现,其实卷积层并没有限制,而是最后的全连接层只能接受固定大小的输入,所以问题出在convs和fc-layers之间。
为什么不通过crop/warp等操作将图片转换成要求大小输入呢?crop可能只包含部分物体,warp会导致几何形变,两者都造成了信息丢损。
论文的核心贡献就是引入了SPP(spatial pyramid pooling,空间金字塔池化),从而解除了输入图片大小限制,多尺度的特征抽取也增强了对于形变的健壮性。特别是在极大地提升了之前目标检测最佳算法R-CNN的性能,因为不再需要对每个proposal都过一次前向计算,而只需要整张图片过一次网络,然后在特征图上应用SPP抽取得到每个proposal的特征即可,加速比达到24~102倍。另外一个突出贡献是,该层适用于很多的卷积网络,具有普适性,试验结果也表明了其通用性。
模型框架
在进入SPP层前,作者先是给我们看了一个卷积特征图的可视化结果,这可以帮助我们理解CNN到底做了什么,所以这里我还是不厌其烦地再贴一下:
看起来和上篇论文很相似,其实有点不同,这里展示的是一个卷积核(convolution filter)的可视化结果,而上篇论文是某个卷积核(对应于某个输出通道)的某个位置。所以可以看到,这里图(c)可能对应着不同的原图的感受野,但一样地都是关注着某些类似的pattern。
SPP的做法很简单,就是在大小变化的特征图上应用数量固定的网格切分(假设划分成份,可以用
的window size和
的stride),网格内采用max-pooling,便可得到固定长度的输出特征向量,直观图解如下:
注意到最粗力度的采用了”global pooling”,这其实相当于传统的Bag-of-Words的方法。
训练过程尝试了两种方式,一种还是传统的单一尺寸的训练(single-size training),另外一种是在不同的epoch采用几种不同的输入尺寸(multi-size training),但是所有参数都是共享的。测试时直接支持任意的输入尺寸。
补充两个在附录里说到的重要细节:
- 所有图片在输入前都做了减均值“Mean subtraction“(分通道)的预处理,看了一些资料,主要目的应该是归一化使得训练更加稳定快速;
-
在目标检测时,原图上的区域提议框需要映射到特征图上以进行特征抽取(Mapping a Window to Feature Maps),后面的论文中通常称为RoI projection。以框的左上角
为例,需要在特征图上找到某点
使得其在原图上的感受野中心刚好落在
附近。
为此,我们首先回顾一下感受野的计算,其实这是前向的卷积层输出大小的逆向过程,对称公式如下:
上面两条式子都是可以(逐层)递归进行计算的,特征图上的每个单元在原图上的感受野大小也可以通过式二计算出来。据此,可以得到感受野中心点的坐标映射公式:
在SPP实现了对此作了简化,令每一层的
(padding)为
,如此一来当
为奇数是(通常也是这样设定的),上式简化为
(
为偶数时,
,因为需要取整,也可以简单近似)。
回到最开始的问题,
与
的关系经由上述分析可得
,因此
的取值为
(左上角)或
(右下角),这里的
主要是因为感受野会有边沿放大现象,所以适当的将映射坐标往内收缩一下。
注:本部分内容参考了https://zhuanlan.zhihu.com/p/24780433
实验分析
这张图支持了之前的几个结论,包括SPP对于不同底层模型的普适性和优异性,也可以看到采用multi-size traning能够带来更多的收益
对于为何能够取的性能的提升,作者在这里也补充了自己的观点:SPP所带来的收益并非简单地由于参数量的增加,更可能是其对于物体形变和空间布局的适应性更强。
上表是在目标检测上的效果,但是提升并不大,主要贡献还是在于速度的优化。表12是做了模型集成的结果,两个模型结构相同,使用了不同的随机初始化,可以看到在不同类别上的mAP呈现互补,所以集成取得正收益。
Fast R-CNN
论文地址:Fast R-CNN
代码地址:https://github.com/rbgirshick/fast-rcnn
短评:这篇论文首次基于R-CNN提出端到端的方法,利用SPP中提到的Pooling方法,节省大量重复计算,并且将目标分类和检测结合到一个网络,同时优化。性能和速度都得到了大幅提升。
简介
经典R-CNN主要有以下3个缺点:1. 训练时一个多阶段过程(multi-stage pipeline);2. 训练时空复杂度高;3. 预测耗时多,VGG16平均用时47s/image。
SPP主要对问题2&3进行了优化,使得提议区域的特征提取时间大幅降低。但是,问题1仍旧存在,多阶段间的独立性带来了不少限制。
本文的贡献主要是提出了一个single-stage的方法,不仅时空效率大为提升,检测性能也更加优异。
模型框架
RoI projection在上一节中已经介绍过,RoI pooling思想也极为简单,可以认为是单层次的SPP,即将RoI window划分为固定的份,然后max-pooling。
主要创新是在灰色部分,将检测目标的分类和框回归通过多任务学习(multi-task loss)合并到了同一个网络中,使得整个过程可以端到端学习优化。损失函数如下:
注:为
类的softmax概率分布值,
为真实类标(0表示背景),
为关于
的预测框,
为真实类框,
表示忽略背景框的预测。
此外,目标检测涉及许多区域提议的计算,其中卷积层的计算可以共享,后面的全连接层的计算耗费巨大。因此,作者还提出了通过truncated SVD()来实现加速:将单层全连接层
替换成两层规模小很多的全连接层(
和
中间不过非线性激活函数)。
实验分析
![]() |
![]() |
---|---|
S/M/L表示几种规模的基础模型 | truncate SVD对性能有一些影响,但是减少了很多时间 |
还有其他一些看起来不是很重要的实验,这里就略过了,感兴趣的点击论文链接去看吧。
Reference
本篇内容还参考了下列文章,致谢:
Faster R-CNN和Mask R-CNN就留待下一篇文章再讲吧,都放在一起篇幅太长了,敬请期待~
One thought on “从R-CNN到Mask R-CNN(一)”