Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
NIPS 2015 Matlab code: https://github.com/ShaoqingRen/faster_rcnn Python code: https://github.com/rbgirshick/py-faster-rcnn
本文是沿着 R-CNN 目标检测路线,在 Fast R-CNN 基础上,使用一个网络完成卷积特征提取,候选区域提取,区域分类,坐标回归。基本满足快速准确的检测物体这个需求。
分析 Fast R-CNN 检测系统,主要问题集中在候选区域提取,这个步骤导致了整个系统的速度比较慢。再就是候选区域提取和后面的分类系统是分离的。在 Faster R-CNN 中,我们提出了一个Region Proposal Networks (RPNs), 将其嵌入到 Fast R-CNN 中,完美的解决了候选区域提取这个问题。
我们观察到在 Fast R-CNN 中检测器的输入是 卷积特征图,该卷积特征图可以用于产生候选区域。在卷积特征图上,我们通过加入几个卷积层构建一个 RPN 小网络,在卷积特征图每个位置上用RPN 同时区域边界回归和目标置信度计算。 这个 RPN 是一个全卷积网络,对于候选区域提取可以实现端对端训练。
RPN 是怎么解决物体尺度和长宽比问题的了? 以前的方法要么使用金字塔图像 或者 金字塔滤波器来解决。 这里我们提出了一组 anchor 框来解决该问题,这些anchor 框 具有不同尺度和长宽比,在检测时,我们将这些 anchor 框 当做模板,在卷积特征图上进行模板匹配。如下图所示:
为了将 RPN 和 Fast R-CNN 统一起来,我们提出了一个交替训练方案,即交替微调候选区域提取和目标检测。
下面来看看网络的具体结构图:
从上图我们可以看出 RPN 和 RoI pooling 两个共用了一个卷积特征图,在 ZF 模型中 共享了5个卷积层,在 VGG-16 模型中共享了13个卷积层。
3.1 Region Proposal Networks 为了产生候选区域,我们在最后一个共享卷积层输出的卷积特征图上滑动一个小的网络,这个小网络的输入是卷积特征图上的 3*3 区域,该网络将每个滑动 窗口 (3*3区域)映射到一个低维特征向量(ZF 对于256维, VGG 对应512维)。再将该特征分别输入到两个兄弟全链接层,一个是 box-regression layer (reg),对应框的位置回归,另一个是 box-classification layer (cls),判断该区域是否包含物体。这里我们使用 n=3,注意在卷积特征图中3*3区域 对应 输入图像的区域是很大的。(ZF 是 171*171,VGG 是 228*228)。这个小网络在某一位置的示意图如下图左边所示:
注意这个小网络是以滑动方式运行的,所以上面的两个全链接层对于卷积特征图上所有位置来说是共享的。这个架构在实际实现中就是 n×n 卷积层后面跟着两个 1× 1 的卷积层, 对应 reg 和 cls。
3.1.1 Anchors
在每个滑动窗口位置,我们预测 k 个候选区域, reg layer 有 4k 个输出来解析 k 个矩形框所有坐标,而 cls layer 则有 2k 用于估计该候选区域是物体或不是物体的概率。注意这里的 k 个候选区域对应了 k 个模板矩阵框,这里我们称之为 anchors , 每个模板对应一个 特定的 scale and aspect。 这里我们设置了 3个尺度 ,3个长宽比,在每个滑动位置一共有9个 anchors ,即9个模板。
Translation-Invariant Anchors 我们的方法具有一个重要的属性,那就是平移不变性。当图像中的物体发生移动时,对应的候选区域也会发生移动。这种平移不变性可以减小模型尺寸。
The design of multiscale anchors is a key component for sharing features without extra cost for addressing scales. 使用多个尺寸的模板anchors 是解决尺度问题中共享了特征但没有增加额外的计算量的关键所在。