YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构:

C3

C3 模块的设计灵感来自 CSPNet,其核心思想是将特征图的部分通道进行分割和并行处理,目的是减少冗余梯度信息,同时保持较高的网络表达能力。C3 结构与传统的残差结构类似,但有一些关键改进。

C3 结构的具体组成如下:

  1. 输入特征图的分割

    • 将输入特征图分成两部分:一个部分直接传递到后续层,另一个部分通过多个卷积层和 Bottleneck 结构处理。
  2. Bottleneck 结构

    • 其中一部分特征图会经过多个 Bottleneck 结构,这些 Bottleneck 结构本质上是 ResNet 风格的残差块。
    • 每个 Bottleneck 块包含两个 3x3 卷积层,之间有一个跳跃连接(skip connection)。
    • Bottleneck 模块的数量可以根据需求调整,用来增加网络的深度。
  3. 特征图融合

    • 两部分特征图会在末端重新融合。这种设计可以通过减少冗余计算,保留更多的原始特征,同时通过 Bottleneck 提升特征提取的能力。
  4. 卷积操作

    • 最后,融合后的特征图会经过一次 1x1 卷积操作,用来进一步压缩通道数量,并输出到下一个网络层。

C2F

C2F 的核心概念

  1. 跨阶段连接(Cross-stage Connection)

    • 特征图传递:C2F 通过跨阶段连接将特征图从早期阶段传递到后期阶段,允许网络在不同层次之间传递信息。这种连接可以帮助保留来自不同阶段的特征,增强网络的表达能力。
    • 改进梯度流动:跨阶段连接有助于改善梯度流动,减少梯度消失问题,特别是在深层网络中。
  2. 特征融合(Feature Fusion)

    • 信息融合:C2F 将来自不同阶段或不同卷积块的特征图进行融合。这通常通过拼接(concatenation)、加法(addition)或其他融合操作来实现。
    • 多尺度特征整合:通过融合不同阶段的特征,C2F 能够整合多尺度信息,提高网络对不同尺度目标的检测能力。

C2F 的实现方式

  • 特征图的分段和连接

    • 输入特征图会被分成多个部分,这些部分分别经过不同的卷积层或网络块处理。然后,将这些处理后的特征图进行融合,以便在后续层中使用。
  • 融合操作

    • 常见的融合操作包括 拼接(concatenation)加法(addition)。拼接会增加特征图的通道数,而加法则会将特征图的通道数保持不变,通过逐元素相加的方式融合特征。
  • 特征图的处理

    • 跨阶段连接的特征图可以经过卷积层、激活函数等处理后再进行融合,以确保融合后的特征图能够有效地表示不同阶段的信息。

 2. Head改进

解耦头结构
 

Anchor-Based 换成了 Anchor-Free
 

YOLOv8 实现了 anchor-free 目标检测,这种方法不使用传统的 anchor boxes,而是通过其他技术来检测目标。YOLOv8 采用了几种创新的策略来实现 anchor-free 目标检测。以下是 YOLOv8 anchor-free 方法的实现思路和关键技术:

1. Center-based Detection

YOLOv8 采用了基于中心点的检测方法。与传统的 anchor-based 方法不同,YOLOv8 主要关注目标的中心点而不是预定义的 anchor boxes。具体来说,YOLOv8 使用以下方法来实现 center-based 检测:

  • 中心点预测:网络预测每个位置是否包含目标中心点,并回归目标的尺寸和类别。网络的输出包括每个像素点的中心点置信度和目标的相关属性(例如宽度、高度和类别)。

  • 热图(Heatmap):YOLOv8 通过生成目标中心点的热图来定位目标。热图显示了每个像素作为目标中心点的可能性。

2. 边界框回归

YOLOv8 使用回归方法来预测目标的边界框,而不是通过 anchor boxes 的方式。具体包括:

  • 目标尺寸回归:对于每个预测的中心点,网络会回归目标的宽度和高度。这种方法允许网络直接从图像中学习目标的真实尺寸,而不是依赖于预定义的 anchor boxes。

  • 边界框的定义:通过中心点和尺寸预测,可以生成完整的边界框。这种方法通常使用一组回归层来直接预测边界框的四个坐标值(中心坐标、宽度和高度)。

3. 边界框生成

边界框的生成方法与传统的 anchor-based 方法不同,主要包括:

  • 相对位置回归:网络回归目标边界框的相对位置和尺寸,而不是相对于 anchor boxes 的偏移量。

  • 目标中心点匹配:每个预测的边界框通过匹配目标的中心点来生成,这种方法不依赖于预定义的 anchor boxes。


目标检测中的解耦和耦合、anchor-free和anchor-base-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_55794606/article/details/142266086?spm=1001.2014.3001.5502

 3. LOSS改进

正负样本分配策略的改进

使用动态分配策略:TOOD

TOOD (Task-aligned One-stage Object Detection)

