从R-CNN到Fast R-CNN
R-CNN
title: Rich feature hierarchies for accurate object detection and semantic segmentation
conf & anthor: CVPR14, Ross Girshick et al.
arXiv: https://arxiv.org/pdf/1311.2524v1.pdf (v1)
intro:regions with CNN features
主要内容:
(以下主要基于RCNN论文arXiv v1)R-CNN:region with CNN features。R-CNN文章中探索了在ImageNet上训练的用于图片分类的深度卷积神经网络是否可以应用于目标检测任务。文章通过将自下而上的候选框提取算法(如selective search)与卷积神经网络相结合并应用于目标检测任务,在VOC07 目标检测任务上取得了超越传统方法很多的结果(mAP 48%)。文章首先在ImageNet上预训练分类模型,然后“迁移”到VOC上的经过“变形”的图片(warped regions)上的分类任务。
文章的主要思路是将目标检测任务分为候选框提取和图片分类两个部分,基本的流程图如下(图片来自原论文)。
具体来说:
模型训练
部分,首先在ImageNet上预训练一个图片分类神经网络,训练数据使用的是图片及其对应的图片级类别标签。训练好这个分类模型后,进行模型微调。即使用“region”及其对应的region-level的标签进行训练,“region”的选取方式是在原图上与目标的Bounding box大于等于0.5作为对应类别的正样本,其余的均作为背景类别,“region”取出后,调整宽高比例和尺寸至固定大小(224*224)后作为训练样本,对网络进行fine-tuning(在arXiv上RCNN v5中,介绍了使用一个新的层替换原来网络的最后一个分类层,这个新加的层的神经元的个数为N+1,N是在新的训练数据的物体类别书,加1是包括一个背景类别。表明了当训练数据稀缺的时候,使用“supervised pre-training/domain-specific fine-tuning”的方法是很有效的)。最后训练N个线性SVM用于最后的分类,训练SVM的时候使用GT Bbox作为正样本,使用IoU小于0.3作为负样本,并应用了“hard negative mining”,这与之前fine-tuning阶段的定义有所不同。
模型预测
部分,在使用模型进行目标检测的时候,首先使用selective search提取约2000个候选区域,然后调整宽高和尺寸后送入卷积网络和SVM得到分类结果,处理完一张图片的所有候选区域之后,使用非极大值抑制算法(NMS)去除重复的检测框,其中NMS中IoU的阈值设为0.3。
关于为什么要使用SVM?
(1)
在文章的v1版本中,为在使用卷积神经网络提取的4096维的向量的基础上使用线性SVM完成最后的分类,而不是替换最后一层进行fine-tuning?
(2)
在文章的v5版本中,首先在ImageNet上预训练模型,然后替换最后一层进行fine-tuning,但是最后还是使用线性SVM完成最后的分类,这是为什么?
关于这两个问题,作者在arXiv上的文章的v5版本中在附录B部分做了相关说明,对于第一个问题,主要是当时(v1版本)一开始的思路就是在ImageNet的最后一层上加一个SVM分类器,并没有考虑fine-tuning的方法。对于第二个问题,当作者开始采用fine-tuning的方法,一开始正负样本的选取方法和v1中SVM的正负样本选取方法一致(即GT Bbox作为正样本,IoU小于0.3的作为负样本),但是发现效果不好,原因是如果严格选取GT Bbox作为正样本,会导致用于fine-tuning的样本太少,无法避免网络过拟合。使用IoU大于等于0.5为正样本,其他为负样本,使得正样本的数目增加至约原来的30倍,但是虽然这样可以避免过拟合了,但是由于训练的数据不是精确的GT Bbox区域,最后得到的结果也不是最优的。所以最后又用了SVM,使用SVM比直接使用fine-tuning的mAP提高了3.3%,结果提高可能是多个原因造成的,包括fine-tuning本身不是在精确的GT Bbox区域上训练的,softmax分类用的负样本是随机选取的,而SVM中是经过“hard negative mining”的。
Fast R-CNN
paper title: Fast R-CNN
arXiv :https://arxiv.org/pdf/1504.08083.pdf
conf & anthor: ICCV15, Ross Girshick.
intro:share computation,single-stage training
主要思路:
在R-CNN中,整个训练过程是分为多个步骤的,先是预训练,然后fine-tuning,再训练SVM;另外在做前向传播的时候是对每一个区域单独计算的,没有共享计算,这样导致了RCNN很慢。针对这些问题,Fast R-CNN中做了一些改进,来提高训练和预测的速度,并提高检测的准确性。Fast R-CNN使用“single-stage”的训练算法同时对区域进行分类和位置的校正,并在训练过程中通过“合理”的设置mini-batch的数据,实现共享计算和存储。预测的时候,输入图片和RoI,得到每一个RoI的类别和坐标结果,最后使用NMS去除重复的检测结果。
模型部分
:使用在ImageNet上预训练的模型(文中使用了AlexNet和VGG),移除模型的最后一个池化层,使用一个RoI池化层替代,然后移除全连接层中的最后一个分类层和softmax层,添加两个分支的全连层,一个用于分类,一个用于Bbox的回归校正。RoI池化就是将上一层输出的特征图上对应于’region‘的那部分,分成W×H个格子,然后使用最大池化将其转换至一个固定大小的尺寸。这个固定大小的尺寸W×H是和网络的第一个去连接层有关的,在使用VGG16时,W,H均设为7(保证了RoI池化之后的尺寸与原来的池化后的大小一致)。
训练部分
:充分利用特征共享(共享计算)提高效率,就是在一个mini-batch的所有训练样本中,来自同一张图片的regions可以共享计算和存储。例如一个mini-batch有128个RoI的训练样本,样本的选择方式上,“2张图片,每张64个RoI” 和“128张图片,每张1个RoI”,前者的训练速度约为后者的64倍,这可以大大提高训练效率。文中提到这样做的一种担忧是可能会导致训练的收敛速度变慢,因为来自同一张图片的RoI相关性比较强,但是在实际中并没有出现这种情况。
损失函数
:包括类别损失和坐标损失两部分,分别使用使用log损失smooth L1损失;
L ( p , p ^ , c , c ^ ) = L c l s ( p , p ^ ) + λ ∗ 1 o b j e c t ∗ L l o c ( c , c ^ ) L(p,\hat p,c,\hat c)=L_{cls}(p,\hat p) +\lambda *1^{object}*L_{loc}(c,\hat c) L(p,p^,c,c^)=Lcls(p,p^)+λ∗1object∗Lloc(c,c^)
- p p p是预测的类别概率的向量;
- p ^ \hat p p^是RoI的实际类别概率的向量;
- c c c模型预测的坐标,包括 { c x , c y , c w , c h } \{c_x,c_y,c_w,c_h\} { cx,cy,cw,ch}, c ^ \hat c c^是实际的RoI的坐标;
- λ \lambda λ是调节类别损失和坐标损失比例的权重因子;
- 1 o b j e c t 1^{object} 1object当RoI是目标时为1,是背景时为0;
其中类别损失使用Log损失:
L c l s ( p , p ^ ) = − l o g ( p k ) L_{cls}(p,\hat p)=-log(p_k) Lcls(p,p^)=−log(pk)
p k p_k pk是预测的第k类的概率,k为RoI的实际类别。
坐标损失使用的是 S m o o t h L 1 Smooth_{L_1} Smooth