YOLOv8改进 | 2023Neck篇 | BiFPN双向特征金字塔网络(附yaml文件+代码)

news2024/9/28 11:21:07

一、本文介绍

本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进YOLOv8模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带来的结构可以让大家自行调节网络结构大小,同时能够达到一定的轻量化效果(需要注意的是BiFPN正常是需要五个检测头的,但是YOLOv8只有三个检测头,所以我对其yaml文件进行了一定设计,从而支持三个头的检测,后面我也会出四个头的BiFPN,然后配合我前面的AFPN_Detect检测头来融合)。

推荐指数:⭐⭐⭐⭐⭐

涨点效果:⭐⭐⭐⭐⭐

专栏回顾:YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备    

训练结果对比图->  

可以看到这个图片的mAP50和mAP50-95都有一定程度的上涨。

目录

一、本文介绍

二、BiFPN原理

2.1 BiFPN的基本原理

2.2 双向特征融合

2.3 加权融合机制

2.4 结构优化

三、BiFPN代码 

四、手把手教你修改BiFPN

4.1 修改一

4.2 修改二 

4.3 修改三 

五、BiFPN的yaml文件

五、运行成功记录

六、本文总结


二、BiFPN原理

论文地址:论文官方地址

代码地址:官方代码地址


2.1 BiFPN的基本原理

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

1. 高效的双向跨尺度连接:BiFPN通过在自顶向下和自底向上路径之间建立双向连接,允许不同尺度特征间的信息更有效地流动和融合。

2. 简化的网络结构:BiFPN通过删除只有一个输入边的节点、在同一层级的输入和输出节点间添加额外边,以及将每个双向路径视为一个特征网络层并重复多次,来优化跨尺度连接。

3. 加权特征融合:BiFPN引入了可学习的权重来确定不同输入特征的重要性,从而提高了特征融合的效果。

我们可以将其基本原理概括分为以下几点:

1. 双向特征融合:BiFPN允许特征在自顶向下和自底向上两个方向上进行融合,从而更有效地结合不同尺度的特征。

2. 加权融合机制:BiFPN通过为每个输入特征添加权重来优化特征融合过程,使得网络可以更加重视信息量更大的特征。

3. 结构优化:BiFPN通过移除只有一个输入边的节点、添加同一层级的输入输出节点之间的额外边,并将每个双向路径视为一个特征网络层,来优化跨尺度连接。

我将通过下图为大家对比展示BiFPN与其他四种不同特征金字塔网络设计的不同以及BiFPN如何更有效地整合特征

(a) FPN (Feature Pyramid Network): 引入了自顶向下的路径来融合从第3层到第7层(P3 - P7)的多尺度特征。
(b) PANet: 在FPN的基础上增加了自底向上的额外路径。
(c) NAS-FPN: 使用神经架构搜索(NAS)来找到不规则的特征网络拓扑,然后重复应用相同的块。
(d) BiFPN: 通过高效的双向跨尺度连接和重复的块结构,改进了准确度和效率之间的权衡。

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


2.2 双向特征融合

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

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

下图展示的是EfficientDet架构的具体细节,其中包含了EfficientNet作为骨干网络(backbone),以及BiFPN作为特征网络的使用。在这个架构中,BiFPN层通过其双向特征融合的能力,从EfficientNet骨干网络接收多尺度的输入特征,然后生成用于对象分类和边框预测的富有表现力的特征。

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


2.3 加权融合机制

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

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

 O = \sum_i w_i \cdot I_i

其中w_{i} 是一个可学习的权重,可以是标量(每个特征),向量(每个通道)或多维张量(每个像素)。这些权重是可学习的,可以是标量(针对每个特征),向量(针对每个通道),或者多维张量(针对每个像素)。这种加权融合方法可以在最小化计算成本的同时实现与其他方法可比的准确度。 


2.4 结构优化

结构优化是为了在不同的资源约束下,通过复合缩放方法确定不同的层数,从而在保持效率的同时提高准确性。我们通过分析观察BiFPN的设计,其结构优化包括:

1. 简化的双向网络:通过优化结构,减少了网络中的节点数,特别是移除了那些只有一个输入边的节点。这种简化的直觉是如果一个节点没有进行特征融合,即它只有一个输入边,那么它对于融合不同特征的特征网络的贡献会更小。

2. 增加额外的边缘:在相同层级的原始输入和输出节点之间增加了额外的边缘,以便在不显著增加成本的情况下融合更多的特征。

3. 重复使用双向路径:与只有单一自顶向下和自底向上路径的PANet不同,BiFPN将每条双向(自顶向下和自底向上)路径视为一个特征网络层,并重复多次,以实现更高级别的特征融合。


三、BiFPN代码 

