YOLOX(学习笔记)

目录

1.前言

2.网络结构

[3.Anchor Free](#3.Anchor Free)

4.损失计算

[5.正负样本匹配策略 SimOTA](#5.正负样本匹配策略 SimOTA)

(1)SimOTA原理

(2)cost计算

(3)正负样本的匹配


1.前言
  • YOLOX是旷视科技在2021年发表的一篇文章,当时主要对标的网络就是很火的YOLO v5,如果对YOLO v5不了解的可以看下我之前的文章。那么在YOLOX中引入了当年的哪些黑科技呢,简单总结主要有三点:decoupled head(解耦检测头)、anchor-free以及advanced label assigning strategy(SimOTA)。YOLOX的性能如何呢,可以参考下图,YOLOX比当年的YOLO v5略好一点,并且论文中说他们利用YOLOX获得了当年的Streaming Perception Challenge的第一名。
  • 那在项目 中YOLO v5和YOLOX到底应该选择哪个。建议是,如果你的数据集图像分辨率不是很高,比如640x640,那么两者都可以试试。如果你的图像分辨率 很高,比如1280x1280,那么我建议使用YOLO v5。
2.网络结构
  • 下图是YOLOX-L网络结构。因为它是基于YOLO v5构建的,所以Backbone以及PAN部分和YOLO v5是一模一样的(红圈),注意这里说的YOLO v5是对应tag:v5.0版本的,而我们之前讲的YOLO v5文章中是tag:v6.1版本,所以在Backbone部分有些细微区别。
  • 那YOLOX和YOLO v5在网络结构上有什么差别呢,主要的差别就在检测头head部分。之前的检测头就是通过一个卷积核大小为1x1的卷积层实现的,即这个卷积层要同时预测类 别分数、边界框回归参数以及object ness ,这种方式在文章中称之为耦合的检测头(coupled detection head)。作者说采用耦合的检测头是对网络有害的,如果将耦合的检测头换成解耦的检测头(decoupled detection head)能够大幅提升网络的收敛速度。
  • 解耦检测头结构如下图。解耦检测头中对于预测Cls.、Reg.以及IoU参数分别使用三个不同的分支,这样就将三者进行了解耦。这里需要注意一点,在YOLOX中对于不同的预测特征图采用不同的head,即参数不共享(就是说上图右边的三个检测头参数不共享)
3.Anchor Free
  • YOLOX是Anchor-Free的网络,所以head在每个位置处直接预测4个目标边界框参数tx,ty,tw,th,如下所示,这4个参数分别对应预测目标中心点相对Grid Cell左上角(c_x, c_y)的偏移量,以及目标的宽度、高度因子。注意这些值都是相对预测特征图尺度上的,如果要映射回原图需要乘上当前特征图相对原图的步距stride
  • 可以发现w和h的公式没有×anchor的长宽,所以和anchor已经没有关系了。
4.损失计算
  • 损失由分类损失、定位损失和obj损失三部分组成。
  • Npos就是正样本的个数。
5.正负样本匹配策略 SimOTA
(1)SimOTA原理
  • SimOTA简单来说,就是将匹配正负样本的过程看成一个最优传输问题。方便理解就举个简单的例子。如下图所示,假设有1到6共6个城市(图中的五角星),有2个牛奶生产基地A和B。现在要求这两个牛奶生产基地为这6个城市送牛奶,究竟怎样安排才能最小化运输成本。假设运输成本(cost)仅由距离决定,那么很明显城市1、2、3由牛奶生产基地A负责,城市4、5、6由牛奶生产基地B负责,运输成本最低。
  • 那么在SimOTA正负样本匹配过程中,城市对应的是每个样本(对应grid网格中的每个cell),牛奶生产基地对应的是标注好的GT Bbox(真实目标框),那现在的目标是怎样以最低的成本将GT分配给对应的样本(cell) 。根据论文中的公式1,cost的计算公式如下,其中λ为平衡系数,代码中设置的是3.0:
(2)cost计算
  • 在SimOTA中,首先会将落入目标GT Bbox内或落入fixed center area内的样本给筛选出来,在源码中作者将center_ratius设置为2.5,即fixed center area是一个5x5大小的box。如上图所示,feature map(或者称grid网格)中所有打勾的位置都是通过预筛选得到的样本。注意,这里将落入GT Bbox与fixed center area相交区域内的样本用橙色的勾表示。
  • 接着计算网络在这些样本(anchor point)位置处的预测值(目标类别以及目标边界框)和每个GT的以及(由于回归损失是IoULoss,所以这里也知道每个样本和每个GT的IoU),然后再计算每个样本和每个GT之间的cost(cost公式为下图右边)
  • pair_wise_cls_loss就是每个样本与每个GT之间的分类损失
  • pair_wise_ious_loss是每个样本与每个GT之间的回归损失
  • is_in_boxes_and_center代表那些落入GT Bbox与fixed center area交集内的样本,即上图中橙色勾对应的样本,然后这里进行了取反~表示不在GT Bbox与fixed center area交集内的样本(非橙色样本),即上图中黑色勾对应的样本。接着又乘以100000.0,也就是说对于GT Bbox与fixed center area交集外的样本cost加上了一个非常大的数,这样在最小化cost过程中会优先选择GT Bbox与fixed center area交集内的样本。
(3)正负样本的匹配
  • 接下来利用cost去进行正负样本的匹配
  • 首先构建两个矩阵,一个是之前筛选出的Anchor Point与每个GT之间的cost矩阵 ,另一个是Anchor Point与每个GT之间的IoU矩阵
  • 接着计算n_candidate_k并结合IoU对Anchor Point做进一步筛选(保留IoU大的Anchor Point),n_candidate_k是取10和Anchor Point数量之间的最小值,在下面给的这个示例中由于Anchor Point数量为6,所以n_candidate_k=6,故保留所有的Anchor Point。
  • 然后通过IOU矩阵计算每个GT的IOU的和(结果向下取整),得到dynamic_ks,这里对于GT1和GT2都是3,所以GT1有3个正样本,GT2也有3个正样本。
  • 然后在cost矩阵中取cost最小的三个为正样本,GT1是A1,A2,A5,GT2是A3,A4,A5.
  • 最后我们发现一个问题,两个GT都把正样本分配给了A5,但A5只能有一个正样本,这时就取cost最小的,因为0.3>0.2,所以最后正样本分配给GT2,GT1就只有两个正样本了。
  • 剩下的全分为负样本
相关推荐
chloe23332 分钟前
【动手学深度学习】笔记1:简单的线性回归
笔记·深度学习·线性回归
迷枫71222 分钟前
达梦 SQL 执行计划操作符与 TRACE、ET 学习笔记
笔记·sql
学机械的鱼鱼29 分钟前
一文读懂轮足翼复合机器人:结构特点与仿真学习路线规划
学习·机器人
知识分享小能手44 分钟前
Hadoop学习教程,从入门到精通, 部署Hadoop 3.x — 知识点详解(2)
大数据·hadoop·学习
问心无愧05131 小时前
ctf show web入门106
笔记
星恒随风1 小时前
C++ 类和对象入门(三):拷贝构造、赋值运算符重载和深浅拷贝
开发语言·c++·笔记·学习
tedcloud1231 小时前
Understand-Anything部署教程:打造AI代码理解平台
服务器·人工智能·学习·自动化·powerpoint
逆光的July1 小时前
Logback 学习笔记
笔记·学习·logback
数智工坊1 小时前
周志华《Machine Learning》学习笔记--第十三章--半监督学习
笔记·学习·机器学习
AI_零食1 小时前
鸿蒙原生 ArkTS:margin 溢出、Row 弹性分配与 alignItems 的交互
学习·华为·开源·harmonyos·鸿蒙·鸿蒙系统