背景

2015年 Faster-RCNN 首次使用深度学习网络将视觉目标检测任务端到端 Learning 化,核心工作是其中的 RPN 设计替代了传统的 Selective Search 来生成候选框。本文参考原始论文实现记录一些关键细节。

Region Proposal Network

预处理后的图像经过主干网络后得到高层语义特征 $F_b$,然后其输入 RPN 网络,输出是一系列区域候选框以及其对应的置信度得分。如何得到区域候选框呢?对主干网络生成的特征图使用nxn的卷积进一步提取特征来模拟滑动窗口(nxn 可以反推感受野的范围);之后使用1x1的卷积来聚合 channel 维度的信息得到 RPN 的特征图 $F_r$,进而预测框的偏移量和分类置信度。

Anchor

锚点示例

具体到预测框的偏移量如何计算?文章创新性地提出了 Anchor(锚点)的概念。具体来说, 特征图 $F_r$ 的大小为NxHxW,其中N为batch_num,在每个位置预设k个不同大小、比例的2D框模板, 每个位置预测k个相对于 anchor 的偏移量,即NxHxWx4k维的输出,偏移量加上原始 anchor 的位置大小则可以得到最终的预测框; 另外还有NxHxWx2K维用于预测 anchor 对应框的二分类置信度得分。 Anchor可以理解为利用了残差的原理,从 ResNet 到 Low-level 图像处理,一般的认知是残差 Residual 的学习难度要低于原始信号。(ps: 也可以联想 Fourier 级数,从低频到高频不断叠加逼近原始信号)

FasterRCNN 中的 anchor 是定制的,3个尺度3个比例,其中尺度是在预处理图像上 GT 对应的尺度,而不是经过主干网络缩放后的特征尺度,这样便于生成更准确的学习目标。Anchor 的设定会影响学习 RPN 网络参数时正负样本的匹配情况,如果 Anchor 与 GT 匹配的规则设置不合理,可能导致部分类别的正样本无法被匹配到进而无法参与学习,所以如果自行聚类 anchor 训练时要检查正样本的匹配分布。Anchor 与正负样本匹配选择的方法要单独再起一篇文章介绍。

多尺度Anchor。Anchor的不同尺度是为了解决多尺度检测问题,当然特征的多尺度可能对检测可能更有效,这也是后续 FPN/PAN 等 Neck 结构设计的初衷。

平移不变性。如果输入图像平移,输出的 anchor 回归量也会产生相应的平移,即平移不会影响检测结果,主要原因是卷积操作对于平移是不变的。当然平移有一个限度,就是特征缩放的尺度。

损失函数

RPN 正样本的选择规则:

(i) 与 GT box 的 IoU 得分最大的 anchor,
(ii) 与 GT box 的 IoU 大于 0.7 的 anchor.

注意:一个 GT 框可能与多个 anchor 之间都满足这个关系,不同的是 Yolov3 只将 GT 所在 feature 坐标对应的 anchor 设置为正样本;负样本是与 GT 的 IoU 得分都小于 0.3 的 anchor。正负样本的个数大约限制在256,正负样本比例1:1/3:1,正样本不足时负样本填充。

正负样本都会参与分类损失的计算,只有正样本参与回归损失的计算,总的损失函数如下:

$$ L(p_{i}, t_{i}) = \frac{1}{N_{cls}}\sum{L_{cls}(p_i, p_i^{*})} + \lambda \frac{1}{N_{reg}}\sum{L_{reg}(t_i, t_i^{*})} $$

其中 $N_{cls}$ 是所有参与正负样本分类的样本个数,$N_{reg}$ 是只参与区域候选框回归的正样本个数,$L_{reg}$ 是 smooth-l1 损失,l1 loss 约束求解更偏向稀疏解,smooth 是将0点不可导位置用可导的 l2损失替换,增加梯度的稳定性。

另外回归量的计算方式如下:

$$ t_x = (x - x_a)/w_a $$

$$ t_w = log(w/w_a) $$

位置是计算相对于 anchor 的偏移量,再除以 anchor 的宽度得到相对量,使得损失范围可控简化学习难度,相反绝对量取值范围不可控;同理,长宽的学习是计算与 anchor 大小的相对量,然后使用log函数将比值大小按1进行区分,降低大比值的预测值范围。

实验部分(TODO)

参考链接

原始文章