目标检测算法总结(3)——Faster RCNN

目标检测算法总结(3)——Faster RCNN

  • 算法步骤
  • RPN
    • anchor boxes
    • 正样本与负样本
    • RPN损失函数
  • 总结
  • 参考:

在RCNN与Fast RCNN之后,它们的作者Ross又推出了“Faster RCNN”,进一步提升了速度与准确率,并在2015年的coco等多个竞赛中夺魁。

算法步骤

首先回顾下Fast RCNN的步骤:
——在图像上使用Selective Search生成1k~2k个候选区域
——将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵。
——将每个特征矩阵通过ROI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

而下面是Faster RCNN的步骤
——将图像输入网络得到相应的特征图
——使用RPN生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
——将每个特征矩阵通过ROI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
目标检测算法总结(3)——Faster RCNN_第1张图片

对比来看,可以发现Faster RCNN相比较Fast RCNN的区别在于候选区域的生成方法,Fast RCNN继承自RCNN,使用的依旧是传统的机器学习的SS算法,而Faster RCNN使用的则是RPN,那么下面就将重点介绍RPN

RPN

RPN,全称:RegionProposal Network,可翻译成区域生成网络 ,是Faster RCNN的核心。

目标检测算法总结(3)——Faster RCNN_第2张图片
上面是原论文中有观RPN的图像说明。从下到上的步骤如下:
首先在已经生成的特征图(conv feature map)上使用滑动窗口(sliding window),得到一个一维向量作为中间层(intermediate layer),图片中输出的维度(256-d)由所使用的卷积网络确定。接着我们将intermediate layer连接全连接层得到了目标概率(2k scores)边界框回归参数(4k coordinates)

anchor boxes

当我们在特征图上选取了一点后,我们会在对应位置的原图像上生成Kanchor boxes,k在原论文中给出的数字为9,3种比例的anchor(1:1、1:2、2:1)*3种不同的面积( 12 8 2 , 25 6 2 , 51 2 2 128^2,256^2,512^2 1282,2562,5122),共计9种。
目标检测算法总结(3)——Faster RCNN_第3张图片
RPN所生成的2k个目标概率4k个边界框回归参数k个anchor boxes刚好是相互对应的。
目标检测算法总结(3)——Faster RCNN_第4张图片
目标概率以两个为一组表示这个anchor是背景不是背景的概率。
回归参数以4个为一组,表示anchor修正的偏移量,使修正后的anchor能更准确的框出目标。

对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略掉跨越边界的anchor以后,剩下约6k个anchor。将这6k个anchor调整成6k个候选框,对于RPN生成的候选框之间还存在大量重叠,基于候选框的cls得分,采用非极大值抑制,把IoU设为0.7来筛选候选框,这样每张图片只剩2k个候选框。

正样本与负样本

在训练的过程中,会挑选正负样本进行训练,用于训练RPN网络的正负样本,在在所有的anchor的基础上进行筛选,而用于之后的Fast RCNN网络训练的候选框则是在挑选的2k个候选框上筛选。论文中在用于训练Fast RCNN的样本数量大概为256,正负比(有目标:背景)为1:1。筛选的标准为proposals(候选框)与ground truth(真实边界框)的iou。

RPN损失函数

RPN本身是神经网络,所有其也有相应的损失函数,公式如下:

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(\lbrace p_{i} \rbrace, \lbrace t_{i} \rbrace )=\cfrac{1}{N_{cls}} \sum\limits_{i} L_{cls}(p_{i},p_{i}^*)+\lambda\cfrac{1}{N_{reg}} \sum\limits_{i}p_{i}^* L_{reg}(t_{i},t_{i}^*) L{pi},{ti}=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)

1 N c l s ∑ i L c l s ( p i , p i ∗ ) \cfrac{1}{N_{cls}} \sum\limits_{i} L_{cls}(p_{i},p_{i}^*) Ncls1iLcls(pi,pi)分类损失 λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) \lambda\cfrac{1}{N_{reg}} \sum\limits_{i}p_{i}^* L_{reg}(t_{i},t_{i}^*) λNreg1ipiLreg(ti,ti)回归损失

