YOLOv8优改系列一:YOLOv8融合BiFPN网络,实现网络快速涨点

本文介绍了将BiFPN应用于YOLOv8以增强网络性能的方法,包括BiFPN的工作原理、优势以及如何通过修改配置文件、创建模块文件和训练代码来实现这一融合。通过双向跨尺度连接和加权特征融合,BiFPN能有效捕获多尺度特征,提高目标检测任务的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

💥 💥💥 💥💥 💥💥 💥💥神经网络专栏改进完整目录点击
💗 只需订阅一个专栏即可享用所有网络改进内容每周定时更新
文章内容:针对YOLOv8的Neck部分融合BiFPN(双向特征金字塔网络)网络,实现网络快速涨点!!!
推荐指数(满分五星):⭐️⭐️⭐️⭐️
涨点指数(满分五星):⭐️⭐️⭐️⭐️


一、BiFPN介绍

🌳论文地址点击
🌳源码地址点击
🌳问题阐述:传统的自上而下的FPN在本质上受到单向信息流的限制。为了解决这个问题,PANet 添加了一个额外的自底向上的路径聚合网络。最近,NAS-FPN 采用神经结构搜索来搜索更好的跨尺度特征网络拓扑,但在搜索过程中需要数千小时的GPU,发现的网络不规则,难以解释或修改。
🌳主要思想:1. 高效的双向跨尺度连接;2. 加权特征图融合。
🌳解决方法

  1. PANet进行特征融合时,是通过Concat的,一般高层和低层的特征贡献程度相同,BiFPN在特征融合时,通过一组可学习的归一化权重参数调整各层贡献程度。
  2. BiFPN堆叠多层实现更高维度的特征融合。

🌳工作原理

  1. 特征金字塔生成:最初,网络通过从骨干网络(通常是ResNet等卷积神经网络)的多个层中提取特征来生成特征金字塔。

  2. 双向连接:与传统FPN不同,BiFPN在特征金字塔相邻级别之间引入了双向连接。这意味着信息可以从更高级别的特征流向更低级别的特征(自顶向下路径),也可以从更低级别的特征流向更高级别的特征(自底向上路径)。

  3. 特征整合:双向连接允许在两个方向上整合来自特征金字塔不同级别的信息。这种整合有助于有效地捕获多尺度特征。

  4. 加权特征融合:BiFPN采用加权特征融合机制,将不同级别的特征进行组合。融合的权重在训练过程中学习,确保了最佳的特征整合。

   BiFPN中的双向连接有助于更好地在不同尺度上捕获特征表示,提高了网络处理不同尺寸和复杂度对象的能力。这在目标检测任务中尤为重要,因为图像中的对象大小可能差异显著。

🌳网络结构图
在这里插入图片描述

二、核心代码修改

2.1 修改yaml配置文件

复制一份ultralytics\cfg\models\v8\yolov8.yaml下的yolov8.yaml文件到v8同级目录文件my_v8(新创建一个,好区分),取名为yolov8-bifpn.yaml,然后将yolov8-bifpn.yaml文件内容全部修改为以下内容(加入了跳级连接以及加权特征融合,完全按照bifpn的方式加入):

配置文件,可通过关注公众号【AI应用视界】
    输入关键字 yolov8+bifpn 自动获取

2.2 创建模块文件

ultralytics\nn\modules,在此路径下新建专门存放我们新添加的模块文件夹my_modules(好区分),然后在此文件夹下新建bifpn.py,添加以下内容:

核心模块文件,可通过关注公众号【AI应用视界】
    输入关键字 yolov8+bifpn 自动获取

2.3 修改task.py文件

