当前位置: 首页 > article >正文

目标检测 - 从FPN到PAN:双向路径聚合如何提升特征融合效率

1. 目标检测中的特征金字塔从FPN到PAN的进化之路在目标检测任务中处理多尺度目标一直是个棘手的问题。想象一下你要在一张图片中同时识别出近处的行人、远处的车辆和更远处的交通标志这些目标的尺寸差异可能达到数十倍。传统方法就像用同一把尺子测量大象和蚂蚁效果自然不理想。特征金字塔网络FPN的提出改变了这一局面。它通过构建自顶向下Top-down的特征金字塔将高层语义信息传递给低层特征。这就像给检测系统装上了望远镜和显微镜让模型既能看清大目标也能捕捉小细节。但FPN有个明显缺陷信息流动是单向的低层的精确定位信息无法有效传递给高层。我在实际项目中就遇到过这种情况当处理密集小目标时FPN的表现总是不尽如人意。直到尝试了路径聚合网络PAN检测精度才有了显著提升。这让我意识到双向信息流动对目标检测有多重要。2. FPN的工作原理与局限性2.1 FPN的基本结构FPN的核心思想很简单通过横向连接lateral connection和上采样upsampling构建从深层到浅层的特征金字塔。具体实现通常包含三个关键步骤自底向上的特征提取Backbone网络如ResNet会自然生成不同尺度的特征图我们记作C1到C5其中C5的感受野最大自顶向下的特征传播从C5开始通过上采样将高层特征与低层特征融合横向连接使用1×1卷积对齐通道数后将Backbone的特征与上采样特征相加# 简化版FPN实现示例 class FPN(nn.Module): def __init__(self, backbone_channels[256, 512, 1024, 2048], fpn_channels256): super().__init__() # 横向连接的1×1卷积 self.lateral_convs nn.ModuleList([ nn.Conv2d(channels, fpn_channels, 1) for channels in backbone_channels ]) # 上采样使用的3×3卷积 self.fpn_convs nn.ModuleList([ nn.Conv2d(fpn_channels, fpn_channels, 3, padding1) for _ in backbone_channels ]) def forward(self, features): laterals [conv(feat) for conv, feat in zip(self.lateral_convs, features)] # 自顶向下路径 for i in range(len(laterals)-1, 0, -1): laterals[i-1] F.interpolate(laterals[i], scale_factor2) return [conv(feat) for conv, feat in zip(self.fpn_convs, laterals)]2.2 FPN的三大痛点虽然FPN在很多场景表现不错但在实际部署中我发现几个明显问题信息衰减问题低层的精确位置信息在向上传递过程中会逐渐丢失。就像传话游戏经过多层传递后原始信息已经失真小目标检测不稳定对小目标的检测结果波动较大特别是当目标密集出现时特征融合不充分简单的相加操作可能无法有效融合不同层次的特征有次我在处理卫星图像时FPN对小建筑物的召回率比大建筑物低了近15个百分点。这促使我开始寻找更好的特征融合方案。3. PAN的创新设计双向信息高速公路3.1 双向路径聚合的核心理念PAN的核心创新在于增加了自底向上Bottom-up的路径增强。如果说FPN是单行道那么PAN就是双向八车道的高速公路。这种设计带来了三个关键优势位置信息保留低层的精确位置信息可以向上传递改善定位精度多级特征复用每个层次的特征都能被多次利用提高特征利用率自适应特征选择网络可以自主决定哪些信息需要向上或向下传递在实际项目中改用PAN后小目标的检测AP提升了约8%而计算量仅增加了不到5%。这个性价比让我印象深刻。3.2 PAN的代码级实现细节不同框架对PAN的实现各有特色。以mmdetection和nanodet为例我们看看实际工程中的处理方式# mmdetection风格的PAN实现 class PAN(nn.Module): def __init__(self, in_channels[256, 512, 1024, 2048], out_channels256): super().__init__() # 自顶向下路径同FPN self.top_down_layers nn.ModuleList([ nn.Conv2d(ch, out_channels, 1) for ch in in_channels ]) # 自底向上路径新增的卷积层 self.bottom_up_convs nn.ModuleList() for i in range(len(in_channels)-1): self.bottom_up_convs.append(nn.Sequential( nn.Conv2d(out_channels, out_channels, 3, stride2, padding1), nn.BatchNorm2d(out_channels), nn.ReLU() )) def forward(self, features): # 自顶向下路径 top_down [] for i in range(len(features)-1, -1, -1): if i len(features)-1: top_down.append(self.top_down_layers[i](features[i])) else: top_down.append(self.top_down_layers[i](features[i]) F.interpolate(top_down[-1], scale_factor2)) # 自底向上路径 bottom_up [top_down[-1]] for i in range(len(top_down)-1): bottom_up.append(self.bottom_up_convs[i](bottom_up[-1]) top_down[-i-2]) return bottom_up[::-1] # 按从浅到深的顺序返回nanodet的实现更加轻量直接使用插值进行特征融合# nanodet风格的轻量级PAN class LightPAN(nn.Module): def forward(self, features): # 自顶向下 for i in range(len(features)-1, 0, -1): features[i-1] F.interpolate(features[i], scale_factor2) # 自底向上 for i in range(len(features)-1): features[i1] F.interpolate(features[i], scale_factor0.5) return features4. PAN在YOLO系列中的应用实践4.1 YOLOv4中的PAN改进YOLOv4对原始PAN做了几处重要改进跨阶段连接借鉴CSPNet思想减少计算冗余SPP模块集成在PAN路径中加入空间金字塔池化增强感受野Mish激活函数替代ReLU获得更好的梯度流动这些改进使得YOLOv4在保持速度优势的同时精度大幅提升。我在工业质检项目中测试发现相比YOLOv3v4对小缺陷的检测率提升了12%。4.2 轻量化PAN设计技巧对于资源受限的场景可以考虑以下优化策略通道裁剪减少PAN中特征图的通道数如从256减至128深度可分离卷积替换标准3×3卷积降低计算量部分连接只对关键层级进行双向连接# 轻量级PAN实现示例 class LitePAN(nn.Module): def __init__(self, channels128): super().__init__() # 使用深度可分离卷积 self.dw_conv nn.Sequential( nn.Conv2d(channels, channels, 3, padding1, groupschannels), nn.BatchNorm2d(channels), nn.ReLU(), nn.Conv2d(channels, channels, 1), nn.BatchNorm2d(channels), nn.ReLU() ) def forward(self, features): # 只对P3-P5进行双向连接 p3, p4, p5 features[-3:] # 自顶向下 p4 F.interpolate(p5, scale_factor2) p3 F.interpolate(p4, scale_factor2) # 自底向上 p4 self.dw_conv(F.avg_pool2d(p3, 2)) p5 self.dw_conv(F.avg_pool2d(p4, 2)) return [p3, p4, p5]5. 特征融合的进阶思考5.1 加法 vs 拼接哪种融合方式更好在实现PAN时特征融合有两种主要方式融合方式优点缺点适用场景特征相加计算量小参数少可能丢失部分信息计算资源受限特征拼接保留完整信息增加通道数提升计算量精度优先场景我的经验是对于轻量级模型加法更合适而对于追求精度的场景拼接效果更好。可以像这样灵活选择def merge_features(feat1, feat2, methodadd): if method add: return feat1 feat2 elif method concat: return torch.cat([feat1, feat2], dim1) else: raise ValueError(fUnknown merge method: {method})5.2 特征金字塔的层级选择不是所有层级都适合加入PAN。通过实验发现对于输入尺寸为640×640的图像P3-P5stride 8/16/32通常足够更高分辨率的P2stride 4会显著增加计算量但对小目标提升有限更深的P6-P7stride 64/128对大目标检测有帮助在无人机图像检测项目中我最终选择了P3-P5的配置在精度和速度间取得了最佳平衡。

