本文介绍fpn1. fpn是巧妙解决深度学习利用难以利用金字塔特征的问题。将高层语义特征传到低层。直接在faster rcnn上使用fpn,在coco数据集上,单模型效果超过所有同期论文,也超过COCO 2016 challenge的冠军。
背景
我们知道传统的物体检测通常都是经过在金字塔上用滑动窗口的方式,提取窗口内特征,对是否是某物体进行分类(svm等)。这样才能检测大小不一各个尺度的物体。但这实际上也是传统算法速度很难提高的原因。如下图a所示。
对于,深度学习,一般使用的是图b的结构。输入图片通过一层层网络层,提取特征。然后在高层特征上进行预测位置,分类。这种结构的缺点就是对于小物体,很难获得精确的定位。而如果在每一层特征(金字塔)每层进行预测,会导致训练变慢而且也会导致训练时候内存暴涨,基本上是不可行的。
当然,在特征金字塔不是唯一的方式。也可以选取某些层进行输出。如图c所示。只选择某些层次进行处理。ssd就是用这种方式。使用这种方式一般没有办法选取太低层的特征,因为这些特征语义信息不强,无法有效分类(ssd最低层选用的conv4_3)。高层信息存在无法检测小物体并精确定位的问题。一般对选取的几层添加额外几层来预测所需要的分类、定位信息。这也浪费了高层特征。需要有一种方式可以重用高层特征。
这就是fpn做的事情。它把高层特征重新带回到低层。然后用底层特征进行精确检测。如图d所示。
fpn
具体的,fpn是通过:横向连接,top-down, bottom-up的方式进行的。以下介绍详细细节。
bottom up
就是正常的前向操作。从底层到高层。
top-down和横向连接
正常的top-down如下图所示。一般在物体分割使用到这种方式。将高层特征传回低层,用低层特征进行精确分割。
而fcn的top-down略有不同。这里加入了横向连接。如下图所示。
在上图中每个选中的层都会进行预测。高层特征通过以下方式待会到底层。
block
横向连接体现为一个1x1的卷积层,上面一层通过2倍上采样,然后对位直接相加获得当前层的特征。
这里思考两个问题:
- 横向连接为啥要用1x1的卷积层?
- 为啥是2倍上采样?
对于第一个问题,这是因为上下两层的通道数是不一样的。需要通过1x1统一到相同的通道数目。
对于第二个问题,这是跟选取那些层进行预测的的策略有关了。这得从cnn的发展历史说起。
现在大部分结构,从输入图到预测前的特征图,一般是经过32x的下采样。一般由5个stride为2的层将整个网络结构分为不同的stage。在不同的stage内可以有多个网络层。但这内部的网络层的特征图尺寸一般是不变的。
在fpn网络中,选取预测层都是选中每个stage的最后一层。所以一定是2倍的关系。第二个问题解决。
结果
这是fpn在coco上检测结构。论文也对分割做了一部分工作,暂不考虑。
参考文献:
-
Lin, Tsung-Yi, et al. “Feature pyramid networks for object detection.” CVPR. Vol. 1. No. 2. 2017. ↩