35_YOLOX网络详解

news2024/9/8 23:33:44

1.1 简介

YOLOX是YOLO系列(You Only Look Once)目标检测模型的一个最新变种,由阿里云团队和旷视科技在2021年提出。YOLO系列以其快速、准确的目标检测能力而闻名,而YOLOX在此基础上进行了多方面的改进和优化,旨在提供一个更灵活、可扩展且性能更强的检测框架。以下是关于YOLOX的全面详细讲解:

1. 设计理念

  • 统一架构:YOLOX设计了一个统一的基础网络结构,使得模型可以在训练和推理阶段共享相同的网络架构,这简化了模型的部署流程并提高了效率。
  • 可扩展性:通过模块化设计,YOLOX允许研究人员轻松地插入或替换不同的组件,比如 Backbone(主干网络)、Neck(颈部网络)以及Head(头部网络),以适应不同任务需求或进行算法创新。
  • 高性能与实时性:优化了模型结构和训练策略,确保在保持高检测精度的同时,也能实现实时或接近实时的处理速度。

2. 技术亮点

  • Decoupled Head:YOLOX引入了解耦头(Decoupled Head)的设计,将分类分支和框回归分支分开,这有助于模型更好地学习这两种不同类型的任务特征,提升检测性能。
  • SimOTA (Similarity-based One-Stage Object Detection Assignment):这是一种新颖的动态锚框分配策略,它根据预测框与真实框之间的相似度来动态分配正负样本,从而解决了传统方法中手工设置阈值的问题,提高了训练效率和检测精度。
  • Mosaic Data Augmentation:采用马赛克数据增强技术,通过随机裁剪和拼接图像,增加了训练数据的多样性,有助于模型泛化能力的提升。
  • YOLOX also uses other common practices in modern object detection models, such as:
    • Weighted Boxes Fusion (WBF):在多尺度测试中融合预测框,提高检测边界框的精确度。
    • Cosine Annealing with Warmup:使用余弦退火学习率调度,并结合预热策略,优化模型训练过程中的学习率调整,促进模型收敛。
    • Auto-Augment:自动数据增强策略,根据算法搜索最优的数据增强策略,进一步提升模型鲁棒性。

3. 训练与推理流程

  • 训练:YOLOX在训练过程中,首先通过解耦头分别优化分类和定位任务,同时利用SimOTA策略动态分配样本,结合丰富的数据增强技术,以及精心设计的学习率策略,使得模型能够高效学习。
  • 推理:YOLOX在推理时,由于其统一的架构设计,可以快速输出物体检测结果。通过解耦头生成类别预测和边界框预测,然后依据一定的阈值筛选出最终的检测结果。

4. 性能表现

YOLOX在多个标准数据集上(如COCO、PASCAL VOC等)展示了优越的性能,不仅在精度上取得了显著提升,同时保持了高效的推理速度,适合于实际应用中的实时目标检测任务。

5. 应用场景

因其出色的性能表现,YOLOX广泛应用于各种领域,包括但不限于视频监控、自动驾驶、无人机巡检、智能安防、医疗影像分析等需要快速准确目标检测的场景。

总之,YOLOX作为YOLO系列的最新成员,凭借其创新的设计思路和优化策略,在目标检测领域展现了强大的竞争力,为研究人员和开发者提供了一个高效、灵活且高性能的检测框架。

1.2 网络结构

YOLOX是在YOLOV5的结构基础上进行构建的。

参考:https://blog.csdn.net/qq_37541097/article/details/125132817

YOLOX的左侧和YOLOV5是一模一样的,只有最右侧虚线框的head不一样而已。

(注意这里的YOLOV5是V5.0版本,backbone部分和V6.1有区别,

图中的focus模块在6.1版本中已经替换为6x6卷积核)

YOLOX的检测头: YOLOX采用了解耦的检测头,提升了AP加速了收敛。

那么什么是解耦的检测头呢?在1x1卷积之后并行了两个3x3卷积,然后下面的3x3卷积又并行两个1x1卷积,这三个1x1卷积分别用来预测目标类别(图中的cls)、预测预测框的回归参数(reg)、预测置信度(Iou)。

注意检测头之间的参数是不共享的。

1.3 Anchor-free

