首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[yolov11改进系列]基于yolov11修改Neck为双向特征金子塔BiFPN网络的python源码+训练源码

[yolov11改进系列]基于yolov11修改Neck为双向特征金子塔BiFPN网络的python源码+训练源码

作者头像
git clone firc-dataset
发布2025-07-18 15:46:37
发布2025-07-18 15:46:37
1.7K0
举报

[BiFPN介绍]

1. BiFPN简介

双向特征融合和加权融合机制,主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。

本文系统地研究了目标检测地神经网络架构设计选择,并提出了几项关键优化以提高效率。首先,本文提出了一种加权双向特征金字塔网络(BIFPN),它允许轻松且快速地进行多尺度特征融合;其次,本文提出了一种复合缩放方法,它可以同时均匀地缩放所有背景网络/特征网络和框/类别预测网络地分辨率,深度和宽度。基于这些优化和更好地背景网络,本文开发了一个新的目标检测器家族,称为EffientDet。

2. BiFPN的基本原理

BiFPN(Bidirectional Feature Pyramid Network),双向特征金字塔网络是一种高效的多尺度特征融合网络,它在传统特征金字塔(FPN)的基础上进行了优化,主要特点包括:

  1. 高效的双向跨尺度连接:BIFPN通过在自顶向下和自底向上路径之间建立双向连接,允许不同尺度特征间的信息更有效的流动和融合
  2. 简化的网络结构:BiFPN通过删除只有一个输入边的节点,在同一层级的输入和输出节点间添加额外边,以及将每个双向路径视为一个特征网络层并重复多次,来优化跨尺度连接
  3. 加权特征融合:BiFPN引入了可学习的权重来确定不同输入特征的重要性,从而提高了特征融合的效果
2.1 BiFPN基本原理
  1. 双向特征融合:BiFPN允许特征在自顶向下和自底向上两个方向上进行融合,从而更有效的结合不同尺度的特征。移除了只有一个输入边的节点,这种简化的直觉是如果一个节点没有进行特征融合,它只有一个输入边,那么它对于融合不同特征的特征网络的贡献会更小
  2. 加权融合机制:BiFPN通过为每个输入特征添加权重来优化特征融合过程,使得网络可以更加重视信息量更大的特征,在相同层级的原始输入和输出节点之间增加了额外的边缘
  3. 结构优化:BiFPN通过移除只有一个输入边的节点,添加同一层级的输入输出节点之间的额外边,并将每个双向路径视为一个特征网络层,来优化跨尺度连接
2.1 BiFPN与其他网络对比

(a) FPN(Feature Pyramid Network):引入自顶向下的路径来融合从第3层到第7层(P3-P7)的多尺度特征

(b)PANet:在FPN的基础上增加了自底向上的额外路径

(c)NAS-FPN:使用神经网络搜索(NAS)来找到不规则的特征网络拓扑,然后重复应用相同的块

(d)BiFAN:通过高效的双向跨尺度连接和重复的块结构,改进了准确度和效率之间的权衡

BiFPN通过双向路径允许特征信息在不同尺度间双向流动,这种双向流动可以看作是在不同尺度之间进行有效信息交换。这样的设计旨在通过强化特征的双向流动来提升特征融合的效率和有效性,从而提高目标检测的性能

2.2 双向特征融合

双向特征融合在BiFPN(双向特征金字塔网络)中指的是一种机制,它允许在特征网络层中的信息在自顶向下和自底向上两个方向上流动和融合。这种方法与传统的单向特征金字塔网络(PANet)相比,能够在不同层级之间更高效地融合特征,而无需增加显著的计算成本。

在BiFPN中,每一条双向路径(自顶向下和自底向上)被视作一个单独的特征网络层,然后这些层可以被重复多次,以促进更高效级别的特征融合。这样做的结果是一个简化的双向网络,它增强了网络对特征融合的能力,使网络能够更有效的利用不同尺度的信息,从而提高目标检测的性能

下图是EfficientDet架构的具体细节,其中包含了EfficientNet作为骨干网络(backbone),以及BiFPN

作为特征网络的使用。在这个架构中,BiFPN层通过其双向特征融合的能力,从EfficientNet骨干网络接收多尺度的输入特征,然后生成用于对象分类和边框预测的富有表现力的特征

在BiFPN层中,可以看到不同尺度的特征(P2->P7)如何通过上下双向路径进行融合。这种结构设计的目的是在保持计算效率的同时最大化特征融合的效果,以提高对象检测的整体性能。图中还显示了类别预测网络和边框预测网络,这些是在BiFPN特征融合后用于预测对象类别和定位对象边界框的网络部分。

2.3 加权融合机制

加权融合机制是BiPFN中用于改进特征融合效果的一种技术。在传统的特征金字塔网络中,所有输入特征通常在没有区分的情况下等同对待,这意味着不同分辨率的特征被简单地相加在一起,而不考虑它们对输出特征地不同贡献。然而,在BiFPN中,观察到由于不同地输入特征具有不同地分辨率,通常对输出特征地贡献是不等的。

