FPN输出的特征图为什么比ResNet输出的四个阶段图多一个
2023-12-17 22:13:47
# 先从 resnet 抽取四个不同阶段的特征图 C2-C5。
_, C2, C3, C4, C5 =
resnet_graph(input_image, config.BACKBONE,stage5=True, train_bn=config.TRAIN_BN)
# Top-down Layers 构建自上而下的网络结构
# 从 C5开始处理,先卷积来转换特征图尺寸
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]
# 最后得到了5个融合了不同层级特征的特征图列表;
?
ResNet 的输出被命名为 `C2`, `C3`, `C4`, 和 `C5`,其中 `C2` 是 ResNet 输出的第一个阶段的特征图,而 `C3`, `C4`, 和 `C5` 分别对应 ResNet 输出的第二、第三、和第四个阶段的特征图。ResNet 输出了四个不同阶段的特征图。
接下来,这些特征图通过 Feature Pyramid Network (FPN) 进行处理,得到了五个特征图 `P2`, `P3`, `P4`, `P5`, 和 `P6`。这个过程的具体步骤如下:
1. P5 的构建:?使用 `C5`(ResNet 输出的第四个阶段的特征图)作为输入,经过一个 1x1 的卷积层(`fpn_c5p5`),生成 `P5`。
2. P4 的构建:?使用 `P5` 上采样两倍,再与 `C4`(ResNet 输出的第三个阶段的特征图)经过一个 1x1 的卷积层(`fpn_c4p4`)后的特征图相加,生成 `P4`。
3. P3 的构建:?使用 `P4` 上采样两倍,再与 `C3`(ResNet 输出的第二个阶段的特征图)经过一个 1x1 的卷积层(`fpn_c3p3`)后的特征图相加,生成 `P3`。
4. P2 的构建:?使用 `P3` 上采样两倍,再与 `C2`(ResNet 输出的第一个阶段的特征图)经过一个 1x1 的卷积层(`fpn_c2p2`)后的特征图相加,生成 `P2`。
5. **P6 的构建:?使用 `P5` 进行最大池化(`fpn_p6`),得到 `P6`。
因此,最终得到了五个特征图,其中 `P2`, `P3`, `P4`, `P5` 是通过上述步骤构建的,而 `P6` 是通过最大池化得到的。
文章来源:https://blog.csdn.net/danger2/article/details/135049539
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!