深度学习目标检测:划时代的 YOLO 算法详解
引言:目标检测的意义与挑战
在计算机视觉领域,目标检测(Object Detection)是一项核心且极具挑战的任务。它的目标是在图像或视频中,不仅要识别出画面中存在哪些对象(物体),还要确定每个对象的位置,通常以一个精确的边界框(Bounding Box)来框出。这项技术广泛应用于自动驾驶、智能安防、工业检测、医疗影像分析、零售业管理等众多领域,其重要性不言而喻。
早期目标检测方法依赖于手工设计的特征提取器(如 SIFT, HOG)结合分类器和滑动窗口技术。这种方法计算量大,对物体的姿态、光照变化鲁棒性差,且速度较慢,难以满足实时性要求。
随着深度学习技术的飞速发展,基于卷积神经网络(CNN)的目标检测方法取得了突破性进展。这些方法极大地提高了检测精度,并逐渐提升了速度。主流的深度学习目标检测方法大致可以分为两大类:
- 两阶段检测器(Two-Stage Detectors): 代表算法有 R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN 等。这类方法首先通过一个区域提议网络(Region Proposal Network, RPN)生成一系列可能包含物体的候选区域,然后再对这些候选区域进行分类和精确的边界框回归。它们的特点是精度较高,但由于分成了两个阶段,计算量相对较大,实时性往往受限。
- 单阶段检测器(One-Stage Detectors): 代表算法有 YOLO(You Only Look Once)、SSD(Single Shot Detector)等。这类方法将整个检测过程集成在一个网络中,直接从图像中预测出物体的类别和位置。它们的特点是速度快,非常适合对实时性要求高的场景,但早期的版本在精度上通常略逊于两阶段方法。
在单阶段检测器中,YOLO 算法无疑是最具代表性和影响力的一员。它的出现,以其简洁高效的设计理念和惊人的实时处理能力,彻底改变了目标检测领域的格局。本文将详细介绍 YOLO 算法的核心思想、工作原理及其演进历程。
YOLOv1:革新性的“只看一次”
2015 年,Joseph Redmon 等人提出了 You Only Look Once (YOLO) 算法,并在论文《You Only Look Once: Unified, Real-Time Object Detection》中发布。YOLOv1 的核心思想正如其名——“只看一次”。与之前或同期的许多方法不同,YOLO 不依赖于生成候选区域,而是将目标检测视为一个回归问题,直接从整张图片中预测边界框和类别概率。这种端到端的检测方式是 YOLO 最大的创新之处,也是其实现高速度的关键。
YOLOv1 的核心思想与工作原理
YOLOv1 的检测流程可以概括为以下几个主要步骤:
- 输入图像处理: 将输入的图像缩放到固定大小(通常是 448×448)作为网络的输入。
- 网络推断(Inference): 将缩放后的图像送入一个单一的卷积神经网络。这个网络会直接输出一个固定大小的张量,该张量编码了关于图像中所有物体位置和类别的信息。
- 输出张量解析: 解析网络输出的张量,得到预测的边界框、置信度分数和类别概率。
- 非极大值抑制(Non-Maximum Suppression, NMS): 对预测结果进行后处理,去除冗余的边界框,得到最终的检测结果。
下面详细解释网络是如何编码和输出信息的:
1. 将图像划分为网格 (Gridding the Image)
YOLO 将输入的图像划分成一个 $S \times S$ 的网格(Grid)。例如,在 YOLOv1 中,通常 $S=7$,即将图像划分为 $7 \times 7 = 49$ 个网格单元。
2. 每个网格单元的职责
如果一个物体的中心点落在一个特定的网格单元内,那么这个网格单元就负责预测这个物体。
3. 每个网格单元的预测内容
对于每个网格单元,YOLOv1 会预测以下信息:
-
边界框 (Bounding Boxes): 每个网格单元预测 $B$ 个边界框。在 YOLOv1 中,$B=2$。对于每个边界框,需要预测 5 个值:
- $(x, y)$: 边界框中心点的坐标,相对于该网格单元的左上角,并用网格单元的尺寸进行归一化(值在 0 到 1 之间)。
- $(w, h)$: 边界框的宽度和高度,相对于整个图像的宽度和高度进行归一化(值在 0 到 1 之间)。
- 置信度分数 (Confidence Score): 这个分数反映了两个信息:1) 预测的边界框中是否包含一个物体(Objectness);2) 如果包含物体,预测的边界框与实际物体的真实边界框(Ground Truth Box)之间的吻合程度(通过 Intersection over Union, IoU 来衡量)。具体来说,置信度分数定义为 $\text{Confidence} = \text{Pr(Object)} * \text{IoU(truth, pred)}$。如果网格单元不包含任何物体,则置信度应为 0。如果包含物体,则理想情况下,置信度应等于预测框与真实框的 IoU。
-
类别概率 (Class Probabilities): 每个网格单元预测 $C$ 个条件类别概率 ($\text{Pr(Class}_i \text{ | Object)}$)。这里的 $C$ 是数据集中总共的类别数量。这些概率是在已知网格单元中存在物体的前提下,该物体属于每个类别的概率。请注意,这些类别概率是每个网格单元共享的,而不是每个边界框独立预测的。 也就是说,如果一个网格单元负责检测一个物体,它会预测这个物体是狗、猫、汽车等的概率分布,而它预测的 $B$ 个边界框共享这个概率分布。
4. 网络输出张量
结合以上预测内容,整个网络的输出是一个 $S \times S \times (B \times 5 + C)$ 大小的张量。对于 YOLOv1,$S=7, B=2, C=20$ (对于 PASCAL VOC 数据集),所以输出张量的大小是 $7 \times 7 \times (2 \times 5 + 20) = 7 \times 7 \times 30$。
- $S \times S$ 对应于划分的网格。
- $B \times 5$ 对应于每个网格预测的 $B$ 个边界框信息(每个框 5 个值:x, y, w, h, 置信度)。
- $C$ 对应于每个网格预测的 $C$ 个类别概率。
5. 最终预测分数的计算
为了得到每个预测边界框最终属于某个类别的置信度分数,需要将边界框的置信度分数与网格单元的条件类别概率相乘:
$\text{Pr(Class}_i \text{ | Object)} * \text{Pr(Object)} * \text{IoU(truth, pred)} = \text{Pr(Class}_i\text{)} * \text{IoU(truth, pred)}$
这个分数综合反映了边界框包含特定类别的物体的可能性及其位置的准确性。对于 YOLOv1 预测的 $S \times S \times B$ 个边界框中的每一个,以及数据集中的 $C$ 个类别,都可以计算出 $C$ 个这样的分数。
6. 非极大值抑制 (NMS)
在得到大量的预测边界框及其对应的类别置信度分数后,需要进行后处理。由于一个物体可能会被多个网格单元(特别是物体较大,覆盖多个网格时)或同一个网格单元的多个边界框预测到,会产生大量的重叠预测框。NMS 的作用是保留得分最高的预测框,并抑制(移除)与其有显著重叠(IoU 大于某个阈值)的低分预测框。这样可以得到最终清晰、不重叠的检测结果。
YOLOv1 的网络结构
YOLOv1 的网络结构受到 GoogLeNet 的启发,主要由卷积层和全连接层组成。它没有采用区域提议网络或兴趣区域池化(RoI Pooling)等复杂机制,整个图像只经过一个网络前向传播,这正是其速度快的根本原因。网络的前面部分是用于特征提取的卷积层,后面部分是用于预测边界框和类别概率的全连接层。
YOLOv1 的损失函数
YOLOv1 的损失函数设计比较复杂,旨在同时优化边界框位置、大小、物体置信度以及类别预测。它是一个多部分的损失函数,包含:
- 边界框中心点坐标误差: 使用均方误差(Sum of Squared Errors)计算预测中心点 $(x, y)$ 与真实中心点之间的误差。
- 边界框尺寸误差: 使用边界框尺寸的平方根 $(\sqrt{w}, \sqrt{h})$ 而不是直接使用 $(w, h)$ 来计算误差。这是因为直接使用 $w, h$ 时,大物体和小物体尺寸上的相同绝对误差对 IoU 的影响不同(大物体允许更大的绝对误差),而使用平方根可以缓解这个问题,使得对大尺寸边界框的误差惩罚相对较小,对小尺寸边界框的误差惩罚相对较大。
- 包含物体的边界框置信度误差: 对于负责预测了物体的网格单元中的边界框,计算其预测置信度与真实 IoU 之间的误差。
- 不包含物体的边界框置信度误差: 对于不包含物体的网格单元或预测框,其真实置信度应为 0。这部分误差用于惩罚预测置信度非零的框。由于不包含物体的框远多于包含物体的框,为了避免模型将所有框的置信度都预测为 0,通常会给包含物体的框的置信度损失赋予更高的权重。
- 类别预测误差: 使用均方误差计算预测类别概率与真实类别(one-hot 编码)之间的误差。
整个损失函数是以上各项损失的加权求和。训练时,网络通过最小化这个复合损失函数来学习。
YOLOv1 的优点
- 速度快: 由于是单阶段端到端训练,且没有复杂的候选区域提取过程,YOLOv1 的检测速度非常快,标准版本可以达到 45 fps,Fast YOLO 版本甚至能达到 155 fps,满足实时检测的需求。
- 全局信息: YOLO 在训练和测试时都“看到”了整张图像,因此它能够利用图像中的全局上下文信息来辅助预测,这使得它在区分背景和物体方面表现更好,预测的假阳性(将背景误检为物体)相对较少。
- 端到端训练: 整个检测管线是一个单一的网络,可以直接在检测性能指标上进行端到端的优化。
YOLOv1 的缺点
- 对小物体检测效果差: 由于每个网格单元只能预测固定数量的边界框(YOLOv1 是 2 个)且只有一个类别概率分布,当多个小物体集中在一个网格单元时,YOLO 难以区分它们,导致漏检。
- 边界框定位不够精确: 尤其是在处理长宽比奇特的物体或紧密相邻的物体时,边界框的预测精度相对较低。这是因为边界框的预测是直接基于网格单元进行的,缺乏对边界的精细调整能力。
- 泛化能力相对较弱: 当遇到训练集中未出现的、长宽比或排列方式异常的物体时,YOLOv1 的表现可能会下降。
尽管存在这些缺点,YOLOv1 凭借其革命性的单阶段实时检测思想,为目标检测领域开辟了新的道路,激发了后续大量基于回归或单阶段方法的出现。
YOLOv2 (YOLO9000):速度与精度的平衡
YOLOv1 证明了单阶段方法的潜力,但其精度与当时的 SOTA 两阶段方法还有差距,尤其是在小物体和定位精度上。为了弥补这些不足,Joseph Redmon 等人在 2016 年提出了 YOLOv2,并在论文《YOLO9000: Better, Faster, Stronger》中发布。YOLOv2 在保持速度优势的同时,显著提高了检测精度。论文标题中的 YOLO9000 指的是 YOLOv2 的一个特殊版本,可以检测超过 9000 个类别。
YOLOv2 并没有改变 YOLO 的基本框架(仍然是将图像划分为网格进行预测),但引入了一系列改进技巧,旨在使模型“更好、更快、更强”。这些改进可以大致分为以下几个方面:
使模型“更好”(提高精度):
- 批量归一化 (Batch Normalization): 在所有卷积层后添加批量归一化层。这有助于稳定训练过程,允许使用更高的学习率,并且具有正则化效果,提高了模型的泛化能力。使用 BN 后,Dropout 都可以被移除,而不会导致过拟合。
- 高分辨率分类器 (High Resolution Classifier): YOLOv1 的训练流程是先在 ImageNet 数据集上以 224×224 分辨率预训练分类网络,然后将分辨率提高到 448×448 进行目标检测的微调。YOLOv2 在预训练分类网络时,先用 224×224 训练,然后用 448×448 分辨率再进行 10 个 epoch 的微调。这使得网络更适应高分辨率输入,对检测任务更有利。
- 使用 Anchor Boxes: YOLOv1 每个网格只预测固定数量的边界框,且对物体的长宽比没有先验信息。YOLOv2 借鉴了 Faster R-CNN 中 Anchor Boxes 的思想,不再直接预测边界框的宽度和高度,而是预测相对于 Anchor Boxes 的偏移量。
- 首先,通过 K-Means 聚类算法在训练集标签的边界框尺寸上进行聚类,得到一组具有代表性的 Anchor Boxes 的尺寸(宽度和高度)。这些 Anchor Boxes 的尺寸更能反映数据集中物体的真实形状分布。
- 每个网格单元预测 $B$ 个边界框(在 YOLOv2 中,通常每个网格 $B=5$),每个预测边界框都基于一个预设的 Anchor Box。
- 预测内容变为:相对于 Anchor Box 的中心点偏移量 $(t_x, t_y)$,尺寸缩放因子 $(t_w, t_h)$,以及一个置信度分数。
- 实际预测的边界框 $(x, y, w, h)$ 是通过预测值和对应的 Anchor Box $(p_w, p_h)$ 计算得到的:
$b_x = \sigma(t_x) * grid_w + grid_x$
$b_y = \sigma(t_y) * grid_h + grid_y$
$b_w = p_w * e^{t_w}$
$b_h = p_h * e^{t_h}$
其中 $(grid_x, grid_y)$ 是网格单元左上角相对于图像左上角的坐标,$(grid_w, grid_h)$ 是网格单元的尺寸。$\sigma$ 是 Sigmoid 函数,用于将预测的中心点偏移量约束在 0 到 1 之间,确保预测的边界框中心点落在负责预测它的那个网格单元内。 - 使用 Anchor Boxes 使得模型更容易学习预测与 Anchor Boxes 的微小差异,而不是从头预测物体的绝对尺寸,从而提高了模型的收敛性和预测精度。
- 维度聚类 (Dimension Clusters): 为了选择更好的 Anchor Boxes,YOLOv2 使用 K-Means 聚类来自动发现训练集中标签框的典型尺寸。与标准 K-Means 使用欧氏距离不同,YOLOv2 使用了基于 IoU 的距离度量:$d(\text{box}, \text{centroid}) = 1 – \text{IoU}(\text{box}, \text{centroid})$。这样做的原因是,IoU 更直接地反映了 Anchor Box 与真实框的匹配程度,而这正是我们关心的。聚类得到的 Anchor Boxes 更符合数据集的特点,有助于提高初始预测框的质量。
- 直接位置预测 (Direct Location Prediction): YOLOv1 直接预测边界框的中心点坐标,这可能会导致预测的中心点跑到负责该物体的网格单元之外,从而引入不稳定性。YOLOv2 通过预测相对于网格单元左上角的偏移量,并使用 Sigmoid 函数将偏移量约束在 0 到 1 之间,结合 Anchor Boxes,确保预测的边界框中心点始终落在负责预测它的那个网格单元内部。这提高了定位的稳定性。
- 多尺度训练 (Multi-Scale Training): YOLOv2 在训练时,每隔几次迭代就会随机改变输入图像的尺寸。由于模型中只使用了卷积层和池化层(这些层对于输入图像的尺寸没有严格限制),以及全连接层在处理完卷积特征图后使用了全局平均池化等技术,网络可以适应多种输入尺寸。这使得模型对不同尺度的物体更加鲁棒。例如,可以在 ${320, 352, …, 608}$ 范围内以 32 的步长随机选择输入尺寸。输入尺寸越小,速度越快,精度稍有下降;输入尺寸越大,精度越高,速度变慢。这使得 YOLOv2 可以方便地在速度和精度之间进行权衡。
- 跨层连接/细粒度特征 (Passthrough Layer): 为了更好地检测小物体,YOLOv2 引入了一个 Passthrough 层,类似于 ResNet 中的跳跃连接。它将网络中靠前的一些层的具有较高分辨率的特征图(例如 $26 \times 26$)与靠后的低分辨率特征图(例如 $13 \times 13$)进行连接(通过重塑操作,将 $26 \times 26 \times 512$ 的特征图重塑为 $13 \times 13 \times 2048$),然后与深层特征图进行拼接。这种连接方式使得模型能够利用细粒度的特征信息,提高了对小物体的检测能力。
使模型“更快”(提高速度):
- Darknet-19 网络: YOLOv2 设计了一个新的特征提取网络 Darknet-19。它包含 19 个卷积层和 5 个最大池化层。Darknet-19 借鉴了 Network in Network (NIN) 的思想,使用 1×1 卷积层来压缩通道数,降低计算量。与 YOLOv1 基于 GoogLeNet 修改的网络相比,Darknet-19 的参数量和计算量更少,速度更快,同时在 ImageNet 分类任务上取得了更好的性能。
- 移除全连接层: YOLOv2 将 YOLOv1 中最后的全连接层移除,改用全卷积网络(Fully Convolutional Network, FCN)的思想。最后一层是一个卷积层,直接输出预测张量。这使得网络可以接受任意尺寸的输入图像(尽管为了预测方便,通常还是会 resize 到固定尺寸或 32 的倍数)。移除全连接层也减少了模型的参数数量,提高了速度。
使模型“更强”(扩展检测类别 – YOLO9000):
YOLO9000 是 YOLOv2 的一个变种,旨在扩展检测的类别数量,使其能够检测训练集中未出现的类别。它使用了 WordTree 的概念,这是一个层次化的分类模型。WordTree 将 ImageNet (用于分类) 和 COCO (用于检测) 数据集的类别进行合并,构建一个包含 9000 多个类别的 WordTree。
在训练时,YOLO9000 同时使用 ImageNet 和 COCO 数据集。对于来自 COCO 的图像,既有边界框信息,也有类别标签;对于来自 ImageNet 的图像,只有精细的类别标签。网络学习在预测时,沿着 WordTree 的路径计算不同分支的概率。如果一个物体被预测属于某个较低层级的类别,比如“苏格兰梗”,则其父节点“猎犬”、“狗”、“哺乳动物”、“动物”等类别的概率也会相应计算并传播。
这种层次化的分类方式使得 YOLO9000 可以在只见过某个类别的父类别(例如“动物”)的情况下,预测出属于其子类别(例如“狗”)的可能性,从而实现了对大量类别的检测能力,即使这些类别在检测数据集中没有出现过边界框标签。
YOLOv2 的成就
YOLOv2 在 PASCAL VOC 和 COCO 等数据集上,在保持极高检测速度的同时,显著提升了检测精度,缩小了与两阶段方法的差距。它证明了通过仔细的设计和工程优化,单阶段检测器可以达到与两阶段方法相媲美的性能。YOLOv2 的一些改进技巧,如 Anchor Boxes、Batch Normalization、高分辨率训练、多尺度训练、Passthrough 层等,成为了后续许多目标检测算法的标准配置。
YOLOv3:更强大的特征提取与多尺度预测
尽管 YOLOv2 已经很强大,但与顶尖的两阶段检测器相比,尤其是在检测小物体方面,仍有提升空间。2018 年,Joseph Redmon 再次发布了 YOLOv3,并在论文《YOLOv3: An Incremental Improvement》中进行了介绍。就像标题所示,YOLOv3 更多的是在 YOLOv2 的基础上进行了一系列渐进式的改进,而不是像 YOLOv1 那样彻底改变检测范式。然而,这些改进集合起来,使得 YOLOv3 在检测精度上取得了显著提升,尤其是在处理不同尺度的物体时。
YOLOv3 的主要改进集中在以下几个方面:
- 新的特征提取网络 Darknet-53: YOLOv3 设计了一个更深、更复杂的特征提取网络 Darknet-53。Darknet-53 借鉴了 ResNet 的残差连接思想,包含 53 个卷积层。与 Darknet-19 相比,Darknet-53 具有更多的层和残差块,这使得它能够提取更丰富的特征,并且在 ImageNet 分类任务上的表现优于 ResNet-101 和 ResNet-152,同时计算效率更高。
- 多尺度预测 (Multi-Scale Predictions): 这是 YOLOv3 提升对不同尺寸物体(尤其是小物体)检测能力的关键改进。YOLOv3 不再只在一个尺度上进行预测,而是在 3 个不同的尺度(特征图大小)上进行检测。
- 网络从 Darknet-53 中提取出三个不同层级的特征图(具有不同的感受野和分辨率),分别对应于 $13 \times 13$, $26 \times 26$, 和 $52 \times 52$ (对于 416×416 的输入图像)。
- 每个尺度的特征图都会进行独立的预测。例如,在 $13 \times 13$ 的特征图上进行预测,适合检测大物体;在 $26 \times 26$ 的特征图上预测,适合检测中等物体;在 $52 \times 52$ 的特征图上预测,适合检测小物体。
- 通过上采样和特征拼接(类似于 FPN – Feature Pyramid Network 的思想),将来自更深层(低分辨率,高语义信息)的特征图与来自更浅层(高分辨率,低语义信息)的特征图融合,使得用于预测的特征图同时包含高层次的语义信息和细粒度的位置信息。
- 这种多尺度预测机制显著提高了 YOLOv3 检测小物体的能力。
- 使用逻辑回归预测目标性 (Objectness Prediction with Logistic Regression): YOLOv3 在预测每个边界框是否包含物体时,不再使用均方误差,而是使用了逻辑回归。对于每个预测框,网络会预测一个目标性分数,通过 Sigmoid 函数输出 0 到 1 之间的值,表示该框包含物体的概率。
- 独立的逻辑回归分类器 (Independent Logistic Classifiers): YOLOv3 没有使用 Softmax 函数来计算类别概率,而是对每个类别独立使用逻辑回归进行分类。这是因为 Softmax 假设类别之间是互斥的,而现实世界中一个物体可能属于多个标签(例如,一个物体既是“女人”又是“行人”)。使用独立的逻辑回归允许模型为每个类别预测一个 0 到 1 之间的分数,使得模型能够更好地处理多标签分类问题。
- Anchor Boxes 的改进: YOLOv3 仍然使用 Anchor Boxes,但每个预测尺度都使用一组不同尺寸的 Anchor Boxes。通过对数据集标签框进行 K-Means 聚类,得到 9 个 Anchor Boxes,然后将它们按照大小分配给三个不同的预测尺度(最大的分配给 $13 \times 13$ 特征图,中等的分配给 $26 \times 26$,最小的分配给 $52 \times 52$),每个尺度使用 3 个 Anchor Boxes。
YOLOv3 的损失函数
YOLOv3 的损失函数也进行了调整,以适应新的预测机制和分类方式。它同样是包含边界框坐标损失、尺寸损失、目标性损失和分类损失的加权和。
- 边界框位置和尺寸损失: 仍然使用类似于 YOLOv2 的方式,预测相对于 Anchor Boxes 的偏移量和缩放因子,并使用均方误差计算损失。
- 目标性损失: 使用二元交叉熵(Binary Cross-Entropy)计算预测目标性分数与真实目标性标签(1 如果包含物体,0 如果不包含)之间的损失。
- 分类损失: 对于每个类别,使用二元交叉熵计算预测类别分数与真实类别标签(0 或 1)之间的损失。
YOLOv3 的成就
YOLOv3 在保持较高检测速度的同时,在 COCO 数据集上的 AP(Average Precision)指标上取得了显著提升,尤其是在 AP_small 和 AP_medium 上,这反映了其对小物体和中等物体的检测能力有了明显改善。尽管在最高精度上仍然难以超越一些两阶段方法,但其在速度和精度之间的平衡使其成为当时最受欢迎的目标检测算法之一,得到了广泛的应用。
YOLO 的持续演进:从 v4 到 v8 及以后
YOLOv3 发布后,其作者 Joseph Redmon 宣布停止计算机视觉研究,这让社区感到惋惜。然而,YOLO 的精神和框架得到了广泛的继承和发展。社区涌现出了大量的 YOLO 改进版本,其中一些被广泛认可并冠以了 v4, v5, v6, v7, v8 等“官方”或“社区官方”的名称。这些后续版本在 YOLOv3 的基础上,集成了近年来深度学习领域的各种新技术和优化策略,不断刷新着目标检测的速度与精度记录。
这些后续版本的改进通常体现在以下几个方面:
- 更强大的骨干网络 (Backbone): 引入 CSPNet (Cross Stage Partial Network) 等新的骨干网络设计,以提高特征提取效率和能力(例如 YOLOv4 的 CSPDarknet53,YOLOv5 的 CSPDarknet)。
- 更好的特征融合机制 (Neck): 采用 PANet (Path Aggregation Network) 等结构,进一步改进多尺度特征的融合方式(例如 YOLOv4, YOLOv5, YOLOv7 使用了 PANet 或其变体)。
- 更有效的检测头部 (Head): 对预测头部的结构进行优化。
- 数据增强技术 (Data Augmentation): 引入 Mosaic, CutMix, Copy-Paste 等更先进的数据增强方法,增加训练样本的多样性,提高模型的鲁棒性(例如 YOLOv4, YOLOv5)。
- 损失函数改进 (Loss Function): 使用 CIoU Loss, DIoU Loss 等更优的边界框回归损失函数,提高定位精度。
- 激活函数 (Activation Function): 尝试使用 Mish, Swish 等新型激活函数。
- 训练策略和优化器 (Training Strategy & Optimizer): 采用 Cosine Annealing 学习率调度,使用 AdamW 或 Nesterov Adam 优化器等。
- 后处理改进 (Post-processing): 使用 DIoU-NMS 等改进的非极大值抑制算法。
- 模型架构搜索 (NAS): 探索使用自动化方法搜索更优的模型架构。
- 针对特定硬件的优化: 针对不同的部署平台(如 GPU, CPU, 移动端)进行模型结构的优化和剪枝、量化等。
这些后续版本,如 YOLOv4 (Alexey Bochkovskiy 等人), YOLOv5 (Glenn Jocher 在 Ultralytics 开源), PP-YOLO (百度 PaddlePaddle 团队), YOLOv6 (美团视觉团队), YOLOv7 (Wang, Chao-Yuan 等人), YOLOv8 (Ultralytics 开源) 等,都在速度、精度、模型尺寸、易用性等方面做出了贡献。它们共同推动着 YOLO 系列算法不断向前发展,使其在学术研究和工业应用中都保持着极高的热度。
YOLO 的优势与局限性总结
优势:
- 速度快,适合实时应用: 这是 YOLO 系列最大的卖点。从一开始就设计为单阶段,整个过程在一个网络中完成,计算效率高,非常适合需要快速响应的场景。
- 端到端训练: 整个检测流程是统一的网络,可以直接针对检测性能进行优化。
- 考虑全局上下文: 由于在做预测时能“看到”整张图像,YOLO 更不容易将背景误判为物体,假阳性率相对较低。
- 持续改进: 经过多个版本的迭代,YOLO 系列在精度上也取得了显著提升,缩小了与两阶段方法的差距,并在速度与精度之间找到了很好的平衡。
局限性:
- 对小物体检测相对困难(早期版本): 尤其在 YOLOv1 中,由于网格划分较粗,且每个网格预测框数量有限,导致对密集分布的小物体漏检率较高。尽管后续版本通过多尺度预测等方法有所缓解,但与其他专为小物体检测优化的方法相比,可能仍有差距。
- 边界框定位精度(早期版本): 特别是 YOLOv1,边界框的预测直接与网格相关,导致定位不够精细。后续版本通过 Anchor Boxes、尺寸聚类、更好的损失函数等技术提高了定位精度。
- 对长宽比极端物体的处理: 预设的 Anchor Boxes 如果不能很好地覆盖数据集中长宽比极端的物体形状,可能会影响检测效果。
结论
YOLO 算法作为单阶段目标检测的开创者和杰出代表,以其“只看一次”的核心思想和卓越的实时性能,在计算机视觉领域产生了深远影响。从 YOLOv1 的革命性提出,到 YOLOv2 在速度与精度上的平衡,再到 YOLOv3 的多尺度预测和更强大的骨干网络,以及后续版本如 YOLOv4, v5, v6, v7, v8 等不断融合新的技术优化,YOLO 系列算法持续演进,不断刷新着目标检测的性能极限。
YOLO 不仅仅是一个算法,它代表了一种简洁高效的设计哲学——将复杂的检测任务转化为一个直接的回归或分类问题,通过一个端到端的网络实现。这种哲学极大地推动了实时目标检测技术的发展,并使其在自动驾驶、安防监控、智能制造等对速度要求极高的应用场景中成为首选方案。
尽管未来的目标检测算法可能会引入新的思想和架构,但 YOLO 系列算法所奠定的基础和展现出的潜力,无疑将继续影响和启发着计算机视觉领域的研究和应用。理解 YOLO 的工作原理和演进历程,对于深入掌握目标检测技术具有极其重要的意义。