Yolo v5源码解析笔记

news2024/11/30 0:38:40

一、Yolo v5文件目录树结构

二、train.py文件介绍

从main()方法,首先读取参数;其次建立YOLONet;然后读取训练数据;最后进行训练。

2.1 读取参数

部分截图

2.2  建立YOLONet

        YOLONet的建立是通过 yolo文件夹中的yolo_net.py文件的代码实现了。yolo_net.py定义了YOLONet类,该类包含了网络初始化(__init__()),建立网络(build_networks())和loss函数(loss_layer())等方法。

        网络的所有初始化参数包含于__init__()方法之中:

三、yolov5s.yaml源码解读

        YOLO V5不再采用.cfg配置文件了,而是使用了新的.yaml配置文件,方便进行基于函数式的模块化开发。下面会对模型配置文件 yolov5s.yaml 进行讲解。

先附上yolov5s的网络结构图:

在这里插入图片描述

3.1 参数配置

# parameters
nc: 20  # number of classes
depth_multiple: 0.33  # model depth multiple 控制模型的深度(BottleneckCSP个数)
width_multiple: 0.50  # layer channel multiple 控制Conv通道channel个数(卷积核数量)
# depth_multiple表示BottleneckCSP模块的缩放因子,将所有BottleneckCSP模块的Bottleneck乘上该参数得到最终个数。
# width_multiple表示卷积通道的缩放因子,就是将配置里面的backbone和head部分有关Conv通道的设置,全部乘以该系数。
# 通过这两个参数就可以实现不同复杂度的模型设计。

 这个文件主要设置了三个参数,会用于模型搭建 yolo.py 文件中 如下:

在这里插入图片描述

 第一个是 nc(number of classes)数据集类别个数;

第二个参数是depth_multiple,用于控制模型的深度。通过深度参数 depth gain 在搭建每一层的时候,实际深度 = 理论深度( 每一层的参数n) * depth_multiple,这样就可以起到一个动态调整模型深度的作用。如下图:

在这里插入图片描述

第三个参数是width_multiple,用于控制模型的宽度。在模型中间层的每一层的实际输出channel = 理论channel(每一层的参数c2) * width_multiple,这样也可以起到一个动态调整模型宽度的作用。如下图:

在这里插入图片描述 这里的 depth_multiple 和 width_multiple 两个参数,这种通过一个参数动态调整网络规模的方法是从 EfficientNetV1 和 EfficientNetV2 得到的灵感,感兴趣的可以看一下。

3.2 anchors配置

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8   stride=8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

        yolov5初始化了9个anchors,在三个Detect层使用(3个feature map)中使用,每个feature map的每个grid_cell都有三个anchor进行预测。分配的规则是:尺度越大的feature map越靠前,相对原图的下采样率越小,感受野越小,所以相对可以预测一些尺度比较小的物体,所有分配到的anchors越小;尺度越小的feature map越靠后,相对原图的下采样率越大,感受野越大,所以相对可以预测一些尺度比较大的物体,所有分配到的anchors越大。即可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标。

        yolov5根据工程经验得到了这么3组anchors,对于很多数据集而言确实挺合适的。但是也不能保证这3组anchors就适用于所有的数据集,所有yolov5还有一个anchor进化的策略:使用k-means和遗传进化算法,找到与当前数据集最吻合的anchors。具体的代码细节可以看我的这篇博文链接: 【YOLOV5-5.x 源码解读】autoanchor.py。里面很详细的讲解了如何使用这个策略以及代码理解,这里就不多说了。

3.3 backbone

backbone:
  # [from, number, module, args]
  # from表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出
  # number表示本模块重复的次数,1表示只有一个,3表示重复3次
  # module: 模块名
  [[-1, 1, Focus, [64, 3]],          # 0-P1/2   [3, 32, 3]
   [-1, 1, Conv, [128, 3, 2]],       # 1-P2/4   [32, 64, 3, 2]
   [-1, 3, C3, [128]],               # 2        [64, 64, 1]
   [-1, 1, Conv, [256, 3, 2]],       # 3-P3/8   [64, 128, 3, 2]
   [-1, 9, C3, [256]],               # 4        [128, 128, 3]
   [-1, 1, Conv, [512, 3, 2]],       # 5-P4/16  [128, 256, 3, 2]
   [-1, 9, C3, [512]],               # 6        [256, 256, 3]
   [-1, 1, Conv, [1024, 3, 2]],      # 7-P5/32  [256, 512, 3, 2]
   [-1, 1, SPP, [1024, [5, 9, 13]]], # 8        [512, 512, [5, 9, 13]]
   [-1, 3, C3, [1024, False]],       # 9        [512, 512, 1, False]
   # [nc, anchors, 3个Detect的输出channel]
   # [1, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
  ]

 