在ultralytics\nn文件夹中找到tasks.py文件,并对以下内容(#todo)进行添加。

  • 第20行,导入bifpn模块
  • 第711行,定义此模块的处理方式,和concat一致
...................
from ultralytics.utils.plotting import feature_visualization
from ultralytics.utils.torch_utils import (fuse_conv_and_bn, fuse_deconv_and_bn, initialize_weights, intersect_dicts,
                                           make_divisible, model_info, scale_img, time_sync)
from ultralytics.nn.my_modules.bifpn import BiFPN_Add2, BiFPN_Add3 #todo 第20行
...................
        elif m is Concat:
            c2 = sum(ch[x] for x in f)
        elif m in [BiFPN_Add2, BiFPN_Add3]: # 第 709行左右
            c2 = max([ch[x] for x in f])
        elif m in (Detect, Segment, Pose):
            args.append([ch[x] for x in f])
...................

2.4 修改训练代码

import os
from ultralytics import YOLO

current_path = os.path.dirname(os.path.realpath(__file__))
root_path = os.path.abspath(os.path.join(current_path, "../..")) + "/"

# Load a model
# model = YOLO(root_path + 'ultralytics/cfg/models/v8/yolov8s.yaml').load(
# 	root_path + 'weights/det/yolov8s.pt')  # build from YAML and transfer weights
model = YOLO(root_path + 'ultralytics/cfg/models/my_v8/yolov8-bifpn.yaml')
#model = YOLO(root_path + 'runs1/det/train3/weights/best.pt' ) # build from YAML and transfer weights

if __name__ == '__main__':
	# ultralytics/cfg/models/v8/yolov8s.yaml
	# ultralytics/cfg/models/my_v8/yolov8-bifpn.yaml
	results = model.train(data=root_path + 'my_file/object_detection/dataset_cfg/car.yaml', epochs=10, imgsz=416, batch=2, workers=0, lr0=0.01, amp=False, project=root_path+"runs/det")
 	#results = model.train(data=root_path + "my_file/object_detection/dataset_cfg/smoke.yaml", epochs=100, imgsz=416, batch=16, workers=4, lr0=0.01, resume=True, project=root_path+"runs1/det")

运行此代码即可将bifpn结合YOLOv8进行训练
在这里插入图片描述

2.5 问题总结

  1. 如果遇到v8在文件里修改了模型,但是训练时调用总是调用虚拟环境中的库
    • 是这种情况是没有成功载入你的模块,建议使用pycharm来运行,并仔细查看有没有导入正确。

微信公众号搜索方式:1.AI应用视界;2.可根据CSDN下方名片进行搜索
在这里插入图片描述

### YOLOv11 BiFPN 网络架构解析 YOLOv11引入了双向特征金字塔网络BiFPN)来增强模型性能[^2]。该网络结构旨在善不同尺度下的特征融合,从而提升目标检测的效果。 #### 特征提取与融合机制 在YOLOv11中,BiFPN位于骨干网络之后,负责处理来自多个层次的特征图。这些特征图经过系列上采样和下采样的操作,在不同的空间分辨率之间传递信息。具体来说: - **自顶向下路径**:从高层语义强但位置精度低的特征逐步恢复到较低层的空间细节; - **自底向上路径**:相反方向的操作,则是从细粒度却缺乏全局理解的信息逐渐汇聚成更具抽象性的表达; 这种双流设计允许每级都能获得更丰富的上下文感知能力,进而提高了最终输出的质量。 #### 关键组件说明 为了实现高效的跨级别交互,BiFPN采用了加权残差连接的方式来进行节间的组合运算。这意味着当两个或更多个源节汇入同个目标节时,会先计算它们各自的权重系数再相加以形成新的表示形式。这样的做法不仅有助于缓解梯度消失问题,而且可以更好地平衡各分支的重要性。 ```python def bifpn_layer(features, num_channels=256): P3_in, P4_in, P5_in = features # Top-down path P5_upsampled = tf.image.resize(P5_in, size=[tf.shape(P4_in)[1], tf.shape(P4_in)[2]]) P4_td = Conv_BatchNorm_Relu(num_channels)(P4_in + P5_upsampled) P4_upsampled = tf.image.resize(P4_td, size=[tf.shape(P3_in)[1], tf.shape(P3_in)[2]]) P3_out = Conv_BatchNorm_Relu(num_channels)(P3_in + P4_upsampled) # Bottom-up path P3_downsampled = MaxPooling2D()(P3_out) P4_out = Conv_BatchNorm_Relu(num_channels)((P4_td + P3_downsampled)) P4_downsampled = MaxPooling2D()(P4_out) P5_out = Conv_BatchNorm_Relu(num_channels)((P5_in + P4_downsampled)) return [P3_out, P4_out, P5_out] ``` 此代码片段展示了简化版的BiFPN单次迭代过程中的核心逻辑,实际应用中可能还会涉及到更多的化措施和技术细节。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZZY_dl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值