相关文章:

目标检测 - 从FPN到PAN:双向路径聚合如何提升特征融合效率

1. 目标检测中的特征金字塔:从FPN到PAN的进化之路 在目标检测任务中,处理多尺度目标一直是个棘手的问题。想象一下,你要在一张图片中同时识别出近处的行人、远处的车辆和更远处的交通标志,这些目标的尺寸差异可能达到数十倍。传统…...

CAJ转PDF终极指南:3步告别知网格式限制,实现跨平台学术自由

CAJ转PDF终极指南:3步告别知网格式限制,实现跨平台学术自由 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https:…...

如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战

如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战 【免费下载链接】lightnovel-crawler Generate and download e-books from online sources. 项目地址: https://gitcode.com/gh_mirrors/li/lightnovel-crawler Lightnovel-crawler是一款强大的轻小说…...

如何让Windows 11界面更顺手:ExplorerPatcher完整配置指南

如何让Windows 11界面更顺手:ExplorerPatcher完整配置指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为Windows 11的新界…...

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 想象一下,你手中的百元…...

Neoscroll.nvim调试技巧:解决滚动异常的常见问题指南

Neoscroll.nvim调试技巧:解决滚动异常的常见问题指南 【免费下载链接】neoscroll.nvim Smooth scrolling neovim plugin written in lua 项目地址: https://gitcode.com/gh_mirrors/ne/neoscroll.nvim 作为一款优秀的平滑滚动插件,Neoscroll.nvim…...

