# 先从 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` 是通过最大池化得到的。