nanodet阅读:(2)正负样本定义(ATSS)

2023-05-16

一、 前言

本篇博客主要是ATSS部分,这部分个人认为是核心之一,毕竟正负样本的选择很重要,ATSS论文证实,anchor-basedanchor-free性能差异的根本原因在于正负样本的定义,好的正负样本定义方法能在很大程度上降低模型对Anchor Num, Anchor Size的依赖。这点在yolo v5上也得到了证实——“正确的正负样本定义方式能引入更多的高质量正样本,加快拟合 并 提高模型性能”。
首先推荐一个写的很好的 ATSS博客,看完它再看代码会清晰许多。以及我写的ATSS部分代码注释。

二、 正文

根据代码总结的ATSS流程如下:

  1. 遍历每个ground truth,遍历每个输出层,找出每层前topk(超参,nanodet中是9)个L2距离(anchorgt box中心点距离)最小的anchornanodet一共3层输出层,则每个gt会匹配到27个候选anchor,输出数组shape=(27, gt_num)。这些anchor里可能会有重复,但是没关系,下面还有筛选措施;
  2. 计算每个gt和与之对应的27anchorIOU值,shape=(27, gt_num)(注意是与anchor左上右下的坐标做iou,不是和bbox,现在是给anchor做正负样本分类,还没到bbox呢);
  3. 按列计算每个gt对应的27IOU值的均值mean_IOU和标准差std_IOU,两者相加得到每个gt的自适应阈值,shape = (gt_num, );
  4. 从每个gt27anchor中筛选出IOU大于对应自适应阈值的anchor
  5. 再计算每个anchor中心到其对应gt四条边界线的距离,取四个距离中的最小值,过滤掉最小值小于0.01anchor,剩下的就是挑选出的正样本;
  6. 到这步时,可能有些anchor同时匹配了多个gt,此时需选出IOU值最大的那个gt作为匹配对象。即一个anchor只能匹配到一个gt,但是一个gt可以同时被多个anchcor匹配。

从上面流程来看,一个anchor要成为一个正样本,需要满足三个条件:
① 其中心要与任何一个gt中心的距离要排在前topk内(升序);
② 其与gtiou值要大于对应的iou阈值;
③ 其中心与gt四条边的距离都要大于0.01
由此引发疑惑并思考之:
1. IOU阈值为什么取均值与标准差之和?
个人理解:均值代表了候选anchorgt整体匹配程度,越大说明整体匹配度越高,候选anchor的质量也就越好。标准差本代表了数据的分散程度,越大说明候选anchor之间与对应gt匹配度相差越大,即候选anchor之间质量相差越大。二者相加,可以筛除很多低质量候选anchor

2. 为什么要以anchor中心与gt四条边的距离来筛选候选anchor
个人理解ATSS论文里只要求anchor中心在gt内部,即中心到gt边界的距离大于0就够了,代码实现时改为大于0.01,个人理解是借鉴了label smooth的思路,毕竟对于softmax 函数来说,0是很难学习到的。
然后疑问是,为什么anchor中心要在gt内部,因为nanodet是学习anchor中心到gt四条边界的距离,学习出来的四个距离都是正数(见下面代码),如果anchor中心在gt外部,那模型是学习不出来一个负数给它拉回去的。其次,anchor中心在gt内部,意味着anchor有更多的特征来学习。

# 下面是 bbox 输出处理成 bbox 坐标的处理函数
class Integral(nn.Module):
    def __init__(self, reg_max=16):
        super(Integral, self).__init__()
        self.reg_max = reg_max  # 7
        self.register_buffer(
            "project", torch.linspace(0, self.reg_max, self.reg_max + 1)  # 返回一维 tensor = [0, 1, 2, 3, ... reg_max]
        )

    def forward(self, x):  # 输入 x 就是原始 bbox 输出
        x = F.softmax(x.reshape(-1, self.reg_max + 1), dim=1)  # softmax 之后,数据就是 (0, 1)之间了
        x = F.linear(x, self.project.type_as(x)).reshape(-1, 4)  # 与 self.project 做矩阵相乘,返回 (0, reg_max) 之间的数
        return x  # x 中每个元素都正数

