YOLOv8训练流程-原理解析[目标检测理论篇]
关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地学习本章内容,建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客,再次把YOLOv8网络结构图放在这里,方便随时查看。
1.前言
YOLOv8训练流程这一块内容还是比较复杂的,所以先来谈一下训练流程的思路,一共就两步:第一步就是从网络预测的结果中找到正样本,并且确定正样本要预测的对象;第二步就是计算预测结果和标签之间的损失,分别计算预测框的损失以及预测类别的损失。
如下图所示,假设一张图片中只有3个标签,那么需要从8400个Grid cell中找到这3个标签对应的正样本,然后通过计算正样本的预测值和标签值之间的损失,最后通过损失的反向传播更新模型的权值和偏差。
为了更好地理解YOLOv8或者说是YOLO系列网络,需要对Grid cell建立概念,如下所示:
首先可以看到通过网络输出的三个特征图的分辨率分别为:80*80,40*40,20*20,本文所说的Grid cell即为图中的红点、蓝点以及黄点,从图中可以得到以下信息:第一,红点代表的Grid cell是80*80分辨率中每个像素的中心点,因为红色Grid cell比较密集并且可以x8将红点映射回原图,所以80*80分辨率的特征图Grid cell是用来训练小目标的,蓝色和黄色Grid cell同理;第二,如果8400个Grid cell全部当成正样本的话是不实际的,所以必须从这8400个Grid cell中选出一些正样本;第三,由于YOLOv8是Anchor Free的模型,所以会将这三个尺度的特征图展开变成长度为8400的一维向量。
2. Task Aligned Assigner
Task Aligned Assigner中文翻译为任务对齐分配器,是一种正负样本分配策略,也就是找正样本的方法,也就是训练流程中的第一步。
在正式开始找正样本之前,需要先把网络预测值Box和Cls解码,同时也需要把标签的Box和Cls解码,过程如下图所示:首先是网络预测结果Pred的Box需要解码成4维,用来预测LTRB的(解码过程在预测原理第三章有提到YOLOv8预测流程-原理解析[目标检测理论篇]-CSDN博客),另外还需要转换为XYXY格式且预测的坐标值是相对于网络输入尺寸的(即640*640);Cls只需要使用Sigmoid()解码就行。其次是标签Target的解码,其实只有Box需要解码,为了和Pred的解码格式保持一致,需要将XYWH格式转换为XYXY,并且标签值对应的坐标是相对于网络输入尺寸(即640*640)。
然后正式开始找正样本了,假设一张图片上只有一个GT Box,使用红色框作为标记。由于已经将三个特征图下的grid cell都转换到640*640坐标系了,结合GT框的位置和大小,找到合适的中心点作为训练的正样本,这就是TaskAlignedAssigner的任务,一共分成三步,即初步筛选,精细筛选,剔除多余三个步骤。
(1)初步筛选:即select_candidates_in_gts,转换之后的Grid Cell落在GT Box内部,作为初步筛选的正样本,如图中所示红色点为初步筛选的Grid Cell,而落在GT Box外部的点或者落在GT Box角上或者边上的都需要过滤掉,如蓝色点所示;经过初步筛选,图2中9个红色的点作为初筛后留下的正样本点。
(2)精细筛选:即get_box_metrics,select_topk_candidates,通过公式align_metric=s^α∗u^β(s和u分别表示分类得分和CIoU得分, a和b是权重系数,默认值分别0.5和6.0),计算出每个预测框的得分,然后把得分低的预测框给过滤掉,一般会取得分最高的top10个gird cell。
其中分类得分,取的在是GT Box内对应的类别的预测值,比如该GT的类别下标为1,那么落在GT box内的点所预测的类别下标为1时的置信度。另外计算IoU使用的是CIoU,计算公式和计算过程如下所示,如何理解CIoU呢,IoU并无法充分表示预测框和标注框之间的关系,需要引入中心点距离,以及最小矩形框斜边距离,通过这两者的比值来表示预测框和标注框的相似度。所以会在IoU的基础上减去该比值,再减去由预测框宽高和标注框宽高组成的式子。
(3)剔除多余:保证一个Grid Cell只预测一个GT框,如果一个Grid Cell同时匹配到两个GT Box,那么将从这两个GT中,选出与他CIoU值最大的一个作为他要预测的GT Box。如图所示,Grid Cell A、B、C负责预测GT1,包括预测GT1的类别和Box,而Grid Cell D负责预测GT2,也是预测类别和Box。
3.Loss
YOLOv8的Loss由三部分组成:Loss_box,Loss_cls,Loss_DFL分别表示回归框损失,类比损失和DFL损失(其实也是回归框的损失),下面会详细介绍这三种损失。
还是先来简单了解下Loss计算的思路,如下图所示:左边Target表示标签值,右边Pred表示预测值,均需要借助上一章找到的正样本,然后通过对比同一个Grid cell正样本的预测值和标签值,计算对应的Loss。
先来看一下get_targets函数做了哪些处理,GT_Box是经过预处理的,(1,3,4)表示XYXY且相对于640*640尺度的坐标。GT_Cls没有经过处理,表示GT_Box1、 GT_Box2、 GT_Box3的类别。
假设GT1的box是(x0,y0,X0,Y0),cls是0; GT2的box是(x1,y1,X1,Y1),cls是1;根据找到的正样本和负样本来举个例子,其中负样本为E,正样本为A/B/C/D.由图可以看到Target_Score在这一步已经区分了正负样本了,其中负样本使用[0,0]来表示。而Target_Bbox并没有区分正负样本,负样本统统会选择第1个GT的Box作为其Target_Bbox,换句话说,Target_Bbox值为[x0,y0,X0,Y0]的Grid cell可能为正样本也可能为负样本。
3.1Loss_cls
下面是YOLOv8中计算Loss_cls的代码:
target_scores_sum = max(target_scores.sum(), 1)loss[1] = self.bce(pred_scores, target_scores.to(dtype)).sum() / target_scores_sum # BCE
而主要的部分是Loss_cls采用了BCELoss损失函数,损失计算公式如下(注意:YOLOv8中的Cls使用的是BCEWithLogitsLoss,传入的预测值是不需要自己进行Sigmoid,损失内部会自动进行sigmoid,但我这里演示使用的是BCELoss):
假设当前只有两个类别,取出其中三个Grid cell的值,其中(0,0)表示负样本,(0,1)和(1,0)表示正样本,经过Normalize后得到带有权重的真实标签,这里正负样本均计算Loss.
3.2Loss_box
下面是YOLOv8中计算Loss_box的代码:
iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, CIoU=True)loss_iou = ((1.0 - iou) * weight).sum() / target_scores_sum
而主要的部分是Loss_box采用了CIoULoss损失函数,损失计算公式如下:
由前面可知,经过get_targets后的Target_Bbox并没有区分正负样本,因此下一步将利用fg_mask来区分正负样本,从而得到30个正样本。对Box会求两个损失,所以有Target_Bbox1和Target_Bbox2,都需要还原到各自的特征图的比例进行计算(可能这样数字比较小计算比较方便),并且分别采用XYXY格式和LTRB格式表示。
另一方面,Pred_Box1需要通过网络预测的结果(1,64,8400)解码成(1,4,8400)并采用XYXY坐标的格式表示,并且找到对应的30个正样本和Target_Bbox1计算CIoU损失;Pred_Box2则是直接把网络预测的结果(1,64,8400)取出来,然后找到对应的30个正样本,和Target_Bbox1计算DFL损失。
这里再说一下为什么会是30个正样本,因为有3个GT,每个GT取top10个得分最高的grid cell,并且这30个中没有因重复而被过滤掉的Grid cell。
3.3Loss_DFL
下面是YOLOv8中计算Loss_DFL的代码:
loss_dfl = self._df_loss(pred_dist[fg_mask].view(-1, self.reg_max + 1), target_ltrb[fg_mask]) * weightloss_dfl = loss_dfl.sum() / target_scores_sum
而主要的部分是Loss_DFL,损失计算公式如下:
下面演示一个Grid cell正样本LTRB的计算过程:
首先,Pred_Box2即Pred_dist,是一个(120,16)的矩阵,可以理解为(30*4,16),即共有30个正样本,每个正样本需要预测LTRB四个数值,并且这四个数又分别通过0~15来表示。其次,Target_Bbox2即Target,是一个(120,1)的向量,分别对应着30个样本中每个样本的LTRB真实值。最后,由于Target一般不会是整数值,所以需要计算相邻的两个真实值对应的损失。损失函数使用Cross_entropy损失.
前面提到了由于Target一般不会是整数值,所以需要计算相邻的两个真实值对应的损失,那么如何选择呢?这两个损失之间的权重又是怎么样的呢?为了加深理解,又单独举例演示该Grid cell中的Top_loss是怎么计算的:
该正样本需要对GT对应的LTRB中的T为例,该正样本的中心点距离上边框是7.29像素,因为网络预测只能是0~15的整数,那么只能选择7和8这两个相邻的值作为标签值,即yi=7和yi+1=8。接下来是选择这两个损失的权重,遵循一个原则:离得越近权重越大,所以当计算标签为7的时候,选择权重0.71,即yi+1-y;而计算标签为8的时候,选择权重0.21,即y-yi+1。
前面也提到了损失函数使用Cross_entropy损失,和BCE损失有两点区别,第一是把网络预测的每个正样本的LTRB值都需要进行SoftMax(),使得∑value=1,这和预测的时候是一样的;第二是只选取标签值对应的值作为损失,比如在该正样本预测Top的损失计算中,有7和8两个标签值,那么7对应的损失值为1.4676,即-Log(Si),8对应的损失值为1.6825,即-log(Si+1)。最后该正样本的Loss_Top为1.53,该正样本的总损失为(Loss_Left+ Loss_Top+ Loss_Right+ Loss_Bottom)/4.
训练过程的原理会稍微复杂,先整理成这样子,后面我再优化下表达,争取每个人都可以看得懂。
相关文章:

