深度学习之PAN详解

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

目录

一、提出原因

二、PAN结构分析


一、提出原因

说到PAN,总能联想到与之相似的FPN。有关FPN的介绍分析可以康康博主之前的文章(PAN推荐和FPN结合一起学习)

深度学习中的FPN详解_tt丫的博客-优快云博客

FPN是自上向下的一个特征金字塔,把高层的强语义特征传递下来,对整个金字塔进行增强,不过它只增强了语义信息,却对定位信息没有传递(或者说是因为向上传递路径太长,传递效果不好)。PAN就是针对这一点,在FPN的后面添加一个自下向上的金字塔,对FPN进行补充,将低层的定位特征传递上去,这样形成的金字塔既结合了语义信息又拥有定位信息,“双杀”


二、PAN结构分析

PAN结构图如下图所示:

在FPN的自上而下形成的特征金字塔的基础上,来以下这波操作就是PAN啦

(1)先复制特征金字塔中最底下的那层(①),变成新特征金字塔的最底层。

(2)将新特征金字塔的最底层来一个下采样操作,然后原特征金字塔的倒数第二层进行一个3 * 3卷积,步幅为2;然后与下采样后的最底层进行一个横向连接,两者相加。最后再来一个3 * 3卷积来融合他们的特征。

(3)新特征金字塔其他层的操作与(2)一致。


 欢迎大家在评论区批评指正,谢谢大家~

### PAN 结构介绍 PAN (Path Aggregation Network) 是一种用于增强特征金字塔网络(Feature Pyramid Networks, FPN)的架构设计,旨在提升目标检测和其他计算机视觉任务中的多尺度表示能力[^1]。FPN通过自上而下的路径来融合来自不同层次的信息,但是这种单向的信息流可能会导致低层细节丢失或者高层语义信息不足。 为了克服这些问题,PAN引入了一个额外的自底向上路径,使得底层富含空间信息的特征可以更好地传递给顶层,从而形成更强大的特征表达。具体来说,在标准FPN的基础上增加了两条横向连接:一条是从最底部的高分辨率浅层特征图逐层加权相加以补充到每一级;另一条则是从经过处理后的深层特征反向传播回较浅位置,最终得到一个双向聚合的特征金字塔结构。 #### 应用场景 PAN因其出色的性能被广泛应用于多种计算机视觉任务中: - **物体检测**:特别是在小目标检测方面表现出色,因为其能够有效地保留图像中小尺寸对象的空间信息。 - **实例分割**:如Panoptic FPN所展示的那样,该方法不仅提高了边界框预测精度,还增强了像素级别的分类准确性。 - **姿态估计**:对于人体或其他复杂形状的目标而言,精确捕捉局部区域内的细微变化至关重要,而这正是PAN擅长之处。 - **视频理解**:当涉及到连续帧之间的关联性和一致性时,利用时间维度上的上下文线索同样重要,此时采用类似于PAN的设计可以帮助改善时空建模效果。 ```python import torch.nn as nn class PathAggregationNetwork(nn.Module): def __init__(self, in_channels_list, out_channel=256): super(PathAggregationNetwork, self).__init__() # 自顶向下部分(Top-down pathway) self.lateral_convs = nn.ModuleList() self.fpn_convs = nn.ModuleList() for i in range(len(in_channels_list)): lateral_conv = ConvModule( in_channels_list[i], out_channel, kernel_size=1) fpn_conv = ConvModule( out_channel, out_channel, kernel_size=3, padding=1) self.lateral_convs.append(lateral_conv) self.fpn_convs.append(fpn_conv) # 自底向上部分(Bottom-up pathway) self.bottom_up_convs = nn.ModuleList([ ConvModule(out_channel * 2, out_channel, kernel_size=3, padding=1), ConvModule(out_channel * 2, out_channel, kernel_size=3, padding=1)]) def forward(self, inputs): laterals = [ lat_conv(inputs[i]) for i, lat_conv in enumerate(self.lateral_convs)] used_backbone_levels = len(laterals) for i in range(used_backbone_levels - 1, 0, -1): prev_shape = laterals[i - 1].shape[2:] laterals[i - 1] += F.interpolate( laterals[i], size=prev_shape, mode='nearest') outs = [ self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels)] bottom_up_outs = [] bottom_up_outs.append(outs[-1]) for i in range(len(outs)-2,-1,-1): bottom_up_outs.insert(0,F.max_pool2d(bottom_up_outs[0],kernel_size=3,stride=2,padding=1)+outs[i]) return tuple(bottom_up_outs) ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tt丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值