YOLO系列简记

本文主要参考了论文 A Comprehensive Review of YOLO Architectures in Computer Vision: From YOLOv1 to YOLOv8 and YOLO-NAS,以及其中提到的各 YOLO 原论文。

NMS

  1. 对所有检测框,按置信度降序排序。
  2. 选择最高置信度的检测框,添加到最终结果中。
  3. 计算其与剩下所有检测框的 IOU,若其超过 IOU 阈值则移除。
  4. 重复直到所有检测框被处理完。

YOLOv1

模型

将输入图像分成 S x S 个 grid。
每个 grid 预测 B 个 bounding box,以及 C 个分类的条件概率。
每个 bounding box 包含 5 个预测值: x , y , w , h , c o n f i d e n c e x,y,w,h,confidence x,y,w,h,confidence,其 x , y x,y x,y 是 bounding box 中心坐标,相对每个 grid 归一化,如下图:
YOLOv1 grid
w , h w, h w,h 是 bounding box 相对于整张图像的宽高,也被归一化。例如 bounding box 的宽高是 150 x 75,而图像的宽高是 300 x 300,则 w = 150 / 300 = 0.5 w=150/300=0.5 w=150/300=0.5 h = 75 / 300 = 0.25 h=75/300=0.25 h=75/300=0.25

最终预测输出是一个 S × S × ( B × 5 + C ) S \times S \times (B \times 5 + C) S×S×(B×5+C) 的张量。

S, B 是超参数,C 是类别的数量。

置信度 c o n f i d e n c e = P r ( O b j e c t ) × I O U p r e d t r u t h confidence=Pr(Object) \times IOU^{truth}_{pred} confidence=Pr(Object)×IOUpredtruth,其中 P r ( O b j e c t ) Pr(Object) Pr(Object) 取值为 0 或 1,表示是否检测到目标。

关于 P r ( O b j e c t ) Pr(Object) Pr(Object) 的取值论文中没有明确提及,0 或 1 是我的猜测,因为文章中说用 IOU 表示置信度,如果 P r ( O b j e c t ) Pr(Object) Pr(Object) 表示概率,那么就矛盾了。

对于检测到的目标,每个 grid 还会预测 C 个 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject),代表检测到目标的前提下,是每个类别的条件概率。
最终在 test 阶段,输出结果的置信度 c o n f i d e n c e = P r ( C l a s s i ∣ O b j e c t ) × P r ( O b j e c t ) × I O U = P r ( C l a s s i ) × I O U confidence=Pr(Class_i|Object) \times Pr(Object) \times IOU=Pr(Class_i) \times IOU confidence=Pr(ClassiObject)×Pr(Object)×IOU=Pr(Classi)×IOU,这个结果既包含了识别类别的置信度,又包含了坐标位置的置信度。

关于 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject) 是每个 grid 预测 C 个,还是只有在检测到目标的前提下才预测该值,文章中没有详细说明。但我认为应该是只有检测到才预测此值,否则 P r ( O b j e c t ) = 0 Pr(Object)=0 Pr(Object)=0 时,该值是无意义的。

优化

过多置信度为 0(即没有目标的 grid)会导致模型不稳定、早期发散严重。解决方法是增加坐标的 loss,减少置信度的 loss。

评估

  • 可以达到 45 帧率。
  • 但是对小目标的检测精度不高。
  • 与其他非实时算法相比,精度不高,定位不准。

YOLOv2

模型

为每个 grid 引入若干个 anchor box(文中有时候也叫 prior box),是预先定义的用于匹配检测对象的形状的框。
之前的锚框都是手动选取的,YOLOv2 则对训练集中标注的边框使用 K-means 算法进行自动生成。
最后为每个 anchor box 预测坐标和类别。

优化

使用锚框会遇到两个问题:
1)如何先验地选择anchor box
解决方法:使用k-means聚类算法选择锚框。
2)模型不稳定
以往用到锚框时,任何锚框都可以在图像中的任何位置,而不管是哪个位置预测的边界框,这导致很长时间才能收敛。
解决方法:不预测偏移,而是预测相对于网格单元的位置坐标。这使得参数更容易学习,因而更稳定。

另外,YOLOv2 也针对 YOLOv1 对小目标检测效果不好做了改进。
将 grid 的分辨率从 13x13 提高到 26x26 可以使得小目标更易被检测。最后再从 26x26x512 转换到 13x13x2048 使得可以和最初的特征融合(concatenate)。

最后,由于没有使用全连接层,因此输入可以是不同的大小。

评估

  • 使用了 WordTree 进行分类,利于有各种相同子类(如狗和各种狗)的检测,但对于服装等没有具体父类标签的检测效果不好。

YOLOv3