为了解决这个问题,BiFPN提出了为每个输入添加一个额外的权重,并让网络学习每个输入特征的重要性:w为课学习权重

代码语言:javascript
复制
O=Sum(w.I)
2.4 结构优化

结构优化是为了在不同的资源约束下,通过复合缩放方法确定不同的层数,从而在保持效率的同时提高准确性。

  1. 简化的双向网络:通过优化结构,减少了网络中的节点数,特别是移除了那些只有一个输入边的节点。这种简化的直觉是如果一个节点没有进行特征融合,即它只有一个输入边,那么它对于融合不同特征的特征网络的贡献会更小
  2. 增加额外的边缘:在相同层级的原始输入和输出节点之间增加了额外的边缘,以便在不显著增加成本的情况下融合更多的特征
  3. 重复使用双向路径:与只有单一自顶向下和自底向上路径的panet不同,bifpn将每条双向(自顶向下和自底向上)路径视为一个特征网络层,并重复多次,以实现更高级别的特征融合。

【yolov11框架介绍】

2024 年 9 月 30 日,Ultralytics 在其活动 YOLOVision 中正式发布了 YOLOv11。YOLOv11 是 YOLO 的最新版本,由美国和西班牙的 Ultralytics 团队开发。YOLO 是一种用于基于图像的人工智能的计算机模

Ultralytics YOLO11 概述

YOLO11 是Ultralytics YOLO 系列实时物体检测器的最新版本,以尖端的精度、速度和效率重新定义了可能性。基于先前 YOLO 版本的令人印象深刻的进步,YOLO11 在架构和训练方法方面引入了重大改进,使其成为各种计算机视觉任务的多功能选择。

Key Features 主要特点
  • 增强的特征提取:YOLO11采用改进的主干和颈部架构,增强了特征提取能力,以实现更精确的目标检测和复杂任务性能。
  • 针对效率和速度进行优化:YOLO11 引入了精致的架构设计和优化的训练管道,提供更快的处理速度并保持准确性和性能之间的最佳平衡。
  • 使用更少的参数获得更高的精度:随着模型设计的进步,YOLO11m 在 COCO 数据集上实现了更高的平均精度(mAP),同时使用的参数比 YOLOv8m 少 22%,从而在不影响精度的情况下提高计算效率。
  • 跨环境适应性:YOLO11可以无缝部署在各种环境中,包括边缘设备、云平台以及支持NVIDIA GPU的系统,确保最大的灵活性。
  • 支持的任务范围广泛:无论是对象检测、实例分割、图像分类、姿态估计还是定向对象检测 (OBB),YOLO11 旨在应对各种计算机视觉挑战。

​​

与之前的版本相比,Ultralytics YOLO11 有哪些关键改进?

Ultralytics YOLO11 与其前身相比引入了多项重大进步。主要改进包括:

  • 增强的特征提取:YOLO11采用改进的主干和颈部架构,增强了特征提取能力,以实现更精确的目标检测。
  • 优化的效率和速度:精细的架构设计和优化的训练管道可提供更快的处理速度,同时保持准确性和性能之间的平衡。
  • 使用更少的参数获得更高的精度:YOLO11m 在 COCO 数据集上实现了更高的平均精度(mAP),参数比 YOLOv8m 少 22%,从而在不影响精度的情况下提高计算效率。
  • 跨环境适应性:YOLO11可以跨各种环境部署,包括边缘设备、云平台和支持NVIDIA GPU的系统。
  • 支持的任务范围广泛:YOLO11 支持多种计算机视觉任务,例如对象检测、实例分割、图像分类、姿态估计和定向对象检测 (OBB)

【测试环境】

windows10 x64

ultralytics==8.3.0

torch==2.3.1

【改进流程】

1. 新增BiFPN.py实现骨干网络(代码太多,核心模块源码请参考改进步骤.docx)然后在同级目录下面创建一个__init___.py文件写代码

from .BiFPN import *

2. 文件修改步骤

修改tasks.py文件

创建模型配置文件

yolo11-BiFPN.yaml内容如下:

代码语言:javascript
复制
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [4, 1, Conv, [256]]  # 11-P3/8
  - [6, 1, Conv, [256]]  # 12-P4/16
  - [10, 1, Conv, [256]]  # 13-P5/32

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 14 P5->P4
  - [[-1, 12], 1, Bi_FPN, []] # 15
  - [-1, 3, C3k2, [256, False]] # 16-P4/16

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 17 P4->P3
  - [[-1, 11], 1, Bi_FPN, []] # 18
  - [-1, 3, C3k2, [256, False]] # 19-P3/8

  - [1, 1, Conv, [256, 3, 2]] # 20 P2->P3
  - [[-1, 11, 19], 1, Bi_FPN, []] # 21
  - [-1, 3, C3k2, [256, False]] # 22-P3/8

  - [-1, 1, Conv, [256, 3, 2]] # 23 P3->P4
  - [[-1, 12, 16], 1, Bi_FPN, []] # 24
  - [-1, 3, C3k2, [512, False]] # 25-P4/16

  - [-1, 1, Conv, [256, 3, 2]] # 26 P4->P5
  - [[-1, 13], 1, Bi_FPN, []] # 27
  - [-1, 3, C3k2, [1024, True]]  # 28-P5/32

  - [[22, 25, 28], 1, Detect, [nc]]  # Detect(P3, P4, P5)
