读论文(4)——FPN

前言

原论文名称为《Feature Pyramid Networks for Object Detection》,是一篇多尺度目标检测的经典论文。之前在SSD的论文解读中提到,SSD使用了不同卷积层的feature map来进行多尺度检测。这个方法其实非常巧妙,因为不同层的输出结果中其实就隐含了不同尺度的信息,而且这种方式不会增加额外的计算量,相比之前对图像做多尺度的变换(图像金字塔)之后再分别进行检测计算量和内存开销都要小很多。FPN就是受到了SSD的启发诞生的一种对于多尺度检测更加完备、更加高效的方法,而且这个方法可以很轻松的加到很多主流的目标检测框架中,有很好的泛用性。

总体思路

论文中有一张图涵盖了已有的多尺度目标检测的方法:
在这里插入图片描述
图(a)方法就是最早的多尺度检测方法,也就是先做图像金字塔,再分别对每张图片做目标检测。所谓图像金字塔,可以理解为对原始图片不断做下采样和滤波生成一组不同尺度的图像,然后后续对这一组图像进行操作,这模拟了人眼由近及远看物体的过程。这种方法在早期的目标检测中非常常见,大名鼎鼎的SIFT特征就是基于这个思想进行操作的。但是图(a)方法有一个显而易见的缺陷:计算量和内存开销太大了,即便SIFT检测已经提出了DOG金字塔结构来减少计算量。

图(b)方法则是应用最广也是前几年最为主流的目标检测方法,这种方法就是直接利用自底向上卷积输出的最后一层feature map进行目标检测。这种方法比较简单粗暴,也就是仅仅利用神经网络最后一层的强语义特征做检测,甚至于我们可以说,这种方法基本上没考虑多尺度目标检测的事。现在一些主流目标检测模型的原始模型比如R-CNN、YOLO v1都属于这种模式。而对于这种模式的模型,一般加上多尺度检测的方法是和图(a)相结合,也就是对图像金字塔中的图像分别应用图(b)方法,这种方式对内存和计算的开销的可想而知,这样就导致推断时间大大提升,不利于实时性。这种方式还导致了由于内存限制,我们只能在训练时采取单尺度,而在测试时加上多尺度的模块,这样就使得训练和测试时的推断不一致,影响效果。

图©方法就是我们在前言中说的那个巧妙的思路,由于网络每层的输出中隐含有尺度信息,因此我们可以从网络不同层抽取不同尺度的特征做预测,这种思路的好处是不会增加额外的计算量,因为我们在做神经网络的时候就已经获得了多尺度特征信息。但是这也不是说所有的层都可以选取出来做特征金字塔,因为高层与低层之间所含的语义信息是不同的,且很多低层特征所含的语义信息来做目标检测是不够的,因此实际上选择的特征图也都是较高层的。比如我们之前学习过的SSD。这样有一个缺陷,那就是这种方法不能充分使用高分辨率的低层特征图,也就是说没法充分利用低层特征图中固有的空间信息。而高分辨率特征图中所蕴含的空间信息对于小目标检测十分有用,因此图(c)的方法还是不能很好的进行小目标检测。

图(d)方法就是本文所使用的FPN方法。为了解决图©方法没有很好利用低层特征图的弊端,图(d)将高层的语义强的特征图上采样后与低层的分辨率高的特征图相结合起来进行检测,这样一方面保证了语义信息的充足,另一方面又能保证空间信息的不浪费。其实在FPN之前,也有人提出过类似的思路,但是前人的思路是选择一张既具有高分辨率又具有较强语义信息的特征图进行预测;而FPN是则是在特征金字塔的基础结构上,对每一层级的特征图分别进行预测,对比如下图所示:
在这里插入图片描述

我们用一句话来概括FPN:
FPN主要解决物体检测中的多尺度问题,通过简单的网络连接改变,将高层的语义信息与低层的空间信息结合,并对每个层级分别进行预测,在基本不增加原有模型计算量的情况下,提升了小物体检测的性能。

接下来看看FPN的网络是如何设计的。

网络结构

论文中对FPN网络结构给出了下图作为解释:
在这里插入图片描述
由上图,FPN方法可以概括为三个词:自下而上、自顶向下、横向连接

展开概括描述为:先由一条自下而上的路径生成各级特征图,再由一条自顶向下的路径生成特征金字塔。特征金字塔的每一层是由高一级的新特征图上采样2倍所得特征图以及统计原始特征图做1×1卷积所得特征图两部分合并而来。

网上有大佬对上面的过程进行了很好的总结,如下图所示(图源知乎@Hans):
在这里插入图片描述
下面以上图为例解释FPN网络,以更好理解。

