0.摘要
感觉和我的放大镜原理十分相似,特征金子塔,但是他做的是全局特征级别的,我的是propel、bbox级别。他的目的是充分利用信息,我的目的是针对小目标
使用最近邻插值法进行特征扩增
解决的问题是目标检测在处理多尺度变化问题是的不足
1.特征金字塔
1.1多种方式的比较
(a). 通过图像金字塔来构建不同尺度的特征金字塔
对每一种尺度的图像进行特征提取,能够产生多尺度的特征表示,并且所有等级的特征图都具有较强的语义信息,甚至包括一些高分辨率的特征图。但是有着计算时间长和占用内存高的缺点,而且由于每个级别的fmap提取方式不同,反向传播
(b). 常见的目标检测网络:利用单个高层特征图进行预测
©.金字塔型特征层:低层特征图语义信息不够和低层特征图的分辨率也不高,即没有充分利用到低层特征图中的空间信息,这些信息对小物体的检测十分重要。
(d). 特征金字塔:能够在增加较少计算量的前提下融合低分辨率语义信息较强的特征图和高分辨率语义信息较弱但空间信息丰富的特征图。但是感觉这种方式计算量和存储量也很大
1.2上采样
自顶向下的过程通过上采样(up-sampling)的方式将顶层的小特征图。放大到上一个stage的特征图一样的大小。
KL.UpSampling2D(size=(2, 2),name="fpn_p5upsampled")(P5)
上采样完了再和原来的信息进行加权(1*1con)求和
P4 = KL.Add(name="fpn_p4add")
([KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),
KL.Conv2D(256,(1, 1), name='fpn_c4p4')(C4)])
1.3预测和映射
作者用anchor的方式预设了9个框。这些框本身包含不同的尺度和不同的长款比例。由于每个P层相对于原始图片具有不同的尺度信息,因此作者将原始RPN中的尺度信息分离,让每个P层只处理单一的尺度信息。具体的,对{32^2、 64^2 、128^2 、 256^2 、 512^2 }这五种尺度的anchor,分别对应到{P2、P3、P4、P5、P6}这五个特征层上。
映射的时候是如下的公式:
这里224是标准的ImageNet预训练大小,K0是目标层数,其中w×h=224^2的RoI应映射到该层数。
1.4 网络结构![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/64828d1e53a494282c8b4c5d517ff40e.jpeg)
具体过程为:C5层先经过1 x 1卷积,改变特征图的通道数(文章中设置d=256,与Faster R-CNN中RPN层的维数相同便于分类与回归)。M5通过上采样,再加上(特征图中每一个相同位置元素直接相加)C4经过1 x 1卷积后的特征图,得到M4。这个过程再做两次,分别得到M3,M2。M层特征图再经过3 x 3卷积(减轻最近邻近插值带来的混叠影响,周围的数都相同),得到最终的P2,P3,P4,P5层特征
骨干使用的是frcnn,不是很算热插拔的
P5 = KL.Conv2D(256, (1, 1), name='fpn_c5p5')(C5)
# 上采样之后的P5和卷积之后的 C4像素相加得到 P4,后续的过程就类似了
P4 = KL.Add(name="fpn_p4add")([
KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),
KL.Conv2D(256, (1, 1),name='fpn_c4p4')(C4)])
P3 = KL.Add(name="fpn_p3add")([
KL.UpSampling2D(size=(2, 2), name="fpn_p4upsampled")(P4),
KL.Conv2D(256, (1, 1), name='fpn_c3p3')(C3)])
P2 = KL.Add(name="fpn_p2add")([
KL.UpSampling2D(size=(2, 2),name="fpn_p3upsampled")(P3),
KL.Conv2D(256, (1, 1), name='fpn_c2p2')(C2)])
# P2-P5最后又做了一次3*3的卷积,作用是消除上采样带来的混叠效应
# Attach 3x3 conv to all P layers to get the final feature maps.
P2 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p2")(P2)
P3 = KL.Conv2D(256, (3, 3), padding="SAME",name="fpn_p3")(P3)
P4 = KL.Conv2D(256, (3, 3), padding="SAME",name="fpn_p4")(P4)
P5 = KL.Conv2D(256, (3, 3), padding="SAME",name="fpn_p5")(P5)
# P6 is used for the 5th anchor scale in RPN. Generated by
# subsampling from P5 with stride of 2.
P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2,name="fpn_p6")(P5)
# 注意 P6是用在 RPN 目标区域提取网络里面的,而不是用在 FPN 网络
# Note that P6 is used in RPN, but not in the classifier heads.
rpn_feature_maps = [P2, P3, P4, P5, P6]
2 网络效果
FPN算法在COCO数据集上面的性能表现,使用了FPN的Faster R-CNN方法获得了很多的最佳指标,获得了最好的单模型准确率。但是作者没有说内存和计算量。