3. 验证集成

使用新建的yaml配置文件启动训练任务:

代码语言:javascript
复制
from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('yolo11-BiFPN.yaml')  # build from YAML and transfer weights
        # Train the model
    results = model.train(data='coco128.yaml',epochs=100, imgsz=640, batch=8, device=0, workers=1, save=True,resume=False)

成功集成后,训练日志中将显示CGAttension模块的初始化信息,表明已正确加载到模型中。

【训练说明】

第一步:首先安装好yolov11必要模块,可以参考yolov11框架安装流程,然后卸载官方版本pip uninstall ultralytics,最后安装改进的源码pip install . 第二步:将自己数据集按照dataset文件夹摆放,要求文件夹名字都不要改变 第三步:分别打开train.py,coco128.yaml和模型参数yaml文件修改必要的参数,最后执行python train.py即可训练

【提供文件】

代码语言:javascript
复制
├── [官方源码]ultralytics-8.3.0.zip
├── train/
│   ├── coco128.yaml
│   ├── dataset/
│   │   ├── train/
│   │   │   ├── images/
│   │   │   │   ├── firc_pic_1.jpg
│   │   │   │   ├── firc_pic_10.jpg
│   │   │   │   ├── firc_pic_11.jpg
│   │   │   │   ├── firc_pic_12.jpg
│   │   │   │   ├── firc_pic_13.jpg
│   │   │   ├── labels/
│   │   │   │   ├── classes.txt
│   │   │   │   ├── firc_pic_1.txt
│   │   │   │   ├── firc_pic_10.txt
│   │   │   │   ├── firc_pic_11.txt
│   │   │   │   ├── firc_pic_12.txt
│   │   │   │   ├── firc_pic_13.txt
│   │   └── val/
│   │       ├── images/
│   │       │   ├── firc_pic_100.jpg
│   │       │   ├── firc_pic_81.jpg
│   │       │   ├── firc_pic_82.jpg
│   │       │   ├── firc_pic_83.jpg
│   │       │   ├── firc_pic_84.jpg
│   │       ├── labels/
│   │       │   ├── firc_pic_100.txt
│   │       │   ├── firc_pic_81.txt
│   │       │   ├── firc_pic_82.txt
│   │       │   ├── firc_pic_83.txt
│   │       │   ├── firc_pic_84.txt
│   ├── train.py
│   ├── yolo11-BiFPN.yaml
│   └── 训练说明.txt
├── [改进源码]ultralytics-8.3.0.zip
├── 改进原理.docx
└── 改进流程.docx

【常见问题汇总】 问:为什么我训练的模型epoch显示的map都是0或者map精度很低? 回答:由于源码改进过,因此不能直接从官方模型微调,而是从头训练,这样学习特征能力会很弱,需要训练很多epoch才能出现效果。此外由于改进的源码框架并不一定能够保证会超过官方精度,而且也有可能会存在远远不如官方效果,甚至精度会很低。这说明改进的框架并不能取得很好效果。所以说对于框架改进只是提供一种可行方案,至于改进后能不能取得很好map还需要结合实际训练情况确认,当然也不排除数据集存在问题,比如数据集比较单一,样本分布不均衡,泛化场景少,标注框不太贴合标注质量差,检测目标很小等等原因 【重要说明】 我们只提供改进框架一种方案,并不保证能够取得很好训练精度,甚至超过官方模型精度。因为改进框架,实际是一种比较复杂流程,包括框架原理可行性,训练数据集是否合适,训练需要反正验证以及同类框架训练结果参数比较,这个是十分复杂且漫长的过程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1. BiFPN简介
  • 2. BiFPN的基本原理
    • 2.1 BiFPN基本原理
    • 2.1 BiFPN与其他网络对比
    • 2.2 双向特征融合
    • 2.3 加权融合机制
    • 2.4 结构优化
    • Ultralytics YOLO11 概述
    • Key Features 主要特点
      • 与之前的版本相比,Ultralytics YOLO11 有哪些关键改进?
      • 1. 新增BiFPN.py实现骨干网络(代码太多,核心模块源码请参考改进步骤.docx)然后在同级目录下面创建一个__init___.py文件写代码
      • 2. 文件修改步骤
      • 3. 验证集成
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档