YOLOv8预测流程-原理解析[目标检测理论篇]

        接下来是我最想要分享的内容,梳理了YOLOv8预测的整个流程,以及训练的整个流程。

        关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地介绍本章内容,还是把YOLOv8网络结构图放在这里,方便查看。

1.前言

        前面已经提到了Head层网络是根据类别数来设计生成特定的特征图,那么为什么要将预测box的特征图设计成64个维度?box特征图和预测Cls的特征图又是怎么解码用来预测图片中目标框的位置和类别的?这都是这一节要重点介绍的内容。

         在对box和cls解码之前首先要把三个尺度的特征图展开,box变成(1,64,6400)、(1,64,1600)、(1,64,400),cls变成(1,nc,6400)、(1,nc,1600)、(1,nc,400),然后各自进行合并,从而得到box(1,64,8400),cls(1,nc,8400),一张图片在输入网络后就会得到这两个向量,分别用来预测目标的位置和类别,接下来看一下是如何对这两个向量解码得到预测的结果,并且了解下预测的完整流程。

        预测模块分成了以下三个部分,图像预处理、模型推理以及后处理模块。接下来将按照这三个顺序来展开说明。

2.图像预处理模块

        图像预处理模块:对输入的图片进行预处理,包括letterBox、归一化等操作,这里主要介绍一下letterBox操作:(1)LetterBox的目的就是将原图的尺寸(1280,720)转换成网络输入尺寸(640,640);(2)缩放采用的是等比例缩放方式,即找出长边将其缩放成640,然后按照长边的缩放比例(1280/640=2),同时给短边进行缩放,得到720/2=360,然后把短边补充灰边至640;(3)如图所示经过LetterBox后的图片尺寸并不是640*640而是(640,384),这是为什么呢?这种是改进后的LetterBox,只要保证填充短边是32的倍数即可,这样可以加快推理速度。而至于为什么是32的倍数,我理解的是YOLOv8最大进行了5次下采样,为了保证每个像素都有效并且可以整除,那么输入尺寸必须是32的倍数。

3.推理模块

        推理模块:介绍下Box分支和Cls分支是如何进行解码的。 

        首先来看一下Box分支,由前面可知经过网络后会输出一个(1,64,8400)的向量,64是通过4*reg_max(reg_max=16)计算得到的,4是指预测的中心点到预测边框的左边(l)、上边(t)、右边(r)、下边(b)的距离,reg_max是指预测边框的范围,举个例子就很容易就能理解了。

         当reg_max=16时,在每个预测特征图下(20*20,40*40,80*80),能够预测的最大预测框的大小为30*30,如何理解30*30呢?如下表所示,4*16可以理解成一个4行16列的矩阵,l/t/r/b的值经过softmax后遵循着\sum value=1规定,并且最终预测的结果为Index和对应的value的乘积,比如网络预测的ltrb长度为:

                Left: 5*0.25+6*0.75=5.75 ;Top: 4*0.40+5*0.60=4.60; 

                Right: 5*0.35+6*0.65=5.65;Bottom: 4*0.4+6*0.6=5.20;

        既然如此,那么当Index=15时,value=1,此时预测的l、t、r、b均为最大值,且都为15,也就是说在每个特征图尺度下(20*20,40*40,80*80),能够预测的最大的边框大小均为30*30。比如在20*20尺寸的特征图中,这是专门用来预测大目标尺寸的特征图,而30*30已经超出了特征图20*20的尺寸,说明不会漏掉任何一个大目标。在40*40尺寸的特征图中,30*30能够预测大部分的中等目标(映射回640*640中,目标大小大概为480*480)。在80*80尺寸的特征图中,30*30主要也是用于预测小目标。

         最后,会根据缩放比例,把8400个grid cell预测的边框大小映射回640*640尺度,即输入到网络的尺寸上,并且把预测的LTRB表示方式更改为XYWH方式,即中心点/宽高方式。

        接着是cls分支,Cls分支仅是对所有元素做一个Sigmoid()操作,也就是说每个元素都会独立地经过Sigmoid()函数,从而得到一个(0,1)区间范围内的值。

