正负样本分配策略simOTA

simOTA是YOLOX中提出的
正负样本分配策略(OTA, SimOTA,TAS)
OTA源于2021年cvpr的论文,使训练和验证的标签有着更好的对应关系。
yolov5没有用到,只有一种loss:

from utils.loss import ComputeLoss
compute_loss = ComputeLoss(model)  # init loss class

yolov7用到了,对应的loss:

from utils.loss import ComputeLoss, ComputeLossOTA

这里说yolov5改成simota以后可以提高6个百分点。https://www.iotword.com/4182.html

一、YOLOX整体介绍可看文章:
https://zhuanlan.zhihu.com/p/392221567
改进点:
1、Decoupled head(预测分支解耦)。
作者实验发现耦合检测头可能会损害性能。共有两点改进:
①将预测分支解耦极大的改善收敛速度。
②相比较于非解耦的端到端方式,解耦能带来4.2%AP提升。
图2:yolov3 head与decoupled head结构图
模型结构:
在这里插入图片描述

yolov3中,针对coco80类的检测任务,每一个anchor会对应产生hw85维度的预测结果,其中obj(区分是前景背景)占用1个通道,reg(坐标)占用4个通道,cls(预测是80类中的哪一个类)占用80个通道。
而YOLOX首先使用11卷积将原本不同channel数的特征图先统一到256(主要目的是降维),然后使用两个平行分支,两个分别两个使用33卷积,同时regression分支里还添加了IoU分支。
2、强大的数据增强。