当点云遇上核技巧:一文搞懂K-PCA为何能处理非线性数据(附Sklearn对比实验)

当点云遇上核技巧:一文搞懂K-PCA为何能处理非线性数据(附Sklearn对比实验) 想象你手中握着一团缠绕的毛线——在三维空间里它呈现出复杂的螺旋结构。如果强行用平面镜去照射这个物体,得到的投影永远是一团混乱的线条。这正是线性P…...

120MHz Cortex-M3+150DMIPS+ART加速器:STM32F205RBT6的性能参数解析

STM32F205RBT6:120MHz Cortex-M3工业互联MCU的技术解析在工业控制、电机驱动以及物联网网关等嵌入式应用中,微控制器往往需要同时兼顾高算力、实时响应与丰富的工业通信接口。STM32F205RBT6是意法半导体基于ARM Cortex-M3内核的高性能系列产品&#xff0…...

Visual C++运行库全家桶:一站式解决Windows软件兼容性问题的终极方案

Visual C运行库全家桶:一站式解决Windows软件兼容性问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动&qu…...

工业网关、电机控制、人机界面:ATSAME70Q21B-AN的应用版图

ATSAME70Q21B-AN:300MHz Cortex-M7工业MCU的嵌入式应用解析在工业控制、人机界面和物联网网关等领域,微控制器需要在处理性能、外设集成度和环境适应性之间取得平衡。ATSAME70Q21B-AN是Microchip推出的基于ARM Cortex-M7内核的高性能32位微控制器&#x…...

别再死记硬背了!用Pointer Network搞定NLP里的OOV难题(附代码实战)

Pointer Network实战:如何优雅解决NLP中的OOV难题 在电商客服机器人开发中,你是否遇到过这样的尴尬场景:当用户询问"冰墩墩什么时候补货"时,机器人却回复"该商品暂无库存"——它完全没理解"冰墩墩"…...

智慧工厂与养殖场的一体化光伏监控系统方案

某企业从事乳制品的生产、销售等全流程业务,新增一套分布式光伏发电系统以平衡能耗支出,主要覆盖乳制品生产加工厂、奶牛养殖场及生态观光牧场等场景,实现“自给自足、余电上网”等综合能源目标。现需要对光伏电站进行联网集中监控&#xff0…...

5分钟搞定!iperf3 Windows版:专业网络性能测试工具完全指南

5分钟搞定!iperf3 Windows版:专业网络性能测试工具完全指南 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 你是否曾经怀疑过…...

CAN总线终端电阻:从120Ω与0.25W的选型,看信号完整性与系统鲁棒性设计

