YOLOv10(2):网络结构及其检测模型代码部分阅读

news2025/1/22 12:27:52

YOLOv10(1):初探,训练自己的数据-CSDN博客


 

目录

1. 写在前面

2. 局部模块

(1)SCDown

(2)C2fCIB

(3)PSA(partial self-attention)

3. 代码解读

(1)BaseModel(nn.Module)

(2)DetectionModel(BaseModel)

(3)YOLOv10DetectionModel(DetectionModel)

(4)拓展讲解:parse_model


1. 写在前面

        YOLOv10的代码结构和YOLOv8很相似,说是基于YOLOv8魔改的也不为过。话说回来,也算是魔改的非常成功的了。从代码工程上看,也是通过类一层层继承,获得一个完整的模型网络。

2. 局部模块

        YOLOv10使用了YOLOv8同样的C2f结构,在此就不多做解释了,在我的其他文章中均有讲解。

        本次着重在两个模块上做一下讲解,分别是SCDown、C2fCIB以及PSA。

        相关的代码在./ultralytics/nn/modules/block.py文件中。

(1)SCDown

        SCDown理解起来相对简单,只由两个卷积操作组成。第一个卷积操作主要实现了通道的转换,在YOLOv10中,第二个卷积操作测试通过k=3,s=2,p=1来实现两倍下采样。

(2)C2fCIB

        在讲C2fCIB之前,有必要带大家回顾一下C2f(还是简单回顾一下吧)。

        C2f一般被认为是C2 faster,即更快的C2操作。如下为C2f的网络结构示意图。

        C2fCIB就是将原来的Bottleneck换成了CIB模块,获得如下的结构。

        CIB是一个标准的Bottleneck结构,其结构示意图如下。需要说明的是,如下是一个典型图,采取了shortcut为True,lk为False作为前提。

(3)PSA(partial self-attention)

        YOLOv10引进了注意力机制,在PSA中,就集成了MHSA和FFN模块。

3. 代码解读

        要想了解代码工程是如何创建模型的,还得是多关注task.py文件。

        在此我们主要追随YOLOv10DetectionModel的脉络进行讲解,其他的网络构建过程基本类似。

(1)BaseModel(nn.Module)

        BaseModel,从名字上就能够理解,这是一个基类。BaseModel实际上是抽象出了一些共有成员,如forward,predict,loss等,这样在后面的派生类中,只需要将更细力度的功能进行完善,就可以调用这些共有的成员进行训练。

        多说一句,在面向对象编程中,不管是PyThon还是C++,都可以在基类中构造统一接口,之后通过在派生类中继承或重写,就可以实现统一的接口调用。

        在BaseModel中,我们着重关注_predict_once和fuse函数。

_predict_once

        _predict_once用于一次预测任务。

        第128行可以看出,是将输入x依次通过self.model中的module(m)进行运算(133行)。

        131行控制是否打印运行中的过程信息。

        135行控制可视化。

        137行控制返回嵌入特征数据。

fuse

        fuse操作主要是控制一些OP的融合,以128行为例,如果m为Conv,且m中含有BN层,那么就可以按照如下进行融合,以提升计算效率。

        以Conv+BN为例,我们都了解,卷积层(Conv)实际上是一个y = ax+b的过程。

        训练阶段,基本的操作包含两个部分。

        Conv: x=conv.weight*x+conv.bias

        BN: x=bn.\gamma *\frac{x_{i}-bn.mean}{\sqrt{bn.var+bn.\xi }}+bn.\beta

        其中,bn.mean为均值(对应nn.BatchNorm2d中的running_mean),bn.var为方差(对应nn.BatchNorm2d中的running_var),bn.\gammabn.\beta分别对应nn.BatchNorm2d中的weight和bias,bn.\varepsilon对应nn.BatchNorm2d中的eps。

        推理阶段,可将Conv和BN进行相应的合并计算,同时需要将参数进行重新的映射。具体如下。

        x=\frac{bn.\gamma*conv.weight}{\sqrt{bn.var+bn.\varepsilon }}*x+\frac{bn.\gamma *conv.bias}{\sqrt{bn.var+bn.\epsilon }}+bn.\beta

        如上,其中\frac{bn.\gamma*conv.weight}{\sqrt{bn.var+bn.\varepsilon}}组成了新的weight,\frac{bn.\gamma *conv.bias}{\sqrt{bn.var+bn.\epsilon }}+bn.\beta组成了新的bias。

