基于region proposal 的目标检测算法可以分为一下四部分:候选区域生成,特征提取,分类,位置精修。R-CNN 中每一步单独处理,存在大量的重复计算,计算效率低,fast R-CNN对此进行了改进,将特征提取,分类,位置精修整合到一个网络,检测过程的速度得到巨大提升,暴露出来候选区域生成成为了计算瓶颈。现有的候选框生成方法(selective search,edgebox)都是在CPU中计算,不能利用GPU固有优势,即使在GPU实现这样的算法,也不能share computation。作者提出了Region Proposal Network(RPN)来生成候选框,底层卷积层共享计算,效率更高,速度更快。
对于最后一个conv feature map,首先过一个n=3的卷积,之后连接两个子1*1的卷积,分别对该位置进行分类与坐标预测。分类层(cls-score)输出每一个位置上,9(3种面积,3种长宽比)个anchor属于前景和背景的概率;窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数。 对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。就局部来说,这两层是全连接网络;就全局来说,由于网络在所有位置(共51*39个)的参数相同,所以实际用尺寸为1×1的卷积网络实现。
# define the convrelu layers processing input feature map
self.RPN_Conv = nn.Conv2d(self.din, 256, 3, 1, 1, bias=True)
# define bg/fg classifcation score layer
self.nc_score_out = len(self.anchor_scales) * len(self.anchor_ratios) * 2 # 2(bg/fg) * 9 (anchors)
self.RPN_cls_score = nn.Conv2d(256, self.nc_score_out, 1, 1, 0)
# define anchor box offset prediction layer
self.nc_bbox_out = len(self.anchor_scales) * len(self.anchor_ratios) * 4 # 4(coords) * 9 (anchors)
self.RPN_bbox_pred = nn.Conv2d(256, self.nc_bbox_out, 1, 1, 0)
anchor 标定
考察训练集中的每张图像:
损失函数
作者对比了多种训练预测方法,其中共享卷积的ZF网络结果最好,有多于1%mAp的提升。
速度上ZF网络可以达到17fps,相比于Fast RCNN的0.5fps,得到了很大的提升。
当proposal数量下降到300时, RPN性能基本不变,但是SS,EB却需要大量的Proposal支撑。