自下而上部分:
上图采用第二级到第五级参与预测(推测第一级语义还是太弱了所以不用),{C2,C3,C4,C5}表示conv2,conv3,conv4和conv5的输出层作为FPN的特征,对应输入图片的下采样倍数为{4,8,16,32}。

自顶向下部分和横向连接部分:
C5层先经过1 x 1卷积,改变特征图的通道数。M5通过上采样,再加上C4经过1 x 1卷积后的特征图,得到M4。重复这个过程,分别得到M3,M2。M层特征图再经过3 x 3卷积,得到最终的P2,P3,P4,P5层特征。
下面对上述部分做几点说明:
(1)上采样采用最邻近插值法,即以某个元素为正方形左上角的的四个个元素的值都和该元素一致。
(2)文章中通道数设置为d=256。
(3)横向连接的中相加指的是对应元素直接相加
(4)对M层特征图再做3×3卷积是为了减轻最近邻近插值带来的混叠影响,因为最近邻插值让周围的元素都相同。

应用

文章将FPN方法做了两个应用尝试:一是应用在了RPN中进行边界框提议生成,二是应用在了Fast R-CNN中进行目标检测。
1.RPN中的FPN方法
原来的RPN网络是以主网络的某个卷积层输出的特征图作为输入,也就是只用了一个尺度的特征图。本文将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入,也就是用多尺度特征图代替了原来的单尺度特征图
在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为322,642,1282,2562,5122,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。
对正负样本的界定,如果某个anchor和给定的ground truth有最高的IOU或者和任意一个ground truth的IOU都大于0.7,则是正样本。如果一个anchor和任意一个ground truth的IOU都小于0.3,则为负样本。
进行改进后的结果如表所示:
在这里插入图片描述
从(a)(b)(c)的对比可以看出FPN的作用很明显。

(d)表示只有横向连接,而没有自顶向下的过程,也就是仅仅对自底向上(bottom-up)的每一层结果做一个1×1的横向连接和3×3的卷积得到最终的结果,这个方法有点像我们总体思路部分第一张图中的(c)所示方法(类似于SSD)。
(e)表示有自顶向下的过程,但是没有横向连接,即向下过程没有融合原来的特征。
(f)采用finest level层做预测,即经过多次特征上采样和融合到最后一步生成的特征用于预测,仅仅取融合后最下面一层的特征做了预测,也就是总体思路部分第二张图的上半部分所示的思路。

将(c)(d)(e)(f)对比更能发现FPN方法的优越性,FPN的三个关键步骤缺一不可,分级分别预测的思想也不能弃之不用。

2.Fast R-CNN中的FPN方法
Fast R-CNN是一个基于区域推荐的目标检测器,利用感兴趣区域(RoI)来提取特征。Fast R-CNN通常在单尺度特征映射上执行。要将其与我们的FPN一起使用,我们需要为金字塔等级分配不同尺度的RoI
作者通过通过以下公式将宽度为w和高度为h的RoI分配到特征金字塔的级别:
在这里插入图片描述
这里224是ImageNet预训练的大小,k0则是w×h=2242的RoI应该被映射到的目标级别,在原视单尺度Fast R-CNN中取4。从上述公式可以看出,如果RoI的尺寸(w×h)变小了(小于2242),那么k值就会比k0要小,该RoI就被映射到一个更精细的分辨率级别。
进行改进后的结果如表所示:
在这里插入图片描述
相比于baseline,FPN还是取得了一定程度的进步,说明FPN比单尺度检测更有效。
这里我们也发现FPN(表中(c))和finest level(表中(f))检测的效果差别不大,作者认为原因是ROI pooling对于region的尺度并不敏感。

总结

我们来看看FPN与COCO上排名靠前的算法的对比:
在这里插入图片描述
这个结果是很惊人的,因为作者强调这篇论文的方法并没有采用其他的提升方法(比如增加数据集、迭代回归、难例挖掘等等),仅靠一个原始的模型就达到了如此好的效果。

学习了这么多目标检测的方法,我们不难发现,目标检测的发展趋势一是从非实时到实时的发展,在这背后主要是对阶段的简化、对网络的改进,代表的作品有YOLO v1,SSD;二则是从单尺度检测到多尺度检测,也就是能跟好的检测小目标,这背后主要就是对多尺度特征的提取,代表作品如YOLO的改进、SSD、FPN等等。在发展的道路上,有的人开创新的思路(YOLO v1、SSD),有的人集百家之大成(YOLO v2和v3、FPN),但是他们都为后来者提供了宝贵的经验。

最后的最后我们再来简单总结一下FPN:
FPN复用卷积神经网络中各层输出的特征图,解决了多尺度目标检测的内存开销过大问题,通过自下而上、自顶向下、横向连接的方法构造特征金字塔,并对每一层级分别进行预测,提升了目标检测尤其是小目标检测的性能。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值