1 摘要
- 目前大家不爱用特征金字塔,理由是巨大的计算和存储花费
- 我们提出了一个多层次不同scale的卷积神经网络以很少的cost来建造特征金字塔。称作FPN
- 我们的网络结合Faster RCNN取得了COCO2016的最佳效果
2 引入
2.1 featurized image pyramids
下图(a)表示的就是基于图像的特征金字塔,这是在对每一scale的图像分别进行特征提取,当然在检测时,可以对每一个维度都进行测试。这是手工设计特征领域很常见。Imagenet和coco最近表现比较好的测试都采用了featurized image pyramids.采用这个方法的优点就在于每一个scale的图片都具有很强的语义信息,包括在高分辨率上也是如此。但是一个很明显的缺点就在于在inference time上花费巨大,在训练上的内存也是如此,使得在实际应用中不切实际。假如说也是在最终的test才使用fip,那么又会和训练时的效果差距很大,fast rcnn和faster rcnn也是因为如此才没有使用这个。
2.2 SSD(single shot detector)
- 第一个尝试采用deep conv作为特征金字塔表示的方法(高分辨率的feature map表示了细节的特征,深层次的feature map表示了语义信息),如上图c所示。
- SSD类型的金字塔会reuse在前向传递中所计算出来的不同尺度上的feature map.因此没有多余的cost但为了避免使用低级功能,SSD放弃重新使用已经计算的层,而是从网络中的高位开始构建金字塔(例如,VGG网络的conv4 3 [36]),然后再添加几个新层。 因此,它错过了重用特征层次结构的更高分辨率地图的机会。 我们证明这些对于检测小物体很重要。
2.3 this paper
- 目的是建立一个可以结合高分辨率细节特征和低分辨率强语义特征的金字塔结构,但是是可以在比较短的时间上完成,上图(d)所示。
- 和目前的一些主流的也采用“top-down”结构不同的是,他们是为了得到一个特征信息丰富的feature-map,并且在这上面做预测,而我们则是会在每个scale上都进行预测。
- without bells and whistles,作者仅仅只采用了fast RCNN和FPN就做到了coco2016冠军。
- 该网络也很容易移植到一些实例分割等任务上。
- 我们采用端到端的所有将会在训练和测试时使用的scale,如果对于image-pyramids来说是Memory-infeasible的。
2.4 相关工作
2.4.1 人工特征和早期的神经网络
- SIFT(Scale-Invariant Feature Transform)是最初用于空间极值出进行特征提取,再用于特征点匹配的。HOG和后面出现的SIFT也是如此.
2.4.2 深度卷积目标识别器
- 近几年的overfeat和R-CNN很可。
- R-CNN系列为改进都是two-stage的,但是为了权衡识别准确率和效率,都只采用了一个尺度的信息。但是不得不承认的是mutli-scale是效果更好的,尤其是对于那些小物体来说。
2.4.3 采用multiple layers的方法
- FCN对每个局部区域在所类别上得分的求和来做分割任务。
- Hypercolumns 借助一个类似的方法来进行实例分割任务。
- SSD 和 MS-CNN在多尺度上对图像进行预测,而不是对得分的综合。
- 近期的一些采用跳跃连接的方式可以很好的整合高分辨率时的特征,比如UNET,sharp-mask。
3 特征金字塔
- 目的:同上所讲的
- 输入是单一的任意大小的图片,输出是不同层级不同比例的输出。
- 和骨架网络是独立开的
- 金字塔结构包括一个bottom-up 通路和一个 top-down通路和一些lateral 连接组成。
3.1 bottom-up pathway
- 就是backbone convnet的前向推进层,每一层次都以2的裁剪倍数减小的feature map。计算出一个多尺度的特征图结构。
- 经常会产生很多大小一样的feature map,但是我们把这些都称作同一个stage。在我们的金字塔里,每一个金字塔层级就是一个stage。我们将同一stage的最后一个feature map 作为参考的特征图。
- 本文对resnets,我们采用每一个残差Block所被激活后的输出作为特征。我们把它们记做 c 2 , c 3 , c 4 , c 5 c_2,c_3,c_4,c_5 c2,c3,c4,c5分别是第conv2到conv5层的输出。注意到他们分别具有的strides为 { 4 , 8 , 16 , 32 } \{4,8,16,32\} {4,8,16,32}和输出初始的图像相比来说。
3.2 top-down pathway and lateral connections.
- 看似高分辨率,实际上具有很强的语义信息,这些信息通过lateral connection与来自bottom-up方向上的相同scale的feature map融合。如下图所示:
- 如下图,对每一个merge后的网络,我们都采用一个 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3的核来产生最后的feature map。称之为 { P 2 , P 3 , P 4 , P 5 } \{P_2,P_3,P_4,P_5\} {P2,P3,P4,P5}
4 应用
- 应用在RPN和R-CNN上,采用最小的改动证明有效性。
4.1 FPN for RPN
- 原始的RPN网络是在单个feature map上采用密集的 3 ∗ 3 3*3 3∗3滑动窗口来实现二分类任务或者是BBox的回归。
- 将RPN的feature map替换FPN的输出来进行操作,如上图,和之前的RPN一样的操作是出来的feature map先接一个 3 ∗ 3 3*3 3∗3的conv,和两个sibling的 1 ∗ 1 1*1 1∗1的conv。但是对于每一个scale的feature map。定义了不同大小的archor。一共一个金字塔有15个archor,因为每个archor的比例是 { 1 : 2 , 1 : 1 , 2 : 1 } \{1:2,1:1,2:1\} {1:2,1:1,2:1},对于层次 { P 2 , P 3 , P 4 , P 5 } \{P_2,P_3,P_4,P_5\} {P2,P3,P4,P5}分别对应一个大小不同的archor。
- label采用IOU,假如大于0.7,那么就是说我们可以认为是positve的,如果是小于0.3,那么就是negative的。注意这里的IOU是和任意一个ground truth的BBOX都算。就这么一点点改进,没了。
4.2 FPN for Fast R-CNN
- Fast rcnn采用了那个ROI pooling,因此我们呢需要对ROIs做scale来适应我们的金字塔层级。
- 我们采用一个公式来选取我们的feature-map。这里不细讲了。在R-CNN系列后面的mask-rcnn的PRN讲了