(2)DetectionModel(BaseModel)

        DetectionModel继承自BaseModel。

        DetectionModel在初始化阶段主要执行三个操作,分别是定义模型,预计算参数以及初始化网络模型权重。

        290行到297行主要的工作就是定义模型。其中关键的是parse_model函数,一路走来研究YOLO算法的同学们一定不陌生,后续再和大家一起回顾一下。

        300行到311行则是计算stride信息,在执行模型输出解算的时候会用到。这其中实际上是构建了一组全0的数据,shape为(1, 3, 256, 256),通过调用forward接口,进而通过网络输出来计算不同支路的stride信息。

        314是进行参数的初始化。其中initialize_weights在torch_utils.py中定义。此处实际上仅仅是对BN层参数和激活层做简单的设置。其中作者还隐藏了使用nn.init.kaiming_normal_对卷积参数进行初始化。

(3)YOLOv10DetectionModel(DetectionModel)

        YOLOv10DetectionModel继承自DetectionModel,仅设置了Loss计算方式,此外啥也没做,啥都用DetectionModel的。

(4)拓展讲解:parse_model

        拓展重点放在模型的构建上。

        前面讲到,大家对parse_model应该是不陌生的。parse_model主要是读取网络配置文件,如yolov10m.yaml,来构建生成nn.Module类型的网络。

        以yolov10m.yaml为例,如下所示为文件内容。

        其中,nc表示类别数,这一参数会被数据定义中的相关类别数进行覆盖。具体是在./ultralytics/models/yolov10/train.py中的YOLOv10DetectionTrainer构件时,重载get_model接口时,nc使用了self.data[“nc”]。而self.data是在./ultralytics/engine/trainer.py中的BaseTrainer中,在初始化阶段调用check_det_dataset接口获得,具体操作室读取如VOC.yaml文件获得。

        scales则是模型大小的缩放。在以往的YOLO算法,如YOLOv5等,就开始提供不同尺度的网络模型,以适应不同的部署情况。因此scales就是用于将模型进行相应的缩放处理。

        以第一行的Conv为例,其中第一行内容为“-1, 1, Conv, [64, 3, 2]”四个参数。从如下的parse_model局部代码截图的851行可以看到,这四个参数实际上是代表了from, number, module和args。

        from表示输入来自哪一层,-1表示相邻的上一层。

        number表示模块的重复个数,如CSP结构中Bottleneck的数量。

        module表示模块类型,此处为Conv,卷积层。

        args则是表明了当前模型的输入参数。此处为输出channel为64,使用3*3的卷积核,stride为2。

        之后在如下代码段的889行计算输入、输出通道数。在898行组合完整的Conv层输入参数。

        最后在如下代码段的931构建nn.Module类型的模块,并在942行构建网络。

        好了,关于模型的相关知识就简单讲到这里,有什么问题大家私信我吧。

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

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

相关文章

【简单学习一下卷积神经网络】-基于肆十二的高考例子

前言一、白话卷积神经网络总结 前言 【参考】 主要是P2⇨手把手教你用tensorflow2训练自己的数据集 -------2024/5/4 一、白话卷积神经网络 高考前需要大量的做题训练---->相当于数据集。 做题过程中【于标准答案进行比对】产生的错题⇨loss(误差) 回…

数据新生态:Web3如何重新定义个人数据权利

随着数字化时代的不断深入,个人数据已经成为了现代社会中最宝贵的资源之一。然而,传统互联网时代下,个人数据往往被大型科技公司垄断、滥用,个人数据权利常常受到侵犯。而随着Web3技术的崛起,人们开始期待一种全新的数…

R_AARCH64_ADR_PREL_PG_HI21问题说明

目录 问题现象: 问题原因 问题机理 问题现象: 客户现场加载out文件出现如下问题: 打印“Relocation of type ‘R_AARCH64_ADR_PREL_PG_HI22…..’”,明确是ARDP指令引起的问题 问题原因 ARDP的寻址范围是4GB范围,加载的位置…

【用Python画画】六一儿童节画爱心

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结 一、前言 本文介绍如何使用Python的海龟画图工具turtle&#xf…

取代Windows的系统复制粘贴等文件处理

TeraCopy 可以到官网下载也可以通过应用商店下载 主要作用 : 取代Windows的系统复制粘贴等文件处理 常规窗口 点击第一排最左侧的按钮会显示这个窗口, 显示所以文件操作记录 , 这个也是我装这个软件的原因之一, 框选的是当前正在进行的 当执行复制粘贴时会自动出现, 让自行…

html three.js 引入.stl模型示例

1.新建一个模块用于放置模型 <div id"chart_map" style"width:800px;height:500px"></div> 2. 引入代码根据需求更改 <!-- 在head或body标签内加入以下链接 --> <script src"https://cdn.jsdelivr.net/npm/three0.137/build/t…

基于R语言BIOMOD2 及机器学习方法的物种分布模拟

BIOMOD2是一个R软件包&#xff0c;用于构建和评估物种分布模型&#xff08;SDMs&#xff09;。它集成了多种统计和机器学习方法&#xff0c;如GLM、GAM、SVM等&#xff0c;允许用户预测和分析物种在不同环境条件下的地理分布。通过这种方式&#xff0c;BIOMOD帮助研究者评估气候…

