YOLO系列正负样本分配策略

1、YOLOv3

使用MaxIoUAssigner策略来给gt分配样本,基本上保证每个gt都有唯一的anchor对应,匹配的原则是该anchor与gt的IOU最大且大于FG_THRESH,这种分配制度会导致正样本比较少,cls和bbox分支训练起来可能比较慢。在剩余的anchor中,如果有anchor跟所有gt的IOU都小于BG_THRESH,则将此类anchor设为负样本,如果有anchor跟所有gt的IOU大于BG_THRESH且小于FG_THRESH,则忽视掉此类anchor。

下面以Towards-Realtime-MOT/utils/utils.py中的代码为例:

def build_targets_thres(target, anchor_wh, nA, nC, nGh, nGw):ID_THRESH = 0.5FG_THRESH = 0.5BG_THRESH = 0.4nB = len(target)  # number of images in batchassert(len(anchor_wh)==nA)tbox = torch.zeros(nB, nA, nGh, nGw, 4).cuda()  # batch size, anchors, grid sizetconf = torch.LongTensor(nB, nA, nGh, nGw).fill_(0).cuda()tid = torch.LongTensor(nB, nA, nGh, nGw, 1).fill_(-1).cuda() for b in range(nB):t = target[b]t_id = t[:, 1].clone().long().cuda()t = t[:,[0,2,3,4,5]]nTb = len(t)  # number of targetsif nTb == 0:continuegxy, gwh = t[: , 1:3].clone() , t[:, 3:5].clone()gxy[:, 0] = gxy[:, 0] * nGwgxy[:, 1] = gxy[:, 1] * nGhgwh[:, 0] = gwh[:, 0] * nGwgwh[:, 1] = gwh[:, 1] * nGhgxy[:, 0] = torch.clamp(gxy[:, 0], min=0, max=nGw -1)gxy[:, 1] = torch.clamp(gxy[:, 1], min=0, max=nGh -1)gt_boxes = torch.cat([gxy, gwh], dim=1)anchor_mesh = generate_anchor(nGh, nGw, anchor_wh)anchor_list = anchor_mesh.permute(0,2,3,1).contiguous().view(-1, 4)iou_pdist = bbox_iou(anchor_list, gt_boxes)iou_max, max_gt_index = torch.max(iou_pdist, dim=1)  ## 取出每个pre与gt的IOU最大值iou_map = iou_max.view(nA, nGh, nGw)       gt_index_map = max_gt_index.view(nA, nGh, nGw)id_index = iou_map > ID_THRESHfg_index = iou_map > FG_THRESH  ## 若IOU大于FG_THRESH,则为foregroundbg_index = iou_map < BG_THRESH  ## 若IOU小于BG_THRESH,则为backgroundign_index = (iou_map < FG_THRESH) * (iou_map > BG_THRESH)  ## 若IOU大于BG_THRESH并小于FG_THRESH,则ignoretconf[b][fg_index] = 1tconf[b][bg_index] = 0tconf[b][ign_index] = -1gt_index = gt_index_map[fg_index]gt_box_list = gt_boxes[gt_index]gt_id_list = t_id[gt_index_map[id_index]]if torch.sum(fg_index) > 0:tid[b][id_index] =  gt_id_list.unsqueeze(1)fg_anchor_list = anchor_list.view(nA, nGh, nGw, 4)[fg_index] delta_target = encode_delta(gt_box_list, fg_anchor_list)tbox[b][fg_index] = delta_targetreturn tconf, tbox, tid

2、YOLOv4

yolov4为了增加正样本,采用multi anchor策略,只要大于IoU阈值的anchor,都视为正样本

3、YOLOv5

确定gt是否匹配当前特征图的anchors

因为yolov5是多尺度预测,所以首先需要确定gt应该跟哪个尺度的特征图上的anchor进行匹配。规则为:gt的宽高分别与当前尺度下的anchor的宽高进行比较,如果它们的比例在[1/4,4]之间,则当前gt可以与当前尺度下的anchor进行匹配。

下面以yolov5/utils/loss.py代码为例:

# wh ratio
r = t[..., 4:6] / anchors[:, None]# compare
j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t']# filter
t = t[j]

将与gt中心点邻近的两个点也作为正样本点(即总共有3个正样本点) 

将gt所在的中心点视作一个ceil,并将该ceil划分成4个象限,如果gt的中心点位于该ceil中的第四象限,则将该ceil右边的单元格以及下边的单元格也视为正样本点(如下图的黄色单元格)

anchors, shape = self.anchors[i], p[i].shape
gain[2:6] = torch.tensor(shape)[[3, 2, 3, 2]]  ## 取当前尺度特征图的w、h,如果原图尺寸为[640,640],下采样8倍后,特征图的尺寸就变成[80,80],则gain[2:6]=[80,80,80,80]t = targets * gain  ## 将[0,1]之间的坐标映射到[0,80]上
g = 0.5  ## 偏移量,用于判断gt的x、y坐标在单元格的哪个象限if nt:## 求gt的宽高与anchor的宽高的比值r = t[..., 4:6] / anchors[:, None]## 判断比值是否在[1/4,4]这个范围内j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t']## 挑选符合条件的gtt = t[j]  gxy = t[:, 2:4]  ## gt的x、y坐标gxi = gain[[2, 3]] - gxy  ## gt的x、y坐标到w、h的距离## 由于gxy+gxi=[80,80],因此j和l互斥,k和m互斥j, k = ((gxy % 1 < g) & (gxy > 1)).Tl, m = ((gxi % 1 < g) & (gxi > 1)).Tj = torch.stack((torch.ones_like(j), j, k, l, m))## 将t复制成5份(gt中心点所在单元格加上该单元格的左、上、右、下的单元格)t = t.repeat((5, 1, 1))[j]offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j]

4、YOLOX

yolox的正负样本分配策略的代码可以参考:YOLOX中的SimOTA_Cassiel_cx的博客-CSDN博客