YOLOv8训练流程-原理解析[目标检测理论篇]
关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地学习本章内容,建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客,再次把YOLOv8网络结构图放在这里,方便随时查看。 1.前言 YOLOv8训练…...

实战使用Java代码操作Redis
实战使用Java代码操作Redis 1. 背景说明2. 单连接方式3. 连接池方式1. 背景说明 在工作中, 如果有一批数据需要初始化, 最方便的方法是使用代码操作Redis进行初始化。 Redis提供了多种语言的API交互方式, 这里以Java代码为例进行分析。 使用Java代码操作 Redis 需要借助…...

微信小程序之九宫格抽奖
1.实现效果 2. 实现步骤 话不多说,直接上代码 /**index.wxml*/ <view class"table-list flex fcc fwrap"><block wx:for"{{tableList}}" wx:key"id"><view class"table-item btn fcc {{isTurnOver?:grayscale…...

车牌检测识别功能实现(pyqt)
在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…...

工业派-配置Intel神经计算棒二代(NCS2)
最近两天在工业派ubuntu16.04上配置了Intel神经计算棒二代——Intel Neural Compute Stick,配置过程之艰辛我都不想说了,实在是太折磨人。不过历尽千辛万苦,总算让计算棒可以在工业派ubuntu16.04系统上跑了,还是蛮欣慰的。 注&…...

深度学习中常见的九种交叉验证方法汇总
目录 1. K折交叉验证(K-fold cross-validation) 2. 分层K折交叉验证(Stratified K-fold cross-validation) 3. 时间序列交叉验证(Time Series Split) 4. 留一交叉验证(Leave-One-Out Cross-…...

企业建网站流程
企业建网站是一个复杂而繁琐的过程,需要根据企业的需求和目标进行规划、设计、开发和运营。以下是企业建网站的一般流程,主要包括以下几个步骤: 第一步:需求分析 企业建网站的第一步是进行需求分析。这个过程需要与企业负责人和相…...

Laravel通过phpSpreadsheet合并excel
背景 最近有一个需求,需要将所有excel文件的sheet合并到一个文件。 目前我们处理表格使用的是xlswriter这个插件,对于数据量比较大的话非常好用。...

CTF网络安全大赛web题目:just_sqli
这道题目是bugku的web题目 题目的 描 述: KosenCTF{} 原文链接: CTF网络安全大赛web题目:just_sqli - 红客网-网络安全与渗透技术 题目Web源代码: <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…...

Java入门基础学习笔记27——生成随机数
Random的使用:生成随机数。 随机数应用: 随机点名: 年会抽奖: 猜数字游戏: 密码学。 查看API文档: package cn.ensource.random;import java.util.Random;public class RandomDemo1 {public static voi…...

EasyImage2.0 图床源码
EasyImage2.0 是一个简单图床的源码,它支持以下功能: 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …...

人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析
人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析 2024年5月14日举行的Google I/O大会,犹如一场精彩的科技盛宴,吸引了全球的目光。大会上,谷歌发布了一系列重磅产品和技术更新,展现了…...

下单制造fpc的工艺参数
FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦: 华秋: 背胶: FPC板背胶是可以粘接在光滑表面的一种薄型胶带,可以在狭小以及光滑的表面上用来提供高…...

位拆分与运算
描述 题目描述: 现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12], 现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低) 0: 不输出且只有此时的输入有…...

windows11目标文件夹访问被拒绝-将安全信息应用到以下对象时发生错误
将安全性信息应用到以下对象时发生错误”解决办法 要夺取所有权时,点“安全”添加用户并允许所有权限后点击“应用”, 一直“无法保存对。。。(文件夹名)权限所在的更改。拒绝访问”啊 必须先点击“高级”,把“允许父项…...

C#thread线程传参数更新UI的文本框
C#线程的用法有几个不同的地方: 1、怎么启动线程? 2、是不是需要传入参数? 3、是不是要调用到UI中的控件,并对其进行更新? 关于启动线程,这里一个示例是在form中启动: 定义一个private:sta…...

基于Vue和uni-app的增强型单选ccRadioView组件开发
标题:基于Vue和uni-app的增强单选组件ccRadioView的设计与实现 摘要:本文将详细介绍如何使用Vue和uni-app构建一个简单、好用且通用的单选框组件ccRadioView。该组件提供了单选列表的功能,并支持反向传值,方便开发者快速实现单选…...

信息系统项目管理师0602:项目立项管理 — 历年考题(详细分析与讲解)
点击查看专栏目录 1、2017年11月第31题 题干: 项目经理小李依据当前技术发展趋势和所掌握的技术能否支撑该项目的开发,进行可行性研究。小李进行的可行性研究属于( )。 选项: A. 经济可行性分析 B. 技术可行性分析 C. 运行环境可行性分析 D. 其他方面的可行性分析 答案…...

vue2 中使用audio播放音频
<audio controls ref"audioPlayer" style"width:800px;"><source :src"obj.audioUrl" /></audio> data() {return {obj: {audioUrl: require(../../../../public/audio/video.wav)}}}, 有个地方一定要注意一下. 如果不写req…...

一键追爆款,GPT一键改文 ,绘唐3,绘唐工具
ai画影满足你的制作要求 一键追爆款,GPT一键改文 入口工具 AI推文小说&漫画解说&解压混剪 人物定义,角色定义,lora转换,模型转换,可视化参考满足 一键追爆款 一键挂机生成,效果更精彩ÿ…...

在C#中编写递归函数时,为了避免无限递归
在C#中编写递归函数时,为了避免无限递归(也称为栈溢出),你需要确保递归调用有一个明确的终止条件。这个终止条件通常基于一个或多个参数,当这些参数满足某个特定条件时,递归就会停止并返回结果。 以下是一…...

css层叠样式表——基础css面试题
1、css样式来源有哪些? 內联样式-<a style"color:red"></a>内部样式-<style></style>外部样式-写在独立.css文件中的浏览器用户自定义样式浏览器默认样式 2、样式优先级问题 不同级别下: !important作为style属性…...

数据库-索引结构(B-Tree,B+Tree,Hash,二叉树)
文章目录 索引结构有哪些?二叉树详解?B-Tree详解?BTree详解?Hash详解?本篇小结 更多相关内容可查看 索引结构有哪些? MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包…...

Microsoft Azure AI语音服务
一:文字转语音SDK安装 安装语音 SDK - Azure AI services | Microsoft Learn 二:基于文本转语音Rest API 文本转语音 API 参考 (REST) - 语音服务 - Azure AI services | Microsoft Learn 三:基于文本合成语音 如何基于文本合成语音 - 语…...

【Linux】常用指令、热键与权限管理
一、常用指令 (1)ls 功能:列出指定目录下的所有子目录与文件 用法:ls (选项) (目录或文件名) 常用选项: -a:列出目录下的所有文件,包括隐藏…...

深度学习知识点全面总结
目录 1.深度学习的一些重要知识点 神经网络: 深度学习模型: 深度学习技术: 深度学习应用: 2.深度学习、机器学习、人工智能 3.用python实现简单神经网络模型 4.用于深度学习显卡推荐排序 5.深度学习如何入门? 掌握基础知识: 选择学习资源&…...

【编写控制手机压测的脚本】
编写一个控制手机压测的脚本可以使用Python语言来实现。以下是一个简单的示例脚本: import subprocess import time# 打开app subprocess.call(["adb", "shell", "am", "start", "-n", "com.example.app/.…...

计算机网络-路由策略与路由控制一
到目前为止我们学习了路由与交换基础,路由协议有静态、RIP、OSPF、IS-IS等,但是根据实际组网需求,往往需要实施一些路由策略对路由信息进行过滤、属性设置等操作,通过对路由的控制,可以影响数据流量转发。 因此我们开始…...

在线3D展示软件三维展示软件推荐哪家?
博维数孪、动动三维和sketchfab的在线网页3D展示软件工具选择哪一比较好? 选择在线3D展示软件时,需要考虑几个关键因素,包括软件的功能、用户界面、价格、社区支持和兼容性等。以上几款软件工具都有各自的优势,具体取决于需求和偏…...

VS Code中PlatformIO IDE的安装并开发Arduino
VS Code中PlatformIO IDE的安装并开发Arduino VS Code的安装 略 PlatformIO IDE的安装 PlatformIO IDE是是什么 PlatformIO IDE 是一个基于开源的跨平台集成开发环境(IDE),专门用于嵌入式系统和物联网(IoT)开发。…...