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,一经查实,立即删除!

相关文章

kill 不管用时,类型为C

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

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

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

Qt——控件

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

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

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

模板进阶

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

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

文章目录 概要头文件主要代码概要 在激光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;在任何一个时刻&#…

神经网络与深度学习——第15章 序列生成模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第15章 序列生成模型&#xff0c;习题还没做先存在这里。 序列生成模型 序列概率模型 序列生成 N元统计模型 深度序列模型 模型结构 嵌入层 特征层 输出层 参数学习 评价方法 困惑度 BLEU算法 ROUGE算法 序…

Aethir: 破局算力瓶颈,构建AI时代去中心化云基础设施

科技的每一次飞跃都在重新塑造世界&#xff0c;而近年来&#xff0c;跨越式的技术革新再次引发了深刻的变革&#xff0c;那就是人工智能&#xff08;AI&#xff09;。 人工智能已然超越了此前的所有技术概念&#xff0c;成为了继互联网之后的下一个巨大浪潮。从自动驾驶汽车到…

每天复习一点小CTF知识(6.4)

NSSCTF/[FSCTF 2023]夜深人静的时候也会偷偷emo 直接爆破压缩包&#xff0c;先来数字 解压好&#xff0c;一个flag.mp3 mp3隐写&#xff0c;直接干 得一个txt文件直接开

宇泰485中继器光电隔离防雷 工业级RS485信号放大器 UT-2209正品

品牌&#xff1a;other/其他 型号&#xff1a;UT-2209 上市时间&#xff1a;2018-01-01 颜色分类&#xff1a;蓝色 信号延长器,工业级,高性能,RS-485光电隔离中继器,兼容RS-485标准,延长通信距离,即插即用. 性能特点: 内置光电隔离器及DC/DC隔离模块. 采用TVS瞬态电…

读书-《蛤蟆先生去看心理医生》

书名蛤蟆先生去看心理医生作者罗伯特戴博德状态阅读中简介该书借用《柳林风声》的故事主角蛤蟆先生&#xff0c;讲述了他接受心理咨询的故事。作者通过陷入抑郁的蛤蟆先生和心理咨询师苍鹭的互动&#xff0c;探索蛤蟆先生爱炫耀、自卑性格和抑郁情绪的来源&#xff0c;指出童年…

【Python】 如何在Python中使用小数步长值的`range()`函数?

在Python编程中&#xff0c;range()函数是一个非常常用的工具&#xff0c;它用于生成一个整数序列。然而&#xff0c;标准的range()函数只能接受整数作为步长值&#xff0c;这在某些情况下可能会限制其应用。幸运的是&#xff0c;Python提供了一些方法来实现使用小数步长的rang…

优思学院|六西格玛绿带与黑带知识体系的比较,哪个更适合你?

六西格玛作为一种广泛应用的质量管理方法&#xff0c;通过减少缺陷和变异来提高输出质量。为了实现这些目标&#xff0c;六西格玛采用数据驱动的DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;方法。在六西格玛的实施过程中&#xff0c;绿带和黑带是两个关键角色。…

【代码随想录】【算法训练营】【第28天】 [93]复原IP地址 [78]子集 [90]子集II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 28&#xff0c;工作的周二~ 题目详情 [93] 复原 IP 地址 题目描述 93 复原 IP 地址 解题思路 前提&#xff1a;分割问题 思路&#xff1a;回溯算法&#xff0c;确定每次递归回溯的分割位置…