目标检测——YOLOX算法解读

news2024/11/24 3:12:21

论文:YOLOX: Exceeding YOLO Series in 2021(2021.7.18)
作者:Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, Jian Sun
链接:https://arxiv.org/abs/2107.08430
代码:https://github.com/Megvii-BaseDetection/YOLOX


YOLO系列算法解读:

  • YOLOv1通俗易懂版解读
  • SSD算法解读
  • YOLOv2算法解读
  • YOLOv3算法解读
  • YOLOv4算法解读
  • YOLOv5算法解读
  • YOLOR算法解读
  • YOLOX算法解读

PP-YOLO系列算法解读:

  • PP-YOLO算法解读
  • PP-YOLOv2算法解读
  • PP-PicoDet算法解读
  • PP-YOLOE算法解读
  • PP-YOLOE-R算法解读

文章目录

  • 1、算法概述
  • 2、YOLOX细节
  • 3、实验
  • 4、总结


1、算法概述

YOLOX是旷视科技2021年提出的目标检测算法,它基于YOLOv3-SPP进行改进,将原有的anchor-based调整为了anchor-free形式,并且集成了其他先进检测技术(比如decoupled head、label assignment SimOTA)取得了SOTA性能。类似于YOLOv5,它也提供了多个尺度版本的模型,Nano/Tiny/s/m/l/x,而且该方法的ONNX、TensorRT、NCNN、OpenVino推理模型均已开源。下图是YOLOX与其他检测算法的对比情况图:
在这里插入图片描述
以我实际的使用情况来看,对比YOLOv5算法,YOLOX在检测精度方面确实比YOLOv5更加优秀,但速度会稍微慢一点点。


2、YOLOX细节

作者以YOLOv3-SPP为基准,即backbone为Darknet-53,neck为SPP+FPN,head部分为分3个特征图输出NxNx(3x(4+1+80))。YOLOX对其进行一步步改进,下面来看具体的改进手段。

  • 首先训练YOLOv3-SPP baseline
    和YOLOv3论文中不一样的是,作者增加了一些策略,比如在训练过程中加入EMA权重更新技术,cosine学习率下降,IoUloss和IoU感知分支;用BCEloss训练分类分支和obj分支,用IoUloss训练回归分支。对于数据增强部分,作者只采用了随机水平翻转和颜色抖动以及多尺度训练,没有使用随机尺寸裁剪(因为作者认为这和后面的马赛克数据增强重叠了,不好评估马赛克数据增强带来的影响)。最终在COCO val数据集上是38.5%mAP。
  • Decoupled head
    在目标检测中,分类与回归任务的冲突是一种常见问题。因此,分类与定位头的解耦已被广泛应用到单阶段、两阶段检测中。然而YOLOv3/v4/v5都没有把检测头解耦,作者通过实验发现,解耦检测头能让训练收敛更快,如下图:
    在这里插入图片描述
    解耦头,意味着会检测头会多一个分支结构,所以参数量会增加,为了尽量少增加参数,作者在进入预测分支之前先用1x1卷积将特征通道减少,然后再接分类分支和回归分支。其结构如下所示:
    在这里插入图片描述
  • Strong data augmentation
    数据增强部分,作者将Mosaic和MixUp添加到增强策略中,以提高YOLOX的性能。在模型训练过程中采用MixUp和Mosaic对数据进行增强,并在最后15个epoch关闭它。实际应用下来看,最后15epoch关闭数据增强很有用。
  • Anchor-free
    Anchor-based方法的弊端:1、需要在优化之前,聚类分析数据集标注框的情况,这会导致训练出来的模型使用场景及泛化性能受限。2、锚框设计增加了检测头的复杂性,预测框数量会根据锚框设计的增加而增加。
    而无锚框机制显著减少了需要启发式调整的设计参数的数量和涉及的许多技巧(例如,锚框聚类,网格敏感)的良好性能,使检测器的训练和解码阶段大大简化。将anchor-based调整为anchor-free比较简单,作者将每个位置的预测从3个(YOLOv3是每个grid设置3个anchor)减少到1个,并使它们直接预测4个值,即网格左上角的两个偏移量,以及预测框的高度和宽度。改成anchor-free后,作者参考FCOS,将每个目标的中心定位正样本并预定义一个尺度范围以便于对每个目标指派FPN特征尺度。经过这个改进后,模型参数和GFLOPs都减少了,推理速度更快,而且性能还提升至42.9%mAP了。
  • Multi positives
    上面的匹配策略,一个gt框只能匹配一个正样本(因为采用center location匹配),这意味着会忽略掉周边高质量预测框,所以作者划定gt框中心点3x3的区域内匹配正样本,这个区域就类似于FCOS中的”center sampling”。这一改进促使模特mAP提升至45.0%。
  • SimOTA
    OTA从全局角度分析标签分配,并将分配过程制定为最优运输(Optimal Transport, OT)问题,从而产生当前分配策略中的SOTA性能。然而,在实践中我们发现用Sinkhorn-Knopp算法求解OT问题带来了额外25%的训练时间,这对于训练来说是相当昂贵的。因此,我们将其简化为动态top-k策略,命名为SimOTA,以获得近似解。在SimOTA中,预测框pj与gt框gi的匹配代价计算为
    在这里插入图片描述
    λ为平衡系数,前者为gi与pj的分类损失,后者为gi与pj的回归损失。
    对于每一个gt框gi,选择前topk个与之损失最小的预测框,且该预测框中心点在gi中心点3x3的范围内的可作为该gt框gi的正样本,其余则作为负样本。通过这个改进,mAP又提升至47.3%。
  • End-to-end YOLO
    即模型最后直接输出结果,不需要最后做nms,这样的改进会导致掉点,所以作者最终没有采用。

