实时目标检测:YOLO 算法基础介绍
摘要:目标检测是计算机视觉领域的核心任务之一,旨在识别图像或视频中存在的目标并确定其位置。随着深度学习的发展,目标检测算法取得了显著进步。然而,在许多实际应用场景中,如自动驾驶、实时监控、机器人导航等,不仅要求高精度,更要求极高的处理速度,即实时性。YOLO(You Only Look Once)系列算法正是为满足这一需求而设计的里程碑式工作。本文将深入探讨 YOLO 算法的基础原理、核心思想、关键技术、演进历程及其在实时目标检测领域的深远影响。
关键词:目标检测,实时检测,深度学习,计算机视觉,YOLO,卷积神经网络,Bounding Box,非极大值抑制
1. 引言
1.1 目标检测任务概述
计算机视觉旨在让机器能够“看懂”世界。其中,目标检测(Object Detection)是理解图像内容的基础且关键的一步。与图像分类(识别图像中包含什么类别)不同,目标检测不仅需要识别出图像中包含哪些物体(Classification),还需要精确定位这些物体在图像中的位置(Localization)。通常,这个位置信息由一个紧密包围目标的边界框(Bounding Box, BBox)来表示,同时给出该边界框内物体所属的类别及其置信度(Confidence Score)。
1.2 实时目标检测的挑战与意义
传统的计算机视觉方法,如基于 HOG、SIFT 等特征结合 SVM 分类器的方法,或者早期的深度学习方法,虽然在精度上不断提升,但在处理速度上往往难以满足实时应用的需求。例如,在自动驾驶系统中,车辆需要毫秒级地识别前方的行人、车辆、交通信号灯等,任何延迟都可能导致灾难性后果。同样,在视频监控、人机交互、增强现实等领域,实时性也是关键性能指标。
实时目标检测的核心挑战在于如何在保证较高检测精度的同时,大幅提升处理速度,使得算法能够在视频流(通常为 25-30 帧/秒,甚至更高)的处理速率下运行。这要求算法设计必须兼顾效率和效果。
1.3 YOLO 的诞生:一次革新
在 YOLO 出现之前,主流的高精度目标检测算法大多遵循“两阶段”(Two-stage)范式,如 R-CNN 系列(R-CNN, Fast R-CNN, Faster R-CNN)。这些方法首先生成一系列可能包含目标的候选区域(Region Proposals),然后对这些区域进行分类和边界框回归。这种方式虽然精度较高,但由于包含多个处理步骤,速度通常较慢,难以达到实时要求。
2015年,Joseph Redmon 等人提出的 YOLO(You Only Look Once)算法[1]带来了革命性的变化。YOLO 创造性地将目标检测任务视为一个单一的回归问题(Regression Problem),直接从整个图像一次性预测所有目标的边界框和类别概率。这种“一步到位”的“单阶段”(One-stage)设计极大地简化了检测流程,从而实现了前所未有的检测速度,使其成为实时目标检测领域的开创性工作。
本文旨在详细介绍 YOLO 算法的基础概念和核心机制,从最初的 YOLOv1 出发,逐步解析其设计哲学、网络结构、关键技术细节以及后续版本的重要改进,帮助读者深入理解 YOLO 如何实现速度与精度的平衡。
2. YOLO 核心思想:统一检测框架
YOLO 最核心的创新在于其统一的检测框架。它摒弃了传统方法中复杂的流水线(如候选区域生成、特征提取、分类、回归等独立步骤),将整个目标检测任务整合到一个单独的卷积神经网络(Convolutional Neural Network, CNN)中完成。
2.1 将检测视为回归问题
YOLO 的基本思路是:将输入图像分割成一个 S x S 的网格(Grid)。如果一个物体的中心点落入某个网格单元(Grid Cell)内,那么该网格单元就负责预测这个物体。
对于每个网格单元,YOLO 需要预测以下信息:
-
边界框(Bounding Boxes): 每个网格单元预测 B 个边界框。每个边界框包含 5 个参数:
(bx, by)
: 边界框中心点相对于该网格单元左上角的坐标偏移量(值被归一化到 0 到 1 之间)。(bw, bh)
: 边界框的宽度和高度,相对于整个图像的尺寸(值被归一化到 0 到 1 之间)。Pc
(Confidence Score): 该边界框包含目标的置信度。这个置信度反映了两个因素:一是该边界框内实际存在目标的概率 P(Object),二是该边界框预测的准确度(预测框与真实框的 Intersection over Union, IoU)。即Confidence = P(Object) * IoU(pred, truth)
。如果该网格单元内没有目标,P(Object)
应为 0,则 Confidence 为 0。
-
类别概率(Class Probabilities): 每个网格单元还需要预测 C 个条件类别概率
P(Class_i | Object)
。这表示在假定该网格单元包含目标的情况下,该目标属于第 i 个类别的概率。注意,这里预测的是条件概率,每个网格单元只预测一组类别概率,与预测的边界框数量 B 无关。
2.2 输出张量的结构
经过神经网络处理后,YOLO 输出一个 S x S x (B * 5 + C) 的张量(Tensor)。这个张量包含了整个图像所有网格单元的预测信息。
S x S
: 代表图像被划分成的网格数量。B
: 每个网格单元预测的边界框数量。5
: 每个边界框的 5 个参数 (bx, by, bw, bh, Pc)。C
: 数据集中目标的类别总数。
例如,如果 S=7, B=2, C=20 (PASCAL VOC 数据集),则输出张量的大小为 7 x 7 x (2 * 5 + 20) = 7 x 7 x 30。
2.3 从输出到最终检测结果
得到这个巨大的输出张量后,需要进行后处理才能得到最终的检测结果。对于图像中的每个目标,我们希望得到其类别、位置以及置信度。
对于每个边界框,可以计算其特定类别的置信度分数(Class-specific Confidence Score):
Score_i = P(Class_i | Object) * P(Object) * IoU(pred, truth) = P(Class_i | Object) * Confidence
这个分数 Score_i
既包含了该边界框预测为第 i 类目标的概率,也包含了该边界框定位的准确性和是否包含目标的置信度。
计算出所有边界框(总共 S * S * B 个)的 C 个类别置信度分数后,会得到大量的候选框。接下来需要:
- 阈值过滤: 设置一个置信度阈值。将低于该阈值的边界框(即
Score_i
太低的框)过滤掉。 - 非极大值抑制 (Non-Maximum Suppression, NMS): 一个目标可能被多个边界框以高置信度检测到。NMS 是一种常用的后处理技术,用于消除对同一目标的冗余检测框,只保留置信度最高且最准确的那个。NMS 的基本步骤是:
- 将所有剩余的边界框按类别分组。
- 在每个类别内,根据
Score_i
对边界框进行降序排序。 - 选择得分最高的边界框,将其加入最终结果列表。
- 计算该边界框与其他所有同类别边界框的 IoU。
- 移除 IoU 大于某个阈值(如 0.5)的其他边界框。
- 重复此过程,直到所有边界框都被处理。
经过 NMS 处理后,就能得到最终的、非重叠的检测结果列表,每个结果包含目标的类别、边界框位置和置信度分数。
3. YOLOv1 详解
YOLOv1 是 YOLO 系列的开山之作,奠定了其基本框架。
3.1 网络架构
YOLOv1 的网络结构受到 GoogLeNet[2] 的启发,但没有使用 Inception 模块,而是采用了简单的卷积层和全连接层堆叠而成。
- 主干网络 (Backbone): 包含 24 个卷积层,主要用于提取图像特征。这些卷积层交替使用 3×3 和 1×1 的卷积核。1×1 卷积核用于降低特征图的通道数(瓶颈层),减少计算量。
- 输出层: 最后是 2 个全连接层。第一个全连接层将特征图展平并映射到一个 4096 维的向量,第二个全连接层输出最终的 S x S x (B * 5 + C) 维度的预测张量。在 PASCAL VOC 数据集上,S=7, B=2, C=20,因此输出维度为 7 x 7 x 30 = 1470。
整个网络从输入图像(通常是 448×448 像素)直接输出预测张量,实现了端到端的训练和预测。
3.2 训练过程
3.2.1 损失函数 (Loss Function)
YOLOv1 的训练关键在于其精心设计的损失函数。由于输出张量中包含了不同类型的信息(坐标、置信度、类别概率),损失函数需要平衡这些不同部分的重要性。YOLOv1 采用均方和误差 (Sum-Squared Error, SSE) 作为基础,但对不同类型的误差进行了加权。
损失函数主要由三部分组成:
-
坐标预测损失 (Localization Loss): 只计算负责预测目标(即真实目标中心落入)的那个网格单元的那个“最佳”边界框(通常是与真实框 IoU 最高的那个预测框)的坐标误差。
- 计算中心点
(bx, by)
的 SSE。 - 计算宽高
(bw, bh)
的 SSE。为了缓解大框和小框的尺寸误差对损失函数影响不均衡的问题(同样是10个像素的误差,对小框影响更大),YOLOv1 对宽和高取了平方根 (sqrt(bw)
,sqrt(bh)
) 再计算 SSE。 - 这部分损失乘以一个较大的权重
λ_coord
(通常设为 5),表示更重视定位的准确性。
- 计算中心点
-
置信度预测损失 (Confidence Loss): 分为两种情况:
- 包含目标的边界框 (Objectness Loss): 对于负责预测目标的网格单元的“最佳”边界框,计算其预测置信度
Pc
与真实置信度(通常设为 1,或等于预测框与真实框的 IoU)之间的 SSE。 - 不包含目标的边界框 (No-Objectness Loss): 对于所有其他边界框(包括不负责预测目标的网格单元的所有框,以及负责预测目标的网格单元的其他非“最佳”框),计算其预测置信度
Pc
与真实置信度 0 之间的 SSE。由于图像中大部分区域是不包含目标的背景,这些“负样本”框的数量远多于“正样本”框。为了防止它们主导梯度,这部分损失乘以一个较小的权重λ_noobj
(通常设为 0.5)。
- 包含目标的边界框 (Objectness Loss): 对于负责预测目标的网格单元的“最佳”边界框,计算其预测置信度
-
类别预测损失 (Classification Loss): 只计算负责预测目标的那个网格单元的类别概率误差。计算预测的条件类别概率
P(Class_i | Object)
与真实类别(one-hot 编码)之间的 SSE。
总损失是这三部分损失的加权和:
Loss = λ_coord * Loss_coord + Loss_obj + λ_noobj * Loss_noobj + Loss_class
其中 Loss_obj
是包含目标的置信度损失,其权重默认为 1。
3.2.2 训练细节
- 预训练: 主干网络的前 20 个卷积层首先在 ImageNet 数据集上进行预训练(输入分辨率 224×224),然后添加剩余的卷积层和全连接层,并将输入分辨率提升到 448×448 进行目标检测任务的微调。
- 优化器: 使用标准的随机梯度下降(SGD)进行优化。
- 学习率策略: 采用分段衰减的学习率。
- 数据增强: 使用了随机缩放、平移、曝光和饱和度调整等数据增强技术来提高模型的泛化能力。
3.3 YOLOv1 的局限性
虽然 YOLOv1 在速度上取得了巨大突破,但其设计也带来了一些固有的局限性:
- 对小目标的检测效果差: 每个网格单元只能预测固定数量(B=2)的边界框,并且只能预测一个类别。如果一个网格单元内包含多个小目标,YOLOv1 很难将它们都检测出来。此外,下采样过程使得浅层特征信息丢失较多,不利于小目标检测。
- 定位精度相对较低: 与 Faster R-CNN 等两阶段方法相比,YOLOv1 的定位精度有所欠缺,尤其是对于边界框的精确回归。这部分归因于直接从粗糙的网格进行预测。
- 对罕见长宽比的物体检测效果不佳: 边界框的尺寸是直接预测的,模型学习到的主要是数据集中常见物体的长宽比,对于不常见的、特别扁平或细长的物体,预测效果可能不好。
- 召回率 (Recall) 相对较低: 由于每个网格单元的限制,可能会漏掉一些目标。
这些局限性促使了后续 YOLO 版本的不断改进。
4. YOLO 的演进:从 v2 到 v8 及以后
为了克服 YOLOv1 的缺点并进一步提升性能,研究者们提出了一系列的改进版本。
4.1 YOLOv2 (YOLO9000) [3]
YOLOv2(在联合训练 9000 个类别时称为 YOLO9000)在 YOLOv1 的基础上引入了多项关键改进,旨在实现 “Better, Faster, Stronger”。
- Batch Normalization (BN): 在所有卷积层后加入 BN 层,显著改善了收敛性,允许移除 Dropout,并提高了 mAP 约 2%。
- High Resolution Classifier: 先在 ImageNet 上用 448×448 分辨率微调分类网络 10 个 epoch,让网络适应高分辨率输入,再用于检测任务,提升了 mAP 约 4%。
- Anchor Boxes: 这是 YOLOv2 最重要的改进之一。借鉴了 Faster R-CNN 的思想,YOLOv2 不再直接预测边界框的绝对坐标和尺寸,而是预测相对于预设的锚框 (Anchor Boxes) 的偏移量。
- 动机: 直接预测宽高范围很大,训练初期不稳定。Anchor Box 提供了尺寸先验,使得网络只需要学习较小的偏移量,更容易收敛。
- 实现: 通过 K-Means 聚类算法在训练集的所有真实边界框上聚类得到一组(通常是 5 个)具有代表性的 Anchor Box 尺寸(宽高比)。
- 预测: 每个网格单元预测 B 个边界框,每个边界框的预测值包括相对于 Anchor Box 的中心点偏移
(tx, ty)
、宽高缩放因子(tw, th)
以及置信度Pc
。实际的边界框坐标(bx, by, bw, bh)
通过公式从(tx, ty, tw, th)
和 Anchor Box 的尺寸(pw, ph)
计算得到。 - 效果: 使用 Anchor Box 大幅提高了召回率(Recall),虽然 mAP 略有下降(因为候选框变多了),但总体性能更好。
- Dimension Clusters: 如上所述,Anchor Box 的尺寸不是手动选择的,而是通过 K-Means 聚类自动从数据集中学习得到,使其更符合数据的分布。
- Direct Location Prediction: 对 Anchor Box 的中心点偏移预测进行了约束,使用 sigmoid 函数将偏移量限制在网格单元内部,使得预测更加稳定,避免了早期版本中边界框中心可能漂移到很远的问题。
- Fine-Grained Features (Passthrough Layer): 为了更好地检测小目标,YOLOv2 引入了一个 Passthrough 层,将前面较高分辨率(如 26×26)的特征图与后面较低分辨率(13×13)的特征图进行拼接(通道维度),从而融合了细粒度的特征信息。
- Multi-Scale Training: 为了让模型对不同输入尺寸具有鲁棒性,YOLOv2 在训练过程中每隔几轮(如 10 个 batch)就随机改变网络的输入图像尺寸(从 320×320 到 608×608,步长 32)。这使得同一个网络可以在不同分辨率下工作,在速度和精度之间取得灵活的权衡。
- Darknet-19: 使用了新的主干网络 Darknet-19,包含 19 个卷积层和 5 个最大池化层,比 YOLOv1 的网络更高效。
- YOLO9000: 通过结合 COCO(检测数据集)和 ImageNet(分类数据集),使用 WordTree 数据结构组织标签,实现了同时在检测和分类任务上训练,能够检测超过 9000 种物体类别,展示了大规模目标检测的可能性。
YOLOv2 在保持极快速度的同时,在 PASCAL VOC 和 COCO 数据集上取得了当时 SOTA 的精度,显著优于 YOLOv1。
4.2 YOLOv3 [4]
YOLOv3 继续在 YOLOv2 的基础上进行改进,重点在于提高对小目标的检测能力和整体精度。
- 多尺度预测 (Predictions across Scales): 这是 YOLOv3 最核心的改进。借鉴了特征金字塔网络 (Feature Pyramid Network, FPN) [5] 的思想,YOLOv3 在三个不同的尺度上进行预测。网络在三个不同的层级(具有不同分辨率的特征图,如 13×13, 26×26, 52×52)输出预测结果。
- 大尺度特征图 (52×52): 感受野较小,分辨率高,用于检测小目标。
- 中尺度特征图 (26×26): 用于检测中等大小的目标。
- 小尺度特征图 (13×13): 感受野最大,分辨率低,用于检测大目标。
- 每个尺度的预测层都使用一组(通常是 3 个)不同尺寸的 Anchor Box。例如,在 COCO 数据集上,总共使用 9 个 Anchor Box,每个尺度分配 3 个。
- 更好的主干网络 (Darknet-53): YOLOv3 采用了更深、更强大的主干网络 Darknet-53,包含 53 个卷积层。它大量使用了残差连接(Residual Connections),类似于 ResNet[6],使得网络可以训练得更深,特征提取能力更强,同时避免了梯度消失问题。Darknet-53 在精度上媲美 ResNet-101 和 ResNet-152,但计算效率更高。
- 类别预测方式改变: 对于每个边界框的类别预测,YOLOv3 不再使用 Softmax 函数(假设每个框只属于一个类别),而是使用了多个独立的 Logistic 分类器(每个类别一个)。这使得模型能够处理多标签分类问题(即一个目标可能同时属于多个类别,如 “Woman” 和 “Person”),更适用于像 Open Images Dataset 这样的复杂数据集。
- 边界框预测和损失函数: 边界框的预测方式(相对于 Anchor Box 的偏移)和损失函数(坐标、置信度、分类损失之和)基本延续了 YOLOv2 的设计,但类别损失部分改用二元交叉熵损失 (Binary Cross-Entropy Loss) 来配合 Logistic 分类器。
YOLOv3 在 COCO AP50 指标上达到了与 RetinaNet[7] 相当的精度,同时速度快得多,进一步巩固了 YOLO 在实时检测领域的地位。然而,它在小物体的 AP(Average Precision)指标上仍有提升空间。
4.3 YOLOv4 [8] 与 YOLOv5 [9]
YOLOv4 和 YOLOv5 的出现标志着 YOLO 系列进入了一个快速迭代和工程优化并重的新阶段。它们在 YOLOv3 的基础上,集成了当时深度学习领域各种先进的技术和技巧,旨在进一步提升精度,同时尽可能保持甚至提高速度。
YOLOv4 (2020年4月): 由 Alexey Bochkovskiy 等人(非原作者团队)发布。其主要贡献在于系统性地评估和整合了大量可提升 CNN 性能的技术,并将它们分为两类:
- Bag of Freebies (BoF): 指那些只增加训练成本,但不增加推理(预测)成本的技术,主要是数据增强方法。例如:
- CutMix 和 Mosaic 数据增强:将多张图片裁剪、拼接成一张进行训练,极大地丰富了训练样本的多样性,提高了模型对遮挡、不同背景和小目标的鲁棒性。
- DropBlock 正则化:一种结构化的 Dropout,效果优于传统 Dropout。
- Label Smoothing: 一种正则化技巧,防止模型对标签过于自信。
- IoU/GIoU/DIoU/CIoU Loss: 使用更先进的 IoU 变种作为边界框回归损失函数,能更好地衡量框之间的重叠、距离和长宽比,加速收敛并提高定位精度。YOLOv4 使用了 CIoU Loss。
- Bag of Specials (BoS): 指那些轻微增加推理成本,但能显著提升精度的技术,主要是网络结构或模块的改进。例如:
- Mish 激活函数: 一种平滑的非线性激活函数,据称比 ReLU 效果更好。
- CSP (Cross Stage Partial Network) [10] 结构**: 应用于主干网络 (CSPDarknet53) 和 Neck 部分,通过分割和合并特征图,减少计算量,增强梯度传播,提高学习能力。
- SPP (Spatial Pyramid Pooling) [11] 模块**: 在 Neck 部分使用,通过不同大小的池化核聚合特征,增大感受野,分离出最重要的上下文特征。
- PANet (Path Aggregation Network) [12] 结构**: 在 Neck 部分(特征融合部分)采用,结合了 FPN 的自顶向下路径和自底向上的路径,加强了不同层级特征的融合。
- SAM (Spatial Attention Module) [13]: 空间注意力模块(尽管论文中提到,实际代码实现可能有所不同)。
- DIoU-NMS: 使用 Distance-IoU [14] 作为 NMS 的判据,能更好地处理重叠目标的情况。
YOLOv4 在 COCO 数据集上取得了当时的 SOTA 精度(43.5% AP / 65.7% AP50),在 Tesla V100 上可达到约 65 FPS 的实时速度,实现了精度和速度的卓越平衡。
YOLOv5 (2020年5月): 由 Glenn Jocher 的 Ultralytics 公司发布,几乎与 YOLOv4 同时期出现。YOLOv5 并非一篇学术论文,而是作为一个 PyTorch 实现的开源项目迅速流行起来。它在 YOLOv3/v4 的架构基础上,更加注重工程实践和易用性。
- 架构: 基础架构与 YOLOv4 类似,也采用了 CSPDarknet 作为 Backbone,PANet 作为 Neck,以及 YOLOv3 的 Head。但具体实现和一些超参数设置有所不同。
- 关键特性:
- PyTorch 实现: 使用 Python 和 PyTorch 编写,社区活跃,易于上手、训练、部署。
- 模型缩放: 提供了从 Nano (n), Small (s), Medium (m), Large (l) 到 Extra-Large (x) 的一系列模型,方便用户根据资源和需求选择不同大小的模型。
- 快速迭代: 开发非常活跃,不断集成新的优化和技术。
- 数据增强: 同样大量使用了 Mosaic 等先进的数据增强技术。
- AutoAnchor: 自动学习最佳的 Anchor Box 尺寸。
- 部署友好: 提供了导出到 ONNX, CoreML, TFLite 等多种格式的工具,方便在各种平台(服务器、移动端、嵌入式设备)上部署。
YOLOv5 因其易用性、良好的性能和快速的开发迭代而广受欢迎,成为工业界和学术界非常常用的 YOLO 版本之一。尽管关于其与 YOLOv4 的性能比较存在一些讨论,但两者都代表了当时 YOLO 发展的高水平。
4.4 后续发展 (YOLOv6, v7, v8, YOLOR, YOLOX, …)
在 YOLOv4 和 YOLOv5 之后,YOLO 的发展进入“百花齐放”的阶段,多个研究团队和公司推出了各自的改进版本,不断刷新精度和速度的记录。这些版本通常引入了更先进的网络设计(如 RepVGG 风格结构、更高效的 Neck 设计)、标签分配策略(如 SimOTA)、损失函数、训练技巧以及对部署的优化。
- YOLOR (You Only Learn One Representation) [15]: 引入隐式知识 (implicit knowledge) 与显式知识 (explicit knowledge) 结合的思想。
- YOLOX [16]: 旷视科技提出,采用了 Anchor-Free 设计(不再依赖预设的 Anchor Box),SimOTA 动态标签分配策略,以及更强的 Decoupled Head(将分类和定位任务的输出头分开)。
- YOLOv6 [17]: 美团视觉智能部提出,也采用了 Anchor-Free 设计,RepVGG 风格的硬件友好 Backbone (EfficientRep),以及更优化的 Neck 和 Head 设计。
- YOLOv7 [18]: 由 YOLOv4 的原班人马提出,引入了 “Extended Efficient Layer Aggregation Networks” (E-ELAN) 等结构优化和 “model scaling for concatenation-based models” 等训练技巧,再次在精度和速度上取得显著提升。
- YOLOv8 [19]: 由 Ultralytics (YOLOv5 团队) 推出,作为 YOLOv5 的下一代版本。它同样是 Anchor-Free 设计,采用了 C2f 模块(借鉴 ELAN 和 CSP 的思想),Decoupled Head,并使用了新的损失函数(如 Distribution Focal Loss [20])。YOLOv8 提供了统一的框架,支持目标检测、实例分割、图像分类等多种任务。
- 其他: 还有 DAMO-YOLO, YOLO-NAS, Gold-YOLO 等等,都从不同角度对 YOLO 进行了改进和优化。
这些新版本的共同趋势包括:
- Anchor-Free: 逐渐摆脱对 Anchor Box 的依赖,简化设计,提高泛化能力。
- 动态/最优标签分配: 如 SimOTA, TAL 等,更智能地为预测框分配正负样本标签。
- 更高效的网络结构: 如 CSP, ELAN, RepVGG 等,追求更高的计算效率和特征表达能力。
- 解耦头 (Decoupled Head): 分开处理分类和回归任务,通常能提升性能。
- 更先进的损失函数: 如 GIoU, DIoU, CIoU, Focal Loss, Distribution Focal Loss 等。
- 与 Transformer 结合: 一些研究开始尝试将 Transformer 结构引入 YOLO,如 ViT-YOLO 等。
5. 非极大值抑制 (NMS) 详解
NMS 是目标检测流程中不可或缺的后处理步骤,YOLO 也不例外。它的目的是解决单个目标可能被多个边界框高置信度检测到的问题,筛选出最佳的那个框。
基本原理:
- 输入: 所有通过置信度阈值筛选后的边界框列表,每个框包含坐标、类别和置信度分数。
- 按类别处理: 通常 NMS 是按类别独立进行的。
- 排序: 在当前类别内,根据置信度分数对所有边界框进行降序排序。
- 选择与抑制:
- 选择得分最高的边界框
M
,将其加入最终保留的检测结果列表。 - 计算
M
与该类别内其他所有剩余边界框B_i
的 IoU (Intersection over Union)。 - 如果
IoU(M, B_i)
大于预设的 NMS 阈值T
(例如 0.5 或 0.45),则认为B_i
是对M
所检测目标的冗余检测,将其从列表中移除(或标记为抑制)。
- 选择得分最高的边界框
- 迭代: 从剩余的边界框中,重复步骤 4,选择下一个得分最高的框,抑制与其重叠过多的框,直到所有框都被处理完毕。
- 合并结果: 将所有类别处理后保留下来的边界框合并,得到最终的检测结果。
IoU 计算:
IoU 是衡量两个边界框重叠程度的指标,计算公式为:
IoU = Area(Intersection) / Area(Union)
其中 Area(Intersection)
是两个边界框交集的面积,Area(Union)
是两个边界框并集的面积。IoU 的值域为 [0, 1],值越大表示重叠程度越高。
NMS 的变种:
原始 NMS 存在一个问题:如果两个真实目标靠得很近,得分次高的框可能会因为与得分最高的框 IoU 过高而被错误抑制。为了解决这个问题,出现了一些 NMS 的变种:
- Soft-NMS [21]: 不直接移除 IoU 大于阈值的框,而是根据 IoU 值降低其次高框的置信度分数。这样,靠近的但属于不同目标的框仍有机会被保留。
- DIoU-NMS [14]: 在 NMS 过程中,不仅考虑 IoU,还考虑两个框中心点之间的距离。如果两个框 IoU 很高,但中心点距离较远,则可能属于不同的密集目标,不应被抑制。YOLOv4 就采用了 DIoU-NMS。
NMS 的效率和效果对最终检测性能有重要影响,选择合适的 NMS 阈值和变种也是目标检测实践中的一个重要环节。
6. YOLO 性能评估指标
评估目标检测算法性能的主要指标包括:
- 精度 (Accuracy):
- Intersection over Union (IoU): 如前所述,衡量预测框与真实框的重叠程度。通常设定一个 IoU 阈值(如 0.5),当预测框与真实框的 IoU 大于该阈值时,认为该预测框是 True Positive (TP),否则是 False Positive (FP)。未被检测到的真实框是 False Negative (FN)。
- Precision (精确率):
TP / (TP + FP)
,表示所有预测为正例的框中,真正是正例的比例。 - Recall (召回率):
TP / (TP + FN)
,表示所有真实正例中,被成功检测出来的比例。 - Average Precision (AP): 单个类别的平均精度。通常通过绘制 Precision-Recall (PR) 曲线,并计算曲线下的面积来得到。AP 综合了 Precision 和 Recall。
- mean Average Precision (mAP): 所有类别的 AP 的平均值。这是评估目标检测算法精度的最常用指标。有时会标注 IoU 阈值,如 [email protected] (IoU 阈值为 0.5),[email protected],或 mAP@[0.5:0.95] (表示在 IoU 阈值从 0.5 到 0.95,步长 0.05 的多个阈值下计算 AP,再取平均)。
- 速度 (Speed):
- Frames Per Second (FPS): 每秒可以处理的图像帧数。这是衡量实时性的关键指标。FPS 越高,实时性越好。通常需要在特定的硬件(如 GPU 型号)上进行测试。
- Latency: 处理单张图像所需的时间(毫秒)。
理想的目标检测算法应该同时具有高 mAP 和高 FPS。YOLO 系列算法的核心优势就在于其在 FPS 上的卓越表现,同时不断努力提升 mAP,以在速度和精度之间达到最佳平衡。
7. YOLO 的优势与劣势
7.1 优势
- 速度快: 这是 YOLO 最显著的优势。其统一的单阶段检测框架避免了复杂的流水线,使得检测速度极快,非常适合实时应用。
- 背景误检率低 (背景 False Positives 少): YOLO 在预测时能看到整个图像的上下文信息,而不仅仅是局部区域。这使得它能够更好地理解全局场景,减少将背景误识别为目标的可能性。相比之下,基于滑动窗口或候选区域的方法更容易产生背景误报。
- 学习到的特征泛化能力强: YOLO 学习到的是高度泛化的物体表示。有研究表明,在自然图像上训练的 YOLO 模型,应用到艺术画作等其他领域时,其表现优于 R-CNN 等方法。
- 端到端训练: 整个检测流程集成在一个网络中,可以直接进行端到端的训练和优化,简单直接。
7.2 劣势 (尤其早期版本)
- 对小目标检测困难: 如前所述,YOLOv1 对空间约束较强,且下采样导致细粒度信息丢失,不利于检测密集或微小的目标。(后续版本通过多尺度预测、Passthrough 层等方式已显著改善)
- 定位精度相对较低: 相比于需要精细调整候选区域的两阶段方法,YOLO 的定位精度(尤其是早期版本)通常稍逊一筹。(后续版本通过 Anchor Box 优化、更好的损失函数等方式有所提升)
- 难以处理形状奇特的物体: YOLOv1 直接预测宽高,对训练集中不常见的长宽比泛化能力有限。(Anchor Box 的引入缓解了此问题)
- 召回率相对较低: 早期版本由于每个网格的预测限制,可能会漏检一些目标。(Anchor Box 和多尺度预测提高了召回率)
需要注意的是,随着 YOLO 的不断演进,许多早期的劣势在后续版本中都得到了显著的缓解或解决。现代的 YOLO 版本(如 YOLOv7, YOLOv8)在精度上已经非常有竞争力,同时保持着领先的速度。
8. YOLO 的应用领域
凭借其出色的实时性能,YOLO 已被广泛应用于各种需要快速目标识别和定位的场景:
- 自动驾驶: 实时检测车辆、行人、交通标志、信号灯等,为决策和控制提供关键信息。
- 视频监控与安防: 人流统计、异常行为检测、入侵检测、人脸识别(配合其他技术)、车辆跟踪等。
- 机器人技术: 机器人导航(识别障碍物)、抓取(定位物体)、人机交互(识别手势、人体姿态)。
- 医疗影像分析: 检测肿瘤、病变区域、器官等,辅助医生诊断。
- 零售业: 货架商品识别与计数、顾客行为分析、无人商店结算。
- 增强现实 (AR): 实时识别环境中的物体,叠加虚拟信息。
- 无人机: 航拍图像中的目标搜索与跟踪。
- 工业质检: 检测产品表面的缺陷、瑕疵。
- 娱乐: 实时滤镜、游戏中的目标互动。
9. 总结与展望
YOLO 系列算法无疑是实时目标检测领域的里程碑。从 YOLOv1 革命性地提出统一检测框架,将目标检测转化为回归问题,到 YOLOv2、YOLOv3 引入 Anchor Box、多尺度预测等关键改进,再到 YOLOv4、YOLOv5 及后续版本系统性地集成各种先进技术和工程优化,YOLO 始终在追求速度与精度的极致平衡。
YOLO 的核心思想——“You Only Look Once”——深刻影响了目标检测领域的发展,催生了大量基于单阶段思想的高效检测器。虽然两阶段方法在某些超高精度要求的场景下仍有优势,但单阶段方法(尤其是以 YOLO 为代表)凭借其速度优势和不断提升的精度,已成为许多实际应用的首选。
展望未来,实时目标检测的研究仍在继续:
- 更高精度与更快速度: 持续探索更有效的网络结构、特征融合机制、损失函数和训练策略,进一步提升 mAP 和 FPS。
- 轻量化与部署: 针对移动端、嵌入式设备等资源受限平台,设计更轻量、更高效的模型(如 MobileNet-YOLO, NanoDet 等)。模型压缩、量化、硬件加速等技术将更加重要。
- Transformer 的融合: 将 Transformer 在自然语言处理和图像分类中的成功经验引入目标检测,探索其在捕捉全局依赖关系和长距离上下文方面的潜力,可能带来新的突破(如 DETR[22] 及其变种,以及与 CNN 结合的混合模型)。
- 更复杂的检测任务: 从 2D 目标检测扩展到 3D 目标检测、实例分割、姿态估计、视频目标检测与跟踪等更复杂的任务,并追求实时性。
- 自监督与无监督学习: 减少对大量标注数据的依赖,利用无标签数据进行预训练或直接进行检测。
- 鲁棒性与泛化能力: 提高模型在不同光照、天气、遮挡、视角变化等复杂条件下的鲁棒性。
YOLO 的故事远未结束。它不仅是一个成功的算法系列,更代表了一种追求效率与效果平衡的设计哲学。随着计算能力的提升和算法的不断创新,我们有理由相信,实时目标检测技术将在未来赋能更多激动人心的应用,让机器的“眼睛”看得更快、更准、更智能。
参考文献:
[1] Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You Only Look Once: Unified, Real-Time Object Detection. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[2] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., … & Rabinovich, A. (2015). Going deeper with convolutions. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[3] Redmon, J., & Farhadi, A. (2017). YOLO9000: Better, Faster, Stronger. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[4] Redmon, J., & Farhadi, A. (2018). YOLOv3: An Incremental Improvement. arXiv preprint arXiv:1804.02767.
[5] Lin, T. Y., Dollár, P., Girshick, R., He, K., Hariharan, B., & Belongie, S. (2017). Feature Pyramid Networks for Object Detection. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[6] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[7] Lin, T. Y., Goyal, P., Girshick, R., He, K., & Dollár, P. (2017). Focal Loss for Dense Object Detection. Proceedings of the IEEE International Conference on Computer Vision (ICCV).
[8] Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934.
[9] Jocher, G., et al. (2020). YOLOv5. GitHub repository. https://github.com/ultralytics/yolov5
[10] Wang, C. Y., Liao, H. Y. M., Wu, Y. H., Chen, P. Y., Hsieh, J. W., & Yeh, I. H. (2020). CSPNet: A New Backbone that can Enhance Learning Capability of CNN. Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition Workshops (CVPRW).
[11] He, K., Zhang, X., Ren, S., & Sun, J. (2015). Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI).
[12] Liu, S., Qi, L., Qin, H., Shi, J., & Jia, J. (2018). Path Aggregation Network for Instance Segmentation. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[13] Woo, S., Park, J., Lee, J. Y., & Kweon, I. S. (2018). CBAM: Convolutional Block Attention Module. Proceedings of the European Conference on Computer Vision (ECCV).
[14] Zheng, Z., Wang, P., Liu, W., Li, J., Ye, R., & Ren, D. (2020). Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression. Proceedings of the AAAI Conference on Artificial Intelligence.
[15] Wang, C. Y., Bochkovskiy, A., & Liao, H. Y. M. (2021). You Only Learn One Representation: Unified Network for Multiple Tasks. arXiv preprint arXiv:2105.04206.
[16] Ge, Z., Liu, S., Wang, F., Li, Z., & Sun, J. (2021). YOLOX: Exceeding YOLO Series in 2021. arXiv preprint arXiv:2107.08430.
[17] Li, C., Li, L., Jiang, H., Weng, K., Geng, Y., Li, L., … & Wei, X. (2022). YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications. arXiv preprint arXiv:2209.02976.
[18] Wang, C. Y., Bochkovskiy, A., & Liao, H. Y. M. (2022). YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors. arXiv preprint arXiv:2207.02696.
[19] Jocher, G., et al. (2023). YOLOv8. GitHub repository. https://github.com/ultralytics/ultralytics
[20] Li, X., Wang, W., Wu, L., Chen, S., Hu, X., Li, J., … & He, J. (2020). Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection. Advances in Neural Information Processing Systems (NeurIPS).
[21] Bodla, N., Singh, B., Chellappa, R., & Davis, L. S. (2017). Soft-NMS – Improving Object Detection With One Line of Code. Proceedings of the IEEE International Conference on Computer Vision (ICCV).
[22] Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020). End-to-End Object Detection with Transformers. European Conference on Computer Vision (ECCV).