跳转至

YOLO

简介

YOLO 全称为 You Only Look Once,是一类流行的物体检测和图像分割模型

YOLO 本身是指一类模型,但有时也会把官方推出的 Python 库 Ultralytics 称为 YOLO。在这种语境下,YOLO 完全可以算是一个深度学习框架。它本身是基于 PyTorch 实现的,提供了很多模型和功能,接口非常简单

环境配置

先决条件

Miniforge

请先完成 Miniforge 的安装

然后创建一个 python 3.12 的环境(3.12 是目前 ultralytics 已验证兼容性的最高版本,不过我用 3.13 还没遇到过问题)并激活

# pytorch 可以换成别的名字
mamba create -n pytorch python=3.12
mamba activate pytorch

后续所有命令都在该环境中运行,请确保你激活了正确的环境。

忘了环境名字

如果忘记了刚创建的环境的名字,可以使用 mamba env list 列出所有环境。

PyTorch

在刚激活的环境里完成 PyTorch 的安装

安装

官方快速入门手册 推荐使用 pip 安装

pip install ultralytics

下载完成后,可通过如下方式测试是否可用

# 运行下行命令以 REPL 模式启动解释器
python
# 解释器启动后,输入下行代码
import ultralytics
# 如果没有报错,那就是正确安装了。输入下行代码关闭解释器
exit()

还可以通过如下方式测试是否可用

yolo checks

该命令会打印出非常详细的安装信息。可以简单检查下有没有问题(其中 CUDA:0 意思是第 0 号显卡有可用的 CUDA,并不意味着有问题)。

最后你还可以实际运行个示例来测试功能是否正常

yolo predict model=yolo11n.pt source='https://ultralytics.com/images/bus.jpg'

该命令会使用官方预训练的模型 yolo11n.pthttps://ultralytics.com/images/bus.jpg 这张图片进行预测。模型和图片会下载到当前工作目录,而运行的结果默认保存在当前工作目录的 runs 里。你可以检查下图片是否被正确预测。

Yolo test

网络问题

如果因网络问题无法下载图片的话,你可以用自己的图片,只需修改 source 参数即可。如果无法下载模型,你可能不得不先解决网络问题。

# 使用模型 yolo11n.pt 预测当前工作目录下的 example.jpg 图片。
yolo predict model=yolo11n.pt source='example.jpg'

可选项

cuDNN

目前我没用到这个库,因此暂时作为可选项。事实上这并不是加速必需的,因为 PyTorch 已经自带了 CUDA 运行时。这个库的作用是让你自己写深度学习框架的时候可以加速。

进入 官网 后会看到 NVIDIA 提供了多种安装方式。鉴于前面的库都使用 pip 安装,此处也使用 pip。

不过英伟达非常逆天地在 PyPI 上注册了多个假包来告诉你没有安装正确的版本

cuDNN PyPI

而更逆天的是官网的安装命令下载的就是假包。

cuDNN

目前 PyPI 上这么多的版本中只有 nvidia-cudnn-cu11nvidia-cudnn-cu12nvidia-cudnn-cu13 这几个不是假包。请根据显卡的 CUDA 版本下载正确的包。查看 CUDA 版本的方式可参考 PyTorch 的安装 这部分。

# 将 nvidia-cudnn-cu1x 替换为与 CUDA 对应的版本
pip install nvidia-cudnn-cu1x

同样地,下载完成后,可通过如下方式测试是否可用

# 运行下行命令以 REPL 模式启动解释器
python
# 解释器启动后,输入下行代码
import cudnn
# 如果没有报错,那就是正确安装了。输入下行代码关闭解释器
exit()

VSCode

推荐使用 VSCode 来编写 Python 代码,因为 我喜欢 官方力荐且制作了 相关拓展

可以在 VSCode 中安装 Ultralytics Snippets 这个拓展。顾名思义,此拓展就是提供了一些代码片段(Snippets),不安装并不影响正常使用。

使用方法

YOLO 有两种用法,分别是 PythonCLI

Python

通过 from ultralytics import YOLO 来导入 YOLO 库。

该库的接口很多,建议阅读 官方文档

CLI

YOLO CLI 的基本语法如下

yolo TASK MODE ARGS

其中

  • TASK (可选)是以下之一 detect/segment/classify/pose/obb。如果未明确传递,YOLO 将尝试推断 TASK。detect 是目标检测,segment 是语义分割,其余的我没用过。
  • MODE (必需)是以下之一 train/val/predict/export/track/benchmarktrain 是训练,val 是验证,predict 是预测,export 是导出,benchmark 是基准测试,剩下的那个我没用过。
  • ARGS (可选)是任意数量的自定义 arg=value 键值对,例如 imgsz=320,用于覆盖默认值。这部分较为复杂,不同的 TASK 配置差别极大,建议参考 官方配置说明

更详细的参考请阅读 官方文档

示例

项目结构

建议新建一个文件夹,并以如下方式命名和使用子文件夹

YOLO
├── bin       # 二进制文件
├── data      # 原始数据
├── datasets  # 标注后的数据集
├── docs      # 文档
├── runs      # 运行结果
├── scripts   # 脚本代码
└── weights   # 权重模型

然后在 VSCode 中按 ctrl + k, ctrl + o,并选择此文件夹打开。

打开文件夹后在 VSCode 中按 ctrl + shift + ~ 新建终端,激活正确的环境并运行

yolo settings datasets_dir="datasets"
无法激活环境

如果无法在 VSCode 的集成终端中激活环境,可能有如下原因

之后 YOLO CLI 就会从 datasets 中去寻找数据集,从网上下载的示例数据集也会保存在这个目录里。

具体任务

阅读官方文档

仅展示使用 CLI 进行训练和预测的示例。使用 Python 方法差不多,可以参考部分内容。

更详细的示例请阅读官方文档,包括 CLI 示例Python 示例

训练

YOLO 的训练数据集建议按如下方式组织结构

example
├── images
│   ├── train
│   └── val
└── labels
    ├── train
    └── val

分别把训练集的图片和标签放入 images/trainlabels/train 里,验证集则是 images/vallabels/val。注意图片和标签的文件名必须相同。

然后把 example 这个文件夹放入 datasets 目录下,并在项目根目录新建一个 example.yaml 文件,填写上如下内容

path: example

train: images/train
val: images/val

names: 
  0: low
  1: medium
  # 省略剩余的标签

接着运行如下命令

yolo detect train data='example.yaml' model=yolo11n.pt epochs=10 imgsz=640

这会运行目标检测的模型训练,其中数据集是 datasets/example,在 yolo11n.pt 模型的基础上训练,并以 epochs=10 imgsz=640 覆盖默认参数值。更详细的说明请参考 官方文档 - 训练

训练的结果保存在 runs/detect 目录下。

预测

将你要预测的图片放入 data 文件夹里,并运行如下命令

yolo segment predict model=yolo11n-seg.pt source='data' imgsz=320

这会运行语义分割的图片预测,其中数据来源是 data,而模型权重使用 yolo11n-seg.pt,并以 imgsz=320 覆盖默认参数值。更详细的说明请参考 官方文档 - 预测

训练的结果保存在 runs/segment 目录下。