YOLOX在其更新的版本中引入了anchor-free(无锚点)的检测方法,这是一种不同于传统YOLO系列及其他一些目标检测模型中使用固定anchor boxes的设计。在anchor-free方法中,模型直接预测目标物体的中心点及其宽高,而不是基于预设的anchor boxes进行偏移和尺寸调整。这一改变简化了模型结构,降低了超参数调优的复杂性,并有可能提升模型的灵活性和准确性。

具体到YOLOX中的anchor-free机制,主要特点包括:

  1. 直接预测边界框: 模型直接预测每个候选区域(通常是网格或像素点)上的物体边界框的四个参数,通常是中心点坐标(x, y)和框的宽度(w)、高度(h),而不是像anchor-based方法那样预测相对于预设anchor的偏移量。

  2. 中心点密集采样: 为了覆盖整个图像区域并提高检测精度,YOLOX可能采用在特征图上对每个像素或每隔一定步长的像素进行中心点候选采样,这些候选点都有潜力成为预测框的中心。

  3. 损失函数调整: 由于不使用anchor boxes,损失函数的设计也会有所不同,通常需要直接衡量预测框与真实框之间的距离,如使用IoU(Intersection over Union)作为损失函数的一部分,来优化预测框的位置和尺寸。

  4. 简化训练流程: Anchor-free设计减少了对anchor boxes的敏感性和调优需求,使得模型训练流程更加简洁,降低了过拟合的风险,并可能加快收敛速度。

  5. 提高适应性: 无锚点设计使得模型对不同尺寸和比例的目标更加公平对待,避免了因anchor配置不当导致的检测偏差,提高了模型在多样本、多尺度目标检测任务中的适应性和准确性。

综上所述,YOLOX中的anchor-free机制是对目标检测领域的一次创新尝试,它通过消除预设anchor的限制,提升了模型的灵活性和泛化能力,同时也简化了模型结构和训练过程,是现代目标检测算法发展的一个重要趋势。

1.4 损失计算

obj损失的意思是,如果当前这个样本它被划分为正样本的话,那么它的GT标签就为1,如果被分为负样本,GT的标签为0。

Npos代表正样本的个数。

1.5 正负样本匹配SimOTA

YOLOX中的SimOTA,全称Similarity-based One-Stage Object Detection Assignment,是一种先进的目标检测训练样本分配策略。它被设计用来优化目标检测模型在训练阶段的正负样本分配,特别是在单阶段检测器(如YOLO系列)中的应用。SimOTA的关键贡献在于它摒弃了传统基于阈值的硬性正负样本划分方法,转而采用基于预测框与真实框之间相似度的动态分配策略,提高了训练样本的利用率和模型的检测性能。以下是SimOTA的主要特点和工作原理:

工作原理

  1. 计算相似度: 首先,对于每一个预测框(无论是anchor-based还是anchor-free设计中的候选框),计算其与所有真实框之间的相似度,这个相似度通常基于两者的交并比(IoU)以及分类置信度。

  2. 动态阈值: 不同于固定阈值来区分正负样本,SimOTA根据预测框与真实框之间的相似度分布动态设定阈值。这意味着,模型会自动调整正负样本的划分,以确保每个真实框至少有一个高质量的正样本与之对应,同时合理控制负样本的数量,保持正负样本比例的平衡。

  3. 优化匹配: 在确定了正负样本后,SimOTA还会进一步优化正样本的分配,确保每个预测框尽可能与最匹配的真实框关联,即使该预测框可能不是所有预测框中IoU最高的。这种优化旨在提升模型对难检目标的学习能力。

  4. 提升训练效率与效果: 通过动态且优化的样本分配,SimOTA不仅提高了训练数据的利用效率,还显著提升了模型的检测精度。它帮助模型在训练初期就能获得更准确的梯度信号,加速收敛过程,同时减轻了对大量负样本或难负样本的依赖,降低了过拟合风险。

优势

  • 减少人工干预: 动态阈值设定避免了手动设置正负样本划分阈值,使模型更加自适应。
  • 提高样本质量: 确保每个真实框至少有一对应高质量正样本,提升了训练的有效性和精确性。
  • 优化资源分配: 根据目标的难易程度和检测框的质量智能分配训练资源,有助于提高训练效率和模型性能。
  • 增强模型鲁棒性: 通过优化样本分配,模型在面对复杂场景和尺度变化较大的目标时表现更稳定。

