YOLO系列 | 正负样本分配策略

1 Max-IoU matching(YOLOv1~V3)

选取与gt的IOU最大的bounding box或者anchor,作为真样本,剩余的都是负样本。

  • YOLOv1:grid cell不包含目标,只计算置信度误差;有目标,选取与gt最大IOU的bbox计算分类、回归误差;
  • YOLOv2:5个anchor box;选择与gt最大IOU的anchor来计算分类和回归误差;
  • YOLOv3:9个anchor box,3个尺度检测头,每个尺度3个anchor box;选择与gt最大IOU的anchor来计算分类和回归误差;

存在的问题:正样本太少,负样本太多。

2 Multi-Anchor策略(YOLOv4)

YOLOv4:只要anchor与gt的IOU大于某个阈值,都可以作为正样本。

注意:yolov4的GT需要利用max iou原则分配到指定的检测头上,然后再与指定检测头上的3个anchor box计算正负样本和忽略样本。不存在某个GT会分配到多个层进行预测的可能性,而是一定是某一层负责的。

3 基于宽高比的领域匹配策略(YOLOv5)

v5在v4的基础上引入自适应anchor box(Auto Learning Bounding Box Anchors)和领域正负样本分配策略

  • 自适应anchor box: 训练前,针对不同的训练数据,聚类anchor box
  • 基于宽高比的领域正负样本分配策略: 增加高质量正样本检测框可以显著加速收敛,v5的领域正负样本分配策略:
    • 宽高匹配: 将ground truth与当前feature map中的anchor box进行比较,如果ground truth与anchor box的宽高比例都处在[1/4, 4]那么这个ground truth就能与当前featuer map相匹配。
    • 领域匹配: 将当前feature map中的ground truth分配给对应的grid cell。将这个grid cell分为四个象限,针对与当前feature map匹配的ground truth,会计算该ground truth处于四个象限中的哪一个,并将邻近的两个grid cell中的检测框也作为正样本。如下图所示,若ground truth偏向于右上角的象限,就会将ground truth所在grid cell的上面和右边的grid cell中的检测框也作为正样本。
      在这里插入图片描述
      比起yolov4中一个ground truth只能匹配一个正样本,YOLOv5能够在多个grid cell中都分配到正样本,有助于训练加速和正负样本平衡。

4 simOTA(Simple Optimal Transport Assignment)匹配策略(YOLOX, YOLOv6)

YOLOX和YOLOv6都采用了anchor-free+检测头解耦为分类cls(N)、置信度obj(1)和bbox(4)三个部分。
在这里插入图片描述
simOTA样本匹配流程如下,假设网络最后输出的size为hxw:

  • 将所有位于gt内的点标记为:in_box
  • 以gt为中心,落在5x5区域内的点标记为:in_center
  • in_box与in_center取并集,作为前景信息fg_mask
    • 计算iou_loss矩阵: 计算gt与fg_mask中预测box的IoU,取log作为iou_loss
    • 计算cls_loss矩阵: 先使用置信度矩阵乘以分类矩阵,再与gt计算BCE损失
      在这里插入图片描述
      Source: YOLOX-SimOTA图文详解
  • in_box与in_center取交集,,在fg_mask中标记,作为in_box_and_center
  • 计算simOTA的cost矩阵: c o s t = c l s l o s s + 3.0 ∗ i o u l o s s + 100000 ∗ (   i n b o x a n d c e n t e r ) ,其中 100000 ∗ (   i n b o x a n d c e n t e r ) cost = cls_loss + 3.0 * iou_loss + 100000 * (~in_box_and_center),其中100000 * (~in_box_and_center) cost=clsloss+3.0iouloss+100000( inboxandcenter),其中100000( inboxandcenter),表示给位于center外且在box内的其他点给一个非常大的loss,在最小化cost的过程中就会优先选择center内的样本。cost的大小为N(gt的数量)xM(fg_mask内点的数量)
  • dynamic_k_matching:
    • 针对每个gt,取iou最大的10个anchor点对应的iou并求和,将其和值向下取整得到dynamic_k;
    • 针对每个gt,从cost中挑选dynamic_k个最小的loss,如果一个anchor被多个gt匹配上,则选取cost最小的作为匹配;
      在这里插入图片描述
      在这里插入图片描述
      Source: YOLOX中的SimOTA正负样本分配策略

YOLOv5的正负样本分配策略是基于邻域匹配,并通过跨网格匹配策略增加正样本数量,从而使得网络快速收敛,但是该方法属于静态分配方法,并不会随着网络训练的过程而调整。YOLOx使用的SimOTA能够算法动态分配正样本,进一步提高检测精度。而且比起OTA由于使用了Sinkhorn-Knopp算法导致训练时间加长,SimOTA算法使用Top-K近似策略来得到样本最佳匹配,大大加快了训练速度。

5 领域匹配+simOTA(YOLOv7)

yolov7也仍然是anchor base的目标检测算法,yolov7将yolov5和YOLOX中的正负样本分配策略进行结合,流程如下:

  1. yolov5:使用yolov5正负样本分配策略分配正样本。
  2. YOLOX:计算每个样本对每个GT的Reg+cls loss(Loss aware)
  3. YOLOX:使用每个GT的预测样本确定它需要分配到的正样本数(Dynamic k)
  4. YOLOX:为每个GT取loss最小的前dynamic k个样本作为正样本
  5. YOLOX:人工去掉同一个样本被分配到多个GT的正样本的情况(全局信息)

其实主要是将simOTA中的第一步“使用中心先验”替换成“yolov5中的策略”。

6 TaskAlignedAssigner匹配策略(YOLOv8, YOLOv9)

YOLOv8和v9的检测头为目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free。且不再有objectness分支,只有解耦的分类和回归的分支,并且回归分支使用了distribution focal loss中提出的积分形式表示法。
在这里插入图片描述
Source: YOLOV8 原理和实现全解析

TaskAlignedAtasssigner的匹配策略 :根据分类与回归的分数加权的分数去选择正样本。
t = s α + u β t = s^{\alpha} + u^{\beta} t=sα+uβ
针对每一个gt,其中s是每个点对应的gt类别的分类置信度,u是每个点对应预测的回归框与gt的IoU,两者相乘就可以衡量对齐程度alignment metrics。再直接基于alignment metrics选取topk作为正样本。

参考资料

[1] Yolov3-v5正负样本匹配机制
[2] YOLOX-SimOTA图文详解
[3] yolov7正负样本分配详解
[4] Yolov8标签匹配算法TaskAlignedAssigner原理及代码注解

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 08:02:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 08:02:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 08:02:07       87 阅读
  4. Python语言-面向对象

    2024-04-14 08:02:07       96 阅读

热门阅读

  1. docker shell安装

    2024-04-14 08:02:07       40 阅读
  2. 【初学】前后端flask+vue组合GET案例

    2024-04-14 08:02:07       34 阅读
  3. docker安装es和kibana

    2024-04-14 08:02:07       49 阅读
  4. insert statements with append hint in archive log

    2024-04-14 08:02:07       33 阅读
  5. 设计模式(018)行为型之策略模式

    2024-04-14 08:02:07       119 阅读
  6. cocos2dx4.0 vs编译报错

    2024-04-14 08:02:07       40 阅读
  7. ubuntu netplan 设置dns

    2024-04-14 08:02:07       125 阅读
  8. 自动化word导出

    2024-04-14 08:02:07       35 阅读
  9. 每天学习一个Linux命令之w

    2024-04-14 08:02:07       36 阅读