最后反问一下,提高要求为gt中心在anchor内部行不行?那这样的话,一个gt在每个输出层上只能与一个anchor相对应,减少了高质量正样本,上文说过,更多的高质量正样本,能加快拟合 并 提高模型性能。
3. 为什么要加上 gt_idx * num_bboxes
个人理解:

# num_gt 是一张图片中 gt 数目,num_bboxes 是 anchor 数目
# 下面是疑惑 1
for gt_idx in range(num_gt):  # (topk * 3, num_gt)
            candidate_idxs[:, gt_idx] += gt_idx * num_bboxes 
ep_bboxes_cx = (  # (num_bboxes, ) -> (1, num_bboxes) -> (num_gt, num_bboxes) -> (num_gt * num_bboxes)
            bboxes_cx.view(1, -1).expand(num_gt, num_bboxes).contiguous().view(-1)  # 注意它的长度是 num_gt * num_bboxes
        )
candidate_idxs = candidate_idxs.view(-1)  # (topk * 3 * num_gt)
l_ = ep_bboxes_cx[candidate_idxs].view(-1, num_gt) - gt_bboxes[:, 0]

candidate_idxs = candidate_idxs.view(-1)

一开始不明白为什么要candidate_idxs[:, gt_idx] += gt_idx * num_bboxes 这样,仔细想了下才搞清楚,这是因为起初candidate_idxs里的值,都是相对的,什么意思呢?看下图吧。
在这里插入图片描述

candidate_idxs的数据分布类似于上图左边的样式,它的列数就是当前输入图片中ground truth的个数,它每列元素的含义是离每个ground truth 最近的 topkanchor 的索引值(针对一个输出层而言),即行索引, shape = (topk, num_gt),而nanodet有三个输出层,所以最后candidate_idxs.shape = (topk * 3, num_gt)。但是它每列的索引值范围都是[0, num_bboxes),这就是我说的相对值。而ep_bboxes_cx最后是view(-1)成一个一维向量,这样一来相对位置不能用了,要把行数考虑进去,这也是加上gt_idx * num_bboxes的原因。但奇怪的是candidate_idxs的行数是num_gt,怎么代码里面是num_bboxes,这是因为最后处理的数组是ep_bboxes_cx,它的shape = (num_gt * num_bboxes),行数正好是num_bboxes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nanodet阅读:(2)正负样本定义(ATSS) 的相关文章

  • Rust 基础(一)

    Rust 1 65 发布于2022 11 03 一 安装 配置环境变量 RUSTUP HOME Rustup元数据和工具链将被安装到Rustup主目录中 默认 xff1a USERPROFILE rustup CARGO HOME Carg
  • 定制适用于ARM平台的Ubuntu rootfs(根文件系统)

    0 背景 有一个很厉害的师兄针对我们实验室的需求设计了一块控制板 xff0c 以beaglebone为基础 xff0c 由于更改了一些底层的硬件 xff0c 所以重新定制编译的内核 xff0c 并预先烧写到了板子的flash中 现在需要安装
  • Win10使用附件中的远程桌面连接Ubuntu 16.04图形界面(xrdp方法)

    Ubuntu16 04下 以下命令行皆是在终端中运行 xff1a 安装xrdp sudo apt get install xrdp 安装vnc4server sudo apt get install vnc4server 安装xubuntu
  • CMake构建OpenCV项目

    文章目录 前言一 基本概念二 操作步骤1 创建OpenCV程序2 创建CMake文件3 编译项目4 运行项目 总结 前言 CMake是个一个开源的跨平台自动化建构系统 xff0c 用来管理软件建置的程序 xff0c 并不依赖于某特定编译器
  • 5GC基础:架构和网元

    1 主要内容 5GC xff08 SA xff09 架构介绍 5GC主要网元及功能对比 5GC网络架构的主要变化 SBA架构网元的注册 发现与选择CUPS边缘计算MM和SM的分离计算与存储的解耦与非3GPP的互操作能力开放PCC架构的变化
  • visual studio进入时许可证已过期解决方案

    新手小白 xff0c 记录一下 问题 xff1a 解决步骤 xff1a 1 打开visual studio installer gt 点击更多 gt 点击修复 2 等待更新安装 xff08 耗时略微有些长 xff09 3 点击启动 xff0
  • Qt 在windows 和linux 下的编译教程

    Qt 源码下载地址 xff1a https download qt io archive qt 打开上面的网址 xff0c 进入 submodules 目录下载 qtbase everywhere src 6 4 2 zip xff0c 这
  • 【位运算总结】 之 左移运算

    左移运算的概念 xff1a 左移运算符 应用 xff1a 1 优化代码 因为左移运算比乘法快 xff0c 因此x 61 x 2可优化为x 61 x lt lt 1 2 计算一个数的二进制的某位 如题 xff1a 给定一个含不同整数的集合 x
  • 关于Qt的QMainWindow、QTableWidget、QComboBox、QScrollArea的widget导致的qss无效问题

    问题 前阵子比较忙 xff0c 忘记记录这个问题了 事情是我在写QTableWidget的qss时候 xff0c 要把下图红色箭头指向的这个边角样式改变时发现的 我发现我对QTabelCornerButton写样式无效 但是我印象里 xff
  • Ubuntu 系统 dpkg 命令使用详解

    dpkg 即 package manager for Debian xff0c 是 Debian 和基于 Debian 的系统中一个主要的包管理工具 xff0c 可以用来安装 构建 卸载 管理 deb 格式的软件包 安装软件 使用 span
  • [python]输出“hello 姓名”

    print 34 hello tianxinyao 34
  • Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的 xff0c 基于java语言开发的轻量级的中文分词工具包 官网 xff1a https code google com archive p ik analyzer 本用例借助 IKAnalyzer 进行分

