算法过程(RPN+Fast R-CNN)
- 将图像输入网络得到相应的特征图
- 使用RPN结构生成后选矿,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过RoI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
将图像输入网络得到相应的特征图
与Fast R-CNN第一步相同
使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
RPN结构
-
2k scores:一个anchor对应两个概率,一个是前景的概率,一个是背景的概率。如下图cls所示,每两个格子对应一个anchor,第一个格子表示为
背景
的概率,第二个格子表示为前景
的概率。 -
4k coordinates:每个anchor会生成4个边界框回归参数。如下图所示,在reg中每四个对应一个anchor,分别表示
中心点的x、y坐标
以及边框的长和宽
。
-
256-d:将ZF作为backbone时,该网络生成的特征图的channel是256。如果使用VGG-16的话,就是512
-
anchor:滑动窗口中心点在原图对应的位置,然后以该位置为中心,画出k个anchor box。每个位置(每个滑动窗口)在原图上都对应有3x3=9个anchor
- 三种尺度(面积): { 12 8 2 , 25 6 2 , 51 2 2 } \left \{ 128^2, 256^2, 512^2 \right \} {1282,2562,5122}
- 三种比例: { 1 : 1 , 1 : 2 , 2 : 1 } \left \{1:1, 1:2, 2:1 \right \} {1:1,1:2,2:1}
-
cls:第一个是背景的概率,第二个是前景的概率。每个位置会生成2x9=18个cls
-
reg:每个位置会生成4x9=36个reg
-
感受野:对于ZF网络是171,对于VGG网络是228
根据以上知识点,对于一张1000x600x3的图像,大约有60x40x9(20K)个anchor,忽略跨越边界的anchor以后,剩下约6K个anchor。对于PRN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大抑制
,IoU设为0.7,这样每张图片只剩2K个候选框。
只采用256个anchor(由正样本和负样本1:1组成,如果正样本不足128个,则由负样本补足)
- 正样本:anchor与ground-truth box的IoU值大于0.7,或者拥有最大IoU的anchor
- 与所有的ground-truth box的IoU值小于0.3
滑动窗口其实就是3x3的卷积层,步长为1,padding为1,通过该卷积层获得的特征矩阵和原来的feature map尺寸一样。
将每个特征矩阵通过RoI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
loss function
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\left (\left \{p_i \right \}, \left \{t_i \right \}\right )=\frac{1}{N_{cls}}\sum_{i}L_{cls}(p_i,p^*_i)+\lambda\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*) L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(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的边界框回归参数
- N c l s N_{cls} Ncls表示一个mini- batch中的所有样本数量256
- N r e g N_{reg} Nreg表示anchor位置的个数(不是anchor个数)约2400
- λ \lambda λ通常取10
由于 λ 1 N r e g = 1 240 \lambda\frac{1}{N_{reg}}=\frac{1}{240} λNreg1=2401,所以有时也将这两项合并求解。
分类损失
多分类
L c l s = − log ( p i ) L_{cls} = -\log (p_i) Lcls=−log(pi)
- p i p_i pi表示第i个anchor预测为真实标签的概率
- p i ∗ p^*_i pi∗当样本正证样本时为1,当为负样本时为0。
以下图为例,上方的1011表示预测为真实标签的情况,1表示为前景,0表示为背景。第一个anchor的损失为
−
ln
(
0.9
)
-\ln(0.9)
−ln(0.9),第二个anchor的损失为
−
ln
0.2
-\ln0.2
−ln0.2。注意:
不是
−
ln
0.8
-\ln0.8
−ln0.8
二分类
L c l s = − [ p i ∗ log ( p i ) + ( 1 − p i ∗ ) log ( 1 − p i ) ] L_{cls}=-[p_i^*\log(p_i)+(1-p_i^*)\log(1-p_i)] Lcls=−[pi∗log(pi)+(1−pi∗)log(1−pi)]
- p i p_i pi表示第i个anchor预测为真实标签的概率
- p i ∗ p^*_i pi∗当样本正证样本时为1,当为负样本时为0。
以下图为例,第一个损失为
−
ln
(
0.9
-\ln(0.9
−ln(0.9,第二个的损失为
−
[
(
1
−
0
)
ln
(
1
−
0.2
)
]
=
−
ln
0.8
-[(1-0)\ln(1-0.2)] =-\ln0.8
−[(1−0)ln(1−0.2)]=−ln0.8……以此类推。
边界框回归损失
L
r
e
g
(
t
i
,
t
i
∗
)
=
∑
i
s
m
o
o
t
h
L
1
(
t
i
−
t
i
∗
)
L_{reg}(t_i,t_i^*)=\sum_ismooth_{L_1}(t_i-t_i^*)
Lreg(ti,ti∗)=i∑smoothL1(ti−ti∗)
s
m
o
o
t
h
L
1
(
x
)
=
{
∣
x
∣
−
0.5
,
o
t
h
e
r
w
i
s
e
0.5
x
2
,
i
f
∣
x
∣
<
1
smooth_{L_1}(x)=\left \{ ^{0.5x^2,if \left | x \right |<1}_{\left | x \right |-0.5,otherwise} \right.
smoothL1(x)={∣x∣−0.5,otherwise0.5x2,if∣x∣<1
- 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]
- t i ∗ = [ t x ∗ , t y ∗ , t h ∗ , t w ∗ ] t_i^*=[t_x^*,t_y^*,t_h^*,t_w^*] ti∗=[tx∗,ty∗,th∗,tw∗]
- p i ∗ p^*_i pi∗当样本正证样本时为1,当为负样本时为0
- t i t_i ti表示预测第i个anchor的边界框回归参数
-
t
i
∗
t_i^*
ti∗表示第i个anchor对应的GT Box的回归参数
训练
方法1:直接采用RPN Loss+Fast R-CNN Loss的联合训练方法(推荐)
方法2:原论文的方法(麻烦,不推荐)
总结
参考资料:良心视频