yolov5代码解读之train.py【训练模型】

哇咔咔,登场

代码开头都是一些导包到模块的:

接下来来到入口函数:

我们直接来到main函数的内容:(分四个部分)

前两部分:

关于main函数的第二部分中的resume参数(496行),尽管咋没有使用该参数,但可以简单的了解一下:

resume表示从中断中恢复,比如说现在在某个数据集上想训练一个yolov5的模型,假如你想训练200轮,当你执行到100轮的时候你的电脑突然死机了哈哈,当你重新开机之后你会发现你原来的100轮已经被迫中断了,这个时候你电脑上只有一个已经训练了100轮的模型,但是你需要的结果是一个要200轮的模型,这个时候就可以用到resume参数,帮助你把刚刚的实验环境给恢复过来并继续完成未训练完的100轮。由于我们这里使用的是一个已经预训练好的yolov5.pt权重文件,所以咋就不使用该参数。

main函数后两部分:

虽然用不到evolve,但是可以提一下,它里面有非常多的参数,比如:

ok,来到最重要的train函数(536行),哇咔咔跳过去:

(对于第79行的callbacks.run,就是说你看到了这行代码就代表他要去执行括号里面的函数了。函数里面有内容就会执行,没有就会pass。这些函数都写在loggers里面)

点进去看一下(loggers):

同时还可以看到它定义了一些其他的函数:

ok,回到train函数:

这三个超参数含义:

他们表示的含义其实是损失函数前面的因子,对于yolov5来说,损失值分为三个部分,一部分是框回归的损失(box),一部分是类别损失值(cls),另一部分是置信度损失(obj)。为了平衡这三个损失,为各自乘上一个系数,这就是这三个超参数的含义,分别表示各自的系数。

当nl=3的时候,这3行的"3/nl"都等于1,说明这三个系数都没有发生改变,但假如修改了网路结构的话,假如有四个检测层(242行的nl等于3,检测低层,中层和高层),就会分别乘上3/4,把这三个超参数缩放到和层级一样的尺度。

ok,接着往下看:

这一部分是更新图片权重的。正常情况下,比如coco128数据集中它是含有128张图片的,然后利用这128张图片会在batch(291行代码)的时候给模型一批一批的喂数据,喂数据的时候每一张图片都会给到模型,但是每一张图片的检测效果是不同的,比如有的图片上的目标比较容易检测正确,有的比较难以识别到的目标,所以这个时候我们希望把难识别到的目标多传入模型几次,也就是说会给数据集中每一张图片分配一个采样权重,这样在一轮训练时会额外关注那些难识别的样本,从而改正最终的识别效果。

275行的model.class_weights表示数据集中每一类的数量权重,如果某一类的数量比较多的话,那么它的权重就比较大;maps就是80类各自的精度,1-maps就是80类各自的负精确度。所以在一轮中,如果某一类的负精确度比较高,这一类目标就会算出来一个比较大的类别权重,来增加它被采样到的概率。由于这里求出来的是类别权重,但是我们传给模型的其实是图片,而不是一个一个的检测框,所以必须把类别权重换算到图像的维度。

因此有了类别权重后,需要把类别权重给换算到图像维度(276行),也就是每一张图片的采样权重。比如某一张图片中含有识别不精确的目标越多,这个图片的权重就越大。

然后再利用这个图片权重去进行随机的重采样(277行),这个时候得到的128张图片就不再是原始的数据集了,而是会多包含一些难识别的样本。因此在batch部分给模型一批一批喂数据的时候也会给模型喂更多的难样本。

ok,接着往后看:

进度条呢就如下图所示:

Epoch表示进行到第多少轮了,"0/299":从第0轮开始,299轮结束;gpu_mem:gpu显存占用;box、obj、cls表示3个损失值;labels:平均每批样本中的标注框的个数;img_size:图片尺寸。

后面那个就是训练过程的进度条,一共有8批,每一批训练完它会不断地更新此进度条。"2:25"表示训练这一批数据花的时间,后面的"00:00"表示还需要多少时间,以及每一批数据在这一轮所花费的时间(18.16s)。这一轮训练完后,它会打印一下效果(就是那七个参数class,images......这些都是目标检测中常见的评估指标)

Ok,回到代码部分:

(291行)由于batchsize=16,所以imgs表示16张图片数据,图片数据是用来后续传给模型进行预测的;targets表示相应的标注框,标注框用来跟预测框一起求损失函数值;路径表示图片路径,方便后续做可视化的工作。(292行)在每一批数据开始训练的时候,它又会记录一些信息;

(293)ni表示从第0轮开始,到目前为止一共训练了多少批数据来起到一个记录批次的功能;

(294)把图片移到gpu上,并进行归一化的操作。

warmup是一种训练技巧,比如说他会在刚开始训练前几批数据的时候,他用一个比较小的学习率慢慢给你升到你设置的初始学习率。