添加Mosaic和MixUp,但在最后15epochs时关闭(笔者认为最后15轮关闭的原因可能是怕数据增强过度)
Mosaic最先在U版的yolov3中使用,现在已经广泛用于各大目标检测器。U版yolov3代码网址:https://github.com/ultralytics/yolov3
MixUp用在目标检测中大概的方式是:两张图以一定的比例对rgb值进行混合,同时需要模型预测出原本两张图中所有的目标。目前MixUp在各大竞赛、各类目标检测中属于稳定提点的策略。
作者颠覆性发现:使用强大的数据增强后,ImageNet预训练模型无益,所有后续模型都是随机初始化权重。
同时论文最后提到,在训练比较小的模型时候,例如YOLOX-S, YOLOX-Tiny,YOLOX-Nano网络,剔除mixup,弱化mosaic效果,表现要比使用好。
3、Anchor-free
anchor的问题:
①使用anchor时,为了调优模型,需要对数据聚类分析,确定最优锚点,缺乏泛化性。
②anchor机制增加了检测头复杂度,增加了每幅图像预测数量(针对coco数据集,yolov3使用416416图像推理, 会产生3(1313+2626+52*52)85=10647个预测结果)。
使用ancho-freer可以减少调整参数数量,减少涉及的使用技巧
从原有一个特征图预测3组anchor减少成只预测1组,直接预测4个值(左上角xy坐标和box高宽)。减少了参数量和GFLOPs,使速度更快,且表现更好。
作者在正样本选择方式做过以下几个尝试:
①只将物体中心点所在的位置认为是正样本,一个gt最多只会有一个正样本。AP达到42.9%。
②Multi positives。(笔者感觉这就是暴力美学,策略简单直接)将中心3
3区域都认为是正样本,即从上述策略每个gt有1个正样本增长到9个正样本。且AP提升到45%,已经超越U版yolov3的44.3%AP。
③SimOTA
这里不得不提到OTA(Optimal Transport Assignment,Paper: https://arxiv.org/abs/2103.14259),这里简单解释一下,后续计划出个专栏来解释OTA。在目标检测中,有时候经常会出现一些模棱两可的anchor,如图3,即某一个anchor,按照正样本匹配规则,会匹配到两个gt,而retinanet这样基于IoU分配是会把anchor分配给IoU最大的gt,而OTA作者认为,将模糊的anchor分配给任何gt或背景都会对其他gt的梯度造成不利影响,因此,对模糊anchor样本的分配是特殊的,除了局部视图之外还需要其他信息。因此,更好的分配策略应该摆脱对每个gt对象进行最优分配的惯例,而转向全局最优的思想,换句话说,为图像中的所有gt对象找到全局的高置信度分配。(和DeTR中使用使用匈牙利算法一对一分配有点类似)
二、详解SimOTA
参考:https://zhuanlan.zhihu.com/p/394392992
https://zhuanlan.zhihu.com/p/549382358

巧妙之处:

1、simOTA能够做到自动的分析每个gt要拥有多少个正样本。
2、能自动决定每个gt要从哪个特征图来检测。
3、相比较OTA,simOTA运算速度更快。
4、相比较OTA,避免额外超参数。
代码结构:
核心代码位于yolox/models/yolo_head.py中。
整体代码逻辑:
1、确定正样本候选区域。
2、计算anchor与gt的iou。
3、在候选区域内计算cost。
4、使用iou确定每个gt的dynamic_k。
5、为每个gt取cost排名最小的前dynamic_k个anchor作为正样本,其余为负样本。
6、使用正负样本计算loss。
在这里插入图片描述OTA虽然实现了很好的性能涨点,但其训练成本很高. YOLOX发现OTA中的Sinkhorn-Knopp算法在训练300epoch的情况下会增加25%的训练时间,为此YOLOX提出了SimOTA,使用手工设定的规则替代Sinkhorn-Knopp算法,缩短了因此增加的训练时间.
如上所述,SimOTA和OTA的区别主要在于最后一步,即使用Sinkhorn-Knopp算法求得最小cost的传输计划
. 对此,SimOTA使用下述方法替代Sinkhorn-Knopp算法求得传输计划
在已求得cost矩阵和每个GT所需的Anchor数量k的情况下,针对每个GT,根据cost挑选出k个cost最小的Anchor. (参考下图,下图为示例,只为了表达大概意思. IoU数量也和10对不上)

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

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

相关文章

八大在线项目实习 2024年第一期即将开班

八大项目: 某实习网站招聘信息采集与分析(Python数据采集与分析) 股票价格形态聚类与收益分析(Python金融分析) 某平台网络入侵用户自动识别(Python机器学习) 某平台广东省区采购数据分析&#…

Guava Cache 异步刷新技巧,你值得拥有!

以下文章来源于勇哥Java实战 ,作者勇哥 Guava Cache是一款非常优秀的本地缓存框架。 这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 经典配置 Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基…

开发实践 | MySQL的Explain工具

📫 作者简介:「子非我鱼」,专注于研究全栈 🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~ 文章目录 引言1,Explain工具介绍2,基本语法3&…

[论文分享]TimesURL:通用时间序列表示学习的自监督对比学习

论文题目:TimesURL: Self-supervised Contrastive Learning for Universal Time Series Representation Learning 论文地址:https://arxiv.org/abs/2312.15709 代码地址:暂无 摘要 学习适用于各种下游任务的通用时间序列表示具有挑战性&…

美团后端Java实习一面面经

说一下AOP? 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的技术。可以减少程序中相同代码的编写,简化开发,使得接口更加专注于业务 相关概念 Aspect(切面): Aspect 声…

vivado 支持的XDC和SDC命令

支持的XDC和SDC命令 本附录讨论了支持的Xilinx设计约束(XDC)和Synopsys设计AMD Vivado中的约束(SDC)命令™ 集成设计环境(IDE)。 XDC文件中的有效命令 支持的SDC命令 注意:由于所有AMD Tcl命…

【React系列】Redux(二)中间件

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 中间件的使用 1.1. 组件中异步请求 在之前简单的案例中,redux中保存的counter是一个本地定义的数据…

vue2 消息弹框

父页面 <template><div style"margin-top: 20px"><div class"nav-style msg-style"><el-badge :value"value" :max"99" class"num" v-if"value > 0"><i class"el-icon-bell&…

Qt6学习笔记:对象树

使用QObject及其子类创建的对象是以对象树的形式来组织的。创建一个QObject对象时若设置一个父对象&#xff0c;它就会被添加到父对象的子对象列表里&#xff0c;一个父对象被删除时&#xff0c;其全部的子对象都会自动删除。QObject类的构造函数里有一个参数用于设置对象的父对…

gz-hamonic 安装提示缺少许多依赖无法安装

在软件更新源中增加gz-hamonic的软件源&#xff0c; 点击添加&#xff0c;在输入框中填入如下语句&#xff1a; deb http://packages.osrfoundation.org/ubuntu jammy main 如图所示&#xff1a; 然后执行 sudo apt -get install gz-hamonic即可安装。 如下图 在终端中输入…

iOS苹果和Android安卓测试APP应用程序的差异

Hello大家好呀&#xff0c;我是咕噜铁蛋&#xff01;我们经常需要关注移动应用程序的测试和优化&#xff0c;以提供更好的用户体验。在移动应用开发领域&#xff0c;iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异&…

Bee的批量插入与事务使用

* Bee 在2.2之前,调用批量插入在每个批都会提交commit,但在2.2改为只调用一次且在事务中,在批量插入的方法内容不再提交,而由事务控制. * * 2.2之前,批量插入使用每一个批次提交一次事务; * 这样,当违反主键约束等就忽略的大批量插入效率是很高的; * 但当事务中有批量插…