基于论文的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.整体框架
- 模型的down-stream为共有的CNN结构,通过CNN产生feature map;
- feature map作为输入,并结合sliding windows进入RPN;
- RPN输出scores和proposals结合NMS和top-K ranked产生建议的proposals;
- proposals结合feature maps进入Fast R-CNN detection的阶段;
- Fast R-CNN的classifier产生proposals内的具体classifier及对应的置信度。
2.模型细节
- 无论是训练还是测试阶段,使用的图片都是固定为单一尺寸的,对于不同尺寸的图片,需要re-scale其短边为600px;
- 对于锚点,采用了三种尺寸, 12 8 2 128^2 1282、 25 6 2 256^2 2562、 51 2 2 512^2 5122pixels,三种比例,1:1、1:2、1:3;
- 所有cross-boundary的anchors都被忽略,这些anchors对于损失函数没有影响;
- 模型使用了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 n×n的sliding window,每个sliding window可以对应产生一个lower-dimensional feature,然后这个feature vector分别进入cls层和bbox reg层,cls层进行为object的置信度计算。
RPN的实际结构为一个 n × n n×n n×n的convolutional layer,跟随着两个 1 × 1 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 W×H的feature map,共可以产生 W × H × k W×H×k W×H×k个anchors。
sliding window对应了很大的一块感受野,感受野的计算可以参考:https://iphysresearch.github.io/posts/receptive_field.html
每个sliding window,最终会对应 2 × k 2×k 2×k个scores和 4 × k 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)
L({pi},{ti})=Ncls1ΣiLcls(pi,pi∗)+λNreg1Σipi∗Lreg(ti,ti∗)
这其中
Σ
i
L
c
l
s
(
p
i
,
p
i
∗
)
\Sigma_iL_{cls}(p_i,p_i^\ast)
ΣiLcls(pi,pi∗)为分类损失函数部分:
i i i为mini-batch中的第 i i i个anchor;
p i p_i pi表为i个anchor为object即label=1的概率;
p
i
∗
p_i^{\ast}
pi∗为实际的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) ΣiLreg(ti,ti∗)为坐标回归损失函数部分:
t i t_i ti为第i个anchor的坐标变换预测值;
t i ∗ t_i^{\ast} ti∗为第i个anchor的实际坐标变换,具体求解方法参见R-CNN论文中的介绍方法,只不过现在的坐标换成了中心点坐标;
p i ∗ L r e g p_i^\ast L_{reg} pi∗Lreg为只有positive anchor(label=1)时,才计算回归损失,这里跟Fast R-CNN中的 [ u ≥ 1 ] [u\ge1] [u≥1]效果相同。
损失函数中还包含正规化部分:
N c l s N_{cls} Ncls为分类损失的正规化系数,代表了mini-batch size的数值;
N r e g N_{reg} Nreg为回归损失的正规化系数,代表了anchor location的数量,不是anchor的数量;
λ \lambda λ为平衡系数,默认 λ = 10 \lambda=10 λ=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训练模式
本文提出了三种训练模式:
-
交替训练。这也是本文采用的训练方式。对于这种训练模式,先训练RPN,然后训练Fast R-CNN,然后用训练好的Fast R-CNN训练RPN,并迭代这个过程;
-
近似的联合训练过程。对于这种训练模式,RPN和Fast R-CNN是一起训练的。对于前向传播过程,相当于固定proposals,在反向传播过程中,共享的卷积层相当于叠加了来自RPN损失函数和Fast R-CNN的损失函数。但是这样的训练模式相当于忽略了Fast R-CNN对RPNproposals的反向传播过程(个人理解);
-
非近似联合训练过程。这样的训练过程改进了第2种训练模式中的问题,通过调整RoI layer来加入box坐标梯度的影响。
具体来讲,第一种训练模式为4步训练:
- 首先按照RPN的训练方式进行训练,前面的卷积层还是采用ImageNet-pre-trained模型;
- 采用第一步的RPN模型产生proposals,来对Fast R-CNN进行训练,在这一步两边的ImageNet-pre-trained model不同,因此conv层还没有共享;
- 用第2步训练好的detector network来初始化RPN前面的conv层,来对RPN进行训练,只对RPN特有的卷积层进行训练,前面共享的conv层的参数需要固定不变;
- 使用3中的模型,并固定住前面shared conv layer的参数及RPN的参数,只调节Fast R-CNN的特有的参数(RoI层等)
- 上述的过程可以进行迭代,但效果有限,因此没必要。从中可以看到,最终网络使用的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训练流程(按照训练模式一)
-
输入一张固定scale的图片,进入ImageNet-pre-trained model,产生feature map;
-
sliding window在feature上滑动,会对应产生一系列的anchors,通过跟真实box的比较,通过IoU为每个anchor打上label,从中挑选出等比例且不通过边缘的正负anchors形成mini-batch;
-
将mini-batch挑选出的anchors计算其coordinates真值并每个anchors找到对应的sliding windows,每个均形成一个lower-dimensional vector,将这些vectors输入到后面的n×n conv layer和及cls层和reg层;
对这一步有一些疑问:如果有几个anchors来自一个sliding window,那么得到的vector肯定是相同的,这样mini-batch中估计有不少重复数据,实际是这样的吗?
-
计算cls的损失函数及reg的损失函数,并开始反向传播,迭代输入图片这个过程完成RPN的训练;
-
在这步开始进行Fast R-CNN的训练。同样使用一个ImageNet-pre-trained model,输入图片,生成feature map,并通过上面产生固定参数的RPN产生proposals,并为每个proposals;
-
将proposals对应的feature map提取出来,输入到RoI池化层并通过classifier分类器进行损失函数的计算,并进行反向传播,迭代这个过程完成对Fast R-CNN的训练;
-
将6中的网络拿来再按照RPN训练步骤训练RPN,只修改RPN特有的参数;
-
将7中的网络拿来再训练Fast R-CNN的detection部分,只单独修改detection特有的参数;
-
至此完成整个Faster R-CNN的训练。
4.2预测流程
- 向Faster R-CNN网络输入一个image;
- image通过shared conv layer产生feature map;
- 通过一个sliding windows在feature map上进行滑动,每个sliding windows的中心点都会对应k个anchor(不同的scales和ratios);
- 每个sliding windows可以通过RPN对应产生一个lower-dimensional feature vector;
- 这个feature vector对应产生2k个scores(代表是否是object)和4k个coordinates(k个anchor对应的坐标);
- 对所有计算完成cls scores的anchors进行NMS;
- 在NMS之后进行top-N ranked选择出最终的proposals;
- 将proposals输入到detection的部分进行分类,输入最终的类别概率及对应的region。
5.提高mAP的策略
- 共享卷积层参数。共享卷积层参数比不共享的mAP要高;
- region proposals method。采用RPN比SS的mAP要高;
- 采用更好的网络。前面采用VGG Net比ZF网络的mAP要高;
- 增加数据。采用多数据源的数据能提高mAP,比较明显;
- anchors的数量。anchors数量多可提高mAP,其中scale的影响比较明显;
- 超参数 λ \lambda λ的选择。影响不是很大;
https://blog.csdn.net/williamyi96/article/details/77648047#comments 这篇博客里写的内容也很详细