特征融合篇 | YOLOv10改进之在Neck网络中添加加权双向特征金字塔BiFPN

前言:Hello大家好,我是小哥谈。计算机视觉任务中,特征金字塔网络(FPN)是一种常用的方法,它通过构建不同尺度的特征图来捕获不同尺度的目标。然而,传统的FPN存在一些缺点,如特征融合效率低信息流通不充分等。BIFPN则通过引入双向的特征融合机制和加权的特征融合方法来克服这些问题。🌈  

     目录

🚀1.基础概念

🚀2.网络结构

🚀3.添加步骤

🚀4.改进方法

🍀🍀步骤1:block.py文件修改

🍀🍀步骤2:__init__.py文件修改

🍀🍀步骤3:tasks.py文件修改

🍀🍀步骤4:创建自定义yaml文件

🍀🍀步骤5:新建train.py文件

🍀🍀步骤6:模型训练测试

🚀1.基础概念

加权双向特征金字塔(Weighted Bi-directional Feature Pyramid Network,简称BiFPN)是一种改进的特征金字塔网络架构,它是在传统的Feature Pyramid Network (FPN)基础上发展而来。相较于单向的上采样和下采样,BiFPN引入了双向信息流,即不仅从低层金字塔向上层传递特征,也从高层金字塔向下层传播加强过的特征

BiFPN中,每个级别都包含两个路径一个是自底向上的路径,用于增强底层特征另一个是从顶到底部的路径,通过跨层级融合的方式,使得顶层的高级语义信息能够传达给低层这样做的目的是为了捕获更丰富、更大范围的上下文信息,提高特征表示的精确性和鲁棒性。

此外,BiFPN通常会采用一些权重机制来调整信息流动的方向和程度,以便优化特征融合的质量。这些权重可以根据特征的重要性或者其他学习策略动态计算。

性能比较:

核心思想: 

双向特征融合:传统的FPN是单向的,即从高层特征图向低层特征图传递信息。而BiFPN在此基础上增加了反向的信息传递,即从低层特征图向高层特征图传递信息。这种双向的信息流动使得特征图之间的信息融合更加充分。

加权特征融合:BiFPN中,不同尺度的特征图在融合时会分配不同的权重。这些权重是可学习的参数,模型在训练过程中会自动调整它们,以最优地融合不同尺度的特征。这样一来,模型能够更好地利用每个特征图的信息,提高整体的特征表示能力

论文题目:《EfficientDet: Scalable and Efficient Object Detection》

论文地址:  http://arxiv.org/pdf/1911.09070

代码实现:  https://github.com/google/automl/tree/master/efficientdet

说明:♨️♨️♨️

BiFPN是本文中提出的最重要的一个结构。在此之前介绍一下其他的特征金字塔网络(FPN)结构:

FPN:采用一种自上而下的方法来组合多尺度特征
PANet:在FPN之上增加了一个额外的自下而上的路径聚合网络
STDL:提出了一个利用跨尺度特征的尺度转换模块
M2det:提出一种融合多尺度特征的U形模块
NAS-FPN:利用神经架构搜索来自动设计特征网络拓扑结构
BiFPN:高效的双向跨尺度连接和加权特征融合


🚀2.网络结构

本文的改进是基于YOLOv10,关于其网络结构具体如下图所示:

YOLOv10官方仓库地址:

https://github.com/THU-MIG/yolov10

本文所作的改进是将Neck网络更换为BiFPN改进后的网络结构图具体如下图所示:


🚀3.添加步骤

针对本文的改进,具体步骤如下所示:👇

步骤1:block.py文件修改

步骤2:__init__.py文件修改

步骤3:tasks.py文件修改

步骤4:创建自定义yaml文件

步骤5:新建train.py文件

步骤6:模型训练测试


🚀4.改进方法

🍀🍀步骤1:block.py文件修改

在源码中找到block.py文件,具体位置是ultralytics/nn/modules/block.py,然后将BiFPN模块代码添加到block.py文件末尾位置。

BiFPN模块代码:

# By CSDN 小哥谈
class Concat_BiFPN(nn.Module):def __init__(self, dimension=1):super(Concat_BiFPN, self).__init__()self.d = dimensionself.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)self.epsilon = 0.0001def forward(self, x):w = self.wweight = w / (torch.sum(w, dim=0) + self.epsilon)  # 将权重进行归一化# Fast normalized fusionx = [weight[0] * x[0], weight[1] * x[1]]return torch.cat(x, self.d)