下面是上述改进的消融实验结果:
在这里插入图片描述
从表中可以看出,数据增强,划分3x3领域取更多正样本和SimOTA动态匹配正样本这三个改进对YOLOX提升比较大。

  • Other Backbones
    仿照YOLOv5的网络规模改进得到YOLOX-S/M/L/X,仿照YOLOv4-Tiny提出YOLOX-Tiny及YOLOX-Nano,实验结果均表明YOLOX的这些改进很优秀。
    在这里插入图片描述

3、实验

与现如今其他检测算法对比
在这里插入图片描述


4、总结

YOLOX和YOLOv5是我个人用得比较熟练的算法,工程代码都仔细研读过,写得都是非常优秀,代码结构清晰明了,如今YOLOX和YOLOv5都在工业界得到了广泛的应用,就我个人使用感觉而言,YOLOX的精度是略高于YOLOv5的,但速度比YOLOv5稍慢,两个算法都有不同的应用版本,可以方便各个平台适配;个人使用下来,YOLOX似乎对小目标漏检比较多,YOLOv5泛化性能更强一点。

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

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

相关文章

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize(),unserialize()这两个函数。serialize()函数序列化对象后,可以很方便的将它传递给其他需要它的地方&#x…

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②12

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序 4.2升序建大堆&a…

LeetCode每日一题【206. 反转链表】

思路:双指针,一前一后,逐个把指向后面的指针指向前面。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

自动化的免下车服务——银行、餐厅、快餐店、杂货店

如果您在20世纪70年代和2020年分别驾车经过免下车服务餐厅(汽车穿梭餐厅),您会发现,唯一的不同是排队的车型。50多年来,免下车技术一直为我们提供着良好的服务,但现在也该对它进行现代化改造了。 乘着AI和自…

mini2440 LCD(型号:P43)驱动的背光驱动失效原因分析

