“You Only Look Once”,即“YOLO”,是一种实时目标检测的算法。它的工作原理是将图片分割成网格,并对每个网格同时进行分类和边框预测,能快速而准确的识别图片中的目标。
YOLO算法广泛应用于自动驾驶、智能监控、工业检测等需要高效目标检测的领域。
YOLO算法之所以高效,是因为它将目标检测问题视为一个单阶段CNN任务,能在一次前向传播中就完成物体分类和定位。传统的目标检测方法,如R-CNN系列,通常将检测分为多个步骤,比如候选区域生成、特征提取、分类与边界框回归等,而YOLO则打破了这种流程,实现了“端到端”的目标检测。
核心概念
mAP (mean Average Precision): 平均精度均值,是目标检测任务中常用的评价指标,用于评估模型的准确性。mAP值越高,说明模型的检测效果越好
FLOPs (Floating Point Operations): 浮点运算数,是衡量模型计算复杂度的指标,FLOPs值越低,说明模型的计算效率越高, 需求的算力越小
版本对比
YOLOv8, 2023.1
Link: 发布页面↗
YOLOv8 is the latest iteration in the YOLO series of real-time object detectors, offering cutting-edge performance in terms of accuracy and speed. Building upon the advancements of previous YOLO versions, YOLOv8 introduces new features and optimizations that make it an ideal choice for various object detection tasks in a wide range of applications.
YOLOv8 模型在各种基准数据集上都达到了最先进的性能。例如,YOLOv8n 模型在 COCO 数据集上的 mAP(平均精度)为 37.3,在 A100TensorRT 上的速度为 0.99 毫秒。
优化了速度于与精度,支持多任务学习,提供了更多的预训练模型。
架构升级-anchor-free
v8采用了anchor-free的设计,提升了检测精度和速度,同时简化了模型结构,减少了计算量。
anchor: 锚点,是一种用于目标检测的预定义的边界框,锚点一般是根据训练数据集中的物体尺寸进行手动选择或K-means聚类生成的,通常以不同的宽度和高度组合形成。这些边界框的作用是提供一个初始参考框,以便于模型在训练过程中进行边界框的回归。 anchor可以被视为模型在图像中“Expect”的物体的比例,anchor的存在更适合于识别模式固定的物体,但对于尺寸比例变化较大的物体效果不好。
v5中使用anchor-based方法进行目标检测,在训练过程中,模型需要预测目标的类别和边界框,同时还需要预测anchor的偏移量,增加了模型的复杂度和计算量。
v8采用了anchor-free的设计,通过直接预测目标的中心点和边界框来实现目标检测,比v5效率更高。
多任务
v8原生支持多任务学习,可以同时进行目标检测、分割、图像分类、人姿态估计等,可方便切换不同任务。
# 多任务代码示例
from ultralytics import YOLO
# Load a YOLOv8n model from pretrained weights
model = YOLO('yolov8n.pt')
# Perform object detection, segmentation, classification, and pose estimation
results1 = model.predict(source='image.jpg', task='detect')
results2 = model.predict(source='image.jpg', task='segment')
results3 = model.predict(source='image.jpg', task='classify')
results4 = model.predict(source='image.jpg', task='pose')
# Display the results
results1.show()
results2.show()
results3.show()
results4.show()
性能提升
v8在mAP上有较大提升,通常推理更快、延迟更低,但需要的FLOPs更大。
损失函数
v8换用了新的损失函数,能综合考虑多任务,会进行动态权重调整,提升了模型的训练效果。
代码示例
# 训练代码示例
from ultralytics import YOLO
# Load a COCO-pretrained YOLOv8n model
model = YOLO("yolov8n.pt")
# Train the model on the COCO8 example dataset for 100 epochs
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)
# 推理代码示例
from ultralytics import YOLO
# Load a COCO-pretrained YOLOv8n model
model = YOLO("yolov8n.pt")
# Display model information (optional)
model.info()
# Run inference with the YOLOv8n model on the 'bus.jpg' image
results = model("path/to/bus.jpg")
# Display the results
results.show()
YOLOv9, 2024.2
Link: 原始论文↗ | 发布页面↗
YOLOv9 introduces innovative methods like Programmable Gradient Information (PGI) and the Generalized Efficient Layer Aggregation Network (GELAN).
In the quest for optimal real-time object detection, YOLOv9 stands out with its innovative approach to overcoming information loss challenges inherent in deep neural networks. By integrating PGI and the versatile GELAN architecture, YOLOv9 not only enhances the model’s learning capacity but also ensures the retention of crucial information throughout the detection process, thereby achieving exceptional accuracy and performance.
YOLOv9 的进步深深扎根于解决深度神经网络中信息丢失所带来的挑战。信息瓶颈原理和可逆函数的创新使用是其设计的核心,可确保 YOLOv9 保持高效率和高精确度。
在COCO 数据集上,YOLOv9 模型在保持或减少计算开销的同时,在各种大小的 mAP 分数上都表现优异。例如,与 YOLOv7 AF 相比,YOLOv9c 以减少 42% 的参数和 21% 的计算需求实现了相当的准确性。
解决深度网络中的信息丢失问题,模型训练更加稳定,提升了检测精度。
架构升级-PGI
v8在网络层之间的信息流动可能存在一定的损失,影响了深层网络的准确性。v9通过PGI和可逆函数的使用,确保在整个网络中保留重要数据,减少信息瓶颈,增强梯度生成的可靠性。
- 在深层网络中,随着层数的增加,信息通过网络传递时会逐渐丢失,尤其是与检测物体相关的关键信息。在传统网络中,信息的逐渐丢失可能会导致模型的精度下降。PGI 的引入,通过对梯度信息进行主动控制和优化的方式对梯度的计算和传播进行调整,优化梯度的流动,使模型在训练过程中生成更精确、稳定的梯度,从而提高模型的收敛性和性能。
架构升级-GELAN
v9采用了GELAN,通过对网络层的聚合,参数利用率和计算效率更高
GELAN(广义高效层聚合网络,Generalized Efficient Layer Aggregation Network)的主要目的是提高网络层间的信息传递效率,从而提升模型在目标检测任务中的参数利用率和计算效率。
GELAN 通过聚合不同层的特征,确保网络中的多个层能够共享和重用特征信息。传统的网络结构往往存在特征图孤立的情况,即每一层只能使用来自前一层的特征,这可能导致信息传递不充分。GELAN 通过层与层之间的特征融合,让不同层级的特征(比如高层次语义信息与底层空间信息)能够被充分利用,使模型在复杂的目标检测任务中表现更好。
GELAN 允许多个不同的计算模块灵活集成。这意味着可以根据不同的应用场景和计算资源,在保持高效的前提下,动态调整网络结构和计算模块。这样的灵活性使得 YOLOv9 能够适应更多元的任务和硬件环境,无论是在边缘计算设备上运行轻量化模型,还是在高性能服务器上运行大规模模型。
传统深度神经网络中,随着网络的加深,模型的参数量和计算复杂度往往呈指数增长。GELAN 通过智能的特征融合和信息传递方式,减少了不必要的冗余计算,提升了参数的使用效率。这种设计确保了 YOLOv9 在处理复杂的目标检测任务时,能以较少的计算量获得更高的精度。
性能提升
v9训练需要更多资源,但在mAP上有显著提升,在提高精度的同时大幅减少了参数和计算量,推理更快、延迟更低。
适应范围
v9对复杂场景和多任务学习的适应性更强
代码示例
# 训练代码示例
from ultralytics import YOLO
# Build a YOLOv9c model from pretrained weights and train
model = YOLO("yolov9c.pt")
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)
# 推理代码示例
from ultralytics import YOLO
# Build a YOLOv9c model from pretrained weight
model = YOLO("yolov9c.pt")
# Display model information (optional)
model.info()
# Run inference with the YOLOv9c model on the 'bus.jpg' image
results = model("path/to/bus.jpg")
# Display the results
results.show()
YOLOv10, 2024.5
Link: 原始论文↗ | 发布页面↗
YOLOv10 is created by researchers from Tsinghua University using the Ultralytics Python package. This version provides real-time object detection advancements by introducing an End-to-End head that eliminates Non-Maximum Suppression (NMS) requirements.
解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv10 在显著降低计算开销的同时实现了最先进的性能。大量实验证明,YOLOv10 在多个模型尺度上实现了卓越的精度-延迟权衡。
YOLOv10 在准确性和效率方面都优于YOLO 以前的版本和其他最先进的模型。例如,在 COCO 数据集上,YOLOv10-S 的速度是RT-DETR-R18 的 1.8 倍,而 AP 却与之相似。在性能相同的情况下,YOLOv10-B 比 YOLOv9-C 减少了 46% 的延迟和 25% 的参数。
架构升级-No NMS:
优化推理时间,提升精度
NMS(Non-Maximum Suppression)会将所有的边界框按置信度排序,从中选择最高置信度的边界框作为初步预测框,然后根据与该框的重叠程度(如IOU,交并比)抑制其他置信度较低的重叠框。这一过程被反复执行,直到所有边界框被处理完毕。虽然NMS能够有效过滤冗余框,但这个后处理步骤在推理阶段增加了额外的计算开销。此外,NMS在一些复杂的场景中(例如物体密集排列时)可能会误删真正的物体,导致误检或漏检。
YOLOv10 采用了一种新的分配机制来取代传统的NMS后处理。这种机制使v10推理速度提升、预测精度提高、所需计算资源减少。
一对多策略(One-to-Many): 在模型的训练阶段,YOLOv10会为每个目标物体分配多个预测框。这些预测框提供丰富的监督信号,确保模型可以学习到更多的边界框特征,从而在训练过程中增加学习的鲁棒性。通过这一机制,模型在训练阶段接收了更多关于目标位置和类别的信息。
一对一策略(One-to-One): 在推理阶段,YOLOv10为每个目标只生成一个最佳的预测框,而不再需要通过NMS来筛选。这种方法直接生成了最优的边界框,从而避免了NMS的计算开销并减少了推理时的延迟。
架构升级-改进CSPNet
使梯度信息更为有效地传递,网络能够更好地捕捉到不同尺度和不同语义层次的特征,参数减少,效率提升
CSPNet(Cross Stage Partial Network)跨层特征融合避免了重复的特征提取,v10的改进提高了梯度信息的传递效率、减少了计算冗余、提升了特征表达能力
v10的改进主要体现在:
分割特征图进行处理时,保留了一部分信息直接跳过中间计算,最终在全局阶段进行融合。
根据任务需求动态调整特征图的处理方式,令模型在不同应用场景中能够自适应地调整计算复杂度和精度。
架构升级-大核卷积
引入大核卷积模块,增强了模型的特征提取能力,扩展了感受野,提高了检测精度。
感受野: 卷积神经网络(CNN)中的感受野是指每个输出特征图上的单个点在输入图像中所覆盖的区域。感受野越大,模型能够捕捉到的上下文信息就越多。传统的卷积核(如3x3)具有较小的感受野,虽然可以通过堆叠多层卷积增大感受野,但这往往会增加模型的深度和计算复杂度。
大核卷积能够在不增加网络深度的情况下增强模型对全局特征的捕捉能力,其通过直接使用更大的卷积核(如7x7、9x9)来显著扩展感受野,避免了通过增加层数来增大感受野的计算开销。这样,模型可以一次性捕捉到更多的全局信息,在复杂场景中对物体的理解全局和局部特征理解更准确。
架构升级-PSA
捕捉输入数据中远距离元素之间的依赖关系,提升特征表示、全局信息捕捉的能力。
自注意力模块(Self-Attention Module) 是深度学习模型中的一种关键机制,最早广泛应用于自然语言处理(NLP)任务,如Transformer模型中,通过为每个输入元素(如词、图像像素)计算其与所有其他元素的相似度,动态调整其表示,最终形成更全局化的特征,在需要捕捉全局上下文时非常有用。随着计算机视觉领域的发展,自注意力机制也被引入图像处理任务中。
YOLOv10中的PSA能够捕捉输入数据中远距离位置的相关性、动态计算每个位置的加权信息、增强特征表示能力。
YOLOv10的模块为部分PSA设计,比全局自注意力计算复杂度更低,其仅在部分关键位置上应用自注意力机制,降低了计算成本。
假设输入是一个特征图 \(X\),其形状为 \(H \times W \times C\)(即高度为 H,宽度为 W,通道数为 C)。自注意力模块会将每个像素点(或位置)的特征与其他所有像素点进行比较,生成一个权重矩阵,反映该像素与其他像素之间的相似度。
自注意力机制通常由以下步骤构成:
- \[
Q = W_q X,\quad K = W_k X,\quad V = W_v X
\]
其中 \(W_q\)、\(W_k\)、\(W_v\) 是可学习的权重矩阵。
- \[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
\]
其中 \(d_k\) 是 Key 的维度,Softmax 函数确保权重矩阵的每行加和为 1。
加权求和: 最终的输出是根据权重矩阵对 Value 进行加权求和,从而得到每个位置的全局特征表示。通过这个过程,每个像素点的特征不仅包括自身信息,还融合了其他所有像素点的信息。
- \[
Q = W_q X,\quad K = W_k X,\quad V = W_v X
\]
组件优化-分类头
使用轻量级的分类头,减少了分类任务的计算开销。
分类头是指模型中用于预测目标类别的部分,通常是一个全连接层或卷积层。在目标检测任务中,分类头的设计直接影响了模型对目标类别的识别能力。
YOLOv10引入了分类头,通过对目标类别的预测进行优化,提升了模型的泛化能力,使其能够更好地适应不同的场景和数据集。
组件优化-算法
减少信息损失,提高计算效率、使模块设计根据不同阶段的冗余调整。
空间通道去耦向下采样: 传统CNN中,下采样(如池化操作或步幅卷积)会导致特征图的分辨率降低,从而在提取空间和通道特征的同时可能导致信息丢失。v10引入的空间通道去耦向下采样机制,通过分离空间和通道特征,减少了信息损失。
空间维度: 指特征图中的空间信息,即物体在图像中的位置和大小。当进行下采样时,空间信息的处理可以帮助网络更好地聚焦于物体的定位,减少对背景或不重要部分的注意力。在空间维度,YOLOv10可能会使用更保守的下采样操作,如更小的步幅或更细致的池化方法,确保物体的定位信息得到保留。这样做的目的是减少下采样过程中因分辨率降低带来的位置信息丢失。
通道维度: 指不同的特征通道,每个通道表示输入图像中特定的特征,例如边缘、纹理等。通道信息是CNN中非常关键的部分,用于捕捉高层次的特征。在通道维度上,YOLOv10 可能采用深度可分离卷积(depthwise separable convolutions)等高效计算方法,减少通道间的冗余计算,保持特征提取的丰富性,同时减少计算量。
梯级引导块: 起引导信息流动作用,提高模型在不同阶段计算资源利用率。
分层优化: 针对不同层的特征图,使用不同的卷积核大小、激活函数和PSA机制。低层特征主要负责捕捉图像的细节,高层特征则负责提取更抽象的信息,使不同层次的信息有效结合,减少信息冗余或丢失。
冗余消除: 通过在网络的不同阶段检测冗余信息,剔除不必要的计算负担,提升计算效率。
多尺度信息融合: 在不同尺度上引导信息流动,实现低层和高层特征的结合。
代码示例
# 训练代码示例
from ultralytics import YOLO
# Load YOLOv10n model from scratch
model = YOLO("yolov10n.yaml")
# Train the model
model.train(data="coco8.yaml", epochs=100, imgsz=640)
# 推理代码示例
from ultralytics import YOLO
# Load a pre-trained YOLOv10n model
model = YOLO("yolov10n.pt")
# Perform object detection on an image
results = model("image.jpg")
# Display the results
results[0].show()