文章涉及个人理解部分,可能有不准确的地方,敬请指正
0. 概述
FPN,全名Feature Pyramid Networks,中文称为特征金字塔网络。它是2017年cvpr上提出的一种网络,主要解决的是目标检测中的多尺度问题。FPN通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。
1. 产生动机
目标检测领域中,多尺度检测一直是个挑战,特别是小目标。以往(作者成文的时候,不是现在)检测主要分为三类:
a)使用单特征层。将特征提取网络最后一层输出的特征图,拿去做检测、识别,这是最早期,最一般的方法,该方法的缺点在于,最后一层特征图的尺寸一般都比较小了,无法准确定位目标。
b)多尺度输入。将输入图像resize成多个尺度,然后对每个尺度的图像提取出不同尺度的特征,这种方法计算量很大,因为要进行多次特征提取,即走了好几遍backbone。
c)多尺度特征。在特征提取时,保留中间层的不同尺度上的特征图,对每个尺度的特征图进行预测,这样做是不错的,但是高层特征图只具有丰富的语义信息,而低层特征图只有丰富的位置信息,没有将两者进行结合。
此时,文章作者就想到,如果能对方法 c)中不同尺度的特征图进行融合,岂不美哉,于是FPN就诞生了。
FPN的大致结构长这样:
FPN对高层特征图(尺寸越小越高)进行上采样,然后跟上一层的特征图进行相加融合,这样就使融合后的特征图既包含高层的语义信息,又包含低层的结构信息。而且这样做只增加少量的计算量,是完全可以接受的。
所以简单来说,FPN主要有两个特点:
- 输出多尺度特征图,对不同尺度的目标都有不错的效果;
- 不同尺度特征图之间进行了融合,使特征图同时具有高层语义信息和低层结构信息。
2. 网络结构详解
网络结构大致可以分为三个部分讲解,作者还分别给他们起了名
2.1 buttom-up
这一部分就是常见的特征提取网络,比如VGG,ResNet之类的,不过对特征图的输出尺度有要求,相邻的输出特征图尺度是2倍的关系。作者以ResNet为例,以conv2, conv3, conv4, conv5的输出作为输出特征图,假设他们的输出特征图分别是 { C 2 , C 3 , C 4 , C 5 } \{C2,C3,C4,C5\} {C2,C3,C4,C5},他们的尺度分别是输入图像的 { 1 4 , 1 8 , 1 16 , 1 32 } \{{\frac{1}{4}, \frac{1}{8},\frac{1}{16},\frac{1}{32}}\} {41,81,161,321},可以看到,相邻的特征图之间的尺寸是2倍的关系。
2.2 top-down
该部分进行特征的融合操作,具体流程是, C 5 C5 C5特征图进行2倍上采样,与 C 4 C4 C4相加,因为 C 5 C5 C5的尺寸是 C 4 C4 C4的 1 2 \frac{1}{2} 21,所以进行2倍上采样之后,尺寸与 C 4 C4 C4一致,可以进行相加。然后将相加的结果再进行2倍上采样,与 C 3 C3 C3相加,以此类推。每一层融合后的特征图都要拿去做预测。
2.3 lateral
这一部分定义了融合操作的具体操作
1、每一层的输出特征图要先经过一个 1 × 1 1×1 1×1的卷积核,为啥呢,为了将每个特征图的通道数变为相同,因为高层特征图的通道数往往比较多,而低层特征图的通道数比较少,即使进行了上采样也无法进行相加
2、2倍上采样采用的是最简单的最近邻插值
3、相加操作就是对应元素相加,这里要与yolov3的concatenate
操作做区别,concatenate是拼接,会增加通道数的,而FPN里的融合不会改变特征图的尺寸