在FPN 原文Feature Pyramid Networks for Detection中,使用了ResNet原文 Deep Residual Learning for Image Recognition中的resnet34层模型的 conv2到conv5,conv2到conv5的的维度分别是64,128,256,512。输入图片的size是224x224 。
\"在这里插入图片描述\"

我们先说FPN的目的。
熟悉faster rcnn的人知道,faster rcnn利用的是vgg的最后的卷积特征,大小是7x7x512。而这造成了一个问题,经过多次卷积之后的特征通常拥有很大的感受野,它们比较适合用来检测大物体,或者说,它们在检测小物体任务上效果很差,所以像ssd和fpn这样的网络思想就是将前面和后面的的卷积层都拿出来,组成一个multisacle结果,既能检测大物体,又能检测小物体。
基于这个思想,fpn从ResNet 34层模型构造了一组新的特征,p2,p3,p4,p5,每一个pip_ipi都是ResNet中不同卷积层融合的结果,这保证了他们拥有多尺度信息。他们拥有相同的维度,都是256
构造的方式如下:
\"fpn\"

bottom-up就是简单的使用了ResNet34,主要是top-down中的思想。
在上文中我们提到c2-c5的大小和维度分别是56x56x64,28x28x128,14x14x256,7x7x512,所以在top-down中,先用了一个1x1x256的卷积将c5:7x7x512 变成了m5:7x7x256, 每一个m之后都接了一个3x3x256卷积用来消除不同层之间的混叠效果,其实也就是缓冲作用。
关于p4的构造,我们先将m5的feature map加倍,用简单的nearest neighbour upsamping方法就行,这样m5就变成了m5’:14x14x256,同时c4:14x14x256经过1x1x256得到c4’:14x14x256, 将m5’+c4’, element-wisely,就可以得到m4:14x14x256。

所以最后的p2-p5大小分别是
56x56x256。,28x28x256,14x14x256,7x7x256。

在理解了fpn的基本操作之后,我们来看看RetineNet里面,多层次特征是怎么得到的。
首先,RetinaNet中使用的是ResNet50,上面的图片已经给出了ResNet50的结构了。50怎么来的?
(3+4+6+3)*3+2=50,这里的2表示conv1里面的7x7conv和conv2开始的maxpooling 。所以我们发现,其实ResNet50跟ResNet34大同小异,可以分成conv2到conv5四个部分。
怎么用c2-c5构造pip_ipi是RetinaNet的一个特点。
\" RetinaNet uses feature pyramid levels P3 to P7, where P3 to P5 are computed from the output of the corresponding ResNet residual stage (C3 through C5) using top-down and lateral connections just as in [20], P6 is obtained via a 3⇥3 stride-2 conv on C5, and P7 is computed by apply- ing ReLU followed by a 3⇥3 stride-2 conv on P6. This differs slightly from [20]: (1) we don’t use the high-resolution pyramid level P2 for com- putational reasons, (2) P6 is computed by strided convolution instead of downsampling, and (3) we include P7 to improve large detection. These minor modifications improve speed while maintaining accuracy. \" -----------《Focal Loss for Dense Detection》

首先跟fpn中类似,假设输入图片是I×II \\times II×I,那么c3到c5的大小是
I23×I23×512\\frac{I}{2^3}\\times\\frac{I}{2^3}\\times51223I×23I×512;
I24×I24×1024\\frac{I}{2^4}\\times\\frac{I}{2^4}\\times102424I×24I×1024;
I25×I25×2048\\frac{I}{2^5}\\times\\frac{I}{2^5}\\times204825I×25I×2048
类似于fpn的操作,我们将c5通过1x1x256卷积变成m5:I25×I25×256\\frac{I}{2^5}\\times\\frac{I}{2^5}\\times25625I×25I×256,再通过3x3x256卷积得到
p5:I25×I25×256\\frac{I}{2^5}\\times\\frac{I}{2^5}\\times25625I×25I×256
同理可以得到
p4:I24×I24×256\\frac{I}{2^4}\\times\\frac{I}{2^4}\\times25624I×24I×256;
p3:I23×I23×256\\frac{I}{2^3}\\times\\frac{I}{2^3}\\times25623I×23I×256;
在RetinaNet中新增了p6和p7,p6是通过对p5 进行3x3,stride=2的卷积得到,所以p6大小是p6:I26×I26×256\\frac{I}{2^6}\\times\\frac{I}{2^6}\\times25626I×26I×256
对p6进行ReLU,然后再通过3x3,stride=2的卷积,就可以得到p7,大小是p7:I27×I27×256\\frac{I}{2^7}\\times\\frac{I}{2^7}\\times25627I×27I×256
原文中也说了,pip_ipi的意思就是pip_ipi has resolution 2i2^i2ilower than the input.
原文中解释,加入p6和p7就是为了让模型更好地检测大物体,因为感受野大。而不用p2的原因是p2的feature map太大导致计算量太大。
所以如果想检测小物体,理论上有两种方法,一种是加入p2然后去掉p6和p7,但是这个代价是引入了128x128的feature map,这样在p2这一层生成的anchor数目是128x128x9=16384x9=147456. 有点过多了,算起来很慢的。
另一种方法就是在设置anchor的 size和ratios还有scales上让anchor尽量小一点。

近期补充anchor生成部分总结。

假设输入图片大小是512x512
选择的feature map的大小和anchors的大小的关系,以及anchors和ground truth之间的计算关系。
anchors数目是N=(64x64+32x32+16x16+8x8+4x4)*9=49104
其中
在64x64的feature map上,我用的anchor size是8x8
同理32x32 map对应anchor size是16x16

在4x4的map上 anchor size是128x128

收藏 打印