Fast R-CNN提出后,RP的生成成为了计算瓶颈(SS在CPU下需要2s)。Faster R-CNN中的RPN网络就是解决这个问题。
RPN
用n * n(3 * 3)大小的窗口在conv 特征映射上滑动,每个窗口生成一个低维向量(256-d for ZF and 512-d for VGG)。这向量后接两个并行的全连接层,一个是分类层(2k维,2类,9个anchor),一个是回归层(4k维,(k=9, 3 * 3, 3尺度,3长宽比))
由于窗口是滑动的,参数也是共享的,所以整个过程可以用全卷积来实现:
conv(3,3,512,1) -> conv(1,1,18,1)和conv(1,1,36,1)
损失函数
p是预测的包含物体的概率值,p*=1 if anchor 是正 else 0称anchor是正的,若与某个GT的IOU是最高的或大于0.7;
称anchor是负的,若与所有的GT的IOU都小于0.3;
其余的anchor非正非负,损失函数不计算这些anchor。
注意这个和Fast R-CNN的定义不一样。
Ncls=256(batch size), Nreg~2400(anchor size),λ=10,Lreg=R(t-t*),R是Smooth L1.
优化
每个batch(256)的anchor都来自同一张图片,正:负 = 1:1,如果正样本少于128,则用负样本补足。
Faster R-CNN训练
1. RPN训练
2. 使用RPN得到的框训练Fast R-CNN
3. 将Fast R-CNN的卷基层权重赋予 RPN的卷基层权重,只调整RPN独有层权重。
4. 固定Fast R-CNN的共享层, 只FT全连接层权重。
实现细节
1. 将同比例放到图片,使得最短边s = 600。
2. 出于速度和准确率的权衡,训练和测试都是单尺度的。
3. 三尺度(128 * 128,256 * 256, 512 * 512),三长宽比(1:1, 1:2, 2:1)。对于尺度大于感受野,文中的解释是:人能在物体中部可见的情况下,大致推断出该物体的类别
4. 训练时不考虑超出边界的anchor,因为如果把这些anchor加到loss里,会导致训练不收敛。测试的时候如果anchor超出边界,就把它们裁剪至边界。
5. 对RPN提出的RP进行NMS,阈值是0.7,这样就剩下2K左右的RP,然后取top-N(300)来检测。
实验
参考文献
2. Fast R-CNN
网友评论