TOOD 是一种任务对齐的单阶段目标检测方法,最早由腾讯提出。它的核心思想是通过任务对齐机制同时优化分类和回归任务,从而提高检测精度。TOOD 提出了一个新的样本分配方法,称为任务对齐分配策略(Task Alignment Assignment, TAA)

概念和机制
  • 任务对齐(Task Alignment)

    • 传统的目标检测网络通常将分类任务和边界框回归任务分开进行处理,而 TOOD 通过设计任务对齐的检测头,将分类和回归任务联合优化。
    • 在 TOOD 中,样本的分类和回归任务共享权重,避免了任务之间的冲突。
  • 任务对齐样本分配(TAA)

    • TOOD 提出了任务对齐样本分配策略,目的是为分类和回归任务分配相同的正样本,而不是将分类和回归任务分离开。
    • TAA 首先计算每个 anchor 与 ground truth 之间的分类损失和回归损失,并通过综合这两种损失来动态选择正样本。
    • 它将那些同时在分类和回归上表现较好的 anchor 标记为正样本。
  • 正负样本的选择

    1. 分类和回归损失融合:TOOD 在样本分配时会同时考虑分类损失和回归损失,综合选择正样本。
    2. 正样本匹配:基于任务对齐的损失计算,选择那些能够在分类和回归任务上都有较好表现的 anchor 作为正样本。
    3. 负样本选择:没有满足正样本条件的 anchor 被标记为负样本。
优点
  • 任务对齐:通过联合优化分类和回归任务,解决了传统检测器中任务冲突的问题,提升了检测精度。
  • 动态分配:通过综合损失计算正负样本的分配,避免了传统方法中固定阈值导致的分配不合理问题。
  • 更高精度:TOOD 在多个数据集上表现出比传统方法更高的检测精度。

Loss计算

在 YOLOv8 的损失函数设计中,传统的 Objectness Loss 被取消,损失函数主要由以下两部分构成:

  • 分类损失(Classification Loss):用于评估类别预测的准确性。
  • 边界框回归损失(Bounding Box Regression Loss):用于评估预测框的定位准确性(通常使用 CIoU 或 DIoU 损失)+Distribution Focal Loss。

关键原因:

在 YOLOv8 中,目标检测任务采取了anchor-free的设计,并且模型不再单独预测目标置信度(objectness score)。在 YOLOv3 和 YOLOv4 中,objectness score 是一个用于判断某个预测框是否包含目标的置信度分数。YOLOv5 及之后的版本则逐渐简化了这一设计,而 YOLOv8 完全取消了这个置信度的预测。

替代机制:

  1. 动态分配样本:YOLOv8 通过动态样本分配机制直接从预测的分类和回归损失中确定正负样本,而不需要像之前那样依赖单独的目标置信度预测。模型通过对正负样本的高效分配,自动平衡正负样本之间的关系,从而不再需要目标置信度损失来辅助训练。

  2. 直接预测分类和回归:YOLOv8 不再通过单独的 objectness score 进行目标存在性判断,而是直接通过分类和回归任务的损失来训练模型。正样本的框即代表有目标,而负样本则代表没有目标。

  3. 更高效的计算:取消 objectness score 还简化了计算流程,使得模型在推理和训练过程中更加高效,减少了不必要的计算负担。

训练数据增强

数据增强方面和 YOLOv5 差距不大,只不过引入了 YOLOX 中提出的最后 10 个 epoch 关闭 Mosaic 的操作。假设训练 epoch 是 500,其示意图如下所示:

1. Mosaic 数据增强简介

Mosaic 数据增强是一种在 YOLOv4 中首次引入的图像增强技术,旨在增强模型的泛化能力。它通过将 4 张不同的图像拼接在一起,形成一张新的训练图像。这个方法的核心优势在于:

  • 提供了丰富的场景变化(例如不同的目标尺寸、背景混合等)。
  • 增强了模型对小目标和目标分布变化的鲁棒性。
  • 增加了每个 mini-batch 中的样本多样性,帮助模型更好地学习不同的场景和目标。

Mosaic 使得模型可以在每次迭代中看到更加多样化的样本,从而提高模型的泛化能力。

2. 为什么最后 10 个 epoch 关闭 Mosaic?

虽然 Mosaic 数据增强有助于提高模型的泛化能力,但在训练的最后阶段关闭 Mosaic 可以帮助模型收敛得更好。这主要基于以下几点原因:

a. 提高收敛稳定性

在训练的早期和中期,数据增强有助于模型学习更广泛的特征,尤其是通过增加数据的多样性和复杂性来防止模型过拟合。然而,Mosaic 增强会带来一些不自然的图像拼接和畸变,特别是在图像边缘或拼接区域,这在训练的最后阶段可能影响模型的精细化学习。

关闭 Mosaic 数据增强后,模型会在最后的训练阶段接触到原始比例和结构的图像,从而帮助模型在更接近真实数据分布的样本上微调。这有助于提高检测精度和模型对真实数据的适应性。

b. 减少训练波动

