FPN (feature pyramid network)特征金字塔网络


这里主要讲下FPN的结构设计


 我们知道一副图像中包含的物体有大有小,随着网络层数的加深,feature map也会变得越来越小,那么小物体的特征就有可能被过滤掉。

 在SSD网络中的一种做法就是:对不同深度的feature map直接进行目标检测,这样小物体就有可能在比较大的feature map上被检测出来,从而实现了不同尺度的识别。

 但是,有个问题,就是不同层次的feature map,它所包含的信息级别是不同的。浅层主要体现的是低级的信息,而深层则体现的是较为高级抽象的语义信息。所以听起来好像是利用了不同尺度进行检测,但是精度并没有期待的提升那么多。

 原来多数的目标检测算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而FPN不一样的地方在于预测是在不同特征层独立进行的。

 下图为几种处理不同尺度特征的方法:
FPN (feature pyramid network)特征金字塔网络_第1张图片
(a)即图像金字塔,将图像转换成不同尺度,然后分别输入对应网络中,生成不同尺度的特征进行预测。不用说,这速度肯定很慢。

(b)检测在最后一个feature map进行,这结构不利于检测不同大小物体。如SPP net,Fast RCNN,Faster RCNN是采用这种方式

(c)对不同深度的feature map分别进行目标检测。SSD中采用的便是这样的结构。每一个feature map获得的信息仅来源于之前的层,之后的层的特征信息无法获取并加以利用。FPN认为SSD算法中没有用到足够低层的特征,而在作者看来足够低层的特征对于检测小物体是很有帮助的。

(d)即FPN采用的方式。顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。这是一个有跨越性的设计。因为有了这样一个结构,当前的feature map就可以获得“未来”层的信息,这样的话低阶特征与高阶特征就有机融合起来了,提升检测精度。
FPN (feature pyramid network)特征金字塔网络_第2张图片
(FPN的主干网络是ResNet)

 从上图,FPN的大体结构是:一个自底向上的线路,一个自顶向下的线路,然后横向连接。而横向连接通过上图虚线框中给的skip connection结构实现。然后有用到11的卷积核,这里1×1的卷积操作目的是改变channels,要求和后一层的channels相同,并不改变feature map的尺寸大小。(我们知道,11卷积核的个数有多少个,那输出的feature map就有多少个。)

自底向上:其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。

自顶向下:采用上采样(upsampling)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。

举例:skip connection的实现(Keras-API)

P4 = KL.Add(name="fpn_p4add")
    ([KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),
      KL.Conv2D(256,(1, 1), name='fpn_c4p4')(C4)])

其实这个上采样只是直接复制,没有用到一些插值方法。
就是如下图的方式:
FPN (feature pyramid network)特征金字塔网络_第3张图片

然后相加就是像素的加法,直接相加。

参考论文:《Feature Pyramid Networks for Object Detection》

你可能感兴趣的:(目标检测,深度学习,图像识别)