论文链接: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,从而确定具体的类别及相应的置信度。整个系统形成一个单一且同一的目标检测网络。
对于Faster R-CNN,最重要的技术无疑是非常新颖的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,从而大致平衡分类损失和回归损失。
1:1
,如果正样本的数量小于128,那么剩下的用负样本填充;本文提出了三种训练模式:
交替训练。这也是本文采用的训练方式。对于这种训练模式,先训练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的最终目的只是产生Region proposals,并不会对object进行具体的分类,计算具体类置信度的任务属于Fast R-CNN detection。RPN向Fast R-CNN detection的输出是一系列具有是否为object标记及经过reg调整后的proposals,RPN所使用的分类器并没有对object进行分类,只是用来计算anchor是否是object。最终由Fast R-CNN对具体类别进行计算,并再次对proposals进行回归校准。
输入一张固定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的训练。
https://blog.csdn.net/williamyi96/article/details/77648047#comments 这篇博客里写的内容也很详细