然后,在block.py文件最上方下图所示位置加入Concat_BiFPN

🍀🍀步骤2:__init__.py文件修改

在源码中找到__init__.py文件,具体位置是ultralytics/nn/modules/__init__.py

修改1:在下图所示位置加入Concat_BiFPN,具体如下图所示:

修改2:在下图所示位置加入Concat_BiFPN,具体如下图所示:

🍀🍀步骤3:tasks.py文件修改

在源码中找到tasks.py文件,具体位置是ultralytics/nn/tasks.py

修改1:from ultralytics.nn.modules import ()中加入Concat_BiFPN,具体如下图所示:

修改2:找到parse_model函数(829行左右),在下图中所示位置添加如下代码。

 # ------------start--------------elif m is Concat_BiFPN:c2 = sum(ch[x] for x in f)# ------------ end---------------

具体添加位置如下图所示:

🍀🍀步骤4:创建自定义yaml文件

在源码ultralytics/cfg/models/v10目录下创建yaml文件,并命名为:yolov10n_BiFPN.yaml具体如下图所示:

备注:其他版本yaml文件同理。

关于yolov10n_BiFPN.yaml文件的完整代码如下所示:👇

# By CSDN 小哥谈
# 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] # 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, SCDown, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 1, PSA, [1024]] # 10# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)
🍀🍀步骤5:新建train.py文件

在所下载的YOLOv10源码根目录下新建train.py文件,文件完整代码如下所示:

# coding:utf-8
# By CSDN 小哥谈
from ultralytics import YOLOv10
# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/v10/yolov10n_BiFPN.yaml"
# 数据集配置文件
data_yaml_path = 'ultralytics/cfg/datasets/helmet.yaml'
# 预训练模型
pre_model_name = 'weights/yolov10n.pt'if __name__ == '__main__':# 加载预训练模型model = YOLOv10("ultralytics/cfg/models/v10/yolov10n_BiFPN.yaml").load('weights/yolov10n.pt')# 训练模型results = model.train(data=data_yaml_path,epochs=100,batch=8,name='train_v10')
🍀🍀步骤6:模型训练测试

train.py文件,点击“运行”,在作者自制的安全帽佩戴检测数据集上,模型可以正常训练。

参数量对比:🌈

YOLOv10n.yaml 385 layers2707820 parameters2707804 gradients8.4 GFLOPs
YOLOv10n_BiFPN.yaml385 layers2707829 parameters2707813 gradients8.4 GFLOPs

 说明:关于测试数据集,小伙伴们可根据个人情况进行更换!~🍉 🍓 🍑 🍈 🍌 🍐   

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

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

相关文章

计算机网络--tcpdump和iptable设置、内核参数优化策略

tcpdump工具 tcpdump命令: 选项字段: 过滤表达式: 实用命令: TCP三次握手抓包命令: #客户端执行tcpdump 抓取数据包 tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcapnetstat命令 netst…

java算法day11

二叉树的递归遍历二叉树的非递归遍历写法层序遍历 递归怎么写? 按照三要素可以保证写出正确的递归算法: 1.确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且…

第二证券:销量暴跌95%,这一巨头市值蒸发超3000亿元!

在多重要素刺激下,PCB工作站上风口。 波音销量堕入停滞 6月仅售出3架客机 据央视财经,在一系列丑闻的影响下,波音公司本年出售遭到明显冲击。当地时间9日,波音发布的数据闪现,在以前一个月,该公司仅卖出…

excel有条件提取单元格特定文本(筛选纯文字的单元格或含有数字的单元格、单元格提取不同的文本长度)

实际工作背景 需要对导出的银行流水中的数十个村以及对应的村小组进行分组统计,但是初始的表格中村和小组是混在一起的,如下图所示: 目的:将大树村和大树村小组名称分别筛选出来 1.观察发现,大树村小组的单元格第4…

代码随想录算法训练营第四十九天| 647. 回文子串、 516.最长回文子序列

647. 回文子串 题目链接:647. 回文子串 文档讲解:代码随想录 状态:不会 思路: dp[i][j] 表示字符串 s 从索引 i 到索引 j 这一段子串是否为回文子串。 当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是fa…

构建与操作共享栈

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝既然选择了远方,当不负青春,砥砺前行! 共享栈是一种优化的栈实现方式,它允许两个或多个栈共享同一段连续的内存空间…

数据结构——Trie