1. 为什么CAN总线需要终端电阻? 第一次接触CAN总线设计时,我也曾疑惑:为什么要在总线两端各加一个120Ω的电阻?直接连线不行吗?直到亲眼目睹不加电阻时总线上的信号振荡,才真正理解终端电阻的重要性。 CAN总…...

CANN/ops-nn RMS归一化动态量化算子

AddRmsNormDynamicQuantV2 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推…...

手把手教你用STM32F103C8T6(正点原子mini板)驱动SHT31温湿度传感器(附完整工程)

从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南 当你第一次拿到正点原子Mini开发板和SHT31传感器时,是否曾被密密麻麻的引脚和陌生的术语吓退?别担心,这篇文章将用最接地气的方式,带你完成从硬件连接到数据采集的全过程。不同…...

FanControl深度解析:解锁Windows风扇控制的专业级配置哲学

FanControl深度解析:解锁Windows风扇控制的专业级配置哲学 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响)

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响) 当你在Xilinx Vivado中配置Aurora 8B/10B IP核时,是否曾被USER_CLK的计算问题困扰?这个看似简单的参数背后,其实隐藏着线速率、数…...

图神经网络终于能“上生产”了?SITS 2026发布首个支持实时增量训练的AI原生图引擎(附Benchmark对比:吞吐提升6.8×,延迟压至12ms)

更多请点击: https://intelliparadigm.com 第一章:AI原生图计算应用:SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架,深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...

储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战

摘要: 随着储能系统在全球范围的大规模部署,出海项目的硬件BOM成本压力与恶劣环境下的维护成本日益凸显。传统的“x86工控机下发控制 透传网关上传数据”的双体架构显得极度臃肿且易引发单点故障。本文从底层研发架构师视角出发,深度拆解符合…...

《QGIS空间数据处理与高级制图》004:内置地理处理工具箱

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化 在航天任务规划中,轨道设计往往是项目初期最耗时的环节之一。传统方法需要工程师反复调整参数、运行仿真、分析结果,整个过程可能持续数小时甚至数天。而ST…...

CANN/GE动态输入Python构图示例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解) 在开源通信领域,Asterisk作为功能最强大的PBX系统之一,长期困扰初学者的不是其丰富的功能,而是复杂的编译安装过…...

CANN/GE动态输入算子样例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...

娱乐圈天降紫微星终结乱象,海棠山铁哥终结资源咖霸屏时代

资源咖的丧钟,已鸣。 草根王的号角,已响。一、旧秩序罪状书固化霸权三宗罪现场速写1. 资源垄断霸占赛道、包揽曝光、红利通吃2. 圈层护城出身即顶流,背景即通行证3. 劣币驱逐流水线泛滥,原创被碾压,审美被带偏 “无资源…...

3天搞定中文API大全:从菜鸟到高手的完整指南

3天搞定中文API大全:从菜鸟到高手的完整指南 嘿,开发者!你是不是经常为找一个好用的API而烦恼?项目做到一半,突然发现某个API文档全是英文,看得头大?别担心,今天我要给你介绍一个超级…...

终极Visual C++运行库修复指南:一劳永逸解决Windows软件兼容性问题

终极Visual C运行库修复指南:一劳永逸解决Windows软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库修复工具是解决Windo…...

CherryPy与数据库集成:SQLAlchemy和ORM模式详解

CherryPy与数据库集成:SQLAlchemy和ORM模式详解 【免费下载链接】cherrypy CherryPy is a pythonic, object-oriented HTTP framework. https://cherrypy.dev 项目地址: https://gitcode.com/gh_mirrors/ch/cherrypy CherryPy是一个Python风格的面向对象HTTP…...

构建 AI Agent 应用商店的构想

构建 AI Agent 应用商店的构想:从“单骑救主”的工具到“生态协同”的智能枢纽关键词 AI Agent、应用商店、多Agent协作、工具调用链、Prompt工程标准化、安全沙箱、智能分发摘要 当你在凌晨2点对着一份混乱的月度财务报表焦虑时,有没有想过:…...