论文:Feature Pyramid Networks for Object Detection
Github:https://github.com/facebookresearch/deepmask
cvpr2017,凯明的大作
论文提出多尺度的物体检测算法,特征金字塔Feature Pyramid Network (FPN) 。原来多数的物体算法都是只采用顶层特征做预测,像faster RCNN系列,但是低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,像EAST,而本文不一样的地方在于预测是在不同特征层独立进行的,从而充分利用了不同尺度的特征信息。FPN测试速度6FPS在GPU上。
论文基于faster RCNN修改基础backbone为FPN进行检测操作,修改deepmask做分割操作。
最终使得检测的RPN模块Average Recall (AR) 提高8个点,物体检测在COCO数据集上Average Precision (AP) 提升2.3个点,VOC上提升3.8个点。
(a)图片金字塔,基于不同尺度的图片提取特征,像传统的sift,hog等特征
(b)基于最后一层的特征做预测,像faster RCNN系列
(c)基于不同尺度的特征层分别做预测,像ssd
(d)基于不同尺度的特征层预测,并且带有由顶层到底层的特征融合,本文的FPN
上图:具有从顶层到底层的特征融合,但是只在最后一个融合的特征层做预测,代表作EAST。
下图:本文的FPN结构,每个scale尺度都有预测。
ResNet结构:
FPN结构:
FPN网络采用Resnet结构,其中残差block(C2; C3; C4; C5)分别代表conv2, conv3, conv4, conv5的输出,这样得到stride分别为(4, 8, 16, 32)。这里没有考虑conv1,主要由于conv1的输出的特征图太大,需要占用大量的显存。
每一个conv层的输出一个要做预测操作,一个要进行上采样操作(X2),然后和上一个block中的卷积输出进行融合,融合过程,首先将上一个block中的卷积输出进行1*1卷积的降维操作,然后和之前上采样的输出进行求和的操作,从而得到融合后的特征。然后对融合后的特征进行3*3卷积操作,使得最终融合后的输出都为256个channel。最终conv2, conv3, conv4, conv5对应的输出分别为P2, P3, P4, P5 。
RPN中使用FPN的改动:
对于P2, P3, P4, P5, P6分别使用的anchor为scale为(32*32; 64*64; 128*128; 256*256; 512*512)这5个,即一个特征图使用一个与之对应的anchor的scale。长宽比aspect ratios分别为 (1:2; 1:1, 2:1),即每个特征图都有这3种不同长宽比。最终一共有15种anchor。
当预测和groundtruth的IOU大于0.7,或者与groundtruth的IOU最大,则该预测框为positive
当预测和groundtruth的IOU小于0.3,则该预测框为negative
Fast R-CNN 中使用FPN的改动:
在Fast R-CNN 模块中,RoI pooling 操作是在一个feature map 进行7*7的ROI的crop操作。但是FPN使用了好几个不同尺度的feature map。这样就引入了一个问题,原图上anchor预测的框该还原为哪个scale的feature map?
为了解决这个问题,论文引入了下面的公式,
224表示IMAGENET预训练的输入图片大小为224*224。
w,h表示ROI区域的宽高。
K0表示目标ROI区域的大小为224*224大小的区域。论文将C4的输出作为224*224的ROI,即k0。
例如,
w=h=224,得到k=k0,也就是c4层
w=h=112,得到k=k0-1,也就是c3层
w=h=448,得到k=k0+1,也就是c5层
当然这样也会引入一个误差,会出现预测边框实际是c3预测的,结果上面公式算完是在c4的特征图上crop的想象。感觉这样的误差应该不会很大。
FPN在deepmask分割上的应用:
实验结果:
检测结果:
分割结果:
总结:
FPN(Feature Pyramid Network)算法同时利用低层高分辨率特征和高层语义特征,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同。