基于论文的Faster R-CNN学习

基于论文的Faster R-CNN学习

论文链接:https://arxiv.org/abs/1506.01497

Faster R-CNN通过提出Region Proposal Network(RPN)解决了region proposal成为网络计算瓶颈的问题。通过使用RPN能够检测出图像内的对象边界和是否为对象的概率,根据概率进行NMS和top-K ranked筛选出proposals后输入到Fast R-CNN的来进行detection,从而确定具体的类别及相应的置信度。整个系统形成一个单一且同一的目标检测网络。

1.整体框架

  1. 模型的down-stream为共有的CNN结构,通过CNN产生feature map;
  2. feature map作为输入,并结合sliding windows进入RPN;
  3. RPN输出scores和proposals结合NMS和top-K ranked产生建议的proposals;
  4. proposals结合feature maps进入Fast R-CNN detection的阶段;
  5. Fast R-CNN的classifier产生proposals内的具体classifier及对应的置信度。

在这里插入图片描述

2.模型细节

  1. 无论是训练还是测试阶段,使用的图片都是固定为单一尺寸的,对于不同尺寸的图片,需要re-scale其短边为600px;
  2. 对于锚点,采用了三种尺寸, 12 8 2 128^2 25 6 2 256^2 51 2 2 512^2​ pixels,三种比例,1:1、1:2、1:3;
  3. 所有cross-boundary的anchors都被忽略,这些anchors对于损失函数没有影响;
  4. 模型使用了NMS和top-K ranked来挑选proposals,减少冗余proposals。

3.关键技术

对于Faster R-CNN,最重要的技术无疑是非常新颖的RPN。

RPN

概述:

RPN是一种全卷积网络,接收一个任意size的图片作为输入,并产生一系列的rectangular object proposals且伴随一个objectness scores。是用来代替Selective Search等方法来为feature maps产生proposals的。

实现细节:

为了产生proposals,需要在feature map上滑动一个 n × n n×n 的sliding window,每个sliding window可以对应产生一个lower-dimensional feature,然后这个feature vector分别进入cls层和bbox reg层,cls层进行为object的置信度计算。

RPN的实际结构为一个 n × n n×n​ 的convolutional layer,跟随着两个 1 × 1 1×1​ 的convolution layers作为reg和cls layer。

锚点:

锚点的引入

由于sliding windows的尺寸固定,需要其他的方式产生不同尺寸及比例的proposals,因此引入了anchor(锚点)。

锚点含义

锚点其实对应的就是一个给定尺寸及比例的proposals,是网络的初始检测框。一个锚点对应一个proposals的中心位置。而这个锚点又和sliding windows的中心位置重合,因此通过锚点,将sliding windows和不同尺寸和比例的proposals对应起来。如果定义k为每个位置上的最大可能proposals数量,那么一个sliding window可产生k个锚点,也就是k个proposals。对于一张size为 W × H W×H 的feature map,共可以产生 W × H × k W×H×k 个anchors。

sliding window对应了很大的一块感受野,感受野的计算可以参考:https://iphysresearch.github.io/posts/receptive_field.html

每个sliding window,最终会对应 2 × k 2×k 个scores和 4 × k 4×k 个coordinates,它们分别代表了这个window对应的k个anchor是否为object的概率和这k个anchor预测坐标

在这里插入图片描述

锚点对于平移不变形的保证

如果一个图像内的object发生了平移,那么它对应的feature map发生变化,但相应产生的anchor及后面的计算过程不发生变化,因此最终还是能提出相应的proposals。

锚点的作用

通过锚点引入不同size及scale,保证了image和filter的single size,从而避免了image或filter的multi-scale,从而节省了时间

损失函数

由于RPN网络的目的不仅是产生proposals,也通过cls层产生了一个关于proposals为object的概率预测,因此也是一个multi-task损失函数。