optimal Transport Assignment:最优运输分配

为了方便理解举个例子:五角星是城市,圆圈是牛奶供应基地。现在需要牛奶基地对所有城市进行供应牛奶,那么就需要考虑到一个运输成本的问题,假设运输成本仅仅由距离决定,很显然123由基地A负责,456由基地B负责,这样运输成本是最低的。

那么在我们匹配正负样本的过程中:

首先我们会对样本做一个预筛选操作。先找出所有落入GT和fixexd center area的anchor point,然后这些又分为两部分,一部分是既在GT也在fixexd center area的anchor point,也就是橙色的钩,一部分是在交集之外的anchor point,也就是用黑色钩标注的部分。

在代码中计算cost时分为三个部分,首先第一部分是分类损失,第二部分是回归损失,第三项在公式中没体现出来,“~“是取反操作,”is in boxes and center“代表交集(橙色的√),那么取反就是不在这个区域内(也就是黑色的√),前面乘上了非常大的系数,那么损失就会非常大。

那么我们在最小化cost过程中,就会逼迫它优先选择交集内的anchor point,如果不够再去取黑色的√。

如何利用simOTA去分配正负样本呢?

举个例子:假设我们在之前先预选了一部分anchor point(黑色和橙色),然后与每个GT都去计算一个cost,结果会得到一个cost矩阵,然后我们用anchor point与GT计算IOU得到IOU矩阵(这里记录的是每个anchor point 预测的目标边界框和每个GT之间的IOU),这个IOU矩阵不用单独计算,在之前计算回归损失(采用IOULOSS)的时候计算过了。

然后我们会计算一个n_candidate_k,这个值是从10和橙色√anchor point个数中取最小值。这里的值是6所以n_candidate_k取6。然后再选取前n_candidate_k个anchor point,因为前面值是6所以这里就取6个,也就是全取了。 

然后我们再看通过筛选之后的IOU矩阵,接下来会计算一个dynamic_ks参数。这个参数对应论文中的dynamic k estimation strategy。也就是说我们针对每一个GT所分配的正样本的个数是一不一样的,是动态计算得到的。

代码的实现就是将每一行求和然后向下取整。比如GT1是3,GT2也等于3,就是说对GT1和GT2分配三个anchor point

然后我们分配dynamic_ks个anchor point,根据cost最小的原则选择cost最小的前三个。如下图所示。然后根据上面的cost矩阵构建了一个分配矩阵。

那么现在又有一个问题:为啥A5对应两个GT啊?它到底是GT1还是GT2啊?

作者为了解决这个问题又加了一步。对于这种情况,我们再来比较A5相对于GT1和GT2的损失,然后将这个A5分配给较小cost的那个GT.

那么现在我们已经找到全部的正样本了,那么除了正样本以外其他的全部都是负样本,然后我们就可以结合损失计算的公式取计算YOLOX对应的总损失了。

1.6 模型性能

La tency指的是推理时间。

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

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

相关文章

获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题

能看到这篇文章说明网上哪些获取 (dbm/asu值)不适合你,不是他们的代码不正确,而是不符合你的情况 比如安卓6获取android手机信号强度 可以看这篇文章 https://blog.csdn.net/sinat_31057219/article/details/81134030 当然如果你…

计算机三级嵌入式(三)——嵌入式系统硬件组成

目录 考点1 嵌入式最小硬件系统 考点2 基于 ARM 内核的典型嵌入式应用系统硬件组成 考点3 ARM 的 AMBA 总线体系结构及标准 考点4 基于 ARM 内核的嵌入式芯片的硬件组成 考点5 存储器层次结构 考点6 存储器分类 考点7 存储器主要性能指标 考点8 片内存储器 考点9 外部…

Perfectly Clear WorkBench中文绿色版,让每一张照片都完美无瑕

软件简介 你是否曾经为了一张不完美的照片而感到遗憾?是否曾经因为照片中的小瑕疵而不得不花费大量时间进行后期处理?现在,有了Perfectly Clear WorkBench,这些问题都将迎刃而解。作为全球领先的智能图像校正技术商推出的图像清晰…

【C++高阶数据结构】红黑树:全面剖析与深度学习

