YOLO系列正负样本分配策略

news2024/9/28 11:12:19

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.5
    FG_THRESH = 0.5
    BG_THRESH = 0.4
    nB = len(target)  # number of images in batch
    assert(len(anchor_wh)==nA)

    tbox = torch.zeros(nB, nA, nGh, nGw, 4).cuda()  # batch size, anchors, grid size
    tconf = 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 targets
        if nTb == 0:
            continue

        gxy, gwh = t[: , 1:3].clone() , t[:, 3:5].clone()
        gxy[:, 0] = gxy[:, 0] * nGw
        gxy[:, 1] = gxy[:, 1] * nGh
        gwh[:, 0] = gwh[:, 0] * nGw
        gwh[:, 1] = gwh[:, 1] * nGh
        gxy[:, 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_THRESH
        fg_index = iou_map > FG_THRESH  ## 若IOU大于FG_THRESH,则为foreground
        bg_index = iou_map < BG_THRESH  ## 若IOU小于BG_THRESH,则为background
        ign_index = (iou_map < FG_THRESH) * (iou_map > BG_THRESH)  ## 若IOU大于BG_THRESH并小于FG_THRESH,则ignore
        tconf[b][fg_index] = 1
        tconf[b][bg_index] = 0
        tconf[b][ign_index] = -1

        gt_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_target
    return 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']
    ## 挑选符合条件的gt
    t = 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)).T
    l, m = ((gxi % 1 < g) & (gxi > 1)).T
    j = 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.coloradmin.cn/o/712042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(三)Flask前置知识栈——装饰器

在后续的讲解中&#xff0c;对大家对装饰器的掌握程度要求较高&#xff0c;所以此文来深入讲解一下&#xff0c;有看过《Python全栈系列教程》专栏的小伙伴可能会说&#xff0c;装饰器已经出过文章讲的很详细了。饶是如此&#xff0c;深究过装饰器的小伙伴们就权当复习一遍&…

荣耀笔记本怎么重装Win10系统?荣耀笔记本用U盘重装系统Win10教程

随着时间的推移&#xff0c;荣耀笔记本系统可能会变得缓慢、不稳定&#xff0c;甚至出现故障&#xff0c;这时候&#xff0c;重装操作系统就成为了一个必要的选择&#xff0c;那么怎么给荣耀笔记本电脑重装Win10系统呢&#xff0c;可以按照系统之家小编分享的荣耀笔记本用U盘重…

提升矿井水质安全性:矿井水除氟领域的应用与优势

引言 随着工业化进程的推进&#xff0c;矿井水中含有过量的氟离子已成为一个严重的环境问题。高浓度的氟离子对人体健康和生态环境都具有危害。因此&#xff0c;矿井水除氟工艺的研究和应用变得至关重要。 当废水中的氟超标超过了环保标准时&#xff0c;可能会对环境和人类健康…

【AUTOSAR】VCU开发实际项目讲解(一)----VCU系统边界条件

VCU系统边界条件 VCU基本性能参数 序号 项目 参考指标 试验方法或评定指标 1 外形尺寸 长244mm*宽156mm*41.4mm&#xff08;参考尺寸&#xff09; 2 工作电压 正常工作电压 9V-16V CAN通讯电压 8V-18V 不保证功能 &#xff1c;8V or &#xff1e;18V 3 过压保…

基于深度学习的高精度老虎检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度老虎检测识别系统可用于日常生活中或野外来检测与定位老虎目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的老虎目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

host碰撞,利用host碰撞突破访问边界

文章目录 host 碰撞漏洞原理漏洞利用步骤漏洞复现 host 碰撞 直接利用ip访问显示的是403 404 400 500&#xff0c;但是用域名请求就会返回正常业务。当然在排除WAF作祟下&#xff08;有一些WAF它会要求使用域名访问&#xff0c;使用IP的会出现WAF的拦截界面&#xff09;&#…

记录node.js+vue-elementui-admin的后台管理系统登录传参问题

前言&#xff1a;本来想用Node做后端&#xff0c;vue-element-admin做前端来练习一下技术&#xff0c;了解一下开发的过程 // 用户登录处理函数 exports.login (req, res) > {console.log(req.body)const userinfo req.bodyconst sql select * from user where username…

迪赛智慧数——柱状图(象形动态图):高考填报专业考虑的因素

效果图 填报志愿是高考后的一大重要环节&#xff0c;你的职业生涯就在这里起航了。那么&#xff0c;应该怎么填报志愿呢&#xff1f;高考填报专业考虑的因素很多&#xff0c;过半的人会考虑专业就业前景及薪资&#xff0c;其次是个人兴趣和是否为双一流建设学科。 数据源&…

Spring中bean使用方法

