yolov5模型结构与构建原理

一.yolov5模型结构与构建原理

修改模型结构,全部在models文件夹下面

models/common.py   (加入新增网络细节)

models/yolo.py          (设定网络结构传参细节)

models/##.yaml         (修改模型结构配置文件)


上一篇博客用的自己标注的火影的数据集,修改的是data

data/##.yaml,

然后把数据集datasets放进项目里面

没有修改模型本身

 1.用tensorboard可视化来理解模型结构:

进入到group图

综合上面的3个图,我们可以这样总结:
(1)每经过一个卷积conv,特征图/2

(2)每一层都有层数标号,从0开始,这个标号非常重要,决定了特征融合是哪一层和哪一层融合(相同大小的特征图才能彼此融合)

(3)最后是融合之后的17,20,23层成为3种size的特征头

2.理解深层逻辑

(1)在train.py里面找到#model

我们只关注最后一行,给model传的参列表

cfg:对应yolov5s.yaml文件

ch:通道数为3

nc:原始类别数,修改yaml会对其更新

(2)进到Model里面看看实现

会发现这个Model其实等于DetectionModel的返回值


 yolo.py:

(3)进入DetectionModel看看具体实现

会发现竟然跳到了yolo.py里面来 惊!

还记得文章最前面的这个吗?

可以看到默认是这样的:cfg果然默认是yolov5s.yaml

并且nc值如果和默认的.yaml不一样会修改nc值

还可以看到里面有这一行:

(4)转入parse_model看看

