社区计算机视觉课程文档
YOLO
并获得增强的文档体验
开始使用
YOLO
对象检测简短介绍
卷积神经网络在解决图像分类问题上迈出了一大步。但仍然有另一个重大任务需要解决:对象检测。对象检测不仅需要对图像中的对象进行分类,还需要准确预测其在图像中的位置(在本例中为对象的边界框坐标)。这就是 YOLO 取得重大突破的地方。在深入研究 YOLO 之前,让我们先回顾一下使用 CNN 的对象检测算法的历史。
RCNN、Fast RCNN、Faster RCNN
R- CNN(基于区域的卷积神经网络)
RCNN 是使用卷积神经网络进行对象检测的最简单方法之一。简单来说,基本思想是检测“区域”,然后使用 CNN 对区域进行分类。因此,这是一个多步骤过程。基于这个想法,RCNN 论文于 2012 年[1] 发表。
RCNN 使用以下步骤:
- 使用选择性搜索算法选择区域。
- 使用基于 CNN 的分类器从区域中分类对象。
对于训练目的,该论文提出了以下步骤:
- 制作从对象检测数据集中检测到的区域的数据集。
- 在区域数据集上微调 Alexnet 模型。
- 然后在对象检测数据集上使用微调模型。
以下是 RCNN 的基本流程
Fast RCNN
Fast RCNN 专注于改进原始 RCNN。他们增加了以下四个改进:
- 单阶段训练,而不是像 RCNN 那样的多阶段训练。使用多任务损失
- 无需磁盘存储。
- 引入 ROI 池化层,仅从感兴趣区域获取特征。
- 与使用多任务损失的多步骤 RCNN / SPPnet 模型相反,训练端到端模型。
Faster RCNN
Faster R-CNN 完全消除了对选择性搜索算法的需求!与 Fast R-CNN 相比,这些功能使推理时间提高了 90%!
- 它引入了 RPN,区域提议网络。RPN 是一种基于注意力的模型,它训练模型“关注”图像中包含对象的区域。
- 它将 RPN 与 Fast RCNN 合并,使其成为端到端对象检测模型。
特征金字塔网络 (FPN)
- 特征金字塔网络是一种用于对象检测的 Inception 模型。
- 它首先将图像下采样为较低维度的嵌入。
- 然后再次将它们上采样。
- 从每个上采样的图像中,它尝试预测输出(在本例中为类别)。
- 但是,相似维度特征之间也存在跳跃连接!
请参考以下图片,这些图片取自论文。[20]
YOLO 架构
YOLO 是当时一项突破性的创新。实时对象检测器,可通过单个网络进行端到端训练。
YOLO 之前
之前的检测系统包括在图像块上使用图像分类器。诸如可变形部件模型 (DPM) 之类的系统使用滑动窗口方法,其中分类器在整个图像上均匀间隔的位置运行。
RCNN 等其他工作使用两步检测。首先,他们检测许多可能的感兴趣区域,这些区域由区域提议网络生成为边界框。然后,分类器在所有提议的区域中运行以做出最终预测。需要进行后处理,例如细化边界框、消除重复检测以及根据场景中的其他对象重新评分框。
这些复杂的流程速度慢且难以优化,因为每个单独的组件都必须单独训练。
YOLO
YOLO 是一种单步检测器,其中边界框和对象的类别在同一次传递中同时预测。这使得系统速度非常快 - 每秒 45 帧。
重构对象检测
YOLO 将对象检测任务重构为单个回归问题,该问题预测边界框坐标和类别概率。
在此设计中,我们将图像划分为 $S \times S$ 网格。如果对象的中心落入网格单元格中,则该网格单元格负责检测该对象。我们可以将 $B$ 定义为每个单元格中要检测的最大对象数。因此,每个网格单元格预测 $B$ 个边界框,包括每个框的置信度分数。
置信度
边界框的置信度分数应反映框的预测准确程度。它应该接近真实框与预测框的 IOU(交并比)。如果网格不应该预测框,则它应该为零。因此,这应该编码框的中心存在于网格中的概率以及边界框的正确性。
正式地,
坐标
边界框的坐标编码为 4 个数字 $(x, y, w, h)$。$(x, y)$ 坐标表示框的中心相对于网格单元格边界的位置。宽度和高度已标准化为图像尺寸。
类别
类别概率是一个长度为 $C$ 的向量,表示给定单元格中存在对象时每个类别的条件类别概率。每个网格单元格仅预测一个向量,即每个网格单元格将分配一个类别,因此该网格单元格预测的所有 $B$ 个边界框都将具有相同的类别。
正式地,
在测试时,我们将条件类别概率和各个框置信度预测相乘,这为我们提供了每个框的特定于类别的置信度分数。这些分数编码了该类别出现在框中的概率以及预测框与对象的拟合程度。
总而言之,我们有一张图像,分为 $S \times S$ 网格。每个网格单元格包含 $B$ 个边界框,其中包含 5 个值 - 置信度 + 4 个坐标和 $C$ 个长向量,其中包含每个类别的条件概率。因此,每个网格单元格都是一个 $B \times 5 + C$ 长向量。整个网格是 $S \times S \times (B \times 5 + C)$。
因此,如果我们有一个可学习的系统,可以将图像转换为 $S \times S \times (B \times 5 + C)$ 特征图,那么我们就离任务更近一步了。
网络架构
在原始的 YOLOv1 设计中,输入是一张尺寸为 $448 \times 448$ 的 RGB 图像。图像被划分为一个 $S \times S = 7 \times 7$ 的网格,其中每个网格单元负责检测 $B=2$ 个边界框和 $C=20$ 个类别。
网络架构是一个简单的卷积神经网络。输入图像通过一系列卷积层,然后是一个全连接层。最后一层的输出被reshape为 $7 \times 7 \times (2 \times 5 + 20) = 7 \times 7 \times 30$。
YOLOv1 的设计灵感来源于 GoogLeNet,后者使用 1x1 卷积来减少特征图的深度。这样做是为了减少网络中的参数数量和计算量。该网络有 24 个卷积层,后跟 2 个全连接层。最后一层使用线性激活函数,所有其他层都使用 Leaky ReLU 激活函数。
有关 YOLOv1 的架构,请参见下图。
训练
网络在图像和真值边界框上进行端到端训练。损失函数是平方误差损失之和。损失函数旨在惩罚网络对边界框坐标、置信度和类别概率的不正确预测。我们将在下一节讨论损失函数。
YOLO 为每个网格单元预测多个边界框。在训练时,我们只希望一个边界框预测器负责每个对象。我们根据哪个预测与真值的当前 IOU 最高,来分配一个预测器“负责”预测一个对象。这导致了边界框预测器之间的专业化。每个预测器都变得更擅长预测特定尺寸、宽高比或类别的对象,从而提高整体召回率。我们将使用 $\mathbb{1}{ib}^{\text{obj}}$ 将此信息编码在网格单元 $i$ 和边界框 $b$ 的损失函数中。$\mathbb{1}{ib}^{\text{noobj}}$ 与 $\mathbb{1}_{ib}^{\text{obj}}$ 相反。
损失函数
现在我们有了一个可学习的系统,可以将图像转换为 $S \times S \times (B\times5 + C)$ 的特征图,我们需要训练它。
训练这种系统的一个简单函数是使用平方误差损失之和。我们可以使用预测值和真值之间的平方误差,即用于边界框坐标、置信度和类别概率。
每个网格单元 $(i)$ 的损失可能如下所示
其中
- 如果第 $i$ 个网格单元中的第 $b$ 个边界框负责检测对象,则 $\mathbb{1}_{ib}^{\text{obj}}$ 为 1,否则为 0。
- 如果第 $i$ 个网格单元包含一个对象,则 $\mathbb{1}_i^\text{obj}$ 为 1,否则为 0。
但是,这种损失函数不一定与目标检测的任务良好对齐。简单地将两个任务(分类和定位)的损失相加,会同等地权衡损失。
为了纠正这一点,YOLOv1 使用了加权平方误差损失之和。首先,我们为定位误差分配一个单独的权重,称为 $\lambda_{\text{coord}}$。它通常设置为 5。
因此,每个网格单元 $(i)$ 的损失可能如下所示
此外,许多网格单元不包含对象。置信度接近于零,因此包含对象的网格单元常常会压倒梯度。这使得网络在训练期间不稳定。
为了纠正这一点,我们还降低了不包含对象的网格单元中的置信度预测损失的权重,使其低于包含对象的网格单元。我们为置信度损失使用一个单独的权重,称为$\lambda_{\text{noobj}}$,通常设置为 0.5。
因此,每个网格单元 (i) 的置信度损失可能如下所示
边界框坐标的平方误差和可能存在问题。它对大框和小框中的误差赋予相同的权重。大框中的小偏差不应像小框中的小偏差那样受到同等程度的惩罚。
为了纠正这个问题,YOLOv1 对边界框宽度和高度的平方根使用平方误差和损失。这使得损失函数具有尺度不变性。
因此,每个网格单元 (i) 的定位损失可能如下所示
推断
推断很简单。我们将图像传递到网络中,得到 $S \times S \times (B \times 5 + C)$ 特征图。然后,我们滤除置信度分数低于阈值的框。
非极大值抑制
在极少数情况下,对于大型对象,网络倾向于从多个网格单元预测多个框。为了消除重复检测,我们使用一种称为非极大值抑制 (NMS) 的技术。NMS 的工作原理是选择置信度得分最高的框,并消除所有 IOU 大于阈值的其他框。这是迭代完成的,直到没有重叠的框为止。
端到端流程如下所示:
YOLO 的演变
到目前为止,我们已经了解了 YOLO 的基本特征以及它如何实现高度准确和快速的预测。这实际上是 YOLO 的第一个版本,称为 YOLOv1。YOLOv1 于 2015 年发布,此后发布了多个版本。它在准确性和速度方面具有突破性,因为它引入了使用单个卷积神经网络 (CNN) 一次处理整个图像,并将其划分为 S × S 网格的概念。每个网格单元直接预测边界框和类别概率。然而,它在小图像区域中存在定位不佳和检测多个对象的问题。在随后的几年中,不同的团队发布了许多新版本,以逐步提高准确性、速度和鲁棒性。
YOLOv2 (2016)
在发布第一个版本一年后,YOLOv2[5]问世。改进主要集中在准确率和速度上,同时也解决了定位问题。首先,YOLOv2 用 Darknet-19 替换了 YOLOv1 的骨干网络架构,Darknet-19 是 Darknet 架构的一个变体。Darknet-19 比之前版本的骨干网络更轻量,它由 19 个卷积层和最大池化层组成。这使得 YOLOv2 能够捕获更多信息。此外,它对所有卷积层应用了批量归一化,因此移除了 dropout 层,解决了过拟合问题并提高了 mAP。它还引入了锚框的概念,为检测框的宽度和高度添加了先验知识(特别是,他们使用了锚框)。此外,为了解决定位不佳的问题,YOLOv2 为每个锚框和网格单元(现在是 13x13)预测了类别和对象。因此,我们最多有(对于 5 个锚框)13x13x5 = 845 个框。
YOLOv3 (2018)
YOLOv3[6] 再次显著提高了检测速度和准确率,它用更复杂但更高效的 Darknet-53 架构替换了 Darknet-19 架构。此外,它通过使用三种不同的尺度进行对象检测(13x13、26x26 和 52x52 网格)更好地解决了定位问题。这有助于在同一区域找到不同大小的对象。它将边界框增加到:13 x 13 x 3 + 26 x 26 x 3 + 52 x 52 x 3 = 10,647。非极大值抑制 (NMS) 仍然用于滤除冗余的重叠框。
YOLOv4 (2020)
回到 2020 年,YOLOv4[7] 成为速度和准确率方面最佳的检测模型之一,在对象检测基准测试中取得了最先进的结果。作者再次更改了骨干网络架构,选择了更快更准确的 CSPDarknet53[8]。此版本的一个重要改进是优化了资源的高效利用,使其适合部署在各种硬件平台上,包括边缘设备。此外,它在训练前包含了一些数据增强,进一步提高了模型的泛化能力。作者将此改进包含在一组称为“bag-of-freebies”(免费技巧包)的方法中。“Bag-of-freebies”是一些优化方法,这些方法会增加训练过程的成本,但旨在提高模型在实时检测中的准确率,而不会增加推理时间。
YOLOv5 (2020)
YOLOv5[9] 将 Darknet 框架(用 C 语言编写)转换为更灵活且易于使用的 PyTorch 框架。此版本自动化了之前的锚框检测机制,引入了自动锚框。自动锚框自动训练模型锚框以匹配您的数据。在训练期间,YOLO 最初会自动使用 k-means 和遗传方法来进化新的、更匹配的锚框,并将它们放回 YOLO 模型中。此外,它还提供了不同类型的模型,这些模型取决于硬件约束,名称与今天的 YOLOv8 模型类似:YOLOv5s、YOLOv5m、YOLOv5l 和 YOLOv5x。
YOLOv6 (2022)
下一个版本 YOLOv6[10][11] 由美团视觉 AI 部门发布,文章标题为:“YOLOv6: A Single-Stage Object Detection Framework for Industry.”(YOLOv6:面向工业的单阶段对象检测框架)。该团队通过关注五个方面进一步提高了速度和准确率:1) 使用 RepVGG 技术的重参数化,RepVGG 技术是 VGG 的修改版本,带有跳跃连接。在推理期间,这些连接被融合以提高速度。2) 基于重参数化的检测器的量化。添加了称为 Rep-PAN 的块。3) 认识到考虑不同硬件成本和模型部署能力的重要性。具体而言,作者测试了低功耗 GPU(如 Tesla T4)的延迟,而之前的作品大多使用高成本机器(如 V100)。4) 引入了新型损失函数,例如用于分类的 Varifocal Loss、用于边界框回归的 IoU Series Loss 和 Distribution Focal Loss。5) 在训练期间使用知识蒸馏提高准确率。2023 年,YOLOv6 v3[12] 发布,标题为 “YOLOv6 v3.0: A Full-Scale Reload,”(YOLOv6 v3.0:全面重载),它对网络架构和训练方案进行了增强,再次提高了速度和准确率(在 COCO 数据集上评估),与之前发布的版本相比。
YOLOv7 (2022)
YOLOv7 由 YOLOv4 的作者发布,论文标题为 “YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors”[13][14](YOLOv7:可训练的免费技巧包为实时对象检测器设定了新的最先进水平)。具体而言,此版本的免费技巧包包括一种新的标签分配方法,称为粗到细引导标签分配,并使用梯度流传播路径来分析重参数化卷积应如何与不同的网络结合。他们还为实时对象检测器提出了“扩展”和“复合缩放”方法,可以有效地利用参数和计算。同样,所有这些改进都将实时对象检测提升到了新的最先进水平,超越了之前的版本。
YOLOv8 (2023)
YOLOv8[15] 由 Ultralytics 在 2023 年开发,再次成为新的 SOTA。它在骨干网络和颈部引入了改进,同时采用了无锚框方法,从而消除了对预定义锚框的需求。相反,直接进行预测。此版本支持广泛的视觉任务,包括分类、分割和姿势估计。此外,YOLOv8 具有可扩展性,预训练模型有多种尺寸可供选择:nano、small、medium、large 和 extra-large,并且可以轻松地在自定义数据集上进行微调。
YOLOv9 (2024)
YOLOv9 由 YOLOv7 和 YOLOv4 的同一批作者发布,论文标题为 “YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information”[16][17](YOLOv9:使用可编程梯度信息学习你想要学习的内容)。本文重点介绍了现有方法和架构在逐层特征提取和空间变换过程中存在的信息丢失问题。为了解决这个问题,作者提出了
- 可编程梯度信息 (PGI) 的概念,以应对深度网络为实现多个目标所需的各种变化。
- 通用高效层聚合网络 (GELAN),这是一种新的轻量级网络架构,与当前方法相比,它在不牺牲计算效率的情况下实现了更好的参数利用率。
通过这些改变,YOLOv9 在 MS COCO 挑战赛上设定了新的基准。
考虑到时间线和模型的不同许可,我们可以创建下图:
关于不同版本的说明
这个简短的章节以线性的方式介绍了 YOLO 的历史/演变。然而,事实并非如此——许多其他版本的 YOLO 是并行发布的。请注意 YOLOv4 和 YOLOv5 是在同一年发布的。我们没有涵盖的其他版本包括 YOLOvX (2021),它基于 YOLOv3 (2018),以及 YOLOR (2021),它基于 YOLOv4 (2020),以及许多其他版本。此外,重要的是要理解“最佳”模型版本的选择取决于用户的需求,例如速度、准确率、硬件限制和用户友好性。例如,YOLOv2 在速度方面非常出色。YOLOv3 在准确率和速度之间提供了平衡。YOLOv4 在跨不同硬件的适应性或兼容性方面具有最佳能力。
参考
[1][用于精确对象检测和语义分割的丰富特征层次结构](https://arxiv.org/abs/1311.2524v5)
[2][Fast R-CNN](https://arxiv.org/abs/1504.08083)
[3][Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)
[4][特征金字塔网络](https://arxiv.org/pdf/1612.03144.pdf)
[5][YOLO9000: Better, Faster, Stronger](https://arxiv.org/abs/1612.08242)
[6][YOLOv3: An Incremental Improvement](https://arxiv.org/abs/1804.02767)
[7][YOLOv4: Optimal Speed and Accuracy of Object Detection](https://arxiv.org/abs/2004.10934)
[8][YOLOv4 GitHub 仓库](https://github.com/AlexeyAB/darknet)
[9][Ultralytics YOLOv5](https://docs.ultralytics.com/models/yolov5/)
[10][YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications](https://arxiv.org/abs/2209.02976)
[11][YOLOv6 GitHub 仓库](https://github.com/meituan/YOLOv6)
[12][YOLOv6 v3.0: A Full-Scale Reloading](https://arxiv.org/abs/2301.05586)
[13][YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors](https://arxiv.org/abs/2207.02696)
[14][YOLOv7 GitHub 仓库](https://github.com/WongKinYiu/yolov7)
[15][Ultralytics YOLOv8](https://github.com/ultralytics/ultralytics)
[16][YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information](https://arxiv.org/abs/2402.13616)
[17][YOLOv9 GitHub 仓库](https://github.com/WongKinYiu/yolov9)
[18][YOLOvX](https://yolovx.com/)
[19][You Only Learn One Representation: Unified Network for Multiple Tasks](https://arxiv.org/abs/2105.04206) [20][特征金字塔网络论文](https://arxiv.org/abs/1612.03144)