模型

  • 给每个预测对象只分配一个锚框。
  • 为每个分类使用二元交叉熵而非 softmax 进行训练。使得可以给同一个目标多个标签,如 Person 和 Man(即避免 softmax 的非此即彼问题)。
  • 不同于 YOLOv2 为每个 grid 使用 5 个锚框,YOLOv3 为每个 grid 使用 3 个锚框(为了 3 尺度)
  • 最重要的是引入 多尺度(multi-scale) 预测。
    多尺度实际上就是多 grid size。
    YOLOv3 使用 3 尺度得到 3 个输出张量,其 size 分别为 N × N × [ 3 × ( 4 + 1 + 80 ) ] N\times N\times [3\times (4+1+80)] N×N×[3×(4+1+80)]
    其中 N 是经下采样后的三个尺度值,如原图是 416,分别经过 32 倍,16 倍,8 倍的降采样后 N 就分别为 13, 26, 52。后面的 3 表示一个 grid cell 里有 3 个 bounding box。

架构

一个不错的 YOLOv3 模型架构图:
YOLOv3架构
其中 CBL 指 Convolution-BatchNorm-Leaky ReLU 块,SPP(Spatial pyramid pooling)用于在没有下采样(即步幅 stride=1)时连接多个 max pooling 输出。

评估

  • 在 IOU 阈值提高时表现下降明显。

目标检测网络架构

YOLOv3 后目标检测的网络架构被分为三个部分:backbone, neck 和 head。

Backbone

通常是一个 CNN,用于提取特征。

Neck

对主干提取的特征进行聚合和细化,往往侧重于增强不同尺度的空间和语义信息。

Head

进行最后预测,分类、定位等,再加上一些后处理步骤,如 NMS。

YOLOv4

就是使用各种 BoF 和 BoS 对 YOLOv3 进行修改,得到最佳效果。

BoF:指只改变训练策略,增加训练成本,但不增加推理时间的方法。如数据增强。
BoS:指稍微增加推理成本但显著提高准确率的方法。

具体如下:
YOLOv4

优化

  • 使用 mosaic augmentation 将 4 个图像合并成一个。
    使得目标在不同于它们通常出现的场景被检测。
  • 使用 Self-adversarial Training (SAT) 将一个图像中的目标去除,但扔保留标签。
    以提高鲁棒性

架构

性能最好的架构是:

  • backbone:对Darknet-53的修改,采用跨阶段部分连接(CSPNet),以Mish激活函数。
  • neck:使用 YOLOv3- SPP,多尺度预测使用修改版本的 path aggregation network(PANet) 而不是 FPN 或 spatial attention module(SAM)。
  • head:和 YOLOv3 保持相同。
    架构如下:
    YOLOv4架构
    其中 CMB 表示 Convolution + Batch Normalization + Mish activation,CBL 表示 Convolution + Batch Normalization + Leaky ReLU,UP 表示 upsampling,SPP 表示 Spatial Pyramid Pooling,PANet 是 Path Aggregation Network.

YOLOv5

只是对 YOLOv4 做一点小小的修改,最主要的区别是它使用 pytorch 实现,因此而流行。

YOLOX

优化

  • Anchor free
  • Multi positives
    因为无锚框,所有检测到的预测框也会减少,为补偿这部分训练时的损失,引入 Multi positives,将一个预测周围的 3x3 区域都作为 positive。
  • Decoupled head
    将分类置信度和定位精度解耦为分别用两个 head 进行检测。
  • 改进 Label assignment
    使用 simOTA 将 label assignment(就是将输出与 gt 进行匹配评估检测效果,如使用 IOU) 转换为最小运输代价问题。

YOLOv8

优化

  • 转向了 Anchor free。
  • 对目标、分别、回归分别使用解耦的 head。

YOLO-NAS

适合实时边缘设备应用。

优化

  • 使用量化和混合量化。
  • 使用自动标签和自蒸馏的预训练。
  • 使用 AutoNAC 自动设计架构。

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

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

相关文章

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处,为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…

C++(2) —— 通讯录管理系统

目录 1、系统需求 2、创建项目 3、菜单功能 4、退出功能 5、添加联系人 6、显示联系人 7、删除联系人 8、查找联系人 9、修改联系人 10、清空联系人 1、系统需求 2、创建项目 3、菜单功能 // 1、菜单界面 void showMenu() {cout << "--------------------…

团结引擎+OpenHarmony 1配置篇

团结引擎OpenHarmony 1 配置篇 app团结鸿蒙化第一课一 DevEco Studio 下载安装二 团结引擎三 出包 app团结鸿蒙化第一课 1 团结引擎配置2 DevEco Studio 配置 一 DevEco Studio 下载安装 申请开发者套件 1 注册华为账号 签署协议 官网 2 认真填写 DevEco Studio 开发套件申请…

etcd相关知识整理归纳 —— 筑梦之路

