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.hqwc.cn/news/61419.html

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

相关文章

taro Swiper组件--异形滚动

效果 <SwiperindicatorDots{false}previousMargin50pxnextMargin50pxautoplay{false}interval100onChange{onChangeSwiper} >{[1,2,3].map((item, index) > {return (<SwiperItemkey{item-${index}}><View className{demo-item ${currentIndex index ? ac…

机器学习、深度学习项目开发业务数据场景梳理汇总记录四

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

macbook怎么卸载软件?2023年最新全新解析macbook电脑怎样删除软件

macbook怎么卸载软件&#xff1f;2023年最新全新解析macbook电脑怎样删除软件。关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的知识大家了解吗&#xff1f;以下就是小编整理的关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的介绍&#xff0c;希望可以给到…

搜索二叉树(二叉树进阶)

目录 1.二叉搜索树 1.1二叉搜索树概念 1.2二叉搜索树操作 2.3二叉搜索树的实现 2.4二叉搜索树的应用 2.5二叉搜索树的性能分析 1.二叉搜索树 1.1二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff…

定时器

定时器 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码. 定时器是一种实际开发中非常常用的组件. 比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连. 比如一个 Map, 希望里面的…

MAUI+Blazor:windows 打包踩坑

文章目录 前言MSIX安装文件如何发布选择Windows平台旁加载自定义签名版本号安装 总结 前言 最近打算研究一下MAUIBlazor&#xff0c;争取在今年年底之前彻底搞懂MAUIBlazor的安装模式&#xff0c; MSIX安装文件 Windows 4种安装程序格式MSI&#xff0c;EXE、AppX和MSIX优缺点…

uni-app之app上传pdf类型文件

通过阅读官方文档发现&#xff0c;uni.chooseFile在app端不支持非媒体文件上传&#xff1b; 可以使用这个插件&#xff0c;验证过可以上传pdf&#xff1b;具体使用可以去看文档 插件地址 就是还是会出现相机&#xff0c;这个可能需要自己解决下 实现功能&#xff1a;上传只能上…

详解Linux文本三剑客

目录 一、grep 1.什么是grep? 2.如何使用&#xff1f; 3.正则 二、sed 1.认识sed? 2.如何使用&#xff1f; 三、awk&#xff08;重点&#xff09; 1.awk变量 1.1内置变量 1.2自定义变量 2.awk数组 四、经典实战案例 案例一&#xff1a;筛选IPv4地址 案例二&am…

Oracle 开发篇+Java通过DRCP访问Oracle数据库

标签&#xff1a;DRCP、Database Resident Connection Pooling、数据库驻留连接池释义&#xff1a;DRCP&#xff08;全称Database Resident Connection Pooling&#xff09;数据库驻留连接池&#xff08;Oracle自己的数据库连接池技术&#xff09; ★ Oracle开启并配置DRCP sq…

Win11 VS2022 配置CGAL-5.6

由于项目要用到几何库CGAL&#xff0c;因此做了配置。采用的是官方文档中的“Installing from the Source Archive”方式。 1. 下载安装CGAL &#xff08;1&#xff09;CGAL-5.6.zip下载地址&#xff1a;Releases CGAL/cgal GitHub 下载下图所示的两个文件。 &#xff08…

竞赛项目 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

图像变形之IDW和RBF(附源码)

IDW原理 IDW(Inverse distance weighted interpolation)图像变形算法根据给定的控制点对和控制点对的位移矢量(方向和距离)&#xff0c;计算控制点对周围像素的反距离加权权重影响&#xff0c;从而实现图像每一个像素点的位移&#xff0c; 假设输入控制点pi&#xff0c;其对应…