YOLOv8改进---BiFPN特征融合

一、BiFPN原理
1.1 基本原理
BiFPN(Bidirectional Feature Pyramid Network),双向特征金字塔网络是一种高效的多尺度特征融合网络,其基本原理概括分为以下几点:

  1. 双向特征融合:BiFPN允许特征在自顶向下和自底向上两个方向上进行融合,从而更有效地结合不同尺度的特征。
  2. 加权融合机制:BiFPN通过为每个输入特征添加权重来优化特征融合过程,使得网络可以更加重视信息量更大的特征。
  3. 结构优化:BiFPN通过移除只有一个输入边的节点、添加同一层级的输入输出节点之间的额外边,并将每个双向路径视为一个特征网络层,来优化跨尺度连接。

如下图所示:
在这里插入图片描述
(a) FPN (Feature Pyramid Network): 引入了自顶向下的路径来融合从第3层到第7层(P3 - P7)的多尺度特征。
(b) PANet: 在FPN的基础上增加了自底向上的额外路径。
© NAS-FPN: 使用神经架构搜索(NAS)来找到不规则的特征网络拓扑,然后重复应用相同的块。
(d) BiFPN: 通过高效的双向跨尺度连接和重复的块结构,改进了准确度和效率之间的权衡。
我们可以看出BiFPN通过双向路径允许特征信息在不同尺度间双向流动,这种双向流动可以看做是在不同尺度之间进行有效信息交换。这样的设计旨在通过强化特征的双向流动来提升特征融合的效率和有效性,从而提高目标检测的性能。

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

在BiFPN中,每一条双向路径(自顶向下和自底向上)被视作一个单独的特征网络层,然后这些层可以被重复多次,以促进更高级别的特征融合。这样做的结果是一个简化的双向网络,它增强了网络对特征融合的能力,使网络能够更有效地利用不同尺度的信息,从而提高目标检测的性能。
在这里插入图片描述
2.3 加权融合机制
加权融合机制是BiFPN中用于改进特征融合效果的一种技术。在传统的特征金字塔网络中,所有输入特征通常在没有区分的情况下等同对待,这意味着不同分辨率的特征被简单地相加在一起,而不考虑它们对输出特征的不同贡献。然而,在BiFPN中,观察到由于不同的输入特征具有不同的分辨率,它们通常对输出特征的贡献是不等的。

为了解决这个问题,BiFPN提出了为每个输入添加一个额外的权重,并让网络学习每个输入特征的重要性,融合的权重在训练过程中学习,确保了最佳的特征整合。

二、如何添加
2.1 BiFPN代码
在’ultralytics/nn/modules’目录下,创建一个py文件粘贴进去,bifpn.py

import torch.nn as nn
import torch
 
class swish(nn.Module):
    def forward(self, x):
        return x * torch.sigmoid(x)
 
class Bi_FPN(nn.Module):
    def __init__(self, length):
        super().__init__()
        self.weight = nn.Parameter(torch.ones(length, dtype=torch.float32), requires_grad=True)
        self.swish = swish()
        self.epsilon = 0.0001
 
    def forward(self, x):
        weights = self.weight / (torch.sum(self.swish(self.weight), dim=0) + self.epsilon) # 权重归一化处理
        weighted_feature_maps = [weights[i] * x[i] for i in range(len(x))]
        stacked_feature_maps = torch.stack(weighted_feature_maps, dim=0)
        result = torch.sum(stacked_feature_maps, dim=0)
        return result

2.2 修改一
找到如下的文件’‘ultralytics/nn/tasks.py’',在文件的开头处导入我们的模块。

from .modules.bifpn import Bi_FPN

2.3 修改二
找到parse_model的方法,在下面注册我们的模块。
在这里插入图片描述
三、yaml文件配置

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 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=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
 
# YOLOv8.0n 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, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9
 
 
# YOLOv8.0n head
head:
  - [4, 1, Conv, [256]]  # 10-P3/8
  - [6, 1, Conv, [256]]  # 11-P4/16
  - [9, 1, Conv, [256]]  # 12-P5/32
 
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 13 P5->P4
  - [[-1, 11], 1, Bi_FPN, []] # 14
  - [-1, 3, C2f, [256]] # 15-P4/16
 
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 16 P4->P3
  - [[-1, 10], 1, Bi_FPN, []] # 17
  - [-1, 3, C2f, [256]] # 18-P3/8
 
  - [1, 1, Conv, [256, 3, 2]] # 19 P2->P3
  - [[-1, 10, 18], 1, Bi_FPN, []] # 20
  - [-1, 3, C2f, [256]] # 21-P3/8
 
  - [-1, 1, Conv, [256, 3, 2]] # 22 P3->P4
  - [[-1, 11, 15], 1, Bi_FPN, []] # 23
  - [-1, 3, C2f, [512]] # 24-P4/16
 
  - [-1, 1, Conv, [256, 3, 2]] # 25 P4->P5
  - [[-1, 12], 1, Bi_FPN, []] # 26
  - [-1, 3, C2f, [1024]] # 27-P5/32
 
  - [[21, 24, 27], 1, Detect, [nc]]  # Detect(P3, P4, P5)

然后,即可运行成功!

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
Yolov7-tiny系列是一种用于目标检测的网络结构,它在物体检测任务中具有较高的效率和准确率。为了进一步提升其性能,我们可以对其进行改进,引入bifpn结构的特征融合网络。 Bifpn结构是一种特征融合网络,它在多个尺度上进行特征融合,可以有效地提取目标的多尺度信息。我们将其与Yolov7-tiny结构进行结合,以获得更多有效的特征。 首先,我们在Yolov7-tiny的每个火箭头后面添加一层bifpn结构。这样,每个火箭头都可以从多个尺度的特征图中获取信息,并将其融合到一起。这种特征融合可以提高目标检测的准确性和鲁棒性。 其次,我们可以对bifpn结构进行一些改进。例如,我们可以引入注意力机制来控制特征的重要程度。注意力机制可以根据目标的重要性自适应地调整特征图的权重,从而提高关键目标的检测准确率。 此外,我们还可以利用多尺度的特征进行级联式的检测。即将不同尺度的特征图输入到级联式的分类器中,以进一步提升目标检测的性能。级联式的分类器可以对不同尺度的目标进行更准确的判断。 通过以上的改进改进Yolov7-tiny系列可以更好地融合更多有效的特征,提高目标检测的准确率。这将使该系列在实际应用中更加可靠和高效。当然,具体的改进方式还需要进一步的实验和验证,以确保其有效性和可行性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ghx3110

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

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

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

打赏作者

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

抵扣说明:

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

余额充值