关于yolov8的一些理解

news2025/1/16 5:02:20

文章目录

  • 1.前言
  • 2.创新点及工作
  • 3. 网络结构
    • 3.1 BackBone
      • 3.1.1 C2F
      • 3.1.2 结构微调
      • 3.1.2 SPPF
    • 3.2 Neck
    • 3.3 Head
  • 4.正样本匹配策略
    • 4.1 静态分配策略&动态分配策略
    • 4.2 TaskAlignedAssigner
  • 5.损失函数
    • 5.1 概述
    • 5.2 Distribution Focal Loss
  • 6.总结

1.前言

YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本。是一款强大、灵活的目标检测和图像分割工具,它提供了最新的 SOTA 技术。
在这里插入图片描述
Github: yolov8

2.创新点及工作

  1. 提供了一个全新的SOTA模型。基于缩放系数也提供了N/S/M/L/X不同尺度的模型,以满足不同部署平台和应用场景的需求;
  2. 网络结构上引入C2F和SPPF模块,并对不同尺度的模型进行了精心微调,提升网络特征提取能力及模型性能的同时,平衡模型的推理速度;
  3. 采用Anchor-Free代替Anchor-Based,对网络输出头进行解耦,分离类别预测和目标框的回归,同时去掉置信度分支;
  4. 采用TaskAlignedAssigner 动态正样本分配策略,提高样本的生成质量
  5. 引入了 Distribution Focal Loss用于目标框的回归。

3. 网络结构

在这里插入图片描述

3.1 BackBone

3.1.1 C2F

网络结构优化的一种方法:替换基本组件;

  • 参考了YOLOv5的C3模块以及YOLOv7的ELAN的模块进行的设计,让YOLOv8可以在保证轻量化的同时,通过引入更多的分支跨层连接可以获得更加丰富的梯度流信息。
  • 相较于YOLOv7的ELAN模块的设计,C2F模块在输入/输出通道上没有做什么额外工作,在一定程度并不太符合ShuffleNet的一些设计准则:要想使卷积推理速度达到最快,输入通道应与输出通道保持一致。
  • C2F模块中存在 Split 等操作对特定硬件部署没有之前那么友好了
    在这里插入图片描述在这里插入图片描述

3.1.2 结构微调

对不同尺度模型调整了通道数和模型的深度,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,综合考虑模型的精度和推理速度
在这里插入图片描述

  • Yolov5中C3模块的堆叠遵循着3/6/9/3的配置,而在YOLOv8中,C2F的配置则是3/6/6/3的配置,其中的9被减小到了6,以压缩模型的规模
  • 对于较轻量的YOLOv8-N和YOLOv8-S,基本通道数遵循128->256->512->1024的变化规律,即乘以各自的width参数即可。 但是,对于较大的M/L/X,最后的1024则分别变成了768,512和512,如上图红框所示,C5尺度的通道数是有变化的。相当于加入一个参数ratio,简记r,基础通道数为512,那么从YOLOv8-N到YOLOv8-X,就一共有width(w)、depth(d)和ratio® 三组可调控的参数:
    在这里插入图片描述
  • 这种人为调控参数的目的在于提升模型精度的同时,控制计算量的大小,以实现和其它算法相比,达到SOTA效果;但这种强行调整的方式,人为雕琢的痕迹过重,网络结构的调整没有那么”优雅”。

3.1.2 SPPF

对比spp,将简单的并行max pooling 改为串行+并行的方式。对比如下(左边是SPP,右边是SPPF)
在这里插入图片描述

3.2 Neck

NECK部分和yolov5结构基本一致,区别主要有两点

  • C3模块更换为C2F模块
  • 去掉了上采样前用于降维的 1×1 卷积。
    在这里插入图片描述

3.3 Head

  • Anchor_base 调整为 Anchor_free
    • 个人认为anchor box在一定程度上能够起到先验的作用,但其尺寸一般基于数据集统计分析得到,在一定程度上依赖于数据集本身的分布;
    • 同时anchor的引入会带来额外的参数量,整体来说anchor_free还是较为简单明了;
  • 参考yolox操作,对预测结果进行解耦 :单独分支预测分类和定位
  • 去掉了置信度分支
  • 回归的内容是ltrb四个值(距离匹配到的anchor点的距离值),这里的regmax在后面进行解释
    在这里插入图片描述
  • 需要注意的是解耦头的类别分支和回归分支的通道数可能是不相等的,YOLOv8认为二者表征了两种不同的特征,应该不一样。因此,对于类别分支,YOLOv8将其通道数设置为 c c l s = m a x ( c 0 3 , N C ) c_{cls} = max(c_0^3,N_C) ccls=max(c03,NC) 回归分支的通道数设置为 c r e g = m a x ( 16 , c 0 3 / 4 , 4 ∗ r e g m a x ) c_{reg} = max(16,c_0^3/4,4*regmax) creg=max(16,c03/4,4regmax) 以coco数据集(类别80)为例,第一层解耦头的通道数配置为
    在这里插入图片描述

4.正样本匹配策略

4.1 静态分配策略&动态分配策略

  • 在目标检测中,正负样本分配策略关系到模型训练精度的一个重要因素,实际应用中静态分配策略和动态分配策略是两种常见的正负样本分配策略。
  • 静态分配策略通常是设置一些固定阈值参数,如iou、长宽比等。其分配策略在训练前就已经设置好且不会随着网络的训练而发生调整;这些超参数和分配策略一般是基于数据集的统计结果和实际经验得出;
  • 动态分配策略生成的正负样本往往和模型的训练相关联,随着训练的逐步进行,模型的能力逐渐增强,可以让模型更多的关注于高质量的正样本上。整体而言,动态分配策略可以在训练过程中进行调整,能够更好的适用不同的数据集和场景;
  • 训练前期,模型的能力较弱,生成的正负样本可能存在一些问题不利于网络的学习和收敛。所以在实际训练过程中,可以在采用前期使用静态分配策略,中后期使用动态分配策略的组合方法;也可以利于静态分配策略进行样本初筛,然后使用动态分配策略进行细筛的方法生成正负样本;

4.2 TaskAlignedAssigner

正负样本分配策略上目标检测领域的一个常见的优化方向,典型的如 YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet DynamicSoftLabelAssigner,这类 Assigner 大都是动态分配策略,而 YOLOv5 采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。
TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本
在这里插入图片描述

  • α 和 β 为权重超参,s 是标注类别对应的预测分值,u 是预测框和gt 框的iou,两者相乘就可以衡量对齐程度(Task-Alignment)
  • t 可以同时控制分类得分和IoU 的优化来实现 Task-Alignment,可以引导网络动态的关注于高质量的Anchor。

具体执行步骤

  • 基于分类得分和预测框与GT的IoU加权得到一个关联分类以及回归的对齐分数alignment_metrics;
  • 计算anchor中心点是否在当前GT框内,is_in_point:只有在当前GT内的anchor才能作为正样本;
  • 满足条件2的前提下,基于 alignment_metrics 选取 topK 大的作为正样本,其余作为负样本进行训练;
# 1. 基于分类分数与回归的 IoU 计算对齐分数 alignment_metrics
alignment_metrics = bbox_scores.pow(self.alpha) * overlaps.pow(
            self.beta)
# 2. 保证中心点在 GT 内部的 mask
is_in_gts = select_candidates_in_gts(priors, gt_bboxes)
# 3. 选取 TopK 大的对齐分数的样本
topk_metric = self.select_topk_candidates(
            alignment_metrics * is_in_gts,
            topk_mask=pad_bbox_flag.repeat([1, 1, self.topk]).bool())

5.损失函数

5.1 概述

  • Loss 计算包括 2 个分支: 分类和回归分支,没有了之前的 objectness 分支
  • 分类分支依然采用 BCE Loss
  • 回归分支使用了 Distribution Focal Loss(DFL Reg_max默认为16)+ CIoU Loss。
  • 3 个Loss 采用一定权重比例加权即可

5.2 Distribution Focal Loss

常规的坐标点回归方式是一种狄拉克分布,即认为某一点的概率无穷大,而其他点的概率为0(概率密度是一条尖锐的竖线),这种方式认为标签是绝对正确的;在实际应用中,对于遮挡、模糊场景下目标框的边界存在一定的不确定性,如滑板左侧边界和大象右侧边界;而常规的回归方式不能解决这种不确定的问题,所以这种情况下学习边界一个分布更为合理;
在这里插入图片描述
在这里插入图片描述
但如果分布过于任意,网络学习的效率可能会不高,原因是一个积分目标可能对应了无穷多种分布模式。考虑到真实的分布通常不会距离标注的位置太远,因此优化与标签y最接近的一左一右两个位置的概率,从而让网络快速地聚焦到目标位置的邻近区域的分布中去较为合理;也就是说网络学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。
在这里插入图片描述
在这里插入图片描述
具体执行

  • 网络此时回归的不是4个坐标点的信息,而是ltrb四个值(距离匹配到的anchor点的距离值)
  • 其输出的channel为4 *regmax,regmax代表目标边界在当前特征图下距离anchor点的最大偏移量,默认为16
  • 训练阶段:以左侧边界left为例进行说明,现将标签转换为ltrb形式 y = ( l e f t − 匹配到的 a n c h o r 中心点 x 坐标 ) / 当前的下采样倍数 y= (left-匹配到的anchor中心点x坐标)/当前的下采样倍数 y=(left匹配到的anchor中心点x坐标)/当前的下采样倍数
    • 假设计算得到的结果为3.2,则左右两侧的值为yi = 3, y(i+1)=4
  • 推理阶段:先对网络输出的16个格子进行softmax操作转换为概率值,随后对结果进行积分(对离散变量就是累积求和) ,求得坐标偏移量,最后乘以下采样的倍数加上匹配到的anchor中心点坐标
def distribution_focal_loss(pred, label):
    r"""
    参数:
        pred (torch.Tensor): 预测的bbox的分布(未经softmax)(N, n+1),
         n是y的最大值对应的下标,配置里是reg_max,具体见论文.
        label (torch.Tensor): anchor中心到gt bbox四条边的距离标签(N,).

    返回值:
        torch.Tensor: 损失张量 (N,).
    """
    #将label 划分到 dis_left 和 dis_right 两个整数之间
    dis_left = label.long()
    dis_right = dis_left + 1
    # label 与其右边界的差值
    weight_left = dis_right.float() - label
    # label 与其左边界的差值
    weight_right = label - dis_left.float()
    # 求交叉熵损失乘权重
    loss = F.cross_entropy(pred, dis_left, reduction='none') * weight_left \
        + F.cross_entropy(pred, dis_right, reduction='none') * weight_right
    return loss

几点理解

  • DFL通过将bbox的位置建模为一般分布,希望网络能够快速地聚焦到标注位置附近的数值,使得它们概率尽可能大;
  • 这种方式提供了更多信息和精确的估计:额外提供了一个目标框不确定性程度的指标(分布越陡峭,证明越确定,否则越不确定);
  • 以reg-max=16, 输出的是16个位置的概率,而每一个位置对应的是在当前下采样特征图上目标各边缘距离匹配到的anchor中心点的偏差;因此最大偏差为16*32=512,该值需要大于输入分辨率的一半,如果没有大于,需要增大reg-max;
    -更多关于的Distribution Focal Loss说明,请参考大白话 Generalized Focal Loss

6.总结

  • Yolov8是v5团队的又一力作,从网络结构、正样本匹配策略、损失函数等角度对算法进行了优化,这也是yolo系列算法一直以来的优化路径。
  • Yolov8目前阶段实现了新的 SOTA,同时相对于Yolov5来说整体优化效果很明显,也就意味着v5可能会慢慢退出历史舞台;但相对于Yolov7而言,其实优化效果不是很明显;
  • 结合Yolox和Yolov8的一系列更新来看,目标检测的趋势更多的是朝着Anchor_free和Dynamic label assignment分配的方向发展,目前这两个方向都有较多的研究,就看未来是否有质的突破。

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

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

相关文章

在Eclipse中安装配置JDK11

下载安装包 从请官方下载,地址为:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html,选择相应的版本下载即可。注意,现在需要注册才能下载。 ** ** 安装JDK11 使用下载的安装包进行安装,双击可…

Hyperledger Fabric 2.x 环境搭建

一、说明 区块链网络的核心是分布式账本,在这个账本中记录了网络中发生的所有交易信息。 Hyperledger Fabric 是一个是开源的,企业级的,带权限的分布式账本解决方案的平台。Hyperledger Fabric 由模块化架构支撑,并具备极佳的保…

拉格朗日粒子扩散模式FLEXPART

为了高效、精准地治理区域大气污染,需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹,来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算…

Pytorch基础 - 7. torch.transpose() 和 torch.permute()

目录 1. torch.transpose(dim0, dim1) 2. torch.permute(dims) 3. 在转置函数之后使用view() PyTorch中使用torch.transpose() 和 torch.permute()可对张量进行维度的转置,具体内容如下: 1. torch.transpose(dim0, dim1) 参数: 需要转置的两个维度…

React native RN 开发实例

多入口加载方式 React Native 混合开发多入口加载方式 - 知乎 initialProperties 官方文档:React Navigation moduleName 案例:GitHub - hcn1519/ReactNative-iOS-Example React Native 混合开发多入口加载方式 - 知乎 项目结构 参考&#xff1…

传奇修改怪物属性教程:传奇服务端架设后怪物不主动攻击是什么原因?

当你架设好传奇服务端后怪物不主动攻击是什么原因呢?今天飞飞来和你分享 1、检查是否进入了管理员隐藏模式 如果是你设置了GM号进入了隐身模式,登录游戏就会有登录脚本默认管理上线检测,怪物看到你是GM管理员自然不会攻击你的,你…

(顶级理解)为什么Vue中的v-if 和v-for不建议一起用?

目录 1.背景 2.原因 3.通俗案例 4.解决方案 5.扩展(强烈看下) 1.背景 我们都知道v-if和v-for是vue开发工程中十分常用的方法 2.原因 当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。这意味着 v-if 将分别重复运行于 每…

jQuery 基础入门速成下篇

jQuery高级 事件冒泡 什么是事件冒泡? 在一个对象上触发某类事件,此对象上定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或事件返回true,那么这个事件会向这个对象的父级对象传…

门禁系统中人脸检测技术的原理剖析和使用教程

引言 人脸检测 API 是一种基于深度学习技术的图像处理API,可以快速地检测出一张图片中的人脸,并返回人脸的位置和关键点坐标,在人脸识别系统、人脸情绪识别等多种场景下都有极大的应用。 本文将从人脸检测的发展历程、原理、特点等角度出发…

第五章 RNN

目录 5.1 概率和语言模型5.1.1 概率视角下的 word2vec5.1.2 语言模型5.1.3 将CBOW模型用作语言模型? 5.2 RNN5.2.1 循环的神经网络5.2.2 展开循环5.2.3 Backpropagation Through Time5.2.4 Truncated BPTT5.2.5 Truncated BPTT的mini-batch学习 5.3 RNN的实现5.3.1 …

【博云+智领云】携手云原生大数据领域,开展深度合作

近日,博云与LinkTimeCloud智领云达成战略合作伙伴关系,基于此前坚实合作基础,全面拓宽合作广度与深度,共同推出基于Kubernetes的企业级容器云云原生大数据技术融合的新型数字化IT底座,并且在某国家级创新中心首次落地。…

高精度的乘除法(C++实现)

前言:我们都熟知高精度的加减法可以用字符串来模拟实现,其实乘除法的高精度计算也和加减法类似却也略有不同,下面我们一起来看一下高精度的乘除法的模拟实现,希望可以帮助到大家。 目录 1.高精度乘法的实现 1.1原理重点难点解析…

一图看懂 pyexcel 模块:提供统一 API用来读写操作 Excel 文件的库, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 pyexcel 模块:提供统一 API用来读写操作 Excel 文件的库, 资料整理笔记(大全) 摘要模块图类关系图模块全展开【pyexcel】统计常量模块1 …

ABAP:自定义搜索帮助:可参考标准函数F4IF_SHLP_EXIT_EXAMPLE

当我们在自定义选择屏幕中, 需要写入我们自定义的搜索帮助的时候,可以通过预定义函数来实现: 实例说明: 第一步:创建搜索帮助SE11分销渠道(Z_VTWEG) 1.选择基本索引帮助: 2.选择参考表,因为这…

Java 基础——HashMap 底层数据结构与源码分析

目录 1.HashMap 简介2.HashMap 底层数据结构2.2.JDK1.8 之前2.3.JDK1.8 及以后 3.常量定义3.1.默认初始化容量3.2.最大容量3.3.负载因子3.4.阈值 4.HashMap 源码分析4.1.构造函数4.2.Node<K, V>4.2.put(K key, V value)流程源码 4.3.get(Object key)流程源码 4.4.resize(…

java使用阿里云oss上传文件

java使用阿里云oss上传文件 1、oss 是什么&#xff1f; OSS是阿里云对象存储服务&#xff08;Object Storage Service&#xff09;的一个简称&#xff0c;它是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 即开即用、无限大空间的存储集群。相较传统建服务器存储而…

逻辑回归模型预测

范例题目&#xff1a; 建立一个逻辑回归模型预测一个学生是否通过研究生入学考试。N表示训练集中学生个数&#xff0c;Score1、Score2、 Score3、 Score4是N维数组&#xff0c;分别表示N个学生研究生初试、专业课复试、英语面试成绩、专业课面试成绩。Admitted是N维{0,1}数组&a…

RabbitMQ编程模型

RabbitMQ基础概念 RabbitMQ是基于AMQP协议开发的一个MQ产品。 虚拟主机 virtual host RabbitMQ出于服务器复用的想法&#xff0c;可以在一个RabbitMQ集群中划分出多个虚拟主机&#xff0c;每一个虚拟主机都有AMQP的全套基础组件&#xff0c;并且可以针对每个虚拟主机进行权…

面向对象(高级)-Annotation注解、单元测试的使用

注解&#xff08;Annotation&#xff09; 注解大纲 注解的使用1.Annotation的理解 - 注解&#xff08;Annotation&#xff09;是从JDK5.0开始引入&#xff0c;以注解名在代码中存在。 - Annotation可以像修饰符一样被使用&#xff0c;可用于修饰包、类、构造器、方法、成员变…

LeetCode:59. 螺旋矩阵 II

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;59. 螺旋矩阵 II 题目描述&#xff1a;给你一个正整数 n &#xff0c…