浅学一下FPN吧。
1、FPN原文链接: https://openaccess.thecvf.com/content_cvpr_2017/papers/Lin_Feature_Pyramid_Networks_CVPR_2017_paper.pdf
2、大神的论文翻译: https://blog.csdn.net/Quincuntial/article/details/80152306
3、大神的代码链接: https://github.com/unsky/FPN
背景
在目标识别当中,识别不同尺度的目标是计算机视觉中的一个基本挑战。为了更好的识别不同尺度的物体,人们形成了不同的解决方案,利用不同特征层的不同的语义信息(特征金字塔)来识别不同尺度的物体成了解决方案的基础。
特征金字塔是什么?
特征金字塔就是对一张图片进行不同的特征提取得到的不同的结果,因为所提取到的结果,按照大小顺序摆放之后,类似于金字塔,所有叫特征金字塔(本人愚见)。具体可以参考下面论文中所给的图片。
可以看到,形成特征金字塔的方式不只是一种。
1、如图(a),可以先对图片进行不同尺度的缩放,再进行特征提取,从而所得的特征图不一样大小,形成特征金字塔。这种属于由图像金字塔形成特征金字塔(一般这种计算量较大,目前使用较少)。
2、如图(b),也可以就对原始图片进行特征提取,在提取所得的特征图上再进行特征提取,这样也可以得到不同的特征图,形成特征金字塔(一般现在使用的为这种方式)
那什么是FPN?
浅结一下
上面我们说过了特征金字塔是什么,而FPN也是属于特征金字塔当中的一种。如图(d),只不过实现的方式不一样。FPN先是从图片自下向上的形成尺度的特征图,这样就得到了不同语义信息的特征图(通常低层的特征语义信息比较少,但是高分辨率、目标位置准确;高层的特征语义信息比较丰富,但是低分辨率、目标位置比较粗略),如果单一的使用这些单个的特征图进行预测(如图c),或者仅仅使用最顶层的特征图进行预测(如图d),都没有将高层语义和底层语义进行融合,没有更好的实现信息的融合。FPN就是将高层语义和底层语义进行融合(如图d),这样融合之后再在每一层进行输出预测,就能更准的实现目标检测。
具体做法
如图d,具体可以分为两个步骤:
1、自下向上的过程:先使用卷积对图片进行特征提取,在提取所得的特征图上再多次的使用卷积提取特征,以获得不同尺度的特征图。
2、自上向下的融合过程:从最顶层的特征图开始,先输出预测结果,然后进行上采样,将尺度扩充到可以与下一层的特征图进行融合的尺度,再输出预测,再进行上采样…融合…预测…上采样…
具体的融合过程如图:
说明了横向连接和自顶向下路径,通过加法合并。使得无论是那一层的输出,都具有丰富发语义信息。
FPN算法的优点
和如图 a、b、c 相比,FPN拥有一些优点:
1、和 a 相比,a 使用图像金字塔构建特征金字塔。每个图像尺度上的特征都是独立计算的,速度很慢。且,在图像金字塔上端对端地训练深度网络在内存方面是不可行的,FPN使用不同尺度的特征图是自下向上所得,速度上快很多。
2、和 b 相比,b只使用单一尺度特征进行更快的检测。单一尺度没有多尺度融合的预测效果更佳。准确度没有FPN高。
3、和 c 相比,c 好像它是一个特征化的图像金字塔,特征化图像金字塔的每个层次都具有明显的局限性。底层和高层的信息也没有进行融合。准确度没有FPN高。
FPN展示了如何创建网络中的特征金字塔,可以用来代替特征化的图像金字塔,而不牺牲表示能力,速度或内存。
SPP的代码实现
具体的代码实现,可参考上面的代码链接。