multi-task的损失函数如下所示:
L ( { p i } , { t i } ) = 1 N c l s Σ i L c l s ( p i , p i ) + λ 1 N r e g Σ i p i L r e g ( t i , t i ) L(\{p_i\},\{t_i\})=\frac{1}{N_{cls}}\Sigma_iL_{cls}(p_i,p_i^\ast)\\ +\lambda\frac{1}{N_{reg}}\Sigma_ip_i^\ast L_{reg}(t_i,t_i^\ast)
这其中 Σ i L c l s ( p i , p i ) \Sigma_iL_{cls}(p_i,p_i^\ast)​ 分类损失函数部分:

i i 为mini-batch中的第 i i 个anchor;

p i p_i 表为i个anchor为object即label=1的概率;

p i p_i^{\ast} 为实际的label。如果anchor是positive(1.对于一个真实的box,这个anchor有最大的IoU;2.跟一个真实box的IoU大于0.7,往往第2个规则就够了,第一个以往万一),那么label为1,如果为negative(对于所有的真实box的IoU都小于0.3),那么label为0,既不是positive也不是negative的anchor对训练没有贡献;

这其中 Σ i L r e g ( t i , t i ) \Sigma_iL_{reg}(t_i,t_i^\ast)​ 坐标回归损失函数部分:

t i t_i 为第i个anchor的坐标变换预测值;

t i t_i^{\ast} 为第i个anchor的实际坐标变换,具体求解方法参见R-CNN论文中的介绍方法,只不过现在的坐标换成了中心点坐标;

p i L r e g p_i^\ast L_{reg} 为只有positive anchor(label=1)时,才计算回归损失,这里跟Fast R-CNN中的 [ u 1 ] [u\ge1] 效果相同。

损失函数中还包含正规化部分:

N c l s N_{cls} 为分类损失的正规化系数,代表了mini-batch size的数值;

N r e g N_{reg}​ 为回归损失的正规化系数,代表了anchor location的数量,不是anchor的数量;

λ \lambda 为平衡系数,默认 λ = 10 \lambda=10 ,从而大致平衡分类损失和回归损失。

RPN训练细节

  • RPN可以通过端到端的反向传播及SGD进行训练;
  • mini-batch构成方案。RPN训练的时候,每个mini-batch来自单一图像,这个图像内包含很多positive及negative的anchors。由于一张图像内的negative的anchors占大多数,所以都拿来进行训练会使negative anchors占主导。因此需要随机挑选256个anchors,拿来计算mini-batch的loss function,其中正负样本的比例是1:1,如果正样本的数量小于128,那么剩下的用负样本填充;
  • 参数初始化。所有layer的weights服从0均值、0.01sd的高斯分布;前面共享的卷积层采用预训练的ImageNet classifier模型;对于前60k个mini-batch,学习率为0.001,后20k个mini-batch,学习率为0.0001;SGD with momentum中的momentum为0.9,weight decay为0.0005。

RPN训练模式

本文提出了三种训练模式:

  1. 交替训练。这也是本文采用的训练方式。对于这种训练模式,先训练RPN,然后训练Fast R-CNN,然后用训练好的Fast R-CNN训练RPN,并迭代这个过程;

  2. 近似的联合训练过程。对于这种训练模式,RPN和Fast R-CNN是一起训练的。对于前向传播过程,相当于固定proposals,在反向传播过程中,共享的卷积层相当于叠加了来自RPN损失函数和Fast R-CNN的损失函数。但是这样的训练模式相当于忽略了Fast R-CNN对RPNproposals的反向传播过程(个人理解);

  3. 非近似联合训练过程。这样的训练过程改进了第2种训练模式中的问题,通过调整RoI layer来加入box坐标梯度的影响。

