【yolov7系列二】正负样本分配策略

2023-11-17

本文主要就yolov7的正负样本筛选策略,并与yolov5,yolov6进行比对。

首先接着上一篇yolov7系列一,网络整体结构,填几个小坑,希望对大家没有造成困扰:
在这里插入图片描述
如:E-ELAN层,在cat后需要要conv层做特征融合:
在这里插入图片描述
还有SPPCSPC层经大家勘误后,改动如下:
在这里插入图片描述
还有另外几个小问题:如REPconv层在yolov7论文中将identity 层去掉,卷积后的激活函数是SiLu这些,因yolov7网络是基于Tag0.1版本yolov7.yaml的代码构造的,作者后续在持续优化迭代,后续大刀也会继续更新。

**yolov7因为基于anchor based的目标检测,与yolov5相同,yolov6的正负样本的匹配策略则与yolox相同,yolov7则基本集成两家之所长。**下面先回顾下yolov5,v6的正负样本匹配策略。

yolov5的正负样本匹配策略

yolov5基于anchor based,在开始训练前,会基于训练集中gt(ground truth 框),通过k-means聚类算法,先验获得9个从小到大排列的anchor框。先将每个gt与9个anchor匹配(以前是IOU匹配,yolov5中变成shape匹配,计算gt与9个anchor的长宽比,如果长宽比小于设定阈值,说明该gt和对应的anchor匹配)
在这里插入图片描述
如上图为yolov5的网络架构,yolov5有三层网络,9个anchor, 从小到大,每3个anchor对应一层prediction网络,gt与之对应anchor所在的层,用于对该gt做训练预测,一个gt可能与几个anchor均能匹配上。
所以一个gt可能在不同的网络层上做预测训练,大大增加了正样本的数量,当然也会出现gt与所有anchor都匹配不上的情况,这样gt就会被当成背景,不参与训练,说明anchor框尺寸设计的不好。

在训练过程中怎么定义正负样本呢,因为yolov5中负样本不参与训练,所以要增加正样本的数量。gt框与anchor框匹配后,得到anchor框对应的网络层的grid,看gt中心点落在哪个grid上,不仅取该grid中和gt匹配的anchor作为正样本,还取相邻的的两个grid中的anchor为正样本。

如下图所示**,绿色的gt框中心点落在红色grid的第三象限里,那不仅取该grid,还要取左边的grid和下面的grid,**这样基于三个grid和匹配的anchor就有三个中心点位于三个grid中心点,长宽为anchor长宽的正样本,同时gt不仅与一个anchor框匹配,如果跟几个anchor框都匹配上,所以可能有3-27个正样本,增大正样本数量。

在这里插入图片描述

yolov6的正负样本匹配策略

yolov6的正负样本匹配策略同yolox,yolovx因为是anchor free,anchor free因为缺少先验框这个先验知识,理论上应该是对场景的泛化性更好,同时参见旷视的官方解读:Anchor 增加了检测头的复杂度以及生成结果的数量,将大量检测结果从NPU搬运到CPU上对于某些边缘设备是无法容忍的。

yolov6中的正样本筛选,主要分成以下几个部分:
①:基于两个维度来粗略筛选;
②:基于simOTA进一步筛选。

具体步骤如下:
在这里插入图片描述
tie标签的gt如图所示,找到gt的中心点(Cx,Cy),计算中心点到左上角的距离(l_l,l_t),右下角坐标(l_r,l_b),然后从两步筛选正样本:

第一步粗略筛选第一个维度是如果grid的中心点落在gt中,则认为该grid所预测的框为正样本,如图所示的红色和橙色部分**,第二个维度是**以gt的中心点所在grid的中心点为中心点,上下左右扩充2.5个grid步长范围内的grid,则默认该grid所预测的框为正样本,如图紫色和橙色部分。这样第一步筛选出31个正样本(注:这里单独一层的正样本,yolov6有三个网络层,分别计算出各层的正样本,并叠加)。
在这里插入图片描述
第二步:通过SimOTA进一步筛选:

SimOTA是基于OTA的一种优化,OTA是一种动态匹配算法,具体参见旷视官方解读(https://www.zhihu.com/question/473350307/answer/2021031747)

SimOTA流程如下:
①计算初筛正样本与gt的IOU,并对IOU从大到小排序,取前十之和并取整,记为b。
②计算初筛正样本的cos代价函数,将cos代价函数从小到大排列,取cos前b的样本为正样本。
同时考虑同一个grid预测框被两个gt关联的情况,取cos较小的值,该预测框为对应的gt的正样本。
具体细节可以参考江大白的知乎文章:https://www.zhihu.com/search?type=content&q=simOTA

yolov7的正负样本匹配策略

yolov7因为基于anchor based , 集成v5和v6两者的精华,即yolov6中的第一步的初筛换成了yolov5中的筛选正样本的策略,保留第二步的simOTA进一步筛选策略。

同时yolov7中有aux_headlead_head 两个head ,aux_head做为辅助,其筛选正样本的策略和lead_head相同,但更宽松。如在第一步筛选时,lead_head 取中心点所在grid和与之接近的两个grid对应的预测框做为正样本,如图绿色的grid, aux_head则取中心点以及周围的4个预测框为正样本。如下图绿色+蓝色区域的grid.
在这里插入图片描述
同时在第二步simOTA部分,lead_head 是计算初筛正样本与gt的IOU,并对IOU从大到小排序,取前十之和并取整,记为b。aux_head 则取前二十之和并取整。其他步骤相同,aux_head主要是为了增加召回率,防止漏检,lead_head再基于aux_head 做进一步筛选。

以上为yolov7的正负样本的匹配策略,希望对大家有帮助。同时文中如果有bug,欢迎一起讨论。

最后如果大家需文中ppt使用,请关注公众号后台添加微信,领取,备注“ppt”。

参考:
[1] https://github.com/WongKinYiu/yolov7(官方github代码)
[2] https://arxiv.org/pdf/2207.02696.pdf(yolov7论文)
[3] ]https://zhuanlan.zhihu.com/p/39
[4]YOLOv7官方开源 | Alexey Bochkovskiy站台,精度速度超越所有YOLO,还得是AB (qq.com)
[5] 如何评价旷视开源的YOLOX,效果超过YOLOv5?

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