这里简单记录下SimOTA(simple optimal transport assignment)的步骤:

  1. 确定候选正样本计算anchor_box的中心点,若anchor_box的中心点落在gt内或者在以gt的中心点为圆心,以center_radius为半径的圆内,就将该anchor视为候选正样本。如下图所示,红色框为gt,绿色框为蓝点预测的anchor_box,假设该anchor_box的中心点为绿点,由于绿点在红框内,因此该anchor_box便作为候选正样本
  2. 计算候选正样本跟gt之间的cls loss和iou loss并以一定比例加权求和,作为cost,计算公式如下(如果anchor_box的中心点不在gt内,该anchor_box与gt的cost就会很大,对应代码中的100000.0 * (~is_in_boxes_and_center)
    cost = (pair_wise_cls_loss+ 3.0 * pair_wise_ious_loss+ 100000.0 * (~is_in_boxes_and_center))
  3. 对候选正样本与gt之间的iou进行大小排序,挑选前10个(可自己调整)最大iou,对这些iou求和并取整,该数值作为当前gt的dynamic_k
  4. 对于该gt,取前dynamic_k个最小的cost的候选正样本,作为正样本
  5. 如果存在一个正样本匹配多个gt的情况,则选cost较小的gt来匹配(如,某anchor_box与gt_1和gt_2的cost分别为0.8和0.2,则取消该anchor_box与gt_1的匹配,只匹配gt_2

5、YOLOv7

yolov7的正负样本分配策略为yolov5和yolox的结合体。首先使用yolov5的策略去挑选候选正样本,再使用yolox中的SimOTA策略去从候选正样本中挑选正样本。

【参考文章】

目标检测正负样本区分策略和平衡策略总结(一) - 知乎

yolov7正负样本分配详解 - 知乎 

深入浅出Yolo系列之Yolox核心基础完整讲解 - 知乎

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

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

相关文章

【微服务架构模式】微服务设计模式

这是微服务架构系列文章的第 3 篇 高可用性、可扩展性、故障恢复能力和性能是微服务的特征。您可以使用微服务架构模式来构建微服务应用程序&#xff0c;从而降低微服务失败的风险。 模式分为三层&#xff1a; 应用模式 应用程序模式解决了开发人员面临的问题&#xff0c;例如数…

vue表格实现一个简单的合并单元格功能

用的是vue2ant-design-vue 但是vue3或者element-ui也是同理 先上效果 需要后端的数据将相同id的放在一起 否则也会有问题 例如&#xff1a; this.list [{id: 1,name: 舟山接收站,...}{id: 2,name: 舟山接收站碳中和LNG,...},{id: 2,name: 舟山接收站碳中和LNG,...} ]// th…

Java-数据结构(一)-java1中有哪些数据结构呢?

这里写目录标题 前言一、为什么需要数据结构&#xff1f;1、低效的操作2、占用过多的内存空间3、困难的数据操作 二、枚举&#xff08;Enumeration&#xff09;1、定义2、关键字3、适用场景 三、 位集合&#xff08;BitSet&#xff09;1、定义2、方法3、适用场景 四、向量&…

联邦学习 (FL) 中常见的3种模型聚合方法

联邦学习 (FL) 中常见的3种模型聚合方法 联合学习 (FL) 是一种出色的 ML 方法&#xff0c;它使多个设备&#xff08;例如物联网 (IoT) 设备&#xff09;或计算机能够在模型训练完成时进行协作&#xff0c;而无需共享它们的数据。 “客户端”是 FL 中使用的计算机和设备&#x…

通用分页详解【下】

目录 前言 一、通用分页的核心思想 二、PageBean的分页要素及优化 三、SQL的通用 1.获取总记录数 2.获取分页语句 四、PageTag的核心逻辑见解 五、运行流程 案例运用 注意&#xff1a; 1.pageBean优化 2.tld文件 3.分页标签助手类 4.Servlet层 5.jsp页面 6.结果输…

借助APlayer、MetingJS实现 网页音乐播放器

借助APlayer、MetingJS实现 1、src/publi/index.html引入 <script src"https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"></script> <script src"https://cdn.jsdelivr.net/npm/meting2.0.1/dist/Meting.min.js"></scri…

2.Elasticsearch核心概念

文章目录 一、Es中的核心概念1.1文档和字段1.2 索引和映射1.3 Mysql与Elasticsearch的区别1.4 Elasticsearch中分片的概念1.4.1 什么是分片数1.4.2 什么是副本数1.4.3 分片和副本带来的好处一、Es中的核心概念 elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似…

一步一步学OAK之五:通过OAK相机实现边缘检测

目录 边缘检测简介Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点创建相机节点创建边缘检测节点创建XLinkOut数据交互的节点 Setup 6:设置相关属性设置彩色相机的相关属性设置左侧和右侧的单目相机的相关属性设置边缘检测器的…

加速优化WooCommerce跨境电商网站的15种简单方法

Neil Patel和 Google所做的研究表明&#xff0c;如果加载时间超过三秒&#xff0c;将近一半的用户会离开网站。页面加载时间每增加一秒&#xff08;最多5秒&#xff09;&#xff0c;您的收入可能就会减少。在本教程中&#xff0c;我们将学习如何优化加速WooCommerce商店。 目录…

Linux 的逻辑世界与 Windows 的复杂性

Linux的逻辑世界与Windows的复杂性 作为操作系统&#xff0c;Linux 和 Windows 都在全球用户心中赢得了一席之地。 这两种系统都很常用&#xff0c;每种都有不同的原因和目的。 作为一名有用的 AI 助手&#xff0c;我有机会广泛使用 Linux 和 Windows&#xff0c;并且我想探索…

centos7 安装Python3.9

1. 安装编译相关软件 su yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install libffi-devel -y2.下载安…

B+树

B树 B树是对B树的一种变形树&#xff0c;它与B树的差异在于: 非叶结点仅具有索引作用&#xff0c;也就是说&#xff0c;非叶子结点只存储key&#xff0c;不存储value 树的所有叶结点构成一个有序链表&#xff0c;可以按照key排序的次序遍历全部数据 B树存储数据 若参数M选…