YOLO (You Only Look Once) 目标检测算法简介

1,750 阅读5分钟

YOLO (You Only Look Once) 是一种基于深度学习的目标检测算法,简单来说,它能让计算机像人一样,"看一眼"图片或视频,就能知道里面有什么东西,它们在哪里13。YOLO 的核心优势在于速度快准确度高,特别适合需要实时处理的场景25

YOLO 发展简史

YOLO 并非一蹴而就,而是在不断迭代中变得更加强大:

  • YOLO (2015) :初代 YOLO 由 Joseph Redmon 和 Ali Farhadi 推出,以速度快著称,但准确率相对较低1
  • YOLOv2 (2016) :引入了批量归一化(Batch Normalization)、锚框(Anchor Boxes)和维度聚类等技术,提高了准确率和稳定性1
  • YOLOv3 (2018) :采用了更高效的 Darknet-53 网络结构,使用多尺度预测,进一步提升了对小目标的检测能力1
  • YOLOv4 (2020) :引入了 Mosaic 数据增强、新的无锚框检测头和新的损失函数等创新技术,在速度和精度上实现了更好的平衡1
  • YOLOv5:在 YOLOv4 的基础上进行了改进,并增加了超参数优化、集成实验跟踪和自动导出为常用导出格式等新功能,使用更加灵活方便1
  • YOLOv6 (2022) :由美团开源,针对工业应用进行了优化,已经在美团的自动配送机器人中得到应用1
  • YOLOv7:增加了对 COCO 关键点数据集的姿势估计等额外任务的支持,功能更加丰富1
  • YOLOv8:引入了新的功能和改进,以提高性能、灵活性和效率,支持全方位的视觉人工智能任务,是目前流行的 YOLO 版本之一1
  • YOLOv9:引入了可编程梯度信息 (PGI) 和广义高效层聚合网络 (GELAN) 等创新方法,进一步提升了性能1
  • YOLOv10:由清华大学的研究人员创建,通过引入端到端头(End-to-End head),消除了非最大抑制(NMS)要求,实现了实时目标检测的进步,速度更快1
  • YOLOv11:Ultralytics 最新的 YOLO 模型可在物体检测、分割、姿态估计、跟踪和分类等多项任务中提供最先进的 (SOTA) 性能1

YOLO 的核心组件

YOLO 的强大之处在于其巧妙的设计,主要包括以下几个核心组件3

  • 网络架构 (Network Architecture) :YOLO 使用卷积神经网络 (CNN) 作为其基础架构,CNN 擅长从图像中提取特征3
  • 基础网络 (Backbone Network) :通常使用预训练的 CNN 模型,例如 Darknet(YOLOv5 之前),用于提取图像的底层特征
  • 特征提取层 (Feature Extraction Layers) :从输入图像中提取有意义的特征图,这些特征图包含了图像中物体的形状、纹理等信息,用于后续的目标检测和分类3
  • 网格划分 (Grid Division) :将输入图像划分为固定大小的网格。每个网格负责检测中心落在该网格内的物体3
  • 边界框预测 (Bounding Box Prediction) :对于每个网格,YOLO 预测多个边界框,每个边界框包含物体的位置、大小和类别信息。这个过程通过回归实现3
  • 非极大值抑制 (Non-Maximum Suppression, NMS)消除重叠的预测框,只保留置信度最高的那个,保证每个物体只有一个检测结果3
  • 损失函数 (Loss Function) :用于训练网络,衡量预测结果与实际结果之间的差距,指导网络参数的更新。损失函数通常包括边界框回归损失目标存在性损失类别预测损失3
  • 激活函数 (Activation Function) :YOLO 常用的激活函数是 ReLU (Rectified Linear Unit) ,用于引入非线性,使网络能够学习更复杂的模式3

YOLO 实战:用 Python 检测图像中的物体

下面是一个使用 YOLOv5 检测图像中物体的简单示例代码(使用 PyTorch):

python
import torch

# 加载 YOLOv5 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # 或者选择其他版本,如 yolov5m, yolov5l, yolov5x

# 加载图像
img = 'https://ultralytics.com/images/zidane.jpg'  # 可以替换成你自己的图片

# 进行预测
results = model(img)

# 显示结果
results.show()

# 打印检测到的物体
print(results.pandas().xyxy[0])

代码解释:

  1. 加载 YOLOv5 模型:使用 torch.hub.load 从 Ultralytics 的 GitHub 仓库加载预训练的 YOLOv5 模型。可以选择不同大小的模型 (yolov5s, yolov5m, yolov5l, yolov5x),模型越大,精度越高,但速度会慢一些。
  2. 加载图像:使用 img 变量指定要检测的图像,可以是本地文件路径,也可以是网络 URL。
  3. 进行预测:将图像输入模型进行预测,得到 results 对象,包含了检测到的物体的信息。
  4. 显示结果:使用 results.show() 可以显示带有边界框的图像。
  5. 打印检测到的物体:使用 results.pandas().xyxy 可以打印检测到的物体的坐标、置信度等信息。

实际应用:

这段代码可以应用于各种实际场景,例如:

  • 智能交通:检测道路上的车辆、行人、交通标志等。
  • 安防监控:检测监控画面中的异常行为,例如人员入侵、打架斗殴等。
  • 工业质检:检测产品表面的缺陷,例如划痕、污渍等。

YOLO 的广泛应用

YOLO 在各个领域都有着广泛的应用前景3

  • 自动驾驶 (Autonomous Driving) :识别车辆、行人、交通标志等,提高驾驶安全性3
  • 视频监控与安防 (Video Surveillance and Security) :实时监测异常行为,提供预警3
  • 工业质检 (Industrial Quality Control) :检测产品缺陷,提高生产效率3
  • 零售与物流 (Retail and Logistics) :自动识别商品,减少人工成本3
  • 医疗影像分析 (Medical Image Analysis) :辅助医生诊断,提高诊断准确性3
  • 增强现实与虚拟现实 (Augmented Reality and Virtual Reality) :实现物体识别与跟踪,提供沉浸式体验3

总而言之,YOLO 算法凭借其速度精度的优势,正在深刻地改变着我们的生活。随着技术的不断发展,YOLO 将会在更多的领域发挥重要作用,为我们带来更多的便利。