【yolov7系列二】正负样本分配策略 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • Python 类型提示 Dict 语法错误 可变默认值是不允许的。使用“默认工厂”

    我不知道为什么解释器会抱怨这个类型的字典 对于这两个实例 我得到一个 不允许可变默认值 使用默认工厂 语法错误 我使用的是 python 3 7 3 from dataclasses import dataclass from typing
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • mysql不包含模糊查询

    包含like 不包含not like select from 数据库表 where HouseName like 江门奥园项目 and HouseName like 幢 and HouseName not like 商 不包含not in
  • jupyter修改文件目录和虚拟环境

    在我们安装完jupyter的时候 他是默认为根目录的 我们想切换到我们自己创建的文件目录中该怎么做呢 请看下面步骤 一 切换文件目录 首先 先在我们要放的目录下创建一个文件夹 如 我的为 F Jupyter 在命令行窗口中输入 jupyte
  • cocos2dx 常见的49中动作详解

    bool HelloWorld init 1 super init first if CCLayer init return false CCSprite sp CCSprite create Icon png sp gt setPosit
  • java中的类型赋值常见错误

    Java中float double long类型变量赋值添加f d L尾缀问题 添加尾缀说明 我们知道Java在变量赋值的时候 其中float double long数据类型变量 需要在赋值直接量后面分别添加f或F d或D l或L尾缀来说明
  • JAVA的可变类与不可变类

    可变类和不可变类 Mutable and Immutable Objects 的初步定义 可变类 当你获得这个类的一个实例引用时 你可以改变这个实例的内容 不可变类 当你获得这个类的一个实例引用时 你不可以改变这个实例的内容 不可变类的实例
  • Mybatis批量插入数据的三种方式分享

    转自 Mybatis批量插入数据的三种方式分享 下文笔者讲述Mybatis插入数据的方法分享 如下所示 for循环insert long start System currentTimeMillis for int i 0 i lt 100
  • 结构化思维

    我们在求职时 经常能看到岗位要求上写着 逻辑思维 系统 结构化思维 身为一个直觉的打工仔 面对未来Boss耳提面命的 能力标签 我们怎能视若无睹 逻辑思维 好理解 不就 判断 推理 嘛 可这 结构化思维 是啥 很多人就答不上来了 在理解概念
  • electron ajax路径,electron 文件及文件夹上传的问题探索

    不晓得如今electron最新版的dialog解决了这个问题没有 选择文件夹的时候没有返回文件夹里面全部的文件 而是返回了文件夹的路径 一样的在网页端是能够经过webkitDirectory获取到文件夹下面全部的文件node 我试了不少的方
  • https开头的网址是什么意思_网址是什么意思?基础知识普及

    通俗的理解网址就是常说的URL 是很多个它一起组成了数量庞大形形色色的网站 网址 Uniform Resource Locator 统一资源定位器 是计算机Web网络相关的术语 就是网页地址的意思 我们的互联网世界就是由很多的网址组成 也可
  • 2021-04-06

    开源 开源的概念 开源 一词对应英文 Open Source 最初起源于软件开发领域 因此也称为 开放源代码 对应的软件则称为开源软件 Open Source Software 除了我们熟知的开源软件以外 开源的表现形式还有开源硬件 Ope
  • C++编译器为类自动生成拷贝构造函数的情况

    在一下情况中C 会为类自动生成拷贝构造函数 1 类中有虚函数 这种情况即意味着类的对象中有指向虚函数表的指针 考虑下面的情况 class A private int m a public virtual void ShowVal void
  • echarts实现气泡图(气泡之间不叠加)

    前言 echarts本身是有气泡图的 官方气泡图的特点是每个气泡的位置是基于坐标轴进行定位 如图1和2所示 但是本文所介绍的气泡图并不是官方所介绍的气泡图 而是一类区别于官方的图表类型 这种图表类型通常采用d3 js插件实现 如图3所示 从
  • MPC8314 (e300核) uboot 调试

    历经2个多月 完成了MPC8314最小系统 uboot 及Linux内核和根文件系统的调试 这是我第一次从头开始做小系统和内核的移植工作 虽然调试的比较辛苦 但是收获还是很多的 下面就介绍一下调试的过程和一些原理性的东西 1 MPC8314
  • Java基础面试题(三) (2020持续更新)

    前言 全套面试题请直接转到文章末尾 1 Java 中能创建 volatile 数组吗 能 Java 中可以创建 volatile 类型数组 不过只是一个指向数组的引用 而不 是整个数组 我的意思是 如果改变引用指向的数组 将会受到 vola
  • 馆员工作站的产品功能以及特点介绍

    馆员工作站通过跟电脑相互连接使用 工作人员对图书进行标签加工时 可使用设备对粘贴在图书上的RFID电子标签进行加工 通过条形码扫描器扫描图书上的条形码 同时识别图书上的电子标签 对电子标签和图书条码进行标签初始化操作 除此之外 还可以进行图
  • 6个常用的Python编程开发工具

    随着互联网的迅速发展 新技术不断创新 万物互联的时代 企业对IT人员的需求不断增加 很多想要进入IT行业的小伙伴经常会抱怨 想入门 却不知道从哪下手 最近就有不少小伙伴和小编抱怨 我想学Python 但是都不知道该使用哪些工具 别着急 学习
  • ES6入门

    一 let和const命令 1 let命令 类似于var 但是只在let所在的代码块有效 不存在变量提升 即一定要先声明后使用 暂时性死区 待理解 不允许重复声明 2 块级作用域 内层不影响外层 3 const命令 const声明一个常量
  • JAVA 什么是多态?

    面向对象编程有三大特性 封装 继承 多态 封装隐藏了类的内部实现机制 可以在不影响使用的情况下改变类的内部结构 同时也保护了数据 对外界而已它的内部细节是隐藏的 暴露给外界的只是它的访问方法 继承是为了重用父类代码 两个类若存在IS A的关
  • Ag Grid 组件 Vue Data Grid: Components

    目录 声明自定义组件 内联 组件 本地声明的组件 外部化的 JavaScript 组件 js 文件 外部化单文件组件 SFC vue 文件 注册自定义组件 注册内联自定义组件 注册非内联自定义组件 1 按名称 2 直接引用 已弃用 按名称引
  • 【yolov7系列二】正负样本分配策略

    本文主要就yolov7的正负样本筛选策略 并与yolov5 yolov6进行比对 首先接着上一篇yolov7系列一 网络整体结构 填几个小坑 希望对大家没有造成困扰 如 E ELAN层 在cat后需要要conv层做特征融合 还有SPPCSP