目录 概述 1 背光驱动移植 1.1 问题描述 1.2 LCD背光驱动 1.2.1 原理图分析 2 移植驱动程序 2.1 编写驱动代码 2.2.1 编写代码 2.2.2 添加驱动配置 2.2 配置驱动至内核 3 测试背光控制 4 分析P43屏的资料 4.1 查询P43的资料 4.2 关于P43的介绍 5 失效原因分析 概…

ZYNQ AXI GPIO

1 原理介绍 一个AXI GPIO 模块有两个GPIO,分别是GPIO和GPIO2,也就是channel1和channel2,为 双向IO。 AXI GPIO的寄存器也不多,主要是两个channel 的数据寄存器GPIO_DATA和GPIO2_DATA,两个channel的方向控制GPIO_TRI和…

Tempo Talents | 创新专业建设方案,赋能高校4+N大数据学科人才培养

数字经济成为国家战略,是新一轮的经济发展引擎,数字人才、复合型人才成为发展的关键和核心要素。各级政府、区域开始以区域产业为导向,培育、聚集产业所需的数智化人才。 高校作为人才培养的重要基地,也发挥着不可或缺的作用。他…

【Spark编程基础】实验三RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

神经网络(深度学习,计算机视觉,得分函数,损失函数,前向传播,反向传播,激活函数)

目录 一、神经网络简介 二、深度学习要解决的问题 三、深度学习的应用 四、计算机视觉 五、计算机视觉面临的挑战 六、得分函数 七、损失函数 八、前向传播 九、反向传播 十、神经元的个数对结果的影响 十一、正则化与激活函数 一、神经网络简介 神经网络是一种有监督…

安卓findViewById 的优化方案:ViewBinding与ButterKnife(一)

好多小伙伴现在还用findViewById来获取控件的id, 在这里提供俩种替代方案:ViewBinding与ButterKnife; 先来说说ButterKnife ButterKnife ButterKnife是一个专注于Android系统的View注入框架,在过去的项目中总是需要很多的findViewById来查…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

绝地求生:七周年活动来袭,小黑盒联名限时返场

就在2024.3.20号下午18点,小黑盒绝地求生板块上线最新活动,活动方法和以往一样采用积分抽奖的方式,通过每日签到,完成任务即可获得相应积分,抽奖需消耗10积分,第一天可以抽8次,后面每一天可以抽…

利用colab部署chatglm

登录colab 创建新的notebook 选择notebook设置 选择GPU然后保存,需要选择GPU 克隆代码 !git clone https://github.com/THUDM/ChatGLM-6B.git切换到目录安装所需要的依赖 %cd /content/ChatGLM-6B %pwd !pip install -r requirements.txt安装所需要的依赖包 …

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

爬虫基础:Web网页基础

爬虫基础:Web网页基础 前言Web网页基础网页的组成网页的结构节点树及节点间的关系选择器 前言 用浏览器访问不同的网站时,呈现的页面各不相同,你有没有想过为何会这样呢?了解一下网页的组成、结构和节点等内容。了解这些内容有助于…

超长爬电结构法蓝底板平面(厚膜、无感设计)中功率电阻

灌封胶封装设计 厚膜无感电阻规格书 EAK特殊设计的模压灌封胶结构设计,使本产品具备超长的 爬电距离,符合VDE0160和UL94-V0的标准。 技术特点 底板中心温度≤85C时,单一电阻结构额定 功率为150W。 四种封装结构,最多封装三个电阻。 2-…

【ChatGLM3-6B】本地大模型使用方法详细教程!!!内含详细的代码解析!!

ChatGLM3介绍 ChatGLM3 是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。 ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,Ch…

写一个简单的 C++ 日志库 - cllogger(3)- CRT

通过上一篇 《写一个简单的 C 日志库 - cllogger(2)- 日期时间》我们已经掌握了如何通过 std::chrono 提供的日期时间工具转换时间参数为指定格式的字符串。 现在我们可以把各个参数信息拼装为 Entry 实例,交给 OutputMessage() void cllog…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比,非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止,我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

python爬虫学习第二天----类型转换

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…