35_YOLOX网络详解

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.mzph.cn/news/875179.shtml

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

相关文章

机器学习数学基础(2)--最大似然函数

声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。 在机器学习和统计学领域中,似然函数(Likelihood Function)是一个至关重要的概念。…

AIGC的神秘面纱——利用人工智能生成内容改变我们的生活

近年来,人工智能生成内容(AIGC)正在迅速改变我们与数字世界互动的方式。从自动写作到图像生成,AIGC正逐渐走进我们的日常生活。它不仅提高了效率,还为创意和商业活动带来了新的可能性。让我们一起来探索AIGC的世界&…

解读 IP 地址定位

你是否好奇众多平台推出的 IP 归属地功能是如何确定的位置?其实这些说起来并不难。接下来让我来给你们说一下其中的“奥秘”吧~ 一、IP 定位背后的原理 首先,从“IP 地址”开始。因为每个联网设备在接入网络时都会被分配一个独一无二的 IP 地址。根据这…

通信原理思科实验三:无线局域网实验

实验三 无线局域网实验 一:无线局域网基础服务集 实验步骤: 进入物理工作区,导航选择 城市家园; 选择设备 AP0,并分别选择Laptop0、Laptop1放在APO范围外区域 修改笔记本的网卡,从以太网卡切换到无线网卡WPC300N 切…

3.多租户调研1

https://gitee.com/xiaoqiangBUG/hello-ruoyi-cloud.git 1.mybatis plus 的插件 TenantLineInnerInterceptor 是 MyBatis Plus 框架中的一个拦截器,它用于实现多租户系统的数据隔离。在多租户应用中,不同的租户应该只能访问到自己的数据,而…

TCP网络socket编程(面向连接)

Tcp面向链接、面向字节流和文件的读写非常类似():客户端创建套接字主动建立连接,服务器监听套接字一直等待连接的到来,监听到一个,就创建一个新的套接字用于IO 服务器: 创建套接字&#xff1a…

【数据结构】单链表面试题(Java + 力扣 + 详解)

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理) 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景,调用别人的方法&#xff0…

Chapter 15 Python函数进阶

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、函数多返回值二、函数的多种传参方式三、匿名函数 前言 在Python中,函数是组织代码、提高重用性与可读性的基本构建块。随着程序逻辑的复杂性增加&…

在 Windows 上安装 PostgreSQL

官网下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsWindows平台 官网直接提供exe安装包,没有手动安装的压缩包 postgresql-14.4-1-windows-x64.exe几个重要的安装选项 安装界面会指定服务程序和库两个路径&#xf…

压测实操--kafka-consumer压测方案

作者:九月 环境信息: 操作系统centos7.9,kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测,该脚本参数为: thread:测试时的单机线程数&…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分,如果不考虑节点部署,那么所有节点都会身兼数职(master-eligible ,data,coordinate等),这对后期的维护拓展并不利,所以本文…

软件测试10 渗透性测试及验收测试

渗透性测试及验收测试 知识回顾 Web UI自动化测试 引入自动化测试需要满足的条件自动化测试流程简述自动化测试的关键技术Selenium页面元素定位方式 目标 了解安全测试的概念了解常见的安全漏洞了解安全测试流程及测试工具的使用理解验收测试的概念掌握Alpha测试和Beta测试…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中,React 是一个非常流行的框架,用…

【计算机毕业设计】866校企合作管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Git处理Failed to connect to www.google.com port 80: Timed out

Git处理Failed to connect to www.google.com port 80: Timed out 输入提交代码命令:git push -u origin master 报错:fatal: unable to access https://gitee.com/solitudeYu/gerenzhuye.git/: Failed to connect to www.google.com port 80: Timed ou…

AI数字人+城市交通大数据可视化平台,让交通管理与服务更简便、更智能

如今,AI数字人作为科技革命和产业革命的重要驱动力,AI数字人接入城市交通大数据可视化平台,可以有效地将各硬件与业务系统进行深度融合,完成业务闭环。依托AI数字人的应用,使城市交通大数据可视化平台的使用复杂度大幅…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候,集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型,传递数据时可传入该类及其子类类型1.3.3 如果不写泛型,类型默认是Object 二、泛型…

Elastic 数据分层策略:为弹性及高效的实施而优化

作者:来自 Elastic Michael Calizo, Tim Lee 在 Elastic,我们大多数成功的客户实施都是从单一用例开始的,旨在满足特定的业务需求。Elastic 最初被采用通常是因为开发人员欣赏它提供的功能。然而,由于其灵活性和可定制性&#xff…