p i p_{i} pi:第i个anchor预测为真实标签的概率。
p i ∗ p_{i}^* pi: 正样本为1,负样本为0
t i t_{i} ti:第i个anchor的边界框回归参数
t i ∗ t_{i}^* ti:第i个anchor对应的GT box(真实的目标框),其公式如下:
t i = [ t x , t y , t w , t h ] , t i ∗ = [ t x ∗ , t y ∗ , t w ∗ , t h ∗ ] t_{i}=[t_{x},t_{y},t_{w},t_{h}], t_{i}^*=[t_{x}^*,t_{y}^*,t_{w}^*,t_{h}^*] ti=[tx,ty,tw,th],ti=[tx,ty,tw,th]
t x = ( x − x a ) / w a , t y = ( y − y a ) / h a t_{x}=(x-x_{a})/w_{a},t_{y}=(y-y_{a})/h_{a} tx=(xxa)/wa,ty=(yya)/ha,
t w = l o g ( w / w a ) , t w = l o g ( h / h a ) t_{w}=log(w/w_{a}),t_{w}=log(h/h_{a}) tw=log(w/wa),tw=log(h/ha)

t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a t_{x}^*=(x^*-x_{a})/w_{a},t_{y}^*=(y^*-y_{a})/h_{a} tx=(xxa)/wa,ty=(yya)/ha,
t w ∗ = l o g ( w ∗ / w a ) , t h ∗ = l o g ( h ∗ / h a ) t_{w}^*=log(w^*/w_{a}),t_{h}^*=log(h^*/h_{a}) tw=log(w/wa),th=log(h/ha)

N c l s N_{cls} Ncls表示一个mini-batch中所有的样本数量(论文为256)
N r e g N_{reg} Nreg表示anchor位置的个数约2400.

将分类损失视作多重分类时 L c l s = − l o g ( p i ) L_{cls}=-log(p_{i}) Lcls=log(pi),此时分类参数为2k个。但因为只判定是否有目标,可以视作二非类,也就是只有k个分类参数,此时 L c l s = − [ p i ∗ l o g ( p i ) + ( 1 − p i ∗ ) l o g ( 1 − p i ) ] L_{cls}=-[p_{i}^*log(p_{i})+(1-p_{i}^*)log(1-p_{i})] Lcls=[pilog(pi)+(1pi)log(1pi)]

回归损失的计算与之前Fast RCNN的计算是相类似的。
L r e g ( t i , t i ∗ ) L_{reg}(t_{i},t_{i}^*) Lreg(ti,ti)= ∑ i s m o o t h L 1 ( t i u − v i ) \sum\limits_{i} smooth_{L1}(t^u_{i}-v_{i}) ismoothL1(tiuvi)
s m o o t h L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ = 0.5 其 余 情 况 smooth_{L1}(x)=\left\{ \begin{aligned} 0.5x^2 \quad if|x|<1 \\ |x|=0.5 \quad 其余情况 \end{aligned} \right. smoothL1(x)={0.5x2ifx<1x=0.5

在原论文中,RPN和Fast RCNN是分别训练的,但目前采用的方法多是联合训练,损失函数也是两个网络的联合函数。

总结

Faster RCNN将生成候选框也融合进CNN中,实现了端到端的训练,至此RCNN发展的一个阶段完成。除了RCNN,目标检测领域还活跃不少其他系列的算法,但时至今日,RCNN系列算法依旧是在目标检测的主流领域占据一席之地,并不断出现新的成员。我想,对于算法工程师,RCNN依旧是有必要理解的目标检测算法之一。

参考:

https://www.bilibili.com/video/BV1af4y1m7iL?p=3

你可能感兴趣的:(神经网络)