FPN(Feature Pyramid Networks), 论文:Feature Pyramid Network for Object Detection 使用FPN能给网络带来哪些好处呢?根据原论文的描述,可以知道: 针对目标检测任务:coco AP提升2.3个点,pascalAP提升3.8个点 ,这样的提升还是很明显的
1. 网络结构对比
- 图a,
Feature image pyramid(特征图像金字塔结构) ,该网络在传统的图像处理中也是非常常见的一个方法,针对需要检测不同尺度的目标。首先,将网络缩放到不同的尺度上,比如图中4个不同尺度,然后针对每个尺度,经过处理异依次进行预测。这里面临一个问题,我们生成多少个不同尺度,就需要重新预测多少次,这样的效率是很低的。 - 图b,
Single feature map ,这个跟Fast-RCNN流程是一样的,将我们图片通过backbone 得到特征图,通过卷积进行一步步特征提取,最后在最终的特征图进行预测。该网络针对小目标情况下,效果并不是很好。 - 图c,
Pyramidal feature hierarchy ,图c,跟SSD算法比较类似,首先将我们一张图片输入给backbone ,在backbone正向传播过程中得到的特征图上,分别进行预测。 - 图d,就是本文要讲到的FPN结构,可以简单和图c进行对比下,我们能够发现图d不是简单的在我们backbone上的不同特征图上进行预测,而是会将不同特征图上的特征进行融合,再融合后的特征图之上再进行预测。根据论文的试验,这样做确实容易提升网络的检测效果。
2. FPN网络
2. 1 FPN网络的原理
不同层特征究竟是如何融合的呢?注意FPN中的不同的特征图的尺寸有一定要求的,比如这里我们按2的整数倍进行选取。比如最底层特征层对应的尺寸是28x28 ,在它上一层就对应14x14 ,最上面对应的是7x7 的尺寸。在我们特征网络进行缩放时,基本上都是按2的整数倍进行缩放的。 针对上图所示的细节部分,首先针对backbone上的每一层特征图,都会利用1x1 的卷积进行处理,这里1x1 的卷积层主要目的是调整backbone上不同特征图的channel 。因为一般情况下,不同特征图上它的channel 是不一样的,一般情况是越来越多的,为了保证不同尺度上的特征图融合,就需要确保在处理后有相同的shape ,因此首先通过1x1 卷积层来确保特征图的channel 是一样的。
然后我们看如何将高层次的特征图与低层次的特征图进行融合的,我们知道上一层的特征图的尺寸,在w,h维度上是下一特征图的一半。因此需要将上面的特征图进行2 倍的上采样。比如上图中最上面的特征图尺寸为7x7,经过2倍上采样,就和中间的特征层经过1x1 卷积后(保证具有一样的chanel),具有相同的shape 。紧接着将中间的特征图经过2倍的上采样,与下面的特征图经1x1 卷积后的特征层进行add 融合,最后对得到的特征图进一步处理,并预测。注意:是对应像素的add 融合,并不是与其他网络一样通过channel维度上的融合。
这里的2倍上采样是如何实现的呢? ,论文中讲到是通过nearest neighbor upsampling ,就是一个简单的临近插值算法。
2.2 完整的FPN网络结构
2.1节 FPN网络的一些细节是没有展现出来的,这边重新绘制了更完整的FPN结构,这里以backbone为ResNet50 为例进行绘制。假设输入图像是640x640 的RGB 3通道图像,以它作为示例进行绘制的。
说先,我们讲一下backbone中的ResNet网络。 resNet网络的整体框架其实都是一样的,首先都是通过一个con1 进行卷积操作,这里的卷积是包含有BN+Relu ,然后通过conv2_x 它所对应的一系列层结构,以及conv3_x 对应的一系列残差结构,以及conv4_x 和conv5_x 对应的一系列残差结构。 这里为了以便于后面讲解,将conv2_x ,conv3_x,conv4_x,conv5_x 分别命名为C2 ~C5 。接着将我们刚才说的特征图,分别都通过一个1x1 的卷积层,来调整他们的channel为256。然后从C5到C2进行融合,首先对C5得到的特征进行2倍上采样,上采样之后和C4得到的特征层进行Add 融合,然后将融合得到的特征图,再进行2倍上采样,与C3得到的特征图进行融合。然后再将C3融合后的特征图再进行2倍上采样,与C2得到的特征图进行融合。
最后在每一层新得到的特征图,在接了一个3x3 的卷积层进一步特征图提取,依次得到P2,P3,P4,P5 。接着根据论文的描述。会在P5的基础上进行下采样得到P6,假设P5 wxh=20x20,到了P6就变为10x10 。这里是通过Maxpool 来实现的,这里池化核大小为1x1, 因此maxpool不起任何作用,注意这里步距为2的,所以将我们特征图进行了2倍下采样。
注意:P6只用于RPN部分,针对Faster-RCNN目标检测框架来说,它不在Fast-RCNN部分使用 。RPN生成proposal(的时候,会在P2~P6 这5个特征图上进行预测。但是针对我们Fast-RCNN 部分,它只会在P2~P5 这4个特征图上进行预测。
对于Faster-RCNN 在backbone预测特征图上通过我们的RPN网络,生成得到一系列的proposal(,然后将proposal(映射到预测特征图上,然后将映射之后的特征输入到Fast -RCNN 部分,得到我们最终的预测结果。
针对我们FPN 结构中,我们首先在P2~P6 预测特征层上通过RPN预测proposal((这是与不带FPN 结构的Faster-RCNN不同),之后我们将得到的特征图映射到P2~P5 中的特征图上,然后再输入到Fast-RCNN 部分得到最终的预测结果。
注意:Faster-RCNN=RPN+Fast-RCNN 在结构上可以这么表达。 这里有个问题我们得到purpose,最后映射到哪个特征图上呢 ,这个会在下面文章中进行进一步讲解。
由于我们在FPN网络上生成了多个预测特征层P2-P5 ,所以可以在不同的特征层上分别针对不同尺度的目标进行预测。之前将Faster-RCNN我们只有一个预测特征层(指的是backbone 生成的预测特征层),因此只在这一个预测特征图上生成不同面积和不同比例的anchor,但是在FPN中,我们不同的预测特征图,针对不同的面积,比如P2相对于较低层的预测特征层,他会保留更多底层的信息,所以它更适合预测小型的目标,我们会将较小的32x32的尺寸上,比例为{1:2,1:1,2:1}的anchor在我们P2上进行生成。针对我们P3我们会将64x64,比例还是{1:2,1:1,2:1}的anchor在P3上生成,同理128x128尺寸的anchor在P4上生成,256x256在P5上生成,这里也是与我们不带FPN结构的Faster-RCNN存在区别的地方之一。 这里强调一点,论文作者在做实验过程中发现在不同的预测特征图上用不同的RPN和Fast-RCNN与共用同一个RPN以及Fast-RCNN,它的效果并没什么差别(检测精度),既然在检测效果上没什么差异,那么共享RPN和Fast-RCNN是最好的,这样可以减少我们网络的训练参数以及网络的大小,而且参数减少后还能提升网络的训练速度,所以在P2-P6使用的是同一个RPN模块。而Fast-RCNN部分我们的P2-P5也是使用同样的Fast-RCNN模块 ,这里需要大家注意下。
针对RPN得到的一些列purpose之后,该如何将他们映射到对应的特征图上呢?
计算公式如上图,这里的
k
k
k是我们计算的最后映射到哪个预测特征图(P2-P5其中之一)。这里
k
0
k_0
k0?设置为4,其中公式中w,h所对应的是我们RPN预测得到的一些列purpose它在原图上所对应的w,h。比如这里w,h为224的一半,那么log里面计算就为0.5,
l
o
g
2
log_2
log2?底计算就为-1,所以
k
=
4
?
1
=
3
k=4-1=3
k=4?1=3。
总结
带FPN结构的Faster-RCNN与一般Faster-RCNN的区别:
- 带FPN结构的Faster-RCNN,p2-p6预测特征层通过rpn生成purpose,而一般Faster-RCNN只在一个预测特征层通过RPN生成proposal(backbone对应的特征层)
- 带FPN结构的Faster-RCNN在得到proposal(后,需要映射到在p2-p5中对应的特征图,对应是P2-P5中哪一个特征图,需要根据公式计算选择。
- 另外论文作者在做实验过程中发现在不同的预测特征图上用不同的RPN和Fast-RCNN与共用同一个RPN以及Fast-RCNN,它的效果并没什么差别(检测精度),既然在检测效果上没什么差异,那么共享RPN和Fast-RCNN是最好的
|