什么是etcd? Etcd 是 CoreOS 团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法&#xff0c;Etcd基于 Go 语言实现。 名字由来&#xff0c;它源于两个方面&#xff0c;unix的“/etc”文件…

JAVA实现人工智能,采用框架SpringAI

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话应用程序。 项目地址&#xff1a;https://github.com/spring-projects-experimental/sp…

FFmpeg: 自实现ijkplayer播放器--09音频重采样输出

文章目录 流程图音视设备输出回调函数重采样写入音频流因SDL输出音频采样格式为S16(一个采样点2个字节),而音频解码后采样格式通常为float planar(一个采样点4个字节),故需要重采样 重采样的条件:音频解码后的任意一个参数和需要的参数不同时,进行重采样,参数为: 采样格…

格式化D盘后C盘内的文件会受影响吗?深度解析

在计算机的日常使用中&#xff0c;磁盘格式化是一个常见的操作&#xff0c;它能帮助我们清除磁盘上的数据&#xff0c;为新的数据腾出空间。然而&#xff0c;当涉及到系统盘和其他存储盘时&#xff0c;许多用户会担心一个问题&#xff1a;如果我格式化了非系统盘&#xff0c;比…

【Kafka】Kafka 架构深入

Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partition 对应于一个 log 文件&am…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

JavaSE——常用API进阶二(3/8)-Date、SimpleDateFormat(构造器、常用的方法、用法示例、时间格式的常见符号)

目录 Date 构造器、常用的方法 用法示例 SimpleDateFormat 构造器、格式化时间的方法 时间格式的常见符号 用法示例 解析字符串时间成为日期对象 接下来会学习JDK8以前传统的日期、时间&#xff0c;以及JDK8开始新增的日期、时间&#xff1b;有部分项目还是有在使用JDK…

【C++学习】深入理解C++异常处理机制:异常类型,捕获和处理策略

文章目录 ♫一.异常的提出♫二.异常的概念♫三.异常的使用♫3.1 异常的抛出和捕获♫3.2.异常的重新抛出♫3.3异常安全♫3.4 异常规范 ♫4.自定义异常体系♫5.C标准库的异常体系♫6.异常的优缺点 ♫一.异常的提出 之前&#xff1a; C语言传统的处理错误的方式与带来的弊端&…

【位运算】Leetcode 两整数之和

题目解析 371. 两整数之和 算法讲解 异或的本质就是无进位相加&#xff0c;但是我们需要处理进位&#xff0c;就需要知道哪一位上有进位&#xff0c;再让无进位相加的结果 进位即可&#xff0c;在重复这个过程&#xff0c;当进位等于0的时候&#xff0c;说明相加的过程已经结…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行&#xff0c;输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录&#xff08;默认在C盘下的Program …

CSS盒模型(详讲)

目录 概述&#xff1a; 内容区&#xff08;content&#xff09;&#xff1a; 内边距&#xff08;paddingj&#xff09;&#xff1a; 前言&#xff1a; 设置内边距&#xff1a; 边框&#xff08;border&#xff09;&#xff1a; 前言&#xff1a; 示例&#xff1a; 外边…

飞驰云联入选金融信创生态实验室「金融信创优秀解决方案」

近日&#xff0c;由中国人民银行领导、中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布了第三期金融信创优秀解决方案&#xff0c;Ftrans飞驰云联“文件数据传输解决方案”成功入选&#xff01; 本次金融信创优秀解决方案遴选经方案征集、方案初审、专家评审等多环…

unity android 打包

现在使用的unity版本hub不支持导入support&#xff0c;只能自己下载对应的支持 找到对应的sdk&#xff0c;ndk

计算机组成原理【CO】Ch2 数据的表示和应用

文章目录 大纲2.1 数制与编码2.2 运算方法和运算电路2.3 浮点数的表示和运算 【※】带标志加法器OFSFZFCF计算机怎么区分有符号数无符号数? 【※】存储排列和数据类型转换数据类型大小数据类型转换 进位计数制进制转换2的次幂 各种码的基本特性无符号整数的表示和运算带符号整…

牛客研究生复试刷题(1)

KY30进制转换 1.最开始没有考虑到大数问题,可以说是没考虑完全,输入类型使用的是int64_t,只ac了一半测试用例。所以在数很大找不到合适的数据类型存储时,要考虑使用string来存放。 2.使用string存放数字的时候就要考虑:字符和数字之间的转换。字符转换成数字:str[i]-0,…

软考125-上午题-【软件工程】-传统软件的测试策略

一、传统软件的测试策略 有效的软件测试实际上分为4步进行&#xff0c;即&#xff1a;单元测试、集成测试、确认测试、系统测试。 1-1、单元测试&#xff08;模块测试&#xff09; 单元测试也称为模块测试&#xff0c;在模块编写完成且无编译错误后就可以进行。 单元测试侧重…