看到这里不知道大家有没有理解BiFPN,BiFPN是一种结构、一种思想,并不是特指某些卷积、某些注意力机制那样,所以其重要的是如何配置yaml文件实现BiFPN的那种结构和思想,但是其也和其它的FPN有一个区别就是它的拼接方式并不是Concat那样,所以需要下面的代码来配合实现BiFPN。

同样该代码的使用方式我们复制'ultralytics/nn/modules'到该目录下,创建一个py文件粘贴进去,我这里起名为BiFPN(这里有一个注意点是不要和定义的类重名有时候会报错)。

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


四、手把手教你修改BiFPN

修改BiFPN的话只需要在代码中注册上面的BiFPN就可以了。

4.1 修改一

将上面的代码块复制粘贴到如下的文件中去。

4.2 修改二 

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

4.3 修改三 

找到parse_model的方法,在下面注册我们的模块。

到此就添加成功了,只需要配置yaml文件,其实这个BiFPN主要的是配置yaml文件,才是重点。

 


五、BiFPN的yaml文件

复制粘贴下面的代码即可运行,现在是三个头的,我前面的文章说过要出一个四个头的检测头,估计这两天会配合这个BiFPN更新。

# 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
  - [6, 1, Conv, [256]]  # 11
  - [9, 1, Conv, [256]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 13 P5->P4
  - [[-1, 11], 1, Bi_FPN, []] # 14
  - [-1, 3, C2f, [256]] # 15 (T1/8-small)

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 16 P4->P3
  - [[-1, 10], 1, Bi_FPN, []] # 17
  - [-1, 3, C2f, [256]] # 18 (T2/8-small)

  - [2, 1, Conv, [256, 3, 2]] # 19
  - [[-1, 10, 18], 1, Bi_FPN, []] # 20
  - [-1, 3, C2f, [256]] # 21 (T3/8-small)

  - [-1, 1, Conv, [256, 3, 2]] # 22
  - [[-1, 11, 15], 1, Bi_FPN, []] # 23
  - [-1, 3, C2f, [512]] # 24 (T4/16-medium)

  - [-1, 1, Conv, [256, 3, 2]] # 25 P4->P5
  - [[-1, 12], 1, Bi_FPN, []] # 26
  - [-1, 3, C2f, [1024]] # 27 (T5/32-large)

  - [[21, 24, 27], 1, Detect, [nc]]  # Detect(P3, P4, P5)


五、运行成功记录

下面的图片是证明成功运行的截图,确保我发的改进机制是可用的。


六、本文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv8改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~),如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

专栏回顾:YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年贺岁电影:一眼多,二眼好多

如果从11月末开始统计,今年贺岁档共有72部贺岁片,平均一天就有2部电影上映,看完总计需要花费7400分钟。 这个数量几乎快赶上2021年到2022年贺岁片的总和。 今年电影市场快速回暖以来,多部爆款作品接力上映,持续刺激市…

项目篇 | 图书管理系统 | 图像加载与绘制

项目篇 | 图书管理系统 | 图像加载与绘制 基本介绍 首先解释清楚什么叫图像加载与绘制,意思就是说项目中需要用到一些图片资源(各种图标),我们要在图书管理系统中展示这些图片,就需要先导入图片到项目中,再加载图片资源(通过资源路径)、绘制图片(即展示)。 注:如果…

如何将Word中的表格图片转换为可编辑格式?

我们都知道,Word中的表格是一个非常有用的工具,可以让我们在文档中轻松添加和编辑各种数据。但有时候我们可能会遇到一个问题:当表格作为图片插入时,我们就不能直接编辑它了。这可怎么办呢? 别担心,我们有…

Python语言学习笔记之八(文件IO)

本课程对于有其它语言基础的开发人员可以参考和学习,同时也是记录下来,为个人学习使用,文档中有此不当之处,请谅解。 1、什么是文件I/O 在Python中,文件IO(输人/输出)是指与文件进行交互的过程。这包括读…

翻译: 生成式人工智能项目的生命周期 Lifecycle of a generative AI project

我将分享一下构建生成式AI软件应用程序的过程。首先,我们会确定项目范围,决定软件要实现的功能。例如,你可能决定建立一个餐厅声誉监控系统。接下来是实际的实施阶段。由于生成式AI使构建应用程序变得容易,你通常可以很快构建出一…

【Fastapi框架】Fastapi的使用和进阶

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、项目启动1.安装2.示例3.启动4.路由 二、进阶1.请求数据2.静态文件加载3.路由管理4.跨域配置5.自定义中间件6.使用jwt中间件 前言 一、…

轻松学习视频剪辑:视频转码批量转为序列图片技巧,从新手到高手

