YOLO v8:目标检测的最新王者

本文来自公众号“AI大道理”

 ——————

Yolov8是Yolo系列模型的最新王者,各种指标全面超越现有目标检测模型。

Yolov8借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,全面改进了Yolov5模型结构,同时保持了Yolov5工程化简洁易用的优势。
 

1、YOLOV8的改进

1)Backbone

2)Neck

3)Head

4)Loss计算

5)标签匹配策略

2、Backbone

YOLOv8的backbone使用C2f模块代替C3模块。

C2f模块借鉴了YOLOv7中的ELAN思想,通过并行更多的梯度流分支,目的是为了在保证轻量化的同时获得更加丰富的梯度流信息,额外还增加了一个Split操作。

结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作。

C2f中每个BottleNeck的输入Tensor的通道数channel都只是上一级的0.5倍,因此计算量明显降低。从另一方面讲,梯度流的增加,也能够明显提升收敛速度和收敛效果。

yolov8的C2f:

具体改进如下:

  • 第一个卷积层的Kernel size从6×6改为3x3。

  • 所有的C3模块改为C2f模块,多了更多的跳层连接和额外Split操作。

  • Block数由C3模块3-6-9-3改为C2f模块的3-6-6-3。

3、Neck

Neck保留了PAN思想,删除了上采样阶段的卷积结构,将 C3 模块换成 C2f。

SPPF对比SPP,两者的作用是一样的,但SPPF的速度更高。

4、Head

解耦头:

Head部分变化最大,从原先的耦合头变成了解耦头,并且从 YOLOv5 的 Anchor-Based 变成了 Anchor-Free。

可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。

YOLOX的Head中也使用了解耦头和Anchor-free策略。在目标检测中,分类与回归任务的冲突是一种常见问题,因此,分类与定位头的解耦已被广泛应用到单阶段、两阶段检测中。YOLOX的作者分析发现:检测头耦合会影响模型性能,采用解耦头替换YOLO的检测头可以显著改善模型收敛速度。

Anchor-free:

Anchor-based和Anchor-free的区别就在于训练过程是否设置了先验框,Anchor-based策略非常依赖于好的先验框设计,对于不同的任务以及形变较大(高宽比变化大)的目标,可能都需要人为地根据经验对先验框超参数进行设计和调节。Anchor-free相对于就简单很多,但操作简单的同时可能会带来召回率性能欠佳、对重叠目标的检测效果一般等问题(比如YOLOv1)。

5、Loss 计算

Loss 计算包括 2 个分支:分类和回归分支,没有了之前的 objectness 分支。

yolov8采用VFL Loss作为分类损失,同时使用DFL Loss 和CIOU Loss作为回归损失。

VFL Loss(Varifocal Loss)的灵感来自Focal Loss。Focal Loss的设计是为了解决密集目标检测器训练中前景类和背景类之间极度不平衡的问题。

Focal Loss:

其中,1为ground-truth类,表示前景类的预测概率。如公式所示,调制因子(γ为前景类和γ为背景类)可以减少简单样例的损失贡献,相对增加误分类样例的重要性。

Focal Loss处理的正负样本是对称的,VFL Loss则是提出了非对称的加权操作。

VFL Loss:

其中,预测值为目标分数。对于前景点将其ground truth类别分数设定为生成的边界框和它的ground truth(gt_IoU)之间的IoU,否则为0;而对于背景点,所有类的分数为0。

如公式所示,通过利用γ的因子缩放损失,VFL Loss仅减少了负例(q=0)的损失贡献,而不以同样的方式降低正例(q>0)的权重。这是因为正样本相对于负样本是非常罕见的,应该保留它们的学习信息。

DFL Loss:

Distribution Focal Loss损失的提出主要是为了解决bbox的表示不够灵活(inflexible representation)问题。传统目标检测,尤其是复杂场景中,目标物体的真实边界框的定义其实是无法精确给出的(包括标注人的主观倾向,或是遮挡、模糊等造成的边界歧义及不确定性)。比如水中的帆板边界、被遮挡的大象边界,其实都很难去界定一个精确的位置。

传统的回归方法直接使预测值向一个离散的确定值(标签位置y )进行逼近。针对上方所述的场景,回归一个分布范围(下方右图)相比于逼近一个离散值更符合事实。DFL损失就是基于这样的思想,将框的位置建模成一个general distribution,让网络能够快速地聚焦于标签位置y 附近范围的位置分布。

但是如果分布过于随意,网络学习的效率可能不会高,因为一个积分目标可能对应无穷多种分布模式。

考虑到真实的分布通常不会距离标注的位置太远,因此Distribution Focal Loss选择优化标签y附近左右两个位置(yi与yi+1)的概率,使得网络分布聚焦到标签值附近。

6、标签匹配策略

YOLOv5采用的依然是静态分配策略,考虑到动态分配策略的优异性。

Yolov8算法中直接引用了TOOD中的Task-Aligned Assigner正负样本分配策略。

TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。

其中,s是标注类别对应的预测分值,u是预测框和GT Box的IoU,两者相乘即可衡量对齐程度(Task-Alignment)。α和β是权重超参数。

t可以同时控制分类得分和IoU的优化来实现Task-Alignment,从而引导网络动态关注高质量的anchor。当类别分值越高且IoU越高时,t的值就越接近于1。

具体执行步骤如下:

  • 基于分类得分和预测框与GT的IoU,加权得到一个关联分类以及回归的对齐分数alignment_metrics。

  • 计算anchor的中心点是否在当前GT框内,只有在当前GT内的anchor才能作为正样本。

  • 满足2的前提下,基于alignment_metrics选取topK大的作为正样本,其余作为负样本进行训练。

7、总结

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

 