Spring框架是一个非常重要的开发工具&#xff0c;它提供了丰富的功能和模块&#xff0c;其中核心的概念之一就是Spring Bean。Spring Bean是Spring IoC容器中的一个对象&#xff0c;它负责管理一个Java对象的生命周期以及依赖注入。下面我将通过互联网场景下的相关背景内容来阐…

[SSM]MyBatis基础

目录 一、MyBatis概述 1.1框架&#xff08;framework&#xff09; 1.2三层架构 1.3JDBC的不足 1.4了解MyBatis 二、MyBatis入门程序 2.1resources目录 2.2开发步骤 2.3从XML中构建SqlSessionFactory 2.4mybatis中有两个主要的配置文件 2.5关于第一个程序的细节 2.6关…

Linux read的核心函数generic_file_buffered_read

内核&#xff1a;5.9.0 流程图 generic_file_buffered_read一种调用路径&#xff08;cat某个文件触发&#xff09;&#xff1a; #0 ondemand_readahead (mapping0xffff888005c61340, ra0xffff888005927598, filp0xffff888005927500, hit_readahead_markerfalse, index0, req…

Linux历史及环境搭建(VMware搭建CentOS7环境以及使用XShell连接Vmware)

Linux历史及环境搭建 1.Linux历史1.1 UNIX发展的历史1.2 Linux发展历史1.2.1 开源1.2.2 官网1.2.3 发行版本 2.VMware配置CentOS7环境2.1 CentOS下载2.2 配置环境2.3 切换国内阿里源2.4 无图形化界面开机2.5 使用XShell连接VMware 结语 1.Linux历史 在这里简要介绍Linux的发展…

全局配置cnpm淘宝镜像

node是一个非常好用的项目管理工具 但这是一个国外的工具 我们直接执行npm命令因为是用的国外的镜像 会比较慢 那么 我们就可以用cnpm来处理 但前提是你要搭建好环境 我们先打开终端 安装 淘宝镜像 输入 npm install -g cnpm --registryhttps://registry.npm.taobao.org然后 n…

最强DETR+YOLO,三阶段目标检测器DEYOv2正式发布,性能炸裂!

导读 目标检测算法是CV领域非常重要的算法,去年二阶段DEYO的发布,提出了很多的创新点,而本文端到端的 论文链接:https://arxiv.org/pdf/2306.09165.pdf 本文提出了一种称为DEYOv2的新型目标检测器,这是第一版DEYO(DETR with YOLO)模型的改进版本。与前代类似,DEYOv2采…

企企通创始人CEO徐辉:数字生态与数字化供应链如何连通

6月16日&#xff0c;2023年华映资本年度大会在杭州成功举办。 2023年华映资本年度大会以“无限新成皆繁星”为主题。在为期一天的峰会中&#xff0c;华映资本合伙人团队、投资团队、华映资本被投企业创始人以及行业嘉宾等50位嘉宾汇聚一堂&#xff0c;既探讨行业当下科技强共识…

硬件可信方案-EVITA HSM

信息安全中的HSM 和 SHE 两个概念有什么区别和相同的地方&#xff1f; HSM&#xff0c;硬件安全模块&#xff0c;Hardware Security ModuleSHE&#xff0c;安全硬件扩展&#xff0c;Secure Hardware Extension EVITA研究项目的目标是为汽车车载网络设计、验证一个体系架构&am…

STM32单片机双通道FM调频数字音量收音机可存台音量可调TEA5767

实践制作DIY- GC0148---双通道FM调频数字音量收音机 基于STM32单片机设计---双通道FM调频数字音量收音机 二、功能介绍&#xff1a; STM32F103C系列最小系统板TEA5767 收音机模块LCD1602显示器喇叭功放模块数字电位器多个按键&#xff08;存储、S1、S2、S3、频率-0.1MHz、频率…

【AUTOSAR】VCU开发实际项目讲解(二)----VCU软件与结构描述

VCU软件描述 VCU软件架构主要分为底层软件驱动和应用层控制策略&#xff0c;其中应用层控制策略通过基于模型的开发&#xff0c;自动生成代码并可与底层驱动软件实现无缝连接。 VCU软件通过BOOTLOADER和CAN总线进行更新刷写。 标定及诊断 支持CCP/XCP标定协议支持UDS诊断协议及…

聊一聊分布式会话的解决方案

1、传统Session 1、传统session的概述 1、认证过程 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&#xff08;session&#xff09;里面保存相关数据&#xff0c;比如用户角色、登录时间等等。 3、服务器向用户返回一个 session_id&#xff…

电子会议桌卡

一、产品描述 采用电子墨水显示屏作为显示屏&#xff0c;取代传统的纸质或LCD铭牌&#xff0c;高科技的外观设计和节能的显示解决方案&#xff0c;结合网络和移动APP&#xff0c;为用户提供更便捷的会议工作服务。 电子铭牌具有环保、节能、操作方便、实用范围广等特点。 本…