从YOLOv5/v8代码实战解析FPN与PAN的本质差异在目标检测领域特征金字塔网络(FPN)和路径聚合网络(PAN)是两种广泛使用的多尺度特征融合方法。许多教程会告诉你FPN是自上而下PAN是自底向上但这种死记硬背的理解方式在实际调参时往往派不上用场。本文将以YOLOv5和YOLOv8的Neck模块为例通过代码级解析和可视化实验带你真正理解这两种结构的本质区别和应用场景。1. 特征金字塔网络的核心思想与实现1.1 FPN在YOLO中的典型实现打开YOLOv5的模型配置文件如yolov5s.yaml我们可以看到Neck部分的典型配置# YOLOv5 v6.0 backbone backbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, C3, [128]], [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 [-1, 6, C3, [256]], [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 [-1, 9, C3, [512]], [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 [-1, 3, C3, [1024]], [-1, 1, SPPF, [1024, 5]], # 9 ] # YOLOv5 v6.0 head head: [[-1, 1, Conv, [512, 1, 1]], [-1, 1, nn.Upsample, [None, 2, nearest]], [[-1, 6], 1, Concat, [1]], # cat backbone P4 [-1, 3, C3, [512, False]], # 13 [-1, 1, Conv, [256, 1, 1]], [-1, 1, nn.Upsample, [None, 2, nearest]], [[-1, 4], 1, Concat, [1]], # cat backbone P3 [-1, 3, C3, [256, False]], # 17 (P3/8-small) [-1, 1, Conv, [256, 3, 2]], [[-1, 14], 1, Concat, [1]], # cat head P4 [-1, 3, C3, [512, False]], # 20 (P4/16-medium) [-1, 1, Conv, [512, 3, 2]], [[-1, 10], 1, Concat, [1]], # cat head P5 [-1, 3, C3, [1024, False]], # 23 (P5/32-large) ]这段配置清晰地展示了FPN的工作流程自上而下的特征传播从深层特征(P5)开始通过上采样(第12、16行)逐步向浅层特征传播横向连接每一层上采样后的特征会与对应层级的骨干网络特征进行拼接(第13、17行)特征融合拼接后的特征会经过C3模块进行进一步融合(第14、18行)1.2 FPN的特征流动可视化为了更直观地理解FPN的特征流动我们可以使用Netron工具可视化模型结构P5 (深层) → 上采样 → 与P4拼接 → 融合 P4 (中层) → 上采样 → 与P3拼接 → 融合 P3 (浅层) → 输出检测头这种结构使得高层特征的语义信息能够有效地传递到低层特征中增强了小目标的检测能力。但FPN的一个明显局限是低层的细节信息难以反向影响高层特征。2. 路径聚合网络的创新与进化2.1 PAN在YOLOv5中的实现演进YOLOv5在v6.0版本后引入了完整的PAN结构我们对比不同版本的配置文件可以看到这一演进# YOLOv5 v6.0 PAN结构关键部分 head: [[..., ..., Upsample, ...], # 自上而下路径(FPN部分) ..., [..., ..., Conv, [..., 3, 2]], # 自底向上路径(PAN部分) [[-1, ..., ..., Concat, ...], # 特征聚合 ...]PAN在FPN基础上增加了自底向上的路径形成了双向的特征金字塔。这种结构在YOLOv8中得到了进一步优化# YOLOv8的Neck配置示例 head: - [-1, 1, nn.Upsample, [None, 2, nearest]] # 上采样 - [[-1, -2], 1, Concat, [1]] # 拼接 - [-1, 3, C2f, [256]] # 融合 - [-1, 1, Conv, [256, 3, 2]] # 下采样 - [[-1, -3], 1, Concat, [1]] # 拼接 - [-1, 3, C2f, [512]] # 融合2.2 PAN的双向特征流动PAN的核心创新在于建立了双向的特征传播路径自上而下路径与FPN相同传递高层语义信息自底向上路径通过下采样操作将低层的细节信息传递到高层这种双向流动使得网络能够同时利用高层的语义信息和低层的细节信息对于多尺度目标检测特别有效。我们可以用以下表格对比两种结构的特征流动方向结构类型主要流动方向信息类型优势FPN自上而下语义信息增强小目标检测PAN双向流动语义细节信息综合提升各尺度检测3. 代码级解析从配置文件到实际效果3.1 YOLO中Neck模块的代码实现深入到YOLOv5的代码层面我们可以看models/yolo.py中如何实现这两种结构class Detect(nn.Module): def __init__(self, nc80, anchors(), ch(), inplaceTrue): super().__init__() self.stride torch.tensor([8., 16., 32.]) # 对应P3, P4, P5的输出stride def forward(self, x): # x来自Neck的三个输出层 p3, p4, p5 x # 分别对应小、中、大目标的检测 # 构建输出 return [p3, p4, p5]在训练过程中这三种尺度的特征图会分别负责不同大小目标的检测P3 (stride8)检测小目标P4 (stride16)检测中等目标P5 (stride32)检测大目标3.2 特征图可视化对比为了直观展示FPN和PAN的区别我们可以使用特征图可视化技术。以下是两种结构在COCO数据集上的表现对比FPN特征图特点 - 高层特征语义清晰但细节模糊 - 低层特征细节丰富但语义不明确 PAN特征图特点 - 各层特征都保持较好的语义和细节平衡 - 特征图中的激活区域更加精确这种差异在实际检测任务中表现为PAN结构对于遮挡、小目标和密集场景的检测效果通常优于纯FPN结构。4. 实战调参如何根据任务选择Neck结构4.1 不同场景下的结构选择建议基于我们的实验和经验给出以下实用建议应用场景推荐结构原因小目标检测PAN双向信息流动增强小目标特征实时检测轻量FPN计算量较小多尺度密集目标增强PAN更好的特征融合能力资源受限设备精简FPN平衡精度和速度4.2 自定义Neck结构的技巧在YOLO配置文件中我们可以灵活调整Neck结构# 自定义PAN结构示例 head: [[-1, 1, Conv, [256, 1, 1]], [-1, 1, nn.Upsample, [None, 2, nearest]], # 上采样 [[-1, 4], 1, Concat, [1]], # 拼接 [-1, 3, C3, [256, False]], # 融合 # 添加额外的下采样路径 [-1, 1, Conv, [256, 3, 2]], [[-1, 2], 1, Concat, [1]], # 拼接 [-1, 3, C3, [512, False]], # 融合 ]关键调参经验上采样方法nearest速度最快bilinear质量较好融合模块C3比普通Conv融合效果更好通道数根据任务复杂度调整小目标检测需要更多浅层通道5. 进阶讨论从YOLO看特征金字塔的发展趋势现代目标检测器中特征金字塔结构仍在不断进化。YOLOv8中的C2f模块和更灵活的路径连接方式代表了当前的一些优化方向更轻量的融合模块用更高效的运算实现特征融合动态路径选择根据输入内容自适应选择特征传播路径跨尺度注意力引入注意力机制增强重要特征这些改进使得特征金字塔网络能够更高效地处理各种复杂检测场景而理解FPN和PAN的核心差异正是把握这些高级改进的基础。