题目: 维护一个字符串集合,支持两种操作: I x 向集合中插入一个字符串 x𝑥;Q x 询问一个字符串在集合中出现了多少次。 共有 N𝑁 个操作,所有输入的字符串总长度不超过 10^5,字符串仅…

【onnx】onnxruntime-gpu无法使用问题

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 onnxruntime-gpu无法使用 1. 正文 CUDA版本:12.1 nvcc -VCUDNN的版本 cat /usr/include/cudnn_version.h |grep CUDNN_MAJOR -A 2说明: 可…

【数据结构——链表的深度探索】从实现到应用,保姆级攻略

【数据结构——链表深度探索】从实现到应用,保姆级攻略 🍁1. 链表的介绍🍁2. 链表的实现🍁2.1 单向链表🍁2.1.1 size()🍁2.1.2 display()🍁2.1.3 contains(int key)🍁2.1.4 addFirst…

墨西哥:海外新闻稿媒体分发-海外pr发稿干货分享-大舍传媒

大舍传媒:海外新闻稿媒体分发平台 墨西哥观查者 (mexicoviewer) 墨西哥观查者是墨西哥一家知名的新闻媒体平台,该平台专注于报道墨西哥国内外的时事新闻、政治、经济、文化等多个领域的内容。其更新速度快,报道对象广泛,深受墨西…

开始性能测试之前的准备工作!

性能测试是软件测试中不可或缺的一部分,它可以帮助我们评估软件系统的性能表现,并找出潜在的性能瓶颈。在进行性能测试之前,需要做好充分的准备工作,以确保测试的有效性和准确性。 1. 确定性能测试的目标和范围 * 明确测试目标:性…

《数据库原理》SQLServer期末复习_题型+考点

目录 题型: 一. 概况分析题(5小题,每小题2分,共10分) 二. 计算题(3小题,每小题5分,共15分) 三. 数据库设计(2小题,每小题10分,共2…

在mysql中delete和truncated的相同点和区别点

相同点 删除数据:两者都会删除表中的数据。影响数据:两者都不删除表结构,只影响表中的数据。 区别点 操作方式: DELETE:逐行删除数据,可以使用 WHERE 子句来指定删除的条件。如果不加 WHERE 子句&#…

【Python机器学习】处理文本数据——用tf-idf缩放数据

为了按照我们预计的特征信息量大小来缩放特征,而不是舍弃那些认为不重要的特征,最常见的一种做法就是使用词频-逆向文档频率(tf-idf)。这一方法对某个特定文档中经常出现的术语给与很高的权重,但是堆在语料库的许多文档…

作业/数据结构/2023/7/10

1.实现单向链表队列的,创建,入队,出队,遍历,长度,销毁。 main.c #include "head.h"int main(int argc, const char *argv[]) {//创建链式队列queue_ptr QLcreate_queue();//入栈push(QL, 1000)…

imx6ull/linux应用编程学习(16)emqx ,mqtt创建连接mqtt.fx

在很多项目中都需要自己的私人服务器,以保证数据的隐私性,这里我用的是emqx。 1.进入emqx官网 EMQX:用于物联网、车联网和工业物联网的企业级 MQTT 平台 点击试用cloud 申请成功后可得:(右边的忽略) 进入…

告别PS,ChatGPT图片局部修改,手把手教你成为画图高手

大家好,我是YUAN! 今天,我要向大家介绍一个能够点燃创意火花的画图设计神器——DALLE编辑器。让艺术创作,尤其是画图变得更加简单、直观,甚至可以说是革命性的。 DALLE是什么? DALLE编辑器的问世&#xf…

macOS系统下载navicat安装包

链接: https://pan.baidu.com/s/1SqTIXNL-B8ZMJxIBu1DfIw?pwdc1z8 提取码: c1z8 安装后效果

05STM32EXIT外部中断中断系统

STM32EXIT外部中断&中断系统 中断系统中断触发条件:中断处理流程和用途: STM32中断NVIC嵌套中断向量控制器基本结构 中断系统 中断触发条件: 对外部中断来说,可以是引脚发生了电平跳变 对定时器来说,可以是定时的…

《算法笔记》总结No.6——贪心

一.简单贪心 贪心法是求解一类最优化问题的方法,它总是考虑在当前状态下局部最优(或较优)之后,来使全局的结果达到最优(或较优)的策略。显然,如果采取较优而非最优的策略(最优策略可能不存在或是不易想到),得到的全局结果也无法是…