零刻SER8 AMD 8845Hs Ryzen AI 本地部署大语言模型教程!

零刻SER8 8845HS,配备了一个内置的 NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;可以通过LM Studio语言大模型来部署己的 GPT 模型 AI 聊天机器人&#xff0c;AI 助手已迅速成为提高生产力、效率&#xff0c;甚至是头脑风暴的关键资源。在本地机器上运行 AI 聊天机…

前端列表可滚动,可轮播

前端列表可滚动&#xff0c;可轮播 <ulclass"scroll-list"ref"scroll_List"mouseenter"cancelScroll()"mouseleave"autoScroll()"><liclass"list-item"v-for"(item,index) in tableData3":class"[…

java现饱和,有必要去学其他语言吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;如果有时间总比不学好&…

虹科免拆诊断案例 | 2013 款路虎神行者 2 车偶发性无法起动

故障现象 一辆2013款路虎神行者2车&#xff0c;搭载2.0 L Si4 Petrol发动机&#xff0c;累计行驶里程约为4.5万km。车主反映&#xff0c;车辆偶发性无法起动&#xff0c;故障出现时&#xff0c;尝试起动发动机&#xff0c;组合仪表上会出现“挡位不在驻车挡”“充电系统故障”…

【Qt】 new成功,但是没有进入到构造函数。

NameTest工程中 nametest.cpp NameTest::NameTest() {pdata new privateAB; }NameTest::~NameTest() {if (pdata){privateAB *p (privateAB *)pData; //void *pdata nullptr;delete p;pdata nullptr;} }内部类&#xff1a; privateAB #include "private.h"#i…

密码学基本概念(补充)

BiBa模型的*特性规则&#xff1a;主体不能修改更高完整级的客体&#xff08;主题不能向上写&#xff09; Diffie-Hellman密钥交换协议的安全性基于求解离散对数的困难性&#xff0c;既对于C^d M mod P&#xff0c;在已知C和P的前提下&#xff0c;由d求M很容易&#xff0c;但是…

使用Nginx正向代理让内网主机通过外网主机访问互联网

目录 环境概述 流程说明 在外网服务器上安装部署nginx 安装前准备 下载nginx 编译安装nginx 开始配置正向代理 创建systemd服务单元文件&#xff0c;用于管理Nginx服务的启动、停止和重新加载 启动nginx 代理服务器本地验证 内网服务器验证 将代理地址添加到环境变量中…

地理加权回归GWR简介

地理加权回归GWR简介 一、定义&#xff1a; 地理加权回归&#xff08;Geographically Weighted Regression&#xff0c;简称GWR&#xff09;是一种空间数据分析方法&#xff0c;专门用于处理空间异质性&#xff08;spatial heterogeneity&#xff09;问题。以下是对GWR的详细简…

【云原生】Kubernetes----Ingress对外服务

目录 引言 一、K8S对外方式 &#xff08;一&#xff09;NodePort 1.作用 2.弊端 3.示例 &#xff08;二&#xff09;externalIPs 1.作用 2.弊端 3.示例 &#xff08;三&#xff09;LoadBalancer 1.作用 2.弊端 &#xff08;四&#xff09;Ingress 二、Ingress的…

mac虚拟光驱工具:Daemon Tools for Mac

Daemon Tools for Mac是一款功能强大的虚拟光驱工具&#xff0c;它为用户提供了在Mac上模拟物理光驱的能力&#xff0c;从而方便用户处理各种光盘映像文件。以下是关于Daemon Tools for Mac的详细介绍&#xff1a; 守护进程工具&#xff1a;Daemon Tools不仅是一个简单的虚拟光…

Tomcat概述及部署

目录 一、Tomcat概述 1.Tomcat的简介 2.Tomcat 核心的三个组件 3.应用场景 4.Tomcat 请求过程 二、部署安装Tomcat 三、Tomcat 虚拟主机配置 四、Tomcat多实例部署 一、Tomcat概述 1.Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开…

花费-效益分析筛选肿瘤标记物最佳组合

基于花费-效益分析的肿瘤标记物最佳组合筛选 本文的想法来自于一篇发表的论文[1]。论文作者有感于临床上存在的不恰当的肿瘤标记物的检测&#xff0c;搜集了各种肿瘤标记物&#xff08;TM&#xff09;的价格、检测结果和最终诊断等数据&#xff0c;使用逻辑回归模型分别计算出…

中国90米土壤渗流因子Fsic数据

Fsic(土壤渗流因子)&#xff1a;土壤渗流因子的计算是根据美国农业部(USDA)土壤质地分类&#xff0c; 进行分类、赋值并归一化,得到土壤渗流因子Fsic的值。将13种土壤质地类型分别在0-1之间均等赋值得到。其中Fsic值越高&#xff0c;代表土壤渗水能力越强&#xff0c;Fsic值域范…