4.后处理模块

         后处理模块:主要由两部分组成,分别是NMS模块和Scale_boxes.

         NMS模块即非极大值抑制,NMS流程分成了三部分,第一部分主要是通过置信度阈值过滤掉一部分(每个gird cell会有nc个预测类别的值,且经过sigmoid后均在(0,1)之间,取nc个里面的最大值和阈值进行比较),并且将XYWH格式转换为XYXY格式,由此8400个grid cell经过过滤后只剩下29个。第二部分主要通过Cls张量挑出这29个grid cell的类别置信度及其标签下标。第三部分是给box加上一个偏移量通过torchvision自带的NMS来完成标签框的过滤,给不同类别加上一个偏移量是为了在区分不同的类别。最后将得到一个3行6列的矩阵,代表预测出的三个目标及其对应的XYXY格式的Box,类别的置信度,以及类别的下标。

        下面是对于不同类别需要加上一个偏移量的理解,见图知意。 

        Scale_boxes模块是将预测结果映射回到原始输入图片尺寸的,首先将预测的框减去因为latter box产生的偏移量,复原到等比例缩放(640,360)时的每个框的XYXY坐标,然后再将XYXY坐标等比例放大到原始图像(1280,720)的坐标,最后把得到的XYXY坐标信息进行裁剪到指定的图像尺寸范围内,确保边界框不会超出图像的实际尺寸,简而言之就是不让预测框超出原始图像尺寸。

         至此,YOLOv8模块的预测部分就到此结束,下一章节将介绍目标检测任务中训练流程,有了对预测流程的理解,训练流程就比较容易理解了,详细可以见本专栏文章YOLOv8训练流程-原理解析[目标检测理论篇]-CSDN博客。

            

             

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

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

相关文章

DDM-MIMO-FMCW雷达MATLAB仿真

本文在前期TDM和BPM体制的基础上,仿真DDM体制下的调制解调和信号处理测距、测速、测角流程。 TDM和BPM相关可以看这两篇博文TDM(BPM)-MIMO-FMCW雷达仿真-CSDN博客,确定性最大似然(DML)估计测角-CSDN博客TDM(BPM)-MIMO-FMCW雷达仿真…

Numpy求最大、最小值、求累乘、累和

Numpy求最大、最小值 代码举例: ​ 输出结果为: ​ 在这个例子中,我们首先导入了NumPy库,然后创建了一个3x3的矩阵A。接着,我们使用np.max()函数来求矩阵A的最大值,并将结果存储在变量max_value中&#xff…

WordPress原创插件:超链接点击访问统计

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 一般我们都使用第三方统计服务(比如百度统计)来统计网站的访问量,使用此插件可以统计文章的浏览次数,那么,如果想统计网站外…

队列 + 宽搜(BFS)

目录 leetcode题目 一、二叉树的层序遍历 二、二叉树的层序遍历 II 三、N叉树的层序遍历 四、二叉树的锯齿形层序遍历 五、二叉树最大宽度 六、在每个树行中找最大值 七、二叉树的层平均值 八、最大层内元素和 九、二叉树的第K大层和 十、反转二叉树的奇数层 leetco…

即插即用篇 | YOLOv8引入PSAModule | 高效金字塔压缩注意力模块

本改进已集成到 YOLOv8-Magic 框架。 最近研究表明,通过在深度卷积神经网络中嵌入注意力模块可以有效地提高网络性能。在这项工作中,提出了一种新的轻量级且有效的注意力方法,名为金字塔挤压注意力(PSA)模块。通过在ResNet的瓶颈块中用PSA模块替换3x3卷积,得到了一种新的…

Python:通过接口获取公众号的文章列表(但是开发文档没有这个接口)

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天: 自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口实现 1.自定义控件: 创建新的QT控件类,然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数&…

静态IP地址怎么维护网络稳定?

在数字化日益深入的今天,网络已经成为我们生活、工作和学习中不可或缺的一部分。而在网络世界中,IP地址扮演着至关重要的角色。其中,静态IP地址以其独特的稳定性和安全性,成为了众多企业和个人用户的首选。 一、静态IP地址的基本概…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

后端常用技能:基于easy-poi实现excel一对多、多对多导入导出【附带源码】

0. 引言 在业务系统开发中,我们经常遇到excel导入导出的业务场景,普通的excel导入导出我们可以利用 apache poi、jxl以及阿里开源的easyexcel来实现,特别easyexcel更是将excel的导入导出极大简化,但是对于一些负载的表格形式&…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则(SRP) 三、合成|聚合复用原则(CARP) 四、开放-封闭原则 五、迪米特法则(LoD) 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

力扣70 爬楼梯 C语言 动态规划 递归

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…