【目标检测系列:六】2016 CVPR 特征金字塔网络(FPN)

2016 CVPR

特征金字塔网络(FPN)

Feature Pyramid Networks for Object Detection

ResNet 101 举例:[2]

  • down-top
    就是 每个residual block(C1去掉了,太大太耗内存了),scale缩小2,C2,C3,C4,C5(1/4, 1/8, 1/16, 1/32)
  • top-down
    就是把高层的低分辨强语义的feature 最近邻上采样2x
  • lateral connection
    过 1x1卷积调整channel

具体迭代操作:[2]

  • 从C5(512)开始加个1*1卷积 改变 channel 到256个 ,生成分辨率最低但语义最强的feature P5 ,开始迭代
  • 然后 P5 上采样放大2倍,C4经过一个1*1的卷积后和上采样后的P5 channel feature 大小都一样了,进行 element-wise 相加
  • 以此迭代下去到P2结束
  • 每个Pk后加一个3*3的卷积
    (原文说reduce the aliasing effect of upsampling)

优点

  • 特征金字塔可以在速度和准确率之间进行权衡,可以通过它获得更加鲁棒的语义信息

  • 图像中存在不同尺寸的目标,而不同的目标具有不同的特征,利用浅层的特征就可以将简单的目标的区分开来;利用深层的特征可以将复杂的目标区分开来

利用FPN构建Faster R-CNN检测器步骤[1]

  • 首先, 对 图片进行预处理操作;
  • 然后,将处理过的图片送入预训练的特征网络中(如ResNet、vgg等),即构建所谓的 down-top网络;
  • 接着,如图所示,构建对应的top-down网络(即对层4进行上采样操作,先用1x1的卷积对层2进行降维处理,然后将两者相加(对应元素相加),最后进行3x3的卷积操作
  • 接着,在图中的4、5、6层上面分别进行RPN操作,即一个3x3的卷积后面分两路,分别连接一个1x1的卷积用来进行分类和回归操作;
  • 接着,将上一步获得的候选ROI分别输入到4、5、6层上面分别进行ROI Pool操作(固定为7x7的特征);
  • 最后,在上一步的基础上面连接两个1024层的全连接网络层,然后分两个支路,连接对应的分类层和回归层;

Faster R-CNN+Resnet-101的结构[3]

  • Faster-RCNN利用conv1到conv4-x的91层为共享卷积层
  • 然后从conv4-x的输出开始分叉,一路经过RPN网络进行区域选择,另一路直接连一个ROI Pooling层,把RPN的结果输入ROI Pooling层,映射成7 * 7的特征
  • 然后所有输出经过conv5-x的计算,这里conv5-x起到原来全连接层(fc)的作用
  • 最后再经分类器和边框回归得到最终结果。

RPN中的 FPN [4]

  • 原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map
  • 但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入
  • 在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为322,642,1282,2562,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。

problem[2]

  • RPN生成roi后对应feature时在哪个level上取呢?

resnet那篇文章是在C4取的,k0=4(C5相当于fc,也有在C5取的,在后面再多添加fc),比如roi是w/2,h/2,那么k=k0-1=4-1=3,就在P3取

  • 不同尺度的ROI,使用不同特征层作为ROI pooling层的输入,大尺度ROI就用后面一些的金字塔层,比如P5;小尺度ROI就用前面一点的特征层,比如P4。那怎么判断ROI 该用那个层的输出呢? (同上)

    k = [ k 0 + l o g 2 ( w h 244 ) ] k=[k_0 + log_2(\frac{\sqrt{wh}}{244})] k=[k0+log2(244wh )]

    • 224是ImageNet的标准输入
    • k0是基准值,设置为5,代表P5层的输出(原图大小就用P5层)
    • w和h是ROI区域的长和宽

    假设ROI是112 * 112的大小,那么k = k0-1 = 5-1 = 4,意味着该ROI应该使用P4的特征层。

  • 从不同level取feature做roi pooling后需要分类和回归,这些各个level需要共享吗?
    本文的做法是共享,还有一点不同的是resnet论文中是把C5作为fc来用的,本文由于C5已经用到前面feature了,所以采用在后面加fc6 fc7.
    也就是说 作者把conv5也作为了金字塔结构的一部分,那么从前全连接层的那个作用 采取的方法是增加两个1024维的轻量级全连接层,然后再跟上分类器和边框回归。作者认为这样还能使速度更快一些。[4]

其他帮助理解 参考图:

参考文献

[1] https://blog.csdn.net/WZZ18191171661/article/details/79494534
[2] https://blog.csdn.net/u013010889/article/details/78658135
[3] https://blog.csdn.net/dcxhun3/article/details/59055974
[4] https://blog.csdn.net/baidu_30594023/article/details/82623623

猜你喜欢

转载自blog.csdn.net/qq_31622015/article/details/100940340