随机推荐

  • 虚拟机可以连接,但是不能上网

    解决方法链接 虚拟可以连接但不能上网 xff0c 一般是DNS的问题 解决方法 xff1a xff08 1 xff09 进入网络共享中 xff0c xff08 2 xff09 进入本地连接 属性 xff08 3 xff09 进入TCP IP
  • QThread必须要了解的几个函数

    概述 如果想对Qt中的QThread有个更加深刻的了解 xff0c 必须要知道这几个重要的函数 xff0c 现在就一一介绍下 函数介绍 属性返回值函数体功能staticQThread QThread currentThread 返回当前线程
  • codeforces 766C Mahmoud and a Message

    题意 xff1a 给你一个长度为n的仅包括小写字母的字符串 xff0c 每个小写字母能在一个长度不超过a i xff08 i是小写字母序号如a为0 xff09 的子串中 问 xff1a 1 有多少种分隔方法 2 所有分割方法中最长的子串有多
  • 结构体对齐详解

    1 结构体基础知识 a 认识结构体 结构体是一些值的集合 这些值称为成员变量 结构体的每个成员可以是不同类型的变量 声明一个结构体类型 声明一个学生类型 Stu就是你对这个结构体的称呼 struct Stu char name 20 cha
  • gitlab搬迁到其它服务器

    由于一些因素 xff0c 需要把gitlab从A服务器搬迁到B服务器 xff0c 现记录步骤如下 xff1a 1 查看A服务器的gitlab版本号 xff1a cat opt gitlab embedded service gitlab r
  • 深度学习在图像超分辨率重建中的应用

    同步更新于知乎 xff1a https zhuanlan zhihu com p 25532538 超分辨率技术 xff08 Super Resolution xff09 是指从观测到的低分辨率图像重建出相应的高分辨率图像 xff0c 在监
  • Xorg 的认识

    1 什么是X Window服务器 xff1f 一种图形用户界面只不过是运行在系统上的一个应用程序 它不是 Linux内核的一部分 xff0c 也没有 集成在你的系统里 它是一个可以为你的工作站提供图形化工作界面的强大工具 由于标准的重要性
  • 利用Python获取带合并单元格的表格数据

    由于在日常运维中经常出现一些合并单元格的表格 xff0c 如果要获取数据比较麻烦 xff0c 现将将封装成类 xff0c 并通过调用list excel data 获取列表形式的数据 dict excel data xff1a 获取字典格式
  • 输出不重复的数组元素

    include lt stdio h gt include lt stdlib h gt include lt math h gt int main int n int f 61 1 scanf 34 d 34 amp n int a n
  • UDP编程之windows socket 缓冲区默认大小

    笔者遇到下位机发过来的几百k的文件 xff0c 为了调试方便 xff0c 一开始并没有加协议 后面发现在OnRecv的回调中打印消息时 xff0c 居然UDP丢包了 后面经过多次分析 xff0c 才发现windows默认的socket缓冲区
  • Wmmem占用内存、CPU过多

    Wmmem占用内存 CPU过多 1 问题描述2 解释 2 1 Vmmem是啥2 2 解决办法 1 问题描述 Windows10中 xff0c 没跑啥软件 xff0c 就看见内存满了 Vmmem占用最多 2 解释 2 1 Vmmem是啥 wi
  • Java基础篇:反射机制详解

    一 什么是反射 xff1a xff08 1 xff09 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息 xff0c 从而操作类或对象的属性和方法 本质是JVM得到class对象之后 xff0c 再通过class对象进行反编
  • 使用linux裁剪树莓派完整sd卡镜像

    解决了最小镜像的制作问题以后 xff0c 就发现手里已经积攒了不少用Win32DiskImager制作的完整sd卡镜像 虽然压缩过了以后很小 xff0c 但是在恢复镜像时32G大小的写入速度简直慢到龟速 xff0c 所以我通过Ubuntu来
  • Arch 安装中文输入法

    推荐安装小狼毫输入法 安装 从官方仓库安装ibus软件包 xff1a span class hljs comment pacman S ibus span 此外 xff0c 为了启动ibus的Qt应用程序支持 安装ibus qt软件库 xf
  • angular11报错Can‘t bind to ‘ngForOf‘ since it isn‘t a known property of ‘tr‘. 三种排查办法以及解决方案

    当你遇到Can t bind to ngForOf since it isn t a known property of tr 34 无法绑定到 ngforof xff0c 因为它不是 tr 的已知属性 xff08 可能问题一 xff1a
  • 如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等协议访问应用程序

    简介 WebDAV xff08 Web based Distributed Authoring and Versioning xff09 是基于 HTTP 1 1 的一个通信协议 它为 HTTP 1 1 添加了一些扩展 xff08 就是在
  • c++对象模型系列

    一 指针与引用 一 概括 指针和引用 xff0c 在C 43 43 的软件开发中非常常见 xff0c 如果能恰当的使用它们能够极大的提 高整个软件的效率 xff0c 但是很多的C 43 43 学习者对它们的各种使用情况并不是都了解 xff0
  • ProxmoxVE 6.4-13 (PVE)安装 OpenWrt

    创建虚拟机没什么好说的 xff0c 和大多数教程一样 xff0c 主要记录下我遇到的问题 img2kvm报错 storage 39 vm 103 disk 0 39 does not exist 吐槽 xff1a 这玩意官网打不开 xff0
  • IOS学习笔记8—UITableViewController

    UITableViewController是IOS开发中一个比较重要的试图控制器 xff0c 是集成了UITableView视图的控制器 xff0c 在实际开发中经常用到 xff0c 功能非常强大 xff0c 可定制性也很高 xff0c 下
  • nanodet阅读:(2)正负样本定义(ATSS)

    一 前言 本篇博客主要是ATSS部分 xff0c 这部分个人认为是核心之一 xff0c 毕竟正负样本的选择很重要 xff0c ATSS论文证实 xff0c anchor based和anchor free性能差异的根本原因在于正负样本的定义