关于特征金字塔结构 FPN,终于听明白了它的原理

浅层网络能捕捉细节但小目标特征不突出,高层网络虽有语义信息但小目标特征弱化。FPN通过融合多层特征,有效识别中小目标,提高召回率,实现上下层信息互补。特征融合利用end-to-end训练,使得不同层特征相加后能更好地结合浅层和深层信息。

总结:

浅层网络(下层网络) 感受野小,但是只能感受到纹理等细粒度的特征,在此小目标的特征和大目标特征在此些层 的特征比例分布还算均衡,因此还能被损失函数识别,因此能被识别出来

在高层网络(末端,上层网络),感受野大,能综合更多的语义信息,但是小目标在此些层已经相关的特征了,或者特征数量不足,导致 和大目标 特征信息比例严重失衡,无法被损失函数识别,因此导致

无法更新的模型的权重中去,所以,仅仅用高层网络抽取出来的信息去识别小目标,是不行的。

所以,用FPN结构,综合多层的特征信息,可以有效的识别 中小目标,提高他们的召回率。31:00

 

关于 FPN里的特征融合

https://blog.youkuaiyun.com/weixin_29607637/article/details/112578963?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

 

 

以及 高清大图图解

FPN(特征金字塔)图解

 

Q1:不同深度的feature map为什么可以经过upsample后直接相加?

答:作者解释说这个原因在于我们做了end-to-end的training,因为不同层的参数不是固定的,不同层同时给监督做end-to-end training,所以相加训练出来的东西能够更有效地融合浅层和深层的信息。
原文链接:https://blog.youkuaiyun.com/weixin_38132153/article/details/107933383

### Feature Pyramid Network (FPN) 结构图解释 #### FPN 的核心概念 Feature Pyramid Network (FPN)[^1]是一种用于目标检测的特征提取架构,旨在解决多尺度目标检测问题。它通过构建特征金字塔来增强模型对不同尺寸目标的检测能力[^2]。 #### FPN结构组成 FPN 的网络结构主要包括两个部分:自底向上(Bottom-Up)路径和自顶向下(Top-Down)路径[^3]。 - **自底向上路径**:这是基于传统卷积神经网络(如 ResNet)的标准前向传播过程,负责生成多次的特征图。每特征图都包含了不同的空间分辨率和语义信息。 - **自顶向下路径**:这一路径通过上采样操作将高次的语义信息传递到低次,并通过横向连接与对应的低特征图进行融合。这种设计使得低特征图不仅保留了丰富的空间细节,还获得了更强的语义表达能力。 #### 特征图融合机制 在 FPN 中,特征图的融合是一个关键步骤。具体来说,高特征图经过上采样后与对应低特征图按元素相加,形成新的特征图。这个过程可以重复多次,最终生成一系列具有相同通道数但不同分辨率的特征图[^5]。这些特征图随后被送入区域提议网络(Region Proposal Network, RPN)或其他检测模块中,用于生成不同尺度的目标建议框(proposals)[^4]。 以下是 FPN 的典型结构图及其组成部分: ![FPN Structure](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Fpn_structure.png/800px-Fpn_structure.png) #### 图解说明 1. **输入图像**:原始输入图像进入骨干网络(Backbone Network),通常为预训练好的 CNN 模型(如 ResNet 或 VGG)。 2. **C 次**:骨干网络输出多个中间特征图(记作 C2、C3、C4 和 C5),分别代表不同尺度的特征。 3. **P 次生成**: - P5 由 C5 经过 1×1 卷积降维生成; - P4 由 P5 上采样并与 C4 融合生成; - 同理依次生成 P3 和 P2。 4. **额外**:为了覆盖更的感受野,还可以从 P5 再生成更高一的特征图 P6 和 P7[^4]。 #### 锚点设置 在 FPN 的每一(P2 至 P6),都会定义一组锚点(anchors)。这些锚点的小分别为 \(32^2\)、\(64^2\)、\(128^2\)、\(256^2\) 和 \(512^2\),并且每个规模下有三种比例(1:2、1:1、2:1)。这样总共形成了 15 种可能的 anchor 配置[^4]。 --- ```python import torch.nn as nn class FPN(nn.Module): def __init__(self, in_channels_list, out_channels=256): super(FPN, self).__init__() # 定义 lateral layers 将各 channel 数调整一致 self.lateral_layer1 = nn.Conv2d(in_channels_list[0], out_channels, kernel_size=1) self.lateral_layer2 = nn.Conv2d(in_channels_list[1], out_channels, kernel_size=1) self.lateral_layer3 = nn.Conv2d(in_channels_list[2], out_channels, kernel_size=1) # 定义 top-down pathway 的 conv layers self.topdown_block1 = nn.ConvTranspose2d(out_channels, out_channels, kernel_size=2, stride=2) self.topdown_block2 = nn.ConvTranspose2d(out_channels, out_channels, kernel_size=2, stride=2) def forward(self, c2, c3, c4): p4 = self.lateral_layer3(c4) p3 = self._upsample_add(p4, self.lateral_layer2(c3)) p2 = self._upsample_add(p3, self.lateral_layer1(c2)) return [p2, p3, p4] def _upsample_add(self, x, y): _,_,H,W = y.size() return nn.functional.interpolate(x, size=(H,W), mode='bilinear') + y ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事如yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值