R-CNN,Fast R-CNN,Faster R-CNN 论文解读

从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^)+λ1objectLloc(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} SmoothL1损失:
L l o c = ∑ i i n x , y , w , h S m o o t h L 1 ( c i − c ^ i ) L_{loc}=\sum_{i in x,y,w,h}Smooth_{L_1}(c_i-\hat c_i) Lloc=iinx,y,w,hSmoothL1(cic^i)
S m o o t h L 1 ( x ) = { 0.5 x 2 |x|&lt;1, ∣ x ∣ − 0.5 otherwise Smooth_{L_1}(x)= \begin{cases} 0.5x^2&amp; \text{|x|&lt;1,}\\ |x|-0.5&amp; \text{otherwise} \end{cases} SmoothL1(x)={0.5x2x0.5|x|<1,otherwise

文章通过实验还回答了下面几个问题:

  • 1 多任务学习是否有帮助?
    多任务学习通过一次学习过程可以很方便地同时完成了多个目标任务的学习,文章通过实验表明使用多任务学习的训练方法比分阶段的训练方法在分类的结果上高0.8~1.1个mAP。
  • 2 如果使用SVM效果是否会更好?
    文章通过实验发现在三组不同的网络结构下,SVM的效果都比Softmax稍差(0.1~0.8个mAP),但是这也表明了Fast R-CNN使用的single-stage fine-tuning的方法比R-CNN和SPPNet使用的multi-stage的训练方法要好。
  • 3 proposal的数目是否越多越好?
    文章通过实验发现随着proposal数目的增加,mAP先增高然后降低,表明了proposal的数目不是越多越好,甚至相反会导致mAP降低。proposal数目的增加会使得Average Recall的提升,但是这并不表明mAP会提高。

Faster R-CNN

paper title:Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
paper link:https://arxiv.org/pdf/1506.01497.pdf
conf & anthor: NIPS15, Shaoqing Ren, Kaiming He et al.
intro:RPN, anchor box

主要内容:
尽管从R-CNN到Fast R-CNN,通过共享计算已经大大提高了训练和预测的速度,但是region proposal这一步仍然是十分耗时的。Faster R-CNN提出了一个Region Proposal Network(RPN),通过在卷积特征图上预设一些先验的anchor box,然后通过RPN网络得到特征图每一个位置上的Bbox坐标和存在物体/背景的分数。RPN网络完成了region proposal 的工作,其通过全卷积实现,耗时很小。通过RPN得到region,再送入到Fast R-CNN中,完成目标检测任务。

RPN的网络结构:RPN的输入是经过基础网络的多个卷积层之后的特征图(如VGG的第13个卷积层的输出),输出是一系列的物体候选框及其对应的物体/背景的分数(具体结构如下图)。
RPN结构:通过滑动窗口的形式在卷积特征图上的 n ∗ n n*n nn大小的窗口上接一个“small network”。在这个small network中首先通过 n ∗ n n*n nn卷积将窗口中的数据映射到一个低维的向量上(ZFnet:256d,VGG:512d),然后将这个向量送入到两个分离的全连接层中,一个用于box分类(输出的维度: a n c h o r b o x s c a l e ∗ a n c h o r b o x r a t i o ∗ 2 anchor_box_scale*anchor_box_ratio*2 anchorboxscaleanchorboxratio2),一个用于box坐标回归(输出的维度: a n c h o r b o x s c a l e ∗ a n c h o r b o x r a t i o ∗ 4 anchor_box_scale*anchor_box_ratio*4 anchorboxscaleanchorboxratio4)。由于采用的是滑动窗口的形式,全连接网络在每一个窗口上都是共享参数的,所以在实现的时候,这两个全连接网络分别使用两个 1 ∗ 1 1*1 11的卷积来实现。

#========= RPN ============
#==reference:https://github.com/smallcorgi/Faster-RCNN_TF/blob/master/lib/networks/VGGnet_train.py
 (self.feed('conv5_3') .conv(3,3,512,1,1,name='rpn_conv/3x3') .conv(1,1,len(anchor_scales)*3*2 ,1 , 1, padding='VALID', relu = False, name='rpn_cls_score'))
 (self.feed('rpn_conv/3x3') .conv(1,1,len(anchor_scales)*3*4, 1, 1, padding='VALID', relu = False, name='rpn_bbox_pred'))

在这里插入图片描述

Anchor Box
Faster RCNN 使用anchor来解决多尺度检测问题。在目标框的回归中,每一个regressor负责一种尺度和宽高比的框的回归。

Faster R-CNN中在上图中的conv feature map上的每一个位置上都设置了一些anchor box,也就是一系列宽高比和尺寸不同的Bbox。这些anchor box根据与truth Bbox的IoU大小被分成positive和negtive两类,RPN网络要预测就是这些anchor box的相对于truth Bbox的坐标偏移以及属于目标还是背景的分数。文章中设置了三种大小(分别为[128128, 256256, 512*512])和三种宽高比([1:2, 1:1, 2:1])的anchor box,这样每个位置上就有9个anchor box。positive的Anchor要满足box与truth Bbox的IoU大于0.7,如果一个ground truth没有任何一个Anchor box与其的IoU大于0.7,则选择IoU最大的那个作为positive;nagetive 的Anchor需要满足IoU小于0.3;其他IoU值的Anchor box都不参与训练,不贡献损失。

损失函数:RPN的损失函数沿用了Fast R-CNN中的多任务损失。包括类别损失和坐标损失两部分:
L ( p , p ^ , c , c ^ ) = L c l s ( p , p ^ ) + λ ∗ 1 p o s ∗ L r e g ( c , c ^ ) L(p,\hat p,c,\hat c)=L_{cls}(p,\hat p) +\lambda *1^{pos}*L_{reg}(c,\hat c) L(p,p^,c,c^)=Lcls(p,p^)+λ1posLreg(c,c^)

  • p p p是预测的类别(目标或背景)概率的向量;
  • p ^ \hat p p^是anchor box的实际类别概率的向量;
  • 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^是实际的anchor box的坐标;
  • λ \lambda λ是调节类别损失和坐标损失比例的权重因子;
  • 1 p o s 1^{pos} 1pos当anchor box是positive时为1,是negtive时为0;

坐标损失使用的是 S m o o t h L 1 Smooth_{L_1} SmoothL1损失:
L l o c = ∑ i i n x , y , w , h S m o o t h L 1 ( c i − c ^ i ) L_{loc}=\sum_{i in x,y,w,h}Smooth_{L_1}(c_i-\hat c_i) Lloc=iinx,y,w,hSmoothL1(cic^i)
S m o o t h L 1 ( x ) = { 0.5 x 2 |x|&lt;1, ∣ x ∣ − 0.5 otherwise Smooth_{L_1}(x)= \begin{cases} 0.5x^2&amp; \text{|x|&lt;1,}\\ |x|-0.5&amp; \text{otherwise} \end{cases} SmoothL1(x)={0.5x2x0.5|x|<1,otherwise

计算坐标损失的时候,使用转换后的坐标,如下:
c x = ( x − x a ) / w a , c y = ( y − y a ) / h a c_x=(x-x_a)/w_a,c_y=(y-y_a)/h_a cx=(xxa)/wacy=(yya)/ha
c w = l o g ( w ) / w a , c h = l o g ( h ) / h a c_w=log(w)/w_a,c_h=log(h)/h_a cw=log(w)/wach=log(h)/ha
c ^ x = ( x ^ − x a ) / w a , c ^ y = ( y ^ − y a ) / h a \hat{c}_x=(\hat{x}-x_a)/w_a,\hat{c}_y=(\hat{y}-y_a)/h_a c^x=(x^xa)/wac^y=(y^ya)/ha
c ^ w = l o g ( w ^ ) / w a , c ^ h = l o g ( h ^ ) / h a \hat{c}_w=log(\hat{w})/w_a,\hat{c}_h=log(\hat{h})/h_a c^w=log(w^)/wac^h=log(h^)/ha

  • c x , c y , c w , c h {c_x,c_y,c_w,c_h} cx,cy,cw,ch 表示预测的Bbox的中心坐标和宽高
  • c a , c a , c a , c a {c_a,c_a,c_a,c_a} ca,ca,ca,ca 表示预测的anchor box的中心坐标和宽高
  • c ^ a , c ^ a , c ^ a , c ^ a {\hat{c}_a,\hat{c}_a,\hat{c}_a,\hat{c}_a} c^a,c^a,c^a,c^a 表示预测的truth Bbox的中心坐标和宽高

为什么使用Smooth L1损失函数?
Smooth L1损失是一种鲁棒的L1损失,相对于RCNN和SPPnet中使用的L2损失,对离群点不那么敏感。当回归目标是无边界的时候,训练中使用L2损失需要精心调整学习率以避免梯度爆炸的情况。

网络训练——交替训练:
文章使用交替优化的方式来训练模型,模型可以认为包括三个部分:一是RPN和Fast RCNN的共享卷积层,二是RPN特有部分,三是Fast RCNN特有部分。训练过程包括四个步骤:
(1)使用在ImageNet上预训练得到的权重作为初始权重,训练一个RPN网络(包括共享卷积层和RPN特有部分);
(2)使用(1)训练得到RPN网络输出的proposals 另外训练一个Fast RCNN检测网络,同样使用ImageNet上与训练得到的权重进行初始化;
(3)使用(2)中的训练的网络的权重取初始化RPN网络的共享卷积层参数,并保持共享卷积层的参数固定,仅训练RPN特有部分;
(4)使用(3)中中的训练的网络的权重取初始化Fast RCNN网络的共享卷积层参数,并保持共享卷积层的参数固定,仅训练Fast RCNN特有部分;
最后RPN和Fast RCNN共享卷积层并得到一个完成的模型。上面的交替训练还可以再交替进行下去,但是文章中表示继续交替训练下去得到的模型提升很微小。

一些实现上的细节
(1)训练图片尺寸缩放至较短的边为600 px;
(2)Anchor box使用了三种尺寸 128×128,256×256,512×512;三种宽高比 1:1,1:2,2:1;
(3)去除超过图像边界的Anchor box,对于一张1000x600的图像,去除前的Anchor box的数目约为20000≈60409个,处理后减少为6000个;
(4)使用NMS去除RPN重叠的proposals,IoU设置为0.7。

关于感受野
文中提到一个感受野的问题:noting that the effective receptive field on the input image is large (171 and 228 pixels for ZF and VGG, respectively)
影响感受野大小的主要因素有strides和kernal_size,对于感受野的计算,可以使用反向推算的方法从高层向低层计算:
如果所在当前层的感受野大小为 R F l RF_l RFl
那么 R F l − 1 = ( R F l − 1 ) ∗ s t r i d e s l − 1 + k e r n a l _ s i z e l − 1 RF_{l-1}=(RF_{l}-1)*strides_{l-1}+kernal\_size_{l-1} RFl1=(RFl1)stridesl1+kernal_sizel1

据此可以计算文章提到的VGG感受野,下图中的第14层就是RPN网络的第一个滑窗卷积层,这一层中的一个位置上的对应到输入图像中的感受野大小可以据下表逐层推算得到,最后结果是228。
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值