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

文章目录

  • 1 Max-IoU matching(YOLOv1~V3)
  • 2 Multi-Anchor策略(YOLOv4)
  • 3 基于宽高比的领域匹配策略(YOLOv5)
  • 4 simOTA(Simple Optimal Transport Assignment)匹配策略(YOLOX, YOLOv6)
  • 5 领域匹配+simOTA(YOLOv7)
  • 6 TaskAlignedAssigner匹配策略(YOLOv8, YOLOv9)
  • 参考资料

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原理及代码注解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Appium的使用:混合APP切换上下文

网上别的文章说要把移动端的webview设置成调试模式,才能看到下图信息。 但我这里是直接在Android Studio新建了一个空白活动,然后放的webview控件,写的webview代码,直接部署到模拟器上,在确定adb可以连接到模拟器后,在桌面浏览器输入chrome://inspect/#devices后就可以看…

代码随想录训练营

Day23代码随想录 669.修剪二叉搜索树 1.题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有…

最坏情况为线性时间的第k大元素

在统计和数据分析中,我们经常会遇到求最大值、最小值、中位数、四分位数、Top K等类似需求,其实它们都属于顺序统计量,本文将对顺序统计量的定义和求解算法进行介绍,重点介绍如何在最差时间复杂度也是线性的情况下求解第k大元素。…

Java 二叉数(1)

一、认识树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的…

ES6 promise

Promise是在 JavaScript(也称为 ECMAScript-6)中实现异步编程的一种方式。JavaScript 中使用Promise进行异步编程。对于异步编程,JavaScript 使用回调,但使用回调会出现一个问题,即回调地狱(多个或依赖回调…

Kubernetes 升级不弃 Docker:KubeKey 的丝滑之道

作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社区用户委员会杭州站站长。 引言 随着 Kubernetes 社区的不断发展,即将迎来 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中,社区作出一个重要决策…

前后端分离的Java医院云HIS信息管理系统源码(LIS源码+电子病历源码)

HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分,功能易扩展。多医院、多集团统一登录患者主索引建立、主数据管理,统一对外…

李廉洋;4.11#黄金,WTI原油#行情走势分析策略。

美国银行预计,在今天召开的欧洲央行会议上不会有重大的政策变化,但欧洲央行正逐渐接近开始降息,尽管它采取的是一种谨慎的、依赖数据的方式。虽然欧洲央行对降息轨迹的信心不断增强,但降息的具体速度和幅度仍未公布,而…

【深度学习实战(2)】如何使用matplotlib.pyplot模块记录自己的训练,验证损失

一、matplotlib库 在我们自己训练模型时,常常会使用matplotlib库来绘制oss和accuracy的曲线图,帮助我们分析模型的训练表现。 matplotlib库安装:pip install matplotlib 二、代码 import matplotlib.pyplot as plt import torch import to…

CloudCompare——体元法计算树冠体积

目录 1.概述2.软件实现3.完整操作4.相关代码 本文由CSDN点云侠原创,CloudCompare——体元法计算树冠体积,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 1.概述 体元法将树冠所在的空间范围划…

直驱式风电机组与双馈风电机组的发电机之间显著的区别

直驱式风电机组与双馈风电机组的发电机之间存在一些显著的区别,这些区别主要体现在以下几个方面: 结构设计:直驱式风力发电机组的发电机通常采用多极结构,包括多极内转子结构和多极外转子结构等,结构相对简单。而双馈…

NVM下载和安装NodeJS教程

nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 官网下载nvm,选择版本 打开nvm文件夹下的settings.txt文件,在最后添加以下代码: node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors…

NAT技术

网络技术深似海呀,一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分,可以作用在linux防火墙或者设备防火墙,NAT技术可以实现地址和端口的转换,主要还是为了网络连通性。 作用 存在以下三个IP,A(10.234.…

vue3+element plus图片预览点击按钮直接显示图片的预览形式

1 需求 直接上需求&#xff1a; 我想要直接点击下面这个“预览”按钮&#xff0c;然后呈现出预览图片的形式 ok&#xff0c;需求知道了&#xff0c;下面让我们来看看如何实现吧 ~ 2 实现 template部分 <el-buttontype"primary"size"small"click&qu…

Java集合(一)--Map(2)

ConcurrentHashMap与HashTable 底层实现 在JDK1.7时&#xff0c;底层采用的是分段数组&#xff0b;链表的形式&#xff0c;在JDK1.8之后&#xff0c;采用的是与HashMap相同的形式&#xff0c;数组链表/红黑树。而HashTable采用的是数组链表的形式。 如何实现线程安全 Concu…

SpringBoot新增菜品模块开发(事务管理+批量插入+主键回填)

需求分析与设计 一&#xff1a;产品原型 后台系统中可以管理菜品信息&#xff0c;通过 新增功能来添加一个新的菜品&#xff0c;在添加菜品时需要选择当前菜品所属的菜品分类&#xff0c;并且需要上传菜品图片。 新增菜品原型&#xff1a; 当填写完表单信息, 点击"保存…

Python里安装了库却报错找不到是怎么回事?

你在写代码的时候有没有遇到过这样的问题&#xff1a; 明明已经用pip安装好了一个Python模块&#xff0c; 但当你在代码中使用时&#xff0c;却给你报错说找不到这个库。 出现这种情况&#xff0c;绝大多数都是因为你安装模块的那个pip&#xff0c;和你执行代码时的python&…

【数据分析】嫡权法EWM

总结&#xff1a;基于熵值信息来计算出权重&#xff0c;数据具有客观性。 目录 简介 计算步骤 案例 简介 熵值法原理 熵值法的基本思路是根据指标变异性的大小来确定客观权重信息熵:信息量的期望。可以理解成不确定性的大小&#xff0c;不确定性越大&#xff0c;信息熵也就…

js脚本解决因挂VPN导致boss上高德地图无法正常规划公交路线问题

​ 情况说明&#xff1a; 最开始一直以为boss上的查询自己所在地点到面试地点的公交的功能有bug,总是规划路线失败&#xff0c;结果这个一调试&#xff0c;发现是自己的经纬度有问题导致的。 程序猿嘛&#xff0c;开机VPN必须是挂着的&#xff0c;这就导致了boss获取到了错误…

Python中合并列表的五种方法!

在 Python 编程中&#xff0c;我们经常需要将两个或多个列表合并为一个。这个过程通常是为了数据处理或者进行更复杂的操作。 列表合并是一个将两个或多个列表的元素整合到一起的过程。Python 提供了多种方式来实现这一点&#xff0c;每种方式都有自己的应用场景。 一、使用 …