目标检测——YOLOX算法解读

news/2024/7/10 2:53:34 标签: 目标检测, 算法, YOLO, YOLOX

论文: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系列算法解读:

PP-YOLO系列算法解读:


文章目录

  • 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更加优秀,但速度会稍微慢一点点。


YOLOX_32">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.niftyadmin.cn/n/5447579.html

相关文章

上位机图像处理和嵌入式模块部署(qmacvisual图像识别)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓图像识别,就是对图像进行分类处理,比如说判断图像上面的物体是飞机、还是蝴蝶。在深度学习和卷积神经网络CNN不像现在这…

数据结构之二叉树由浅入深(一)

题外话 我知你深浅,你却不知我长短 今天正式进入二叉树 正题 树型结构概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上&…

C++类的6个默认成员函数(构造)

C类和对象基础-CSDN博客https://blog.csdn.net/lh11223326/article/details/136834917?spm1001.2014.3001.5501 目录 1.构造函数 概念 特性 2.析构函数 概念 特性 3.拷贝构造函数 概念 特征 4.赋值运算符重载(构造实现) 运算符重载 赋值运算…

构造器注入和Autowired注入的区别

在Spring框架中,构造器注入(Constructor Injection)和Autowired注入(Autowired Injection)是两种常用的依赖注入方法。它们主要的区别在于注入方式、时机和使用场景: 构造器注入(Constructor Injection) 方式:通过类的构造器来注入依赖&…

XSS一-WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

演示案例: XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM #XSS跨站-输入输出-原理&分类&闭合 漏洞原理:接受输入数据,输出显示数据后解析执行 基础类型:反射(非持续),存储(…

深入理解Redis的Sentinel机制

Sentinel简述 Sentinel为了解决什么问题? Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案。 我们知道Redis 的主从复制模式可以将主节点的数据改变同步给从节点,这样从节点就可以起…

2024淘天阿里妈妈算法工程师一面&二面 面试题

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 今天我们…

c++ 线程池/Github 开源项目源码分析(progschj/ThreadPool)

c 线程池/Github 开源项目源码分析(progschj/ThreadPool) 前言[ThreadPool 项目地址](https://github.com/progschj/ThreadPool)项目源码:基本用法类成员变量类成员函数构造函数的签名创建线程线程默认的任务向任务队列中添加一个任务析构函数…