轻松入门计算机视觉!从 YOLOv5 开始,无需任何基础就能学会物体识别、图像分类、轨迹追踪和姿势识别。
目录
- 安装 Ultralytics
- 训练
- 模型验证
- 预测 & 识别
- 导出
- 追踪
- 图像分割提取
- 分类
- 姿势识别
- 轨迹生成
Ultralytics YOLOv8 是备受好评的实时目标检测和图像分割模型,主要功能是物体识别、分割图片物体、分类、姿态识别和跟踪等。Ultralytics 支持使用 CPU、GPU 进行训练,支持 x64、arm64 等 CPU 架构,支持苹果的 M1/M2 芯片,支持在边缘设备中训练和使用。
Ultralytics 对于个人免费,使用 【AGPL-3.0 许可】 开源协议,对于企业则需要付费。
Ultralytics 是框架的名称,YOLOv8 是该框架默认携带的模型的版本号,框架默认会自带多种用途模型,我们一般会选择在官方的模型上做训练。
Ultralytics YOLOv8 的物体识别功能很强大,如下图所示,能够准确识别图片中化了妆的妹子为 person(人类),甚至把床也识别出来了。
使用 Ultralytics,一般会经历以下过程:
- 训练(Train)模式:在自定义或预加载的数据集上微调您的模型。
- 验证(Val)模式:训练后进行校验,以验证模型性能。
- 预测(Predict)模式:在真实世界数据上释放模型的预测能力。
- 导出(Export)模式:以各种格式使模型准备就绪,部署至生产环境。
- 跟踪(Track)模式:将您的目标检测模型扩展到实时跟踪应用中。
- 基准(Benchmark)模式:在不同部署环境中分析模型的速度和准确性。
所以,本文也会按照该顺序,逐步讲解。
安装 Ultralytics
一般来说,直接使用 pip 安装即可。
# 从PyPI安装ultralytics包
pip install ultralytics
官方文档的安装方式是最详细的,其它安装方式直接参考官方文档即可。
官方安装文档:https://docs.ultralytics.com/zh/quickstart/#ultralytics
安装 ultralytics 之后,在项目中使用 YOLO 名称引入 ultralytics:
from ultralytics import YOLO
ultralytics 默认是从运行目录中读写数据集、训练模型的,这样可能会比较乱。
可以在程序启动时,修改配置运行配置:
# 模型和训练模块,核心
from ultralytics import YOLO
# 设置模块
from ultralytics import settings
# 更新设置
settings.update({'runs_dir': './' , 'tensorboard': False})
settings 也可以导出配置,或者从文件中加载配置:
def load(self):
"""Loads settings from the YAML file."""
super().update(yaml_load(self.file))
def save(self):
"""Saves the current settings to the YAML file."""
yaml_save(self.file, dict(self))
def update(self, *args, **kwargs):
"""Updates a setting value in the current settings."""
super().update(*args, **kwargs)
self.save()
def reset(self):
"""Resets the settings to default and saves them."""
self.clear()
self.update(self.defaults)
self.save()
settings 可以设置的全部配置如下:
名称 |
示例值 |
数据类型 |
描述 |
|
|
|
Ultralytics settings 版本 |
|
|
|
存储数据集的目录 |
|
|
|
存储模型权重的目录 |
|
|
|
存储实验运行的目录 |
|
|
|
当前设置的唯一标识符 |
|
|
|
是否将分析和崩溃同步到HUB |
|
|
|
Ultralytics HUB API Key |
|
|
|
是否使用ClearML记录 |
|
|
|
是否使用Comet ML进行实验跟踪和可视化 |
|
|
|
是否使用DVC进行实验跟踪和版本控制 |
|
|
|
是否使用Ultralytics HUB集成 |
|
|
|
是否使用MLFlow进行实验跟踪 |
|
|
|
是否使用Neptune进行实验跟踪 |
|
|
|
是否使用Ray Tune进行超参数调整 |
|
|
|
是否使用TensorBoard进行可视化 |
|
|
|
是否使用Weights & Biases记录 |
训练
ultralytics 中常见的文件格式有两种,模型以 .pt
结尾,模型或数据集以 .yaml
结尾。
可以基于官方模型进行训练,或者从已有模型进行训练,甚至在没有模型的情况下训练出自己的模型。
如果已经有模型,则无需再次训练。
官方文档的 demo 如下:
下面的代码不能直接启动。
from ultralytics import YOLO
# 加载一个模型
model = YOLO('yolov8n.yaml') # 从YAML建立一个新模型
model = YOLO('yolov8n.pt') # 加载预训练模型(推荐用于训练)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') # 从YAML建立并转移权重
# 训练模型
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)
官方的 yolov8n.pt 模型和 coco128.yaml 数据集,主要是人、动物、常见物体,可用于物体识别。
如果选择使用官方模型,则第一次使用时,会自动下载
yolov8n.pt
到代码所在目录。
我们先来看看 .train()
训练模型时的参数。epochs
表示训练多少轮,一般 10 轮即可,100轮需要非常久的!imgsz
表示图片大小,当数据集的图片大小太大时,可以适当降低像素,官方的数据集图片大小是 640*480 ,已经提前处理好大小了。
coco128.yaml
是官方提供的数据集合,有 128 张图片,在程序首次运行时,会自动从官方仓库中拉取数据集存储到 datasets/coco128
下面,其中里面包含了一些图片和标注。当然,我们也可以从开源社区中获取更多的数据集,以及自己制作数据集,用来训练模型。
然后再回到加载模型这里。
我们通过官方配置文件,从零训练出一个模型:
from ultralytics import YOLO
# 加载一个模型
model = YOLO('yolov8n.yaml') # 从YAML建立一个新模型
# 训练模型
results = model.train(data='coco128.yaml', epochs=10, imgsz=640)
由于笔者只有 AMD 5600G,是集成显卡,因此跑起来特别慢。
如果你有指定的多个,可以在训练时指定:
results = model.train(data='coco128.yaml', epochs=10, imgsz=640, device=0)
如果不指定,框架会自动选择 GPU。
可能笔者是 AMD 的 CPU,也有可能是因为不支持集成显卡,所以笔者是使用 CPU 训练的,超级慢。
训练出的模型会存储在 detect 目录下。其它两种方式训练的模型也是如此,都会在 detect 目录下。
我们也可以导入已有的模型:
# 加载官方预训练模型
# model = YOLO('yolov8n.pt')
# 训练过的模型
model = YOLO('detect/train/weights/best.pt')
在使用 .train()
训练模型时,可以传递很多参数,全部参数说明如下:
键 |
值 |
描述 |
|
|
模型文件路径,例如 yolov8n.pt, yolov8n.yaml |
|
|
数据文件路径,例如 coco128.yaml |
|
|
训练的轮次数量 |
|
|
早停训练的等待轮次 |
|
|
每批图像数量(-1为自动批大小) |
|
|
输入图像的大小,以整数表示 |
|
|
保存训练检查点和预测结果 |
|
|
每x轮次保存检查点(如果<1则禁用) |
|
|
True/ram, disk 或 False。使用缓存加载数据 |
|
|
运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu |
|
|
数据加载的工作线程数(如果DDP则为每个RANK) |
|
|
项目名称 |
|
|
实验名称 |
|
|
是否覆盖现有实验 |
|
|
(bool 或 str) 是否使用预训练模型(bool)或从中加载权重的模型(str) |
|
|
使用的优化器,选择范围=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto] |
|
|
是否打印详细输出 |
|
|
随机种子,用于可重复性 |
|
|
是否启用确定性模式 |
|
|
将多类数据作为单类训练 |
|
|
矩形训练,每批为最小填充整合 |
|
|
使用余弦学习率调度器 |
|
|
(int) 最后轮次禁用马赛克增强(0为禁用) |
|
|
从最后检查点恢复训练 |
|
|
自动混合精度(AMP)训练,选择范围=[True, False] |
|
|
训练的数据集比例(默认为1.0,即训练集中的所有图像) |
|
|
在训练期间为记录器分析ONNX和TensorRT速度 |
|
|
(int 或 list, 可选) 在训练期间冻结前n层,或冻结层索引列表 |
|
|
初始学习率(例如 SGD=1E-2, Adam=1E-3) |
|
|
最终学习率 (lr0 * lrf) |
|
|
SGD动量/Adam beta1 |