这是yolov5s的backbone,可以看到每一个模块算一行,每行都由四个参数构成。分别是:

1. from:表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出。
2. number: 表示当前模块的理论重复次数,实际的重复次数还要由上面的参数depth_multiple共同决定,决定网络模型的深度。
3. module:模块类名,通过这个类名去common.py中寻找相应的类,进行模块化的搭建网络。
4. args: 是一个list,模块搭建所需参数,channel,kernel_size,stride,padding,bias等。会在网络搭建过程中根据不同层进行改变:
BottleneckCSP, C3, C3TR:

在这里插入图片描述

 nn.BatchNorm2d:

在这里插入图片描述

Detect

在这里插入图片描述

3.4 head 

YOLOv5 head = PANet+Detect

# YOLOv5 head  作者没有区分neck模块,所以head部分包含了PANet+Detect部分
head:
  [[-1, 1, Conv, [512, 1, 1]], # 10                 [512, 256, 1, 1]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], # 11 [None, 2, 'nearest']
   [[-1, 6], 1, Concat, [1]],  # 12 cat backbone P4 [1]
   [-1, 3, C3, [512, False]],  # 13                 [512, 256, 1, False]

   [-1, 1, Conv, [256, 1, 1]], # 14                 [256, 128, 1, 1]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #15  [None, 2, 'nearest']
   [[-1, 4], 1, Concat, [1]],  # 16 cat backbone P3 [1]
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)    [256, 128, 1, False]

   [-1, 1, Conv, [256, 3, 2]], # 18                 [128, 128, 3, 2]
   [[-1, 14], 1, Concat, [1]], # 19 cat head P4     [1]
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)  [256, 256, 1, False]

   [-1, 1, Conv, [512, 3, 2]], # 21                 [256, 256, 3, 2]
   [[-1, 10], 1, Concat, [1]], # 22 cat head P5     [1]
   [-1, 3, C3, [1024, False]], # 23 (P5/32-large)   [512, 512, 1, False]

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # 24  Detect(P3, P4, P5)
  ]

可以看到,和backbone的很像,也是由4个参数构成:

1.from: 表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出。不过这里可以为list,就是这层的输入由所层输出concat而来。
2. number:表示当前模块的理论重复次数,实际的重复次数还要由上面的参数depth_multiple共同决定,决定网络模型的深度。
3. module:模块类名,通过这个类名去common.py中寻找相应的类,进行模块化的搭建网络。
4. args:也是是一个list,模块搭建所需参数,channel,kernel_size,stride,padding,bias等。

搭配着yolo.py一起看,会更清晰每个参数的作用。

参考链接:

【YOLOV5-5.x 源码解读】yolov5s.yaml_满船清梦压星河HK的博客-CSDN博客_yolov5s.yaml

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

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

相关文章

游戏开发58课 性能优化

6. 卡顿优化 相信很多研发者或玩家,都遇到这种情况:游戏大部时间运行都很流畅,但在战斗的某些时刻或者打开某些界面会卡一下,甚至卡很久。这个现象就是卡顿。引发卡顿的原因有很多,但主要有: 突发大量IO。…

银河麒麟桌面V10SP1版本系统休眠唤醒鼠标键盘失效解决方法

