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

news2024/11/27 14:43:32

哇咔咔,登场

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

接下来来到入口函数:

我们直接来到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.coloradmin.cn/o/858579.html

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

相关文章

进程间通信的编程方式(IPC)及实验

进程间通信(IPC)方式 目录 Socket 管道 匿名管道 消息队列 共享内存 信号 远程过程调用 Socket Socket编程是一种在计算机网络中进程间通信的编程方法。Socket提供了一种在不同主机上运行的进程之间传输数据的机制。通过使用Socket API&#xff…

ABC300

ABC300E 题面 思路 对于投骰子,最后一步可能得到1、2、3、4、5、6,那么对应的最后一步之前的数是n/1、n/2、n/3、n/4、n/5,n/6。并且每个数字(1、2、3、4、5、6)得到的概率是一样的,即为1/6。 也就是F(n…

Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家,希望对各位小伙伴…

cpolar的基础使用方法

如何使用cpolar内网穿透? 文章目录 如何使用cpolar内网穿透?前言1. 在群辉NAS系统下安装cpolar套件2. 管理隧道列表3. 创建固定数据隧道 前言 群晖作为大容量存储系统,既可以作为个人的私有存储设备,也可以放在小型企业中作为数据…

别再用人工巡检了,教你一个简单好用的新技巧

当今社会中,计算机设备扮演着不可或缺的角色,它们在个人生活、商业活动和科技创新中都具有重要地位。 无论是个人用户还是企业,UPS监控都是确保计算机设备稳定运行的关键环节。通过有效的UPS监控,我们能够在电力波动或中断时保护硬…

python中的迭代器和生成器

一、迭代器 支持迭代的容器,如列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器。 自定义迭代器的类中必须实现以下2个方法: __next__(self)…

Netty:用forEachByte遍历处理ByteBuf中的可读字节

说明 io.netty.buffer.ByteBuf的forEachByte(ByteProcessor processor)用指明的ByteProcessor 遍历ByteBuf中的可读字节。遍历的时候用升序遍历。 -这个函数可以在ByteBuf中寻找某个字节首次出现的位置,或者首次不是某个字节的位置。 如果已经遍历完了可读字节但还…

简单的基于SpringBoot的学生成绩管理系统java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 简单的基于SpringBoot的学生成绩管理系统 系统有2权限…

LeetCode面向运气之Javascript—第26题-删除有序数组中的重复项-99.18%

LeetCode第26题-删除有序数组中的重复项 题目要求 一个升序排列的数组nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回 nums 中唯一元素的个数。 原地 说是一个…

领航优配:股市看盘的几个小技巧?

股市看盘是每个股民不可或缺的一项技能,它能够帮助股民更好地剖析股票的走势,从而做出更明智的出资决策。可是,股市行情千变万化,要想达到精准的猜测与判断,需求把握一些小技巧。本文将分享几个股市看盘的小技巧&#…

使用CANape查看blf数据

blf数据不像mf4那样自带信号数据库,因为它是记日志用的,一般情况下要尽可能的小,所以,解析blf数据要单独有个数据库文件,一般是dbc或者arxml,我这里用dbc做示范,解析之前要先加载dbc&#xff0c…

微服务Ribbon-负载均衡策略和饥饿加载

目录 一、负载均衡策略 1.1 负载均衡策略介绍 1.2 自定义负载均衡策略 二、饥饿加载 (笔记整理自bilibili黑马程序员课程) 一、负载均衡策略 1.1 负载均衡策略介绍 负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类&…

HCIP-linux和kvm(ks配置文件自动化安装及console连虚拟机有问题)

1、linux linux安装教程参考,https://blog.51cto.com/cloudcs/5245337 yum源配置 本地yum源配置: 8版本配置:将光盘iso挂载到某个目录,/dev/cdrom是/dev/sr0软链接,# mount /dev/cdrom /mnt,# ls /mnt Ap…

siMLPe:Human Motion Prediction

Back to MLP: A Simple Baseline for Human Motion Prediction解析 摘要1. 简介2. Related Work2.1 基于RNN的人体运动预测2.2 基于GCN的人体运动预测2.3 基于 Attention 的人类运动预测2.4 总结 3. siMLPe3.1 离散余弦变换(Discrete Cosine Transform (DCT)&#x…

使用go获取链上数据之主动拉取-连接数据库

上一篇文章,我们完成了基础环境的搭建,并通过viper完成了配置文件的读取,本章,我们将要完成使用gorm连接数据库,并插入一条数据 1、配置数据库连接 1.1、新建db.go 对数据库的操作,我们使用的是gorm类库&…

个人理解Java的浅克隆与深克隆

浅克隆 浅克隆只会克隆基本数据属性,而不会克隆引用其他对象的属性,String类型除外。(String对象是不可修改的对象,每次修改其实都是新建一个新的对象,而不是在原有的对象上修改,所以当修改String属性时其…

vue2.7如何使用vue-i18n

版本: vue:2.7.0 vue-i18n:8.28.2 一、下载 npm i vue-i18n8.28.2二、新建 新建一个文件,例如:lang,项目结构如下: index.js: import Vue from vue import VueI18n from vue-i18n…

函数的递归

1、什么是递归? 程序调用自身的编程技巧称为递归。 递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#x…

最强自动化测试框架Playwright-操作指南(3)-PO模式

playwright支持PO模式 创建页面对象 class SearchPage:def __init__(self, page):self.page pageself.search_term_input page.get_by_role("searchbox", name"输入搜索词")def navigate(self):self.page.goto("https://bing.com")def searc…

《人脸识别技术应用安全管理规定(征求意见稿)》,需要关注三个焦点

目录 严防人脸信息采集与滥用 规范人脸识别信息的处理 保障人脸识别技术的安全 人脸识别主要有三类风险 近日,国家互联网信息办公室发布《人脸识别技术应用安全管理规定(试行)(征求意见稿)》公开征求意见的通知。 …