d:.yaml(注意:我们从上一层传入这个的原因是我们要遍历和使用.yaml文件里面的内容

ch:通道数

  1. 遍历.yaml

from:输入来自哪一层   number:重复几次   model    args(参数)

补充:depth_multiple:控制真正的重复次数 number=max(1,depth_multiple*number)

width_multiple:控制输出通道数 Eg:下面这个64      

这个64,6,2,2,其实对应的是Conv里面_init_的c2,k,s,p这四个,因为c1可以直接用保存的上一层的通道数,不用单独传参

commom.py里面

2.

所以ch[f],f=-1(输入通道数)

输出通道数c2=args[0]=64(其中一个例子)

二.修改网络结构(以C2f为例)

总:要修改yolov5的模型结构的话,主要改的是commom.py,yolo.py,.yaml这3个文件

目的:yolov5->yolov8的模型结构

yolov8代码下载地址:

GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

1.加入新增网络结构

打开yolov8文件,找到E:\ultralytics-main\ultralytics\nn\modules\block.py<=>yolov5里面的common.py

找到 C2f:

把C2f复制粘贴放到yolov5 的common.py的c3前面

因为C2f里面有Bottleneck这个函数,所有要把Bottleneck也粘贴过来

避免麻烦,我们在两个地方都加一个C2f

2.设定网络结构传参细节

在yolov5的yolo.py里面找到

def parse_model(d, ch):

加上C2f (因为它和C3的结构类似,直接加)

 3.修改模型结构配置文件.yaml

(1)复制粘贴重命名一个yolov5s-C2f.yaml

(2)把里面的C3改成C2f

(3)改train.py里面的cfg

改为:

在服务器上跑结果:

 successful!

三.引入注意力机制

借鉴代码:https://github.com/ZhugeKongan/Attention-mechanism-implementation

里面的se_block

1.加入新增网络结构

把借鉴的代码复制粘贴到common.py中

C2fBottleneck(nn.Module):的前面

2.修改模型结构配置文件

复制粘贴重命名yolov5s-se.yaml

修改backbone,加一个SE

因为相当于中间多加了一个第10层:

所以后面大于10层的层号都要变一下:+1

3.设定网络结构的传参细节

yolo.py

四.替换主干网络backbone(特征提取部分)为MobileNet

我们要的是models.mobilenet里面的features部分(第一个sequencial)

1-3:还不满足我们的采样要求

4:8倍下采样

5-9 :16倍下采样

10-最后:32倍下采样

head:(不用改)

backbone:(是我们修改主干真正要改的)

1.common.py里面加上:

2. .yaml

复制粘贴重命名:

注:输出通道数是查找了:

因为backbone里面变成3层了,head里面拼接的层数也要变:

3.yolo.py里面

注意:这个args是.yaml里面穿的参

arge[0]对于的是输出通道数      .yaml里面backbone的[24,1]中的24

4.改train.py里面

总结:其实是起到一个模型轻量化的作用,层数变多了,参数量变少了

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

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

相关文章

测试文章27-这是一篇测试文章请忽略

这是一篇测试文章请忽略 这是测试的文字&#xff0c;如有打扰请谅解。稍后测试完毕会删除 ‍ ‍ 测试代码块 ‍ public static void main(String[] args){System.out.println("Hello, World!"); } aaa

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时&#xff0c;使用 kill -9 PID&#xff0c;却不管用&#xff0c;这时需要先使用如下命令&#xff0c;找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来&#xff1a; 接着就是使用 …

C++ 习题精选(3)——只出现一次的数字

目录 1. 只出现一次的数字 I2. 只出现一次的数字 II 1. 只出现一次的数字 I 题目描述&#xff1a;给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度&…

Go 延迟调用机制

defer延迟调用机制 是什么&#xff1f;为什么&#xff1f; 延迟调用是函数return正常结束后或者painc异常结束前会执行的一些操作。 再申请资源的时候延迟调用&#xff0c;防止忘记资源释放&#xff0c;数据库、文件、锁等资源释放。 延迟调用的顺序&#xff1f; 会按先进后出的…

景源畅信电商:抖音小店怎么做好运营?

在如今这个数字化时代&#xff0c;电商平台如雨后春笋般涌现&#xff0c;其中抖音小店以其独特的短视频营销模式迅速崛起。如何在这个竞争激烈的市场中占据一席之地&#xff0c;成为了许多商家和创业者思考的问题。下面&#xff0c;我们将深入探讨抖音小店的运营策略&#xff0…

多线程插入10万条数据,且避免堆栈溢出

在多线程环境下插入大量数据&#xff08;如10万条&#xff09;时&#xff0c;避免堆栈溢出的关键在于合理管理线程的生命周期、控制递归深度&#xff08;如果使用了递归的话&#xff09;&#xff0c;以及合理分配每个线程处理的数据量。以下是一些建议来实现这个目标&#xff1…

论文阅读[268]基于EEM荧光光谱,感知燃烧产生的颗粒物

【论文基本信息】 标题:EEM Fluorescence Spectroscopy based Sensing of Combustion Generated Particulate Matter 来源与类型:华盛顿大学,博士学位论文 推荐理由:论文作者将主成分回归(PCR)方法与三维荧光光谱结合,预测样本中特定类污染物的总浓度,准确率达到了97.6…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

docker run 两个挂载路径怎么设置

docker run 两个挂载路径怎么设置 在使用 docker run 命令时&#xff0c;如果需要挂载多个宿主机目录到容器中&#xff0c;您只需为每个挂载路径添加一个 -v 或 --volume 选项即可。下面是一个示例&#xff0c;展示了如何挂载两个宿主机目录到容器的不同路径上&#xff1a; Bas…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin&#xff0c;不排序使用…

redhat遇到安装包缺失问题

缺失的文件用repoquery --nvr --whatprovides XXX 查询 repoquery --nvr --whatprovides libstdc.so.6然后使用yum -y install XXX 选择查询到的文件的安装 yum -y install libstdc-8.5.0-3.el8Last metadata expiration check: 0:06:30 ago on Wed Jun 5 04:02:24 2024. lib…

模板进阶

非类型模板参数&#xff08;常量参数&#xff09; 相当于向类传递常量&#xff08;编译前确定&#xff09;参数 只能传整型/size_t&#xff0c;不可double等 C20 后可以支持其他内置类型&#xff08;可指针&#xff09; 自定义类型的实参永远不行 array 可理解为固定size的…

JS继承的方式

目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty

在点云地图中进行点云计数

文章目录 概要头文件主要代码概要 在激光SLAM(Simultaneous Localization and Mapping)中,局部点云地图是通过激光雷达扫描捕捉到的周围环境的局部三维点集合。统计局部点云地图中的所有点数目是一个常见的需求,这可以帮助我们了解数据的密集程度、有效性等。 为了统计局…

JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!

&#x1f4c3;HTTP请求 ▐ http超文本传输协议&#xff1a; ⦁ http超文本传输协议属于应用层协议&#xff0c;传输内容必须是超文本内容 (网页内容) ⦁ 例如在网页上点击超链接&#xff0c;提交表单&#xff0c;都可以向后端发送一个http请求 ⦁ 一次http请求中包含请求行、…

力扣167. 两数之和 II - 输入有序数组

Problem: 167. 两数之和 II - 输入有序数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义左、右指针left、right分别指向数组索引为0和索引为nums.length - 1&#xff0c;定义结果数组int[] res new int[2]用于存储索引; 2.查找&#xff1a;当判断numbers[left] nu…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…

Qwen-VL论文阅读

论文地址 其他同学的详细讲解 模型结构和参数大小 &#xff08;1&#xff09;LLM&#xff1a;Qwen-7B &#xff08;2&#xff09;Vision Encoder&#xff1a;ViT架构&#xff0c;初始化参数是 Openclip’s ViT-bigG。 在训练和推理过程中&#xff0c;输入的图像都被调整到…

C语言函数递归实现汉诺塔问题

汉诺塔问题的大概 汉诺塔问题如图三个柱子&#xff0c;利用B将A上面的盘子移到C上面&#xff0c;但是一次只能移动一个盘子并且大的盘子不可以在小的盘子上面。 当只有三个盘子的时候&#xff0c;就像图片一样移动&#xff0c;当盘子多了起来我们就很难分得清逻辑了。 这个时候…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…