使用银河麒麟桌面系统有时会出现系统休眠后再唤醒,鼠标键盘失效的问题,可尝试以下方法解决。 1.检查是否安装 laptop-mode-tools 工具 执行命令: dpkg -l | grep laptop-mode-tools如果执行命令无结果输出,表示未安装(如果已安装&#xff0…

【从零开始学习深度学习】21. 卷积神经网络(CNN)之二维卷积层原理介绍、如何用卷积层检测物体边缘

目录1. 二维互相关运算2. 自定义二维卷积层3. 卷积层的应用----图像中物体边缘检测4. 通过数据学习核数组5. 互相关运算和卷积运算6. 特征图和感受野总结卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer&#x…

欧克科技在深交所上市:客户集中度较高,胡坚晟为控股股东

12月12日,欧克科技股份有限公司(下称“欧克科技”,SZ:001223)在深圳证券交易所主板上市。本次上市,欧克科技的发行价格为65.58元/股,发行数量为1668万股,募资总额约为10.94亿元,募资…

印制电路板(PCB)设计原则和抗干扰措施

印制电路板(PCB)是电子产品中电路元件和器件的支撑件.它提供电路元件和器件之间的电气连接。随着电于技术的飞速发展,PCB的密度越来越高。PCB 设计的好坏对抗干扰能力影响很大,因此,在进行PCB 设计时.必须遵守PCB设计的…

Nginx 防盗链

Nginx 防盗链 本篇主要介绍一下 nginx 中 防盗链的具体配置 , 以及http 的 referer 头 概述 防盗链其实就是 防止别的站点来引用你的 资源, 占用你的流量 在了解nginx 防盗链之前 我们先了解一下 什么是 HTTP 的头信息 Referer,当浏览器访问网站的时候,一般会带上Referer,告…

【TS】TypeScript声明文件(.d.ts)的使用

前言 当我们在TS文件中需要引入外部库时,编译时是无法判断传入参数的类型的,所以我们需要在引入前加入一个声明文件来帮助ts判断类型。 当然现在大部分库都自带有自己的声明文件,一般在types目录下。 使用场景 在ts文件中对引用的外部库做…

汇编逻辑运算指令

目录 逻辑运算指令 一:取反指令NOT 二:逻辑与运算AND(重点) 屏蔽某些位. 把小写字母转换成大写字母 判断一个数的状态 三:逻辑或运算指令OR 用于拼字 把大写字母转换为小写字母 四:逻辑异或指令XOR…

程序员也会八卦吗?

世俗的眼光,总是觉得女生喜欢吃八卦,经常聚在一起小圈子叽叽喳喳谈论朋友圈。 其实,从现实来看,办公室的男性同胞也不啻于女生的八卦程度。 在吃瓜这件问题上,程序员凭借自身的技术优势,往往奋战于最前线…

【网络编程】捕获网卡IP数据报

本文将通过winsock从应用层捕捉网络层的IP数据报。 唉,原来的时候一直希望能在应用层实现网络游戏加速,发现可以捕捉网卡IP数据报后觉得可能有希望写出来。后面想了想得出结论:可以捕获没卵用,因为没法拦截(包已经发出…

RocketMQ的事务消息是如何实现的?

RocketMQ的事务消息实现方法如下: 1、首先生产者订单系统先发送⼀条half消息到Broker,half消息对消费者而⾔是不可⻅的 2、再创建订单,根据创建订单成功与否,向Broker发送commit或rollback 3、并且⽣产者订单系统还可以提供Broker…

Spark 3.0 - 11.ML 随机森林实现二分类实战

目录 一.引言 二.随机森林实战 1.数据预处理 2.随机森林 Pipeline 3.模型预测与验证 三.总结 一.引言 之前介绍了 决策树 ,而随机森林则可以看作是多颗决策树的集合。在 Spark ML 中,随机森林中的每一颗树都被分配到不同的节点上进行并行计算&…

Crack:Aspose.3D for .NET 22.11.X

Aspose.3D for .NETAspose.3D for .NET 是一个功能丰富的游戏软件和计算机辅助设计 (CAD) API,无需任何 3D 建模和渲染软件依赖即可操作文档。API 支持 Discreet3DS、WavefrontOBJ、FBX(ASCII、二进制)、STL(ASCII、二进制&#x…

[附源码]Nodejs计算机毕业设计基于web的家教管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT

目录 1. SIGINT 2. SIGKILL 3. SIGSTOP与SIGCONT 简介 SignalStandardActionCommentSIGINTP1990TermInterrupt form keybordSIGKILLP1990TermKill signalSIGSTOPP1990TermInterrupt form keybord1. SIGINT 我们在shell交互式进程中常用的ctrl c 就是对当前运行的程序进行…

[附源码]Node.js计算机毕业设计电影票网上订票系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

2022年山东食品安全管理员模拟试题及答案

百分百题库提供食品安全管理员考试试题、食品安全管理员考试预测题、食品安全管理员考试真题、食品安全管理员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 1.下列哪项措施与保证食品安全无关? A…

2022gwb_web3

可以通过反序列化出一个 Webclome 类从而任意构造原生类,但只能调用 getSize 方法获取文件或目录 的大小,试了试直接拿根目录的 /flag 就别想了,先看看网站目录有没有藏什么东西(扫目录什么也扫 不出来),EX…

再学C语言2:概览

重新把C语言梳理一遍,学习在VSCode中进行C语言编程 一、C语言起源 1972年,贝尔实验室的Dennis Ritchie在C语言的基础上设计出一种新的语言,即C语言 C是作为从事实际编程工作的程序员的一种工具儿出现,是为编程人员开发的语言 二…

【脚本项目源码】Python制作桌面宠物,这么可爱的萌宠你不想拥有吗?

前言 本文给大家分享的是如何通过利用Python制作桌面宠物,废话不多直接开整~ 开发工具 Python版本: 3.6 相关模块: random模块 os模块 cfg模块 sys模块 PyQt5模块 环境搭建 安装Python并添加到环境变量,pip安装需要的相…