随着视频剪辑的普及,越来越多的爱好者开始尝试自己动手进行视频剪辑。对于新手来说,掌握一些实用的技巧是很有必要的。在视频剪辑中,有时候要将视频片段转换为序列图片,以便进行更灵活的编辑和处理。本文详解云炫AI智剪的一种简单…

Python爬虫实战(基础篇)—9获取某个城市天气(附完整代码)

文章目录 专栏导读背景1、网址(请求URL)2、查看请求方法、参数3、请求初步测试代码请求成功 4、数据清洗(lxmlxpath)【城市实时天气】【日期】lxmlxpath 代码【室外温度】【体感温度】lxmlxpath 代码【天晴情况】【全天气温】lxmlxpath 代码【气压值】【降水量】【风力情况】【…

Ransac 算法的探索和应用

Ransac 算法python 应用和实现 Ransac 算法是一种常用的图像匹配算法,在参数估计领域也经常被使用到。针对估计各种曲线的鲁棒模型参数,效果显著。这里对ransac算法进行某些探索。 python program: import numpy as np import matplotlib.pyplot as p…

UniGui使用CSS移动端按钮标题垂直

unigui移动端中按钮拉窄以后,标题无法垂直居中,是因为标题有一个padding属性,在四周撑开一段距离。会变成这样: 解决方法,用css修改padding,具体做法如下 首先给button的cls创建一个cls,例如 然后添加css&…

python numpy 两种方法将相同shape的一维数组合并为二维数组

1 np.column_stack 最简单的一种方法 将多个一维数据按【列】合并为二维数组 import numpy as np# a b 都是一维数组 a np.array((1,2,3)) b np.array((2,3,4))# 变成二维 merge np.column_stack((a,b)) # array([[1, 2],[2, 3],[3, 4]])2 np.hstack 尽管该函数也是对【列…

桂电|《操作系统》实验一:UNIX/LINUX及其使用环境(实验报告)

桂林电子科技大学2023-2024学年 第 一 学期 操作系统A 实验报告 实验名称 实验一 UNIX/LINUX及其使用环境 实验指导老师: 成绩 院 系 计算机与信息安全学院 专业 计算机科学与技术(卓越工程) 学 号 姓名 课内序…

多表查询、事务、索引

目录 数据准备 分类 内连接 外连接 子查询 事务 四大特性 索引 数据准备 SQL脚本: #建议:创建新的数据库 create database db04; use db04;-- 部门表 create table tb_dept (id int unsigned primary key auto_increment comment 主键…

物流实时数仓:数仓搭建(DWD)一

系列文章目录 物流实时数仓:采集通道搭建 物流实时数仓:数仓搭建 物流实时数仓:数仓搭建(DIM) 物流实时数仓:数仓搭建(DWD)一 文章目录 系列文章目录前言一、文件编写1.目录创建2.b…

leetcode 162. 寻找峰值(优质解法)

代码&#xff1a; class Solution {public int findPeakElement(int[] nums) {int left0,rightnums.length-1;while (left<right){int midleft(right-left)/2;if(nums[mid]>nums[mid1]){rightmid;}else {leftmid1;}}return left;} } 题解&#xff1a; 通过题意进行分析…

CRM是怎样帮助企业从激烈竞争中脱颖而出的?

有限的市场机会与资源推动了市场竞争。市场竞争是在所难免的&#xff0c;但企业可以借助CRM管理系统调整其业务策略&#xff0c;在市场上很多竞争者中突围。CRM系统怎样帮助企业赢得市场竞争&#xff1f; 以下五个功能点是关键&#xff1a;数据分析、客户管理、合作伙伴、营销自…

XCP详解「4.2·问题-加载信号过多导致FIFO buffer overflow」

APE write报问题 报文也提示80 溢出 检查测量配置

【噪音控制 】 铁氧体磁珠

1. 片状铁氧体磁珠的直流重叠特性 片状铁氧体磁珠是一种使用铁氧体的电感器。因此&#xff0c;当大电流通过时&#xff0c;需要特别注意由于磁饱和所造成的性能改变。图1是电流通过片状铁氧体磁珠时的阻抗值的变化示例。 图1 片状铁氧体磁珠的直流重叠特性示例 正因如此&am…

2023一起益企广东省中小企业数字化赋能活动(深圳站)成功举办

12月12日&#xff0c;由广东工业和信息化厅指导&#xff0c;广东省中小企业服务中心、深圳市中小企业服务局主办&#xff0c;深圳联通承办的2023年“一起益企”广东省中小企业数字化赋能专项对接志愿服务活动&#xff08;深圳站&#xff09;在深圳成功举办。 本次活动涵盖中小企…

Failed to open the referenced table ‘qrtz_job_details‘

依赖【表】或者【其他对象】执行拉到最前面即可。