具体来讲,第一种训练模式为4步训练:

  1. 首先按照RPN的训练方式进行训练,前面的卷积层还是采用ImageNet-pre-trained模型;
  2. 采用第一步的RPN模型产生proposals,来对Fast R-CNN进行训练,在这一步两边的ImageNet-pre-trained model不同,因此conv层还没有共享;
  3. 用第2步训练好的detector network来初始化RPN前面的conv层,来对RPN进行训练,只对RPN特有的卷积层进行训练,前面共享的conv层的参数需要固定不变;
  4. 使用3中的模型,并固定住前面shared conv layer的参数及RPN的参数,只调节Fast R-CNN的特有的参数(RoI层等)
  5. 上述的过程可以进行迭代,但效果有限,因此没必要。从中可以看到,最终网络使用的shared conv layer的参数是在第2步形成的,第3步训练RPN的参数,第4步训练Fast R-CNN的参数。

RPN作用

RPN的最终目的只是产生Region proposals,并不会对object进行具体的分类,计算具体类置信度的任务属于Fast R-CNN detection。RPN向Fast R-CNN detection的输出是一系列具有是否为object标记及经过reg调整后的proposals,RPN所使用的分类器并没有对object进行分类,只是用来计算anchor是否是object。最终由Fast R-CNN对具体类别进行计算,并再次对proposals进行回归校准。

4.典型的训练及预测流程

4.1训练流程(按照训练模式一)

  1. 输入一张固定scale的图片,进入ImageNet-pre-trained model,产生feature map;

  2. sliding window在feature上滑动,会对应产生一系列的anchors,通过跟真实box的比较,通过IoU为每个anchor打上label,从中挑选出等比例且不通过边缘的正负anchors形成mini-batch;

  3. 将mini-batch挑选出的anchors计算其coordinates真值并每个anchors找到对应的sliding windows,每个均形成一个lower-dimensional vector,将这些vectors输入到后面的n×n conv layer和及cls层和reg层;

    对这一步有一些疑问:如果有几个anchors来自一个sliding window,那么得到的vector肯定是相同的,这样mini-batch中估计有不少重复数据,实际是这样的吗?

  4. 计算cls的损失函数及reg的损失函数,并开始反向传播,迭代输入图片这个过程完成RPN的训练;

  5. 在这步开始进行Fast R-CNN的训练。同样使用一个ImageNet-pre-trained model,输入图片,生成feature map,并通过上面产生固定参数的RPN产生proposals,并为每个proposals;

  6. 将proposals对应的feature map提取出来,输入到RoI池化层并通过classifier分类器进行损失函数的计算,并进行反向传播,迭代这个过程完成对Fast R-CNN的训练;

  7. 将6中的网络拿来再按照RPN训练步骤训练RPN,只修改RPN特有的参数;

  8. 将7中的网络拿来再训练Fast R-CNN的detection部分,只单独修改detection特有的参数;

  9. 至此完成整个Faster R-CNN的训练。

4.2预测流程

  1. 向Faster R-CNN网络输入一个image;
  2. image通过shared conv layer产生feature map;
  3. 通过一个sliding windows在feature map上进行滑动,每个sliding windows的中心点都会对应k个anchor(不同的scales和ratios);
  4. 每个sliding windows可以通过RPN对应产生一个lower-dimensional feature vector;
  5. 这个feature vector对应产生2k个scores(代表是否是object)和4k个coordinates(k个anchor对应的坐标);
  6. 对所有计算完成cls scores的anchors进行NMS;
  7. 在NMS之后进行top-N ranked选择出最终的proposals;
  8. 将proposals输入到detection的部分进行分类,输入最终的类别概率及对应的region。

5.提高mAP的策略

  1. 共享卷积层参数。共享卷积层参数比不共享的mAP要高;
  2. region proposals method。采用RPN比SS的mAP要高;
  3. 采用更好的网络。前面采用VGG Net比ZF网络的mAP要高;
  4. 增加数据。采用多数据源的数据能提高mAP,比较明显;
  5. anchors的数量。anchors数量多可提高mAP,其中scale的影响比较明显;
  6. 超参数 λ \lambda 的选择。影响不是很大;

https://blog.csdn.net/williamyi96/article/details/77648047#comments 这篇博客里写的内容也很详细

猜你喜欢

转载自blog.csdn.net/LHaoRax/article/details/88767861