(297)如果当前的批次正好处于需要进行warmup的前几批数据时,它会遍历优化器中的所有参数组(301行)。参数组会把模型的网络结构中的所有参数分成3组,针对所有的bias参数,学习率会在热身时从0.1逐渐降低到初始学习率lr0,所有其他参数的学习率会从0.0逐渐升高到lr0(302)。

比如303行:j=2时,bias参数需要从"warmup_bias_lr"学习率来逐渐降低到初始的lr0(initial_lr),如果不是bias参数就需要从0升高到lr0。

(304行)如果参数中有动量值的话,动量值也会有一个逐渐变化的过程。

在Log里面有一个细节:

ok,一个batch就完了,然后又会下一个batch进入for循环。

ok。

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

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

相关文章

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型(Probabilistic Graphical Model,PGM),是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布,进行有效的推理和学习,以及解决各种实际问题,如图…

mysql延时问题排查

背景介绍 最近遇到一个奇怪的问题,有个业务,每天早上七点半产生主从延时,延时时间12.6K; 期间没有抽数/备份等任务;查看慢日志发现,期间有一个delete任务,在主库执行了161s delete from xxxx_…

人类:我觉得1+1=956446,你觉得呢?大模型:啊对对对

大模型太「听话」了怎么办? 大型语言模型(LLM)的自然语言理解与生成能力一直备受称赞,特别是 ChatGPT 等对话式语言模型能够与人类流畅、自然地进行多轮对话。然而,最近一篇 Google DeepMind 的论文研究发现 LLM 普遍存…

企业权限管理(八)-登陆使用数据库认证

Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作,有很多种操作方式,这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails public interface UserDetails extends Serializable { Collecti…

转义字符\

转移字符,就是通过字符,来转变原来字符的意思 常见的转义字符: 1、 2 注:" 的作用和他是类似的 3 4、 当打印\a时,电脑会出现一个警告,蜂鸣的声音 5、 阿斯克码表

机器学习---对数几率回归

1. 逻辑回归 逻辑回归(Logistic Regression)的模型是一个非线性模型, sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型,因为除去sigmoid映射函 数关系,其他的步骤,算法都是…

行业追踪,2023-08-09

自动复盘 2023-08-09 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

Apache RocketMQ 命令注入

漏洞简介 RocketMQ 5.1.0及以下版本,在一定条件下,存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露,缺乏权限验证,攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命…

Java代理模式——静态代理与动态代理

代理模式 代理模式允许你为其他对象提供一个代理,以控制对这个对象的访问。代理模式在不改变实际对象的情况下,可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身,调用者可以通过这个替身去实现这个被代理对…

网络安全 Day30-容器架构上

容器架构上 1. 容器架构1.1 什么是容器1.2 容器 vs 虚拟机(化) :star::star:1.3 Docker极速上手指南1)使用rpm包安装docker2) docker下载镜像加速的配置3) 载入镜像大礼包(老师资料包中有) 1.4 Docker使用案例1) 案例01&#xff1…

【算法篇C++实现】常见查找算法

文章目录 🚀一、预备知识⛳(一)查找的定义⛳(二)数组和索引 🚀二、二分查找🚀三、穷举搜索🚀四、并行搜索⛳(一)并发的基本概念⛳(二)…

行业追踪,2023-08-10

自动复盘 2023-08-10 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

关于MPU6050的VLOGIC引脚作用

关键字:MPU6X0X、 MPU6050、数字逻辑电平、VLOGIC 框图: 一、VLOGIC引脚作用? VLOGIC引脚主要用于设置为I2C供电引脚,以保证正确的I2C通信。 The bias and LDO section generates the internal supply and the reference voltages and cu…

轻松转换TS视频为MP4,实现优质视频剪辑体验

如果你是一个视频剪辑爱好者,你一定会遇到各种视频格式之间的转换问题,特别是将TS视频转换为MP4格式。别担心,我们的视频剪辑软件将为你提供最简单、高效的解决方案! 首先第一步,我们要进入媒体梦工厂主页面&#xff…

Three.js 实现材质边缘通道发光效果

相关API的使用: 1. EffectComposer(渲染后处理的通用框架,用于将多个渲染通道(pass)组合在一起创建特定的视觉效果) 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入,使用Three.…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列(queue) 队列是一种用于实现任务与任务之间,任务与中断之间消息交流的机制。 注意:1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验:创建一个消息队列…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

webpack中常见的Loader

目录 1.webpack中的loader是什么?配置方式 2. loader特性3.常见的loader 1.webpack中的loader是什么? loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情,仅仅是分…

springboot 设置自定义启动banner背景图 教程

springboot banner Spring Boot中的banner是在应用程序启动时显示的一个ASCII艺术字符或文本。它被用来给用户展示一些关于应用程序的信息,例如名称、版本号或者公司标志等。 使用Spring Boot的默认设置,如果项目中有一个名为“banner.txt”的文件放置…

面试攻略,Java 基础面试 100 问(十一)

抽象类(abstract class)和接口(interface)有什么异同? 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现&#xff…