目录 🚀 前言:红黑树与AVL树的比较一: 🔥 红黑树的概念二: 🔥 红黑树的性质 三: 🔥 红黑树节点的定义和结构🚀 3.1 基本元素🚀 3.2 节点颜色🚀 3.…

Java中static静态变量--继承等相关知识

目录 static 继承: 继承的特点: 案例:自己设计一个继承体系练习: 设计思想: 代码: 子类到底能继承父类的哪些类容? 成员变量内存的继承情况: 成员方法的内存继承情况&#x…

项目经理的开源工具指南:优化您的选择过程

国内外主流的10款开源项目管理系统对比:PingCode、Worktile、禅道、Teambition、Gogs、码云 Gitee、Jira、Redmine、ProjectLibre、OpenProject。 在选择合适的开源项目管理系统时,很多团队面临诸多挑战:功能是否全面?易用性如何&…

C++初学(7)

7.1、字符串 字符串是存储在内存的连续字节中的一系列字符。C处理字符串的方式有两种,第一种是来自C语言,常被称为C风格字符串,另一种则是基于string类库的方法。 存储在连续字节中的一系列字符意味着可以将字符存储在char数组中&#xff0…

Mecanim Animation System

动画系统简介 Unity 有一个非常丰富而又复杂的动画系统,官方称其为Mecanim。该系统具有以下功能: 支持从外部导入动画剪辑,如:fbx、mb | ma(Autodesk maya 原件)、.max(3ds Max原件&#xff09…

5.仓颉编程_数组使用与异常捕捉

5.仓颉编程_数组使用与异常捕捉 数字数组与字符串数组 import std.console.*main() {var qty 10var zero2 0var array [1,2,3] //数组var str_arr:Array<String> [aa,bb]try {//qty qty / zero2//println(qty)println(str_arr[0])println(array[0])// println(arr…

rhce THE homework of first

ssh远程免密登录成功 下载httpd和nginx 关闭防火墙 查看selinux的状态 为服务器配置ip 填充网站的内容 添加服务器配置 将文本写入网站

2024电赛H题参考方案(+视频演示)——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 4、整体控制方案视频演示 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&a…

深入解析 GZIP 压缩传输:优化网络性能的利器

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

MATLAB中“varargin”的作用

varargin是什么&#xff1f; 在MATLAB中&#xff0c;varargin是一个特殊的变量&#xff0c;用于接收函数输入参数中的可变数量的参数。它允许用户在调用函数时传递不确定数量的参数。 varargin的本质是一个包含了所有可变参数的cell数组。在函数内部&#xff0c;可以使用cell…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注&#xff1a;对于"Echo or Echo Reply Message"类型的icmp报文&#xff0c;响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier&#xff08;标识符&#xff09;字段通常由发送方设置&#xff0c;并被用于将ICMP请求与相应的回复…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义&#xff0c;它能够自动偷摸的为咱们的代码生成一个try…catch块&#xff0c;并把异常向上抛出来。 使用 SneakyThrows的使用范围&#xff1a; 只能作用在方法和构造函数之上。从源码就可以…

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足&#xff0c;执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足&#xff0c;执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

app逆向实战:某咨询6.0.4.4版本signature等参数抓包与破解

本篇博客旨在记录学习过程&#xff0c;不可用于商用等其它途径 入口 密码登录接口 抓包 根据抓包结果得知动态参数是client_timestamp&#xff0c;keyword&#xff0c;client_session&#xff0c;sig&#xff0c;sigTime&#xff0c;cursor 初步观察得出以下结论&#xff…

负债了,打死也别干的六件事!逾期了,六句谎言千万别信!

负债这事儿&#xff0c;真是一言难尽&#xff0c;稍不留神&#xff0c;就可能让情况雪上加霜。今儿咱们聊聊&#xff0c;负债后那几件打死也别干的几件事&#xff0c;尤其是针对还没有逾期的朋友们&#xff0c;免得后悔莫及。 首先&#xff0c;千万别动歪脑筋&#xff0c;拿公款…

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时&#xff0c;传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统&#xff0c;它们在并行查询优化方面有着各自的策略和技术。本文…

【C++】C++的类型的转换

目录 C语言中的类型转换 C中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 C语言中又两种类型转换&#xff1a;&#xff08;强制&#xff09;显示类型转换和隐式类型转换。 &#xff08;强制&#xff09;显示类型…