—————————————————————

投稿吧   | 留言吧

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

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

相关文章

为什么要用scrapy爬虫库?而不是纯python进行爬虫?

为什么要用scrapy爬虫库?而不是纯python进行爬虫? Scrapy的优点Scrapy节省的工作使用纯Python编写爬虫的不足 Scrapy是一个使用Python编写的开源和协作的web爬虫框架,它被设计用于爬取网页数据并从中提取结构化数据。Scrapy的强大之处在于其广…

IBFKJ-299 8AI/AO,DI/DO开关量模拟量同时数据采集

产品特点: ● DC12-30V宽压供电; ● RS485通讯光电隔离,输入光耦隔离,继电器输出触点隔离; ●通讯接口支持RS232、RS485; ●支持标准Modbus RTU/TCP/ASCII协议 ●具有闪开、闪断功能,可以在…

C#操作像素替换图片中的指定颜色

待处理的图片,其特征是包含有限数量颜色,不同的颜色相互交叉使用,相同颜色并未完全连贯,需要将图片中的指定颜色替换为另一颜色。虽然很多图片处理工具都支持类似操作,最后还是自己动手编写简单的处理程序。   程序的…

8-图像放大

其实,就是开辟一个zoomwidth,zoomheight的内存,再分别赋值即可。 void CDib::Maginify(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE l…

当word表格复制到excel出现分行问题的解决小技巧

在word文档中将^p(回车符号)替换成其他,比如 全选复制粘贴到excel中后分行问题已经解决,将换回原本的回车即可,ctrshiftj(回车)

新零售SaaS架构:什么是线上商城系统?

零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者。因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题。 缺乏忠实顾客,客户基础不稳,往往是…

Git提交代码进入coding

安装Git后建一个文件在文件里右键点击Git Bash使用命令配置用户名和邮箱git config --global user.name "你的用户名"和git config --global user.email "你的邮箱"命令git init来初始化,自动将当前仓库设置为master创建一个项目(一…

Linux - 安装 nacos(详细教程)

目录 一、简介二、安装前准备三、下载与安装四、基本配置五、单机模式 一、简介 官网:https://nacos.io/ GitHub:https://github.com/alibaba/nacos Nacos 是阿里巴巴推出的一个新开源项目,它主要是一个更易于构建云原生应用的动态服务发现…

什么是接口

接口定义 接口的定义分为接口的声明和接口体 接口构成 接口声明: ① 声明:关键字interface ② 格式:interfac接口名字 接口体 ① 两部分:常量和方法定义。 ② 内容:仅声明抽象方法, 不实现方法(没有方法体…

如何实现幂等性,java多线程面试题及答案整理

订单创建接口,第一次调用超时了,然后调用方重试了一次。是否会多创建一笔订单? 订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次。是否会多扣一次库存? 当这笔订单开始支…

【单调栈】代码随想录算法训练营第五十九天 |503.下一个更大元素II, 42. 接雨水 (待补充)

503.下一个更大元素II 1、题目链接:. - 力扣(LeetCode) 2、文章讲解:代码随想录 3、题目: 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个…

使用R语言计算模拟二项分布

二项分布理论 二项分布是一种离散概率分布,描述了在n次独立重复的伯努利试验中成功的次数的概率分布。其中,每次试验的结果只有两个可能:成功或失败,且每次试验的成功概率p是相同的。 具体来说,如果随机变量X表示在n次…

婚恋源码-婚恋交友系统-源码婚恋交友系统-APP小程序H5公众号-源码交付-支持二开!

本婚恋系统是一款专门为单身人士打造的相亲交友软件,所有用户都必须要身份认证,还有职业认证、学历认证等等全方位认证。智能匹配是本婚恋系统的核心功能,当我们完善好个人资料通过审核,系统会根据个人信息进行匹配,自…

3.1_8 两级页表

文章目录 3.1_8 两级页表(一)单级页表存在的问题(二)如何解决单级页表的问题?(三)两级页表的原理、地址结构(四)如何实现地址变换(五)需要注意的几…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

Java垃圾收集器工作原理、优缺点以及使用注意事项

0.前言 Java 垃圾收集器 (GC) 是自动内存管理组件&#xff0c;负责回收不再使用的对象占用的内存。它们在管理 Java 的动态内存分配方面发挥着至关重要的作用&#xff0c;使开发人员能够专注于应用程序逻辑&#xff0c;而无需手动释放内存。JVM运行时需要GC来防止内存泄漏、优…

YOLOv5 | 涨点复现!YOLOv5添加BiFPN有效提升目标检测精度

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 介绍&#xff1a; BiFPN 代码实现 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及…

苍穹外卖-后端多模块项目搭建

由于视频中给出了项目一些基础代码,因此自己从0开始搭建一个。 文末附pom.xml。 新建项目并连接github 首先新建项目,项目名称为sky-take-out-1,如下图:父模块任何环境都不要,只需要指定springboot版本。 选定一些依赖:例如Lombok(自动注解)、SpringWeb、MyBatis Fra…

Java数据结构-二叉树

文章目录 前言一、树型结构1.1概念1.2 知识点1.3 树的表示形式1.4 树的应用 二、二叉树2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作2.5.1 二叉树的遍历2.5.2 二叉树的基本操作 前言 对学习的二叉树的知识进行总结。 一、树型结构 1.1…

学习JAVA的第二十一天(基础)

目录 多线程 线程&#xff1a; 进程&#xff1a; 并发&#xff1a; 并行&#xff1a; 多线程的实现方式&#xff1a; Thread类 Runnable接口 Callable接口和Future接口 成员方法 线程的生命周期 线程的安全问题 前言&#xff1a;学习JAVA的第二十天&…