Mosaic 数据增强会打破图像的原始结构,增加背景的复杂性,这在训练的早期可以帮助模型学习更复杂的特征。然而在训练的后期,模型可能更需要稳定的特征学习和优化。关闭 Mosaic 后,模型在标准样本上训练,可以减少不必要的复杂性和波动,进一步稳定模型的学习过程。

c. 提升小目标的精度

Mosaic 增强有助于提高小目标的检测性能,因为它在图像拼接中会改变目标的尺寸和位置。但在最后阶段,模型更需要在真实分布的图像上专注于精细定位。通过关闭 Mosaic,模型可以更好地处理原始图像中的小目标,避免被非自然的拼接干扰。

3. 实际操作中的影响

在 YOLOX 中,训练的最后 10 个 epoch 关闭 Mosaic 的操作被称为 "warm down" 机制。通过这一策略,模型在最后阶段训练过程中逐步回归到原始图像分布,以便:

  • 在标准的非增强图像上优化模型的最终权重。
  • 提高模型在真实场景下的检测性能。
  • 减少由于过度数据增强带来的不必要的预测偏差。

4. 模型推理过程

YOLOv8 的推理过程和 YOLOv5 几乎一样,唯一差别在于前面需要对 Distribution Focal Loss 中的积分表示 bbox 形式进行解码,变成常规的 4 维度 bbox,后续计算过程就和 YOLOv5 一样了。

其推理和后处理过程为:

(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式

(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。 将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。

(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。

(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。

(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。


部分内容转载于:
YOLOv8详解 【网络结构+代码+实操】-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/zyw2002/article/details/128732494?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522F7865695-BD19-4765-8429-CABAFD84E7D1%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=F7865695-BD19-4765-8429-CABAFD84E7D1&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-128732494-null-null.142%5Ev100%5Econtrol&utm_term=yoloV8&spm=1018.2226.3001.4187

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

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

相关文章

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中,特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛(VOC Challeng…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程:neo4j社区windows版下载 一、官网下载neo4j的安装包 (1)官网下载页面 (2)上一步 【download】之后,会自动下载,如果没有,点击【here】 这里可以看到一行字…

深度学习——基础知识

深度学习的重点在于优化,其中很重要的步骤在于如何调参,会涉及到一些微积分等数学知识。不同于以往接触到的数值运算,深度(机器)学习都是关于张量Tensor(向量)的计算,Python中最常用…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度:O(n^2) 空间复杂度:O(1) 稳定性:稳定算法 五、应用场景 💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:探索数据结构…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 ,文末自助获取源码 \color{red}{T032,文末自助获取源码} T032,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【Java面试】第九天

🌟个人主页:时间会证明一切. 目录 Spring中如何开启事务?编程式事务声明式事务声明式事务的优点声明式事务的粒度问题声明式事务用不对容易失效 Spring的事务传播机制有哪些?Spring事务失效可能是哪些原因?代理失效的情…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面,找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包,替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流

效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…

苹果为什么不做折叠屏手机?

苹果为什么不做折叠屏手机?折叠屏手机在最近这些年里边,可以说是市场的一个主要在手机上的增长点。你像华W最近推出这个三折叠手机,引起了整个市场的轰动。 可是,为什么苹果到今天为止不为所动,还在那不停地在现在的这…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:…

华为OD机试 - 端口合并(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql(查询时长8s): select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引,但是因为条件里有or,导致…

电路设计学习(一)

FUSB302BUCX 可编程 USB Type-C 控制器,带 PD(默认 SNK) FUSB302BUCX 是一款由 ON Semiconductor 生产的 USB Type-C 控制器,用于实现 USB Type-C 和 USB Power Delivery (PD) 协议。它主要负责 USB Type-C 端口的检测、CC 引脚…

GESP C++二级样题卷

一、单选题(每题 2 分,共 30 分) 1.目前主流的计算机储存数据最终都是转换成( )数据进行储存。 ​ A.二进制 ​ B.十进制 ​ C. 八进制 ​ D.十六进制 2.已知大写字…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

量化交易backtrader实践(二)_基础加强篇(3)_策略类实践进阶

通过前面几节的实践,我们已经对股票数据的获取,pandasData数据的格式处理,到bactrader的DATAS结构以及里面的data的数据结构,以及在init和next函数中如何读取和计算都有了比较清晰的认知。我们通过一个最简的回测系统,…

C# 结合 Javascript 测试获取天气信息

目录 测试效果 范例运行环境 关键代码 C#获取网页数据 前端代码 JavaScript 实现 总结 测试效果 获取一些简单的天气信息,可以丰富我们的应用系统,比如开发一个小桌面,小组件,增加一些实用性的系统功能,本文将…

neo4j安装为服务+配置环境变量

目录 neo4j安装为服务 windows services 参照JDK,将neo4j加入到环境变量 neo4j安装为服务 windows services 我的上一篇文章详细写明了如何安装启动neo4j《neo4j安装启动教程对应的jdk配置》,文末的启动neo4j是通过cmd命令行访问bin目录,这…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…