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]) * weight

loss_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.

        训练过程的原理会稍微复杂,先整理成这样子,后面我再优化下表达,争取每个人都可以看得懂。

         

       

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式光纤测温DTS的测温范围是多少?

分布式光纤测温DTS的测温范围不仅仅取决于光缆的感温能力,还受到多种复杂因素的影响。尽管高温光缆可以耐高温,低温光缆可以耐低温,甚至镀金光缆能够耐受高达700摄氏度的极高温度,然而,这些因素并不能完全解释测温范围…

平航杯复现

简单介绍及前期操作 esxi镜像挂载是一个新的创新点 就根据官方的wp进行挂载就可以了,后面差不多常规的服务器取证操作,然后服务器和计算机,u盘取证都有点联系,还是需要队友配合好一点 配置网段我的建议是把本机的配置改一下&am…

[windows系统安装/重装系统][step-1]U盘启动盘制作,微软官方纯净系统镜像下载

前言 U盘至少8GB吧我这刚好有个空闲的U盘8GB容量,制作启动盘且放入一个最新win10官方镜像足够 不是天天装系统,至少USB2.0 (我用的2.0的一个闲置U盘)即可,当然平时传资料什么的3.0会快些 U盘启动盘仅需要制作一次, U盘启动盘制…

python能够干什么?

python有哪些用途? Python是一种高级编程语言,它被广泛用于各种不同的领域。以下是Python的一些常见用途: 网络应用开发:Python可以用于编写Web应用程序、API、爬虫、网络服务器等。数据科学和机器学习:Python拥有许…

《intel开发手册卷1》学习笔记1

1、操作模式 IA-32架构支持三种基本操作模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和体系结构功能是可访问的: 1)保护模式:该模式是处理器的自然状态。保护模式的功能之一是能够在受保护的多任务环境中直接执行“实地址模式”80…

flask和django的对比

文章目录 1. 简介2. 安装和设置3. 路由和视图4. ORM5. 管理界面6. 社区和文档7. 性能结论 当涉及构建 Web 应用程序时,Flask 和 Django 是两个最受欢迎的 Python Web 框架之一。它们都提供了强大的工具和功能,但在某些方面却有所不同。本文将对 Flask 和…

链表的经典面试题(数据结构详解)+顺序表和链表之间区别+计算机存储体系

前言 首先这里已经正式步入数据结构的知识,之前我们已经讲解了链表的使用,接下来我们需要的就是大量的练习,熟练掌握数据结构。下面的题型我们选择的都是链表的经典题型,面试题型,包含快慢指针,数形结合&am…

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…

gocator导出图片

想用3D扫描后的图片,但是系统自带的导出方法很麻烦,所以考虑通过sdk导出 首先需要设置点云亮度 这里是导出图片的关键代码 case GoDataMessageType.SurfaceIntensity: { Debug.WriteLine("SurfaceIntensity "); GoSu…

AI换脸原理(2)——人脸检测参考文献S3FD:源码解析

1 介绍 S3FD是一个实时人脸检测器,这篇论文的主要思想是试图解决一个常见的问题,即基于anchor(锚点)的检测器随着人脸变小而急剧恶化。 基于锚点的目标检测方法是通过对一系列预设锚点进行分类和回归来检测目标的,这些锚点是通过在图像上有规律地平铺一组不同尺度和宽高比…

凡尔码安全巡检卡替代传统纸质记录卡

建筑行业、物业管理、医院等行业的安全巡检的记录方式通常以:1、纸质记录:巡检人员使用纸质巡检表格,手动填写巡检时间、巡检区域、巡检发现的问题以及处理情况。这种方式简单直接,但可能存在信息记录不完整、易丢失等问题。 2、电…

rust打包编译为mac或者linux可执行文件,发送到别的电脑不能运行

如果使用rust项目编译为linux或者mac可执行文件,发送到别的电脑之后,不可以直接运行,而是显示一个空白文件,双击也没有反应,其实这是因为这个文件没有可执行权限导致的,添加可执行权限就可以了:…

用户至上!探索7种常用的用户体验研究方法

用户体验研究是产品开放过程中的重要组成部分,优秀的产品设计与高质量的用户体验是不可分割的。对于产品开发,选择合适的用户体验研究方法在很大程度上决定了产品的使用效果。本文全面阐述了用户体验研究、用户体验研究的重要性和用户体验研究方法&#…

Linux进程间通信:system V共享内存

目录 一、什么是共享内存 1.1创建共享内存 1.2释放共享内存 1.2.1shmctl 1.2.2shmat 1.2.3 shmdt 二、共享内存的实现及使用 2.1ShmClient 2.2Shm_Server 2.3Fifo.hpp 2.4Comm.hpp 一、什么是共享内存 标准系统V也叫system V的本地通信方式一般有三种: …

行业新应用:电机驱动将成为机器人的动力核心

电机已经遍布当今社会人们生活的方方面面,不仅应用范围越来越广,更新换代的速度也日益加快。按照工作电源分类,可以将它划分为直流电机和交流电机两大类型。直流电机中,按照线圈类型分类,又可以分为有铁芯的电机、空心…

Redis 哨兵机制

文章目录 哨兵机制概念相关知识铺垫主从复制缺陷哨兵工作流程选举具体流程理解注意事项 哨兵机制概念 先抽象的理解,哨兵就像是监工,节点不干活了,就要有行动了。 Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务&#…

视频高效批量剪辑,一站式按顺序合并视频并添加精彩片头片尾,瞬间提升视频品质

视频已成为传递信息、展示创意的最佳方式。但你是否也曾因为繁琐的剪辑工作而头痛不已?别担心,今天我们就来聊聊如何轻松实现视频的高效批量剪辑,让你的作品按顺序完美合并,同时增添上令人眼前一亮的片头片尾,让你的宣…

【Python图像分类系列】建立CNN模型实现猫狗图像分类(案例+源码)

这是我的第275篇原创文章。 一、引言 基于CNN卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含: 数据创建和预处理 神经网络模型搭建 神经网络模型的训练和拟合 文中使用的深度学习框架是Keras。部分数据展示: 猫&#xf…

65-CPLD电路设计(安路为例)

视频链接 CPLD电路设计(安路为例)01_哔哩哔哩_bilibili CPLD电路设计(以安路为例) 浅谈板级电源设计的三种方法_哔哩哔哩_bilibili 参考【浅谈板级电源设计的三种方法】 FPGA板级硬件实战S1~7课 实战Power2-电…

【linux-IMX6ULL配置GPIO通用流程-以及时钟配置】

目录 1. GPIO模式控制流程1.1 LED、蜂鸣器、按键1.2 GPIO控制流程 2. 标准库的简要分析及实现:2.1 问题引入:2.2 代码实现: 3. 时钟配置总结:3.1 时钟树概要:3.2 IMX6ULL时钟概要及时钟树:3.3 IMX6ULL时钟配…