
🎪 摸鱼匠:个人主页
🎒 个人专栏:《YOLOv8 入门到精通:全栈实战》
🥇 没有好的理念,只有脚踏实地!

文章目录
-
- 一、CLI简介与优势
- 二、CLI基础命令与语法
-
- [2.1 基本命令结构](#2.1 基本命令结构)
- [2.2 核心任务类型](#2.2 核心任务类型)
- [2.3 执行模式](#2.3 执行模式)
- [2.4 获取帮助信息](#2.4 获取帮助信息)
- 三、预测模式(Predict)详解
-
- [3.1 基本预测命令](#3.1 基本预测命令)
- [3.2 预测参数详解](#3.2 预测参数详解)
- [3.3 预测命令示例](#3.3 预测命令示例)
- [3.4 预测结果说明](#3.4 预测结果说明)
- 四、训练模式(Train)详解
-
- [4.1 基本训练命令](#4.1 基本训练命令)
- [4.2 训练参数详解](#4.2 训练参数详解)
-
- `data`参数
- `model`参数
- `epochs`参数
- `patience`参数
- `batch`参数
- `imgsz`参数
- `save`参数
- `save_period`参数
- `cache`参数
- `device`参数
- `workers`参数
- `project`和`name`参数
- `exist_ok`参数
- `pretrained`参数
- `optimizer`参数
- `verbose`参数
- `seed`参数
- `deterministic`参数
- `single_cls`参数
- `rect`参数
- `cos_lr`参数
- `close_mosaic`参数
- `resume`参数
- `amp`参数
- `fraction`参数
- `profile`参数
- `freeze`参数
- `lr0`和`lrf`参数
- `momentum`参数
- `weight_decay`参数
- `warmup_epochs`、`warmup_momentum`和`warmup_bias_lr`参数
- `box`、`cls`、`dfl`、`pose`和`kobj`参数
- `label_smoothing`参数
- `nbs`参数
- `overlap_mask`和`mask_ratio`参数
- `dropout`参数
- `val`参数
- `plots`参数
- [4.3 训练命令示例](#4.3 训练命令示例)
- [4.4 数据集配置文件](#4.4 数据集配置文件)
- 五、验证模式(Val)详解
-
- [5.1 基本验证命令](#5.1 基本验证命令)
- [5.2 验证参数详解](#5.2 验证参数详解)
- [5.3 验证命令示例](#5.3 验证命令示例)
- 六、导出模式(Export)详解
-
- [6.1 支持导出的格式](#6.1 支持导出的格式)
- [6.2 导出参数详解](#6.2 导出参数详解)
- [6.3 导出命令示例](#6.3 导出命令示例)
-
- 示例1:导出为ONNX格式
- 示例2:导出为TensorRT格式
- [示例3:导出为TensorFlow Lite格式](#示例3:导出为TensorFlow Lite格式)
- 示例4:导出为CoreML格式(macOS)
- 示例5:导出FP16半精度模型
- 示例6:导出INT8量化模型
- 七、其他模式详解
-
- [7.1 跟踪模式(Track)](#7.1 跟踪模式(Track))
- [7.2 基准测试模式(Benchmark)](#7.2 基准测试模式(Benchmark))
- [7.3 超参数调优模式(Tune)](#7.3 超参数调优模式(Tune))
- 八、高级使用技巧
-
- [8.1 参数覆盖与配置文件](#8.1 参数覆盖与配置文件)
- [8.2 环境变量设置](#8.2 环境变量设置)
- [8.3 覆盖默认参数](#8.3 覆盖默认参数)
- [8.4 命令组合与脚本化](#8.4 命令组合与脚本化)
- 九、常见问题与解决方案
-
- [9.1 命令无法识别](#9.1 命令无法识别)
- [9.2 参数设置无效](#9.2 参数设置无效)
- [9.3 训练中断恢复](#9.3 训练中断恢复)
- [9.4 多GPU训练问题](#9.4 多GPU训练问题)
- [9.5 内存不足](#9.5 内存不足)
- 十、CLI命令速查表
-
- [10.1 预测命令速查](#10.1 预测命令速查)
- [10.2 训练命令速查](#10.2 训练命令速查)
- [10.3 验证命令速查](#10.3 验证命令速查)
- [10.4 导出命令速查](#10.4 导出命令速查)
- 十一、总结
-
- [11.1 CLI的核心价值](#11.1 CLI的核心价值)
- [11.2 学习建议](#11.2 学习建议)
- [11.3 下一步](#11.3 下一步)
一、CLI简介与优势
1.1 什么是CLI
CLI(Command Line Interface,命令行界面)是一种通过文本命令与计算机程序交互的方式。与图形界面(GUI)相比,CLI具有高效、灵活、可自动化等特点。对于开发者和技术人员来说,熟练掌握CLI工具能够大大提高工作效率。
想象一下,你正在开发一个计算机视觉应用,需要进行目标检测。使用传统的图形界面,你可能需要点击多个按钮,填写各种表单,然后等待结果。而使用CLI,你只需要输入一行简洁的命令,就能完成同样的任务,甚至更多。
YOLOv8提供了一个功能强大的命令行工具yolo,让用户能够通过简单的命令完成复杂的目标检测任务。无论你是要进行模型训练、推理预测,还是模型验证、导出部署,都可以通过CLI快速完成。这种"一行命令搞定一切"的体验,正是CLI的魅力所在。
1.2 为什么要使用CLI
(1)简洁高效
使用CLI,你只需要输入一行命令就能完成复杂的操作。例如,训练一个目标检测模型只需要:
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
这行命令包含了数据配置、模型选择、训练轮数、图像尺寸等多个参数,如果用Python代码实现,可能需要几十行。想象一下,你只需要在终端中输入这一行命令,然后就可以去喝杯咖啡,让YOLOv8自动完成所有训练工作。这种简洁性不仅节省了时间,还减少了出错的可能性。
(2)易于复现
CLI命令可以直接复制粘贴,方便在不同机器上复现实验结果。你也可以将命令保存到脚本文件中,便于批量执行和版本控制。
这在科研和工程实践中尤为重要。当你在一个环境中训练出一个优秀的模型,想要在另一个环境中复现这个结果时,只需要复制相同的命令即可。不需要担心环境差异导致的代码兼容性问题,也不需要重新配置复杂的Python环境。这种可复现性对于科学研究和工程部署都是至关重要的。
(3)自动化友好
CLI命令可以轻松集成到Shell脚本、Makefile、CI/CD流水线中,实现自动化工作流。例如,你可以编写一个脚本,自动完成数据准备、模型训练、性能评估和模型部署的全流程。
在当今的软件开发环境中,自动化是提高效率的关键。通过将YOLOv8 CLI命令集成到自动化流程中,你可以实现:
- 每天自动训练新模型
- 自动评估模型性能
- 当性能提升超过阈值时自动部署新模型
- 定期对模型进行基准测试
这种自动化能力使得YOLOv8 CLI成为生产环境中的强大工具,而不仅仅是研究实验的利器。
(4)学习曲线平缓
对于初学者来说,CLI提供了一个低门槛的入门方式。你不需要理解复杂的Python API,只需要记住几个简单的命令和参数,就能开始使用YOLOv8。
想象一下,你是一个刚接触计算机视觉的新手,想要尝试目标检测。如果需要先学习Python编程,然后理解YOLOv8的API结构,再编写代码,这个过程可能需要几天甚至几周。而使用CLI,你可能只需要几分钟就能看到第一个检测结果。这种即时反馈对于学习是极其宝贵的,它能让你快速建立信心,激发进一步学习的兴趣。
1.3 CLI与Python API的对比
YOLOv8同时提供了CLI和Python API两种使用方式,它们各有优势:
| 特性 | CLI | Python API |
|---|---|---|
| 学习难度 | 低 | 中等 |
| 灵活性 | 中等 | 高 |
| 代码量 | 极少 | 较多 |
| 可编程性 | 低 | 高 |
| 适用场景 | 快速实验、批量处理 | 复杂应用、自定义逻辑 |
CLI就像是一辆自动挡汽车,简单易用,适合日常驾驶;而Python API则像是一辆手动挡赛车,提供了更多的控制权和灵活性,适合专业选手在赛道上追求极致性能。
建议:
- 初学者和快速实验:使用CLI
- 复杂项目和生产环境:使用Python API
- 两者可以结合使用:用CLI进行快速原型验证,用Python API开发最终应用
这种组合使用的方式在实践中非常有效。你可以先用CLI快速验证想法,确定可行后再用Python API开发更复杂的应用。这样既能享受CLI的高效,又能利用Python API的灵活性。
二、CLI基础命令与语法
2.1 基本命令结构
YOLOv8 CLI的基本命令结构如下:
bash
yolo <任务> <模式> <参数1>=<值1> <参数2>=<值2> ...
其中:
yolo:CLI工具的入口命令,就像是告诉系统"我要使用YOLOv8"<任务>:指定要执行的任务类型(detect、segment、classify、pose等)<模式>:指定任务的执行模式(train、val、predict、export等)<参数>=<值>:设置各种配置参数
这种结构设计得非常直观,就像是在用自然语言告诉系统你想要做什么。例如,"yolo detect predict"可以理解为"使用YOLO进行目标检测的预测"。
让我们用一个更形象的比喻来理解这个结构:想象你正在一家餐厅点餐。
yolo就像是告诉服务员"我要点餐"<任务>就像是选择菜品类型(如"主菜"、"甜点")<模式>就像是选择烹饪方式(如"烤"、"煮")<参数>=<值>就像是具体的调味要求(如"盐=少"、"辣椒=多")
这种结构使得命令既简洁又直观,即使是初学者也能快速理解和使用。
2.2 核心任务类型
YOLOv8支持多种计算机视觉任务,每种任务都有对应的CLI命令:
| 任务 | 命令 | 说明 |
|---|---|---|
| 目标检测 | yolo detect |
检测图像中的物体位置和类别 |
| 实例分割 | yolo segment |
检测物体并分割出轮廓 |
| 图像分类 | yolo classify |
对整张图片进行分类 |
| 姿态估计 | yolo pose |
检测人体关键点 |
这些任务类型覆盖了计算机视觉领域的主要应用场景。无论你是想识别图片中的物体,还是想分割出物体的精确轮廓,或者只是想对图片进行分类,YOLOv8 CLI都能提供相应的命令。
目标检测(detect)是最常用的任务,它不仅能识别图像中有什么物体,还能标出每个物体的位置。实例分割(segment)则更进一步,不仅能识别和定位物体,还能精确地勾勒出每个物体的轮廓。图像分类(classify)是最简单的任务,只判断整张图片属于哪个类别。姿态估计(pose)则专注于检测人体的关键点,如关节位置,常用于动作识别和分析。
2.3 执行模式
每种任务都支持以下几种执行模式:
| 模式 | 命令 | 说明 |
|---|---|---|
| 训练 | train |
训练模型 |
| 验证 | val |
在验证集上评估模型 |
| 预测 | predict |
对新数据进行推理 |
| 导出 | export |
将模型导出为其他格式 |
| 跟踪 | track |
对视频进行目标跟踪 |
| 基准测试 | benchmark |
测试模型性能 |
这些模式覆盖了模型从训练到部署的完整生命周期。训练模式(train)用于在数据集上训练新模型或微调预训练模型。验证模式(val)用于评估模型在验证集上的性能。预测模式(predict)是最常用的模式,用于对新图像或视频进行推理。导出模式(export)用于将模型转换为其他格式,便于在不同平台部署。跟踪模式(track)扩展了预测功能,可以在视频中持续跟踪目标。基准测试模式(benchmark)则用于测试模型在不同格式和设备上的性能。
2.4 获取帮助信息
YOLOv8 CLI提供了完善的帮助系统,你可以随时查看命令的使用方法:
bash
# 查看总体帮助
yolo --help
# 查看特定任务的帮助
yolo detect --help
# 查看特定模式的帮助
yolo detect train --help
这种分层的帮助系统设计得非常人性化。当你不确定要使用什么命令时,可以先查看总体帮助;当你确定了任务类型但不确定模式时,可以查看特定任务的帮助;当你已经确定了任务和模式,但不确定具体参数时,可以查看特定模式的帮助。
帮助信息通常包括:
- 命令的语法结构
- 可用参数列表
- 参数的默认值和说明
- 使用示例
这种设计使得YOLOv8 CLI非常易于学习和使用,即使是不熟悉命令行工具的用户也能快速上手。
三、预测模式(Predict)详解
预测模式是YOLOv8最常用的功能之一,用于对新的图像、视频或摄像头数据进行目标检测。这一部分将详细介绍如何使用yolo predict命令,以及各种参数的作用和用法。
3.1 基本预测命令
最简单的预测命令只需要指定模型和数据源:
bash
yolo predict model=yolov8n.pt source='image.jpg'
这行命令告诉YOLOv8:
- 使用
yolov8n.pt模型(这是YOLOv8系列中最小的预训练模型) - 对
image.jpg这张图片进行预测
参数说明:
model:模型文件路径或名称。如果是预训练模型(如yolov8n.pt),系统会自动下载source:数据源,可以是:- 图片文件:
image.jpg - 图片URL:
https://example.com/image.jpg - 视频文件:
video.mp4 - 文件夹:
path/to/images/ - 摄像头:
0(默认摄像头) - 屏幕:
screen
- 图片文件:
这种灵活性使得YOLOv8 CLI能够处理各种输入源,无论是本地文件、网络图片,还是实时视频流。你不需要编写不同的代码来处理这些不同的输入源,只需要改变source参数的值即可。
3.2 预测参数详解
预测模式支持丰富的参数配置,下面我们来详细解析这些参数:
| 参数 | 默认值 | 说明 | 示例 |
|---|---|---|---|
model |
yolov8n.pt | 模型文件 | model=yolov8s.pt |
source |
- | 数据源 | source='image.jpg' |
conf |
0.25 | 置信度阈值 | conf=0.5 |
iou |
0.7 | NMS IoU阈值 | iou=0.5 |
imgsz |
640 | 输入图像尺寸 | imgsz=320 |
show |
False | 是否显示结果 | show=True |
save |
False | 是否保存结果 | save=True |
save_txt |
False | 保存结果为txt | save_txt=True |
save_crop |
False | 保存裁剪的检测框 | save_crop=True |
device |
- | 运行设备 | device=0(GPU) |
max_det |
300 | 最大检测数量 | max_det=100 |
vid_stride |
1 | 视频帧间隔 | vid_stride=2 |
line_width |
- | 边界框线宽 | line_width=2 |
visualize |
False | 可视化特征图 | visualize=True |
augment |
False | 使用TTA增强 | augment=True |
agnostic_nms |
False | 类别无关NMS | agnostic_nms=True |
classes |
- | 只检测特定类别 | classes=0,2,3 |
retina_masks |
False | 使用Retina masks | retina_masks=True |
让我们来详细解释这些参数的作用和使用场景:
model参数
model参数指定用于预测的模型文件。YOLOv8提供了多个预训练模型,从小到大依次是:
yolov8n.pt:最小模型,速度最快,精度最低yolov8s.pt:小型模型,平衡速度和精度yolov8m.pt:中型模型,较高精度yolov8l.pt:大型模型,高精度yolov8x.pt:最大模型,精度最高,速度最慢
选择哪个模型取决于你的应用场景。如果你需要在资源受限的设备上运行,或者对速度要求很高,可以选择较小的模型;如果你追求最高的检测精度,且硬件资源充足,可以选择较大的模型。
source参数
source参数指定要预测的数据源,可以是:
- 单张图片:
source='image.jpg' - 多张图片:
source='image1.jpg image2.jpg' - 图片文件夹:
source='path/to/images/' - 视频文件:
source='video.mp4' - 摄像头:
source=0(0表示默认摄像头,1表示第二个摄像头,以此类推) - 网络图片:
source='https://example.com/image.jpg' - 屏幕:
source='screen'(捕获屏幕内容进行检测)
这种灵活性使得YOLOv8 CLI能够适应各种应用场景,无论是处理静态图片、视频文件,还是实时摄像头流。
conf参数
conf参数设置置信度阈值,只有当模型对某个检测结果的置信度高于这个阈值时,才会输出这个结果。默认值是0.25,意味着只有置信度大于25%的检测结果才会被保留。
提高这个阈值可以减少误检(False Positives),但可能会增加漏检(False Negatives);降低这个阈值可以减少漏检,但可能会增加误检。选择合适的阈值需要根据具体应用场景来权衡。
iou参数
iou参数设置非极大值抑制(NMS)的IoU(Intersection over Union)阈值。NMS是一种用于去除重叠检测框的技术,当两个检测框的IoU大于这个阈值时,置信度较低的框会被抑制。
默认值是0.7,这是一个相对宽松的设置,适用于大多数场景。如果你的场景中有很多密集的小物体,可能需要降低这个值;如果你的场景中物体比较稀疏,可以适当提高这个值。
imgsz参数
imgsz参数设置输入图像的尺寸。YOLOv8在训练时使用的默认尺寸是640,所以预测时也默认使用640。你可以根据需要调整这个值,但需要注意的是,改变图像尺寸可能会影响检测精度和速度。
较大的图像尺寸可能会提高检测精度,特别是对于小物体,但会增加计算量和内存使用;较小的图像尺寸可以提高速度,但可能会降低精度。
show参数
show参数控制是否显示预测结果。设置为True时,会在窗口中显示带有检测框的图像或视频帧。这对于实时查看结果很有用,特别是在使用摄像头进行实时检测时。
save参数
save参数控制是否保存预测结果。设置为True时,会将带有检测框的图像或视频保存到文件中。保存的位置通常是runs/detect/predict目录下。
save_txt参数
save_txt参数控制是否将预测结果保存为文本文件。每个图像的预测结果会保存为一个同名的.txt文件,格式为:<class> <x_center> <y_center> <width> <height> <confidence>,其中坐标是相对于图像宽高的归一化值。
这种格式便于后续处理和分析,特别是当你需要将检测结果用于其他应用时。
save_crop参数
save_crop参数控制是否保存裁剪的检测框。设置为True时,会将每个检测到的物体裁剪并保存为单独的图像文件。这对于收集特定物体的样本很有用,例如收集人脸图像用于人脸识别模型的训练。
device参数
device参数指定运行设备。可以设置为:
cpu:使用CPU0:使用第一个GPU1,2,3:使用多个GPUmps:使用Apple的Metal Performance Shaders(适用于Mac)
如果你有NVIDIA GPU并且安装了CUDA,建议使用GPU以获得更快的速度。
max_det参数
max_det参数设置每张图像最大检测数量。默认值是300,对于大多数场景已经足够。如果你的场景中可能有大量物体,可以增加这个值;如果你想限制检测数量,可以减少这个值。
vid_stride参数
vid_stride参数设置视频帧间隔。默认值是1,表示处理每一帧。设置为2表示每隔一帧处理一次,即处理第1、3、5帧...这可以加快视频处理速度,但可能会遗漏快速移动的物体。
line_width参数
line_width参数设置边界框的线宽。默认值是None,表示自动根据图像大小调整。你也可以设置一个具体的整数值,如line_width=2。
visualize参数
visualize参数控制是否可视化特征图。设置为True时,会保存模型的特征图可视化结果。这对于理解模型的工作原理和调试模型很有用。
augment参数
augment参数控制是否使用测试时增强(TTA,Test Time Augmentation)。设置为True时,会对输入图像进行多种变换(如翻转、缩放等),然后对多个预测结果进行集成。这可以提高检测精度,但会增加计算时间。
agnostic_nms参数
agnostic_nms参数控制是否使用类别无关的NMS。设置为True时,NMS不会考虑类别,只考虑IoU。这在某些场景下可能有用,例如当不同类别的物体重叠时。
classes参数
classes参数指定只检测特定类别。例如,classes=0,2表示只检测类别0和类别2的物体。COCO数据集中,0表示人,2表示汽车。这对于专注于特定物体的检测很有用。
retina_masks参数
retina_masks参数控制是否使用Retina masks。这主要用于实例分割任务,可以生成更高质量的掩码。
3.3 预测命令示例
让我们通过一些具体的示例来了解如何使用这些参数:
示例1:基本图片检测
bash
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
这个命令使用YOLOv8n模型对网络上的图片进行检测。系统会自动下载图片和模型(如果本地没有的话),然后进行检测,并显示结果。
示例2:调整置信度阈值
bash
yolo predict model=yolov8n.pt source='image.jpg' conf=0.5
这个命令将置信度阈值提高到0.5,只显示置信度大于50%的检测结果。这可以减少低置信度的误检,但可能会遗漏一些真实物体。
示例3:检测视频并保存结果
bash
yolo predict model=yolov8n.pt source='video.mp4' save=True
这个命令对视频文件进行检测,并将带有检测框的视频保存到runs/detect/predict目录下。
示例4:使用摄像头实时检测
bash
yolo predict model=yolov8n.pt source=0 show=True
这个命令使用默认摄像头进行实时检测,并在窗口中显示结果。按下q键可以退出。
示例5:只检测特定类别(如只检测人和车)
bash
yolo predict model=yolov8n.pt source='image.jpg' classes=0,2
这个命令只检测人(类别0)和汽车(类别2)。COCO数据集中的类别编号如下:
- 0: person(人)
- 1: bicycle(自行车)
- 2: car(汽车)
- 3: motorcycle(摩托车)
- ...
示例6:批量检测文件夹中的所有图片
bash
yolo predict model=yolov8n.pt source='path/to/images/' save=True
这个命令会检测指定文件夹中的所有图片,并保存结果。
示例7:保存检测结果为不同格式
bash
# 保存标注图片
yolo predict model=yolov8n.pt source='image.jpg' save=True
# 保存检测结果为txt文件
yolo predict model=yolov8n.pt source='image.jpg' save_txt=True
# 保存裁剪的检测框
yolo predict model=yolov8n.pt source='image.jpg' save_crop=True
这三个命令分别保存不同格式的结果:带有检测框的图片、文本格式的检测结果、裁剪的检测框。
3.4 预测结果说明
运行预测命令后,你会看到类似以下的输出:
Ultralytics YOLOv8.0.200 🚀 Python-3.10.12 torch-2.1.0 CPU
YOLOv8n summary (fused): 168 layers, 3151904 parameters, 0 gradients, 8.7 GFLOPs
image 1/1 path/to/image.jpg: 640x480 4 persons, 1 bus, 142.5ms
Speed: 2.0ms preprocess, 142.5ms inference, 1.0ms postprocess per image
Results saved to runs/detect/predict
输出信息说明:
- 模型摘要:显示模型的层数、参数量、计算量等信息
- 检测进度:显示当前处理的图片序号和总数
- 检测结果:显示检测到的物体类别和数量
- 速度统计:显示预处理、推理、后处理的时间
- 保存路径:显示结果的保存位置
这些信息对于理解模型性能和调试很有用。例如,你可以通过速度统计了解哪些部分是性能瓶颈,通过检测结果了解模型检测到了什么物体。
四、训练模式(Train)详解
训练模式用于在自定义数据集上训练YOLOv8模型。这一部分将详细介绍如何使用yolo train命令,以及各种参数的作用和用法。
4.1 基本训练命令
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
这行命令告诉YOLOv8:
- 使用
coco128.yaml作为数据集配置文件 - 从
yolov8n.pt预训练模型开始训练 - 训练100轮(epochs)
- 使用640x640的输入图像尺寸
参数说明:
data:数据集配置文件路径(YAML格式)model:预训练模型文件epochs:训练轮数imgsz:输入图像尺寸
4.2 训练参数详解
训练模式支持大量参数配置,以下是常用参数:
| 参数 | 默认值 | 说明 | 示例 |
|---|---|---|---|
data |
- | 数据集配置文件 | data=coco128.yaml |
model |
yolov8n.pt | 预训练模型 | model=yolov8s.pt |
epochs |
100 | 训练轮数 | epochs=200 |
patience |
50 | 早停耐心值 | patience=100 |
batch |
16 | 批次大小 | batch=32 |
imgsz |
640 | 输入图像尺寸 | imgsz=320 |
save |
True | 保存检查点 | save=True |
save_period |
-1 | 保存周期 | save_period=10 |
cache |
False | 缓存数据集 | cache=True |
device |
- | 训练设备 | device=0 |
workers |
8 | 数据加载线程数 | workers=4 |
project |
runs/detect | 项目目录 | project=my_project |
name |
train | 实验名称 | name=exp1 |
exist_ok |
False | 覆盖现有实验 | exist_ok=True |
pretrained |
True | 使用预训练权重 | pretrained=True |
optimizer |
SGD | 优化器 | optimizer=Adam |
verbose |
False | 详细输出 | verbose=True |
seed |
0 | 随机种子 | seed=42 |
deterministic |
True | 确定性训练 | deterministic=True |
single_cls |
False | 单类别训练 | single_cls=True |
rect |
False | 矩形训练 | rect=True |
cos_lr |
False | 余弦学习率 | cos_lr=True |
close_mosaic |
10 | 关闭mosaic的epoch | close_mosaic=0 |
resume |
False | 恢复训练 | resume=True |
amp |
True | 自动混合精度 | amp=True |
fraction |
1.0 | 使用数据比例 | fraction=0.5 |
profile |
False | 性能分析 | profile=True |
freeze |
- | 冻结层数 | freeze=10 |
lr0 |
0.01 | 初始学习率 | lr0=0.001 |
lrf |
0.01 | 最终学习率 | lrf=0.01 |
momentum |
0.937 | SGD动量 | momentum=0.9 |
weight_decay |
0.0005 | 权重衰减 | weight_decay=0.001 |
warmup_epochs |
3.0 | Warmup轮数 | warmup_epochs=5 |
warmup_momentum |
0.8 | Warmup动量 | warmup_momentum=0.5 |
warmup_bias_lr |
0.1 | Warmup偏置学习率 | warmup_bias_lr=0.05 |
box |
7.5 | 边界框损失权重 | box=5.0 |
cls |
0.5 | 分类损失权重 | cls=1.0 |
dfl |
1.5 | DFL损失权重 | dfl=2.0 |
pose |
12.0 | 姿态损失权重 | pose=10.0 |
kobj |
2.0 | 关键点目标损失权重 | kobj=1.0 |
label_smoothing |
0.0 | 标签平滑 | label_smoothing=0.1 |
nbs |
64 | 名义批次大小 | nbs=128 |
overlap_mask |
True | 掩码重叠 | overlap_mask=True |
mask_ratio |
4 | 掩码下采样比例 | mask_ratio=8 |
dropout |
0.0 | Dropout率 | dropout=0.1 |
val |
True | 训练时验证 | val=True |
plots |
False | 保存训练图表 | plots=True |
让我们来详细解释这些参数的作用和使用场景:
data参数
data参数指定数据集配置文件的路径。这个YAML文件包含了数据集的路径、训练集和验证集的位置、类别名称等信息。下面是一个示例:
yaml
# coco128.yaml
path: ../datasets/coco128 # 数据集根目录
train: images/train2017 # 训练集图像目录(相对于path)
val: images/train2017 # 验证集图像目录
# 类别
names:
0: person
1: bicycle
2: car
3: motorcycle
4: airplane
5: bus
6: train
7: truck
8: boat
9: traffic light
# ... 更多类别
model参数
model参数指定预训练模型的路径。YOLOv8提供了多个预训练模型,从小到大依次是:
yolov8n.pt:最小模型,速度最快,精度最低yolov8s.pt:小型模型,平衡速度和精度yolov8m.pt:中型模型,较高精度yolov8l.pt:大型模型,高精度yolov8x.pt:最大模型,精度最高,速度最慢
你也可以使用自定义的预训练模型,或者从头开始训练(设置model='')。
epochs参数
epochs参数指定训练轮数。一轮(epoch)表示模型看过一次整个训练集。默认值是100,但对于小型数据集可能需要更多轮数,对于大型数据集可能需要较少轮数。
patience参数
patience参数指定早停(early stopping)的耐心值。如果在patience轮内验证集上的性能没有提升,训练将提前停止。默认值是50,这意味着如果连续50轮验证性能没有提升,训练就会停止。
batch参数
batch参数指定批次大小。批次大小表示每次迭代中处理的样本数量。较大的批次大小可以加快训练速度,但需要更多的内存。默认值是16,你可以根据GPU内存大小调整这个值。
imgsz参数
imgsz参数指定输入图像的尺寸。默认值是640,表示输入图像会被调整为640x640。较大的图像尺寸可能会提高检测精度,特别是对于小物体,但会增加计算量和内存使用。
save参数
save参数控制是否保存训练检查点。默认值是True,表示会保存最终模型和最佳模型。检查点保存在runs/detect/train/weights目录下。
save_period参数
save_period参数指定保存检查点的周期。默认值是-1,表示只保存最终模型和最佳模型。如果设置为正整数,表示每隔这么多轮保存一次检查点。
cache参数
cache参数控制是否缓存数据集。可以设置为:
False:不缓存True或ram:缓存到内存disk:缓存到磁盘
缓存可以加快数据加载速度,特别是对于小型数据集。但对于大型数据集,缓存到内存可能会消耗大量内存。
device参数
device参数指定训练设备。可以设置为:
cpu:使用CPU0:使用第一个GPU1,2,3:使用多个GPUmps:使用Apple的Metal Performance Shaders(适用于Mac)
如果你有NVIDIA GPU并且安装了CUDA,建议使用GPU以获得更快的训练速度。
workers参数
workers参数指定数据加载的线程数。默认值是8,你可以根据CPU核心数调整这个值。更多的线程可以加快数据加载速度,但也会消耗更多的CPU资源。
project和name参数
project和name参数指定实验的保存位置和名称。默认情况下,实验保存在runs/detect/train目录下。你可以通过设置project=my_project name=exp1将实验保存在runs/my_project/exp1目录下。
exist_ok参数
exist_ok参数控制是否覆盖现有实验。默认值是False,表示如果实验目录已存在,会报错。设置为True表示覆盖现有实验。
pretrained参数
pretrained参数控制是否使用预训练权重。默认值是True,表示使用预训练权重。设置为False表示从头开始训练。
optimizer参数
optimizer参数指定优化器。可以设置为:
SGD:随机梯度下降(默认)Adam:Adam优化器AdamW:AdamW优化器RMSProp:RMSProp优化器
不同的优化器有不同的特性,SGD通常更稳定,Adam通常收敛更快。
verbose参数
verbose参数控制是否输出详细信息。默认值是False,表示只输出关键信息。设置为True会输出更详细的训练信息。
seed参数
seed参数指定随机种子,用于确保实验的可复现性。默认值是0,你可以设置为任何整数。
deterministic参数
deterministic参数控制是否使用确定性训练。默认值是True,表示尽量确保结果可复现。但这可能会降低训练速度。
single_cls参数
single_cls参数控制是否进行单类别训练。默认值是False,表示多类别训练。设置为True会将所有类别视为一个类别。
rect参数
rect参数控制是否使用矩形训练。默认值是False,表示输入图像会被调整为正方形。设置为True会保持图像的原始宽高比,这可以提高训练效率,但可能需要调整一些其他参数。
cos_lr参数
cos_lr参数控制是否使用余弦学习率调度。默认值是False,表示使用线性学习率调度。设置为True会使用余弦学习率调度,这有时可以提高最终性能。
close_mosaic参数
close_mosaic参数指定在最后多少轮关闭mosaic数据增强。默认值是10,表示在最后10轮不使用mosaic增强。这有助于模型在最后阶段适应更真实的数据分布。
resume参数
resume参数控制是否从检查点恢复训练。默认值是False,表示从头开始训练。设置为True会从最新的检查点恢复训练。
amp参数
amp参数控制是否使用自动混合精度训练。默认值是True,表示使用混合精度训练,这可以加快训练速度并减少内存使用。
fraction参数
fraction参数指定使用数据集的比例。默认值是1.0,表示使用整个数据集。你可以设置为小于1的值来使用部分数据集,这对于快速测试很有用。
profile参数
profile参数控制是否进行性能分析。默认值是False,表示不进行分析。设置为True会分析各个部分的性能,帮助找出性能瓶颈。
freeze参数
freeze参数指定冻结的层数。默认值是None,表示不冻结任何层。你可以设置为正整数来冻结前N层,这在微调时很有用。
lr0和lrf参数
lr0和lrf参数分别指定初始学习率和最终学习率。默认值分别是0.01和0.01。学习率是训练中最重要的超参数之一,较大的学习率可以加快收敛速度,但可能导致不稳定;较小的学习率更稳定,但收敛速度较慢。
momentum参数
momentum参数指定SGD优化器的动量。默认值是0.937。动量可以帮助优化器在平坦区域保持速度,在陡峭区域减速。
weight_decay参数
weight_decay参数指定权重衰减(L2正则化)系数。默认值是0.0005。权重衰减可以防止过拟合,但设置过大会导致欠拟合。
warmup_epochs、warmup_momentum和warmup_bias_lr参数
这些参数指定学习率预热的设置。在训练初期,学习率会从较小的值逐渐增加到初始学习率,这有助于稳定训练过程。
box、cls、dfl、pose和kobj参数
这些参数指定不同损失项的权重。默认值分别是7.5、0.5、1.5、12.0和2.0。调整这些权重可以改变模型对不同方面的关注程度。
label_smoothing参数
label_smoothing参数指定标签平滑的系数。默认值是0.0,表示不使用标签平滑。标签平滑可以防止模型过于自信,有助于提高泛化能力。
nbs参数
nbs参数指定名义批次大小,用于自动缩放超参数。默认值是64。这个参数通常不需要调整。
overlap_mask和mask_ratio参数
这些参数主要用于实例分割任务,控制掩码的重叠和下采样比例。
dropout参数
dropout参数指定Dropout率。默认值是0.0,表示不使用Dropout。Dropout可以防止过拟合,但在YOLOv8中通常不使用。
val参数
val参数控制是否在训练过程中进行验证。默认值是True,表示每轮训练后都会在验证集上评估模型性能。
plots参数
plots参数控制是否保存训练图表。默认值是False,表示不保存。设置为True会保存各种训练图表,如损失曲线、学习率曲线等,这些图表对于分析训练过程很有用。
4.3 训练命令示例
让我们通过一些具体的示例来了解如何使用这些参数:
示例1:基本训练
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
这是一个最基本的训练命令,使用COCO128数据集和YOLOv8n模型,训练100轮,输入图像尺寸为640x640。
示例2:使用更大的批次和图像尺寸
bash
yolo detect train data=coco128.yaml model=yolov8m.pt epochs=200 batch=32 imgsz=800
这个命令使用更大的模型(YOLOv8m)、更多的训练轮数(200)、更大的批次大小(32)和更大的图像尺寸(800)。这需要更多的GPU内存,但可能会提高检测精度。
示例3:使用Adam优化器
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 optimizer=Adam lr0=0.001
这个命令使用Adam优化器而不是默认的SGD,并设置初始学习率为0.001。Adam优化器通常收敛更快,但可能不如SGD稳定。
示例4:单GPU训练
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 device=0
这个命令指定使用第一个GPU进行训练。如果你有多个GPU,但只想使用其中一个,这个命令很有用。
示例5:多GPU训练
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 device=0,1,2,3
这个命令指定使用4个GPU进行训练。多GPU训练可以加快训练速度,但需要更多的GPU内存。
示例6:恢复训练
bash
yolo detect train data=coco128.yaml model=last.pt epochs=100 resume=True
这个命令从最新的检查点(last.pt)恢复训练。如果训练过程中被中断,这个命令很有用。
示例7:自定义实验名称
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 project=my_project name=exp1
这个命令将实验保存在runs/my_project/exp1目录下,而不是默认的runs/detect/train目录。这对于组织多个实验很有用。
4.4 数据集配置文件
训练需要提供一个YAML格式的数据集配置文件。这个文件包含了数据集的路径、训练集和验证集的位置、类别名称等信息。以下是一个示例:
yaml
# coco128.yaml
path: ../datasets/coco128 # 数据集根目录
train: images/train2017 # 训练集图像目录(相对于path)
val: images/train2017 # 验证集图像目录
# 类别
names:
0: person
1: bicycle
2: car
3: motorcycle
4: airplane
5: bus
6: train
7: truck
8: boat
9: traffic light
# ... 更多类别
这个配置文件指定了:
- 数据集的根目录:
../datasets/coco128 - 训练集图像目录:
images/train2017(相对于根目录) - 验证集图像目录:
images/train2017(相对于根目录) - 类别名称:从0开始编号,每个编号对应一个类别名称
对于自定义数据集,你需要创建一个类似的配置文件,并根据你的数据集结构修改路径和类别名称。YOLOv8期望图像和标签文件有相同的名称(但扩展名不同),并放在相应的目录中。例如,如果有一张图片名为image001.jpg,那么对应的标签文件应该名为image001.txt,并放在标签目录中。
标签文件的格式为:<class> <x_center> <y_center> <width> <height>,其中坐标是相对于图像宽高的归一化值(0到1之间)。
五、验证模式(Val)详解
验证模式用于在验证集上评估模型的性能。这一部分将详细介绍如何使用yolo val命令,以及各种参数的作用和用法。
5.1 基本验证命令
bash
yolo detect val model=yolov8n.pt data=coco128.yaml
这行命令告诉YOLOv8:
- 使用
yolov8n.pt模型 - 在
coco128.yaml指定的验证集上评估模型性能
5.2 验证参数详解
| 参数 | 默认值 | 说明 | 示例 |
|---|---|---|---|
model |
- | 模型文件 | model=best.pt |
data |
- | 数据集配置文件 | data=coco128.yaml |
batch |
16 | 批次大小 | batch=32 |
imgsz |
640 | 输入图像尺寸 | imgsz=320 |
conf |
0.001 | 置信度阈值 | conf=0.25 |
iou |
0.6 | NMS IoU阈值 | iou=0.5 |
device |
- | 运行设备 | device=0 |
save_json |
False | 保存结果为JSON | save_json=True |
save_hybrid |
False | 保存混合标签 | save_hybrid=True |
conf_thres |
0.001 | 置信度阈值 | conf_thres=0.001 |
plots |
False | 保存验证图表 | plots=True |
rect |
False | 矩形验证 | rect=True |
split |
val | 数据集划分 | split=test |
让我们来详细解释这些参数的作用和使用场景:
model参数
model参数指定要评估的模型文件。通常,你会使用训练过程中得到的最佳模型(best.pt)或最终模型(last.pt)。
data参数
data参数指定数据集配置文件的路径。这个文件应该包含验证集的位置和类别信息。
batch参数
batch参数指定批次大小。较大的批次大小可以加快验证速度,但需要更多的内存。
imgsz参数
imgsz参数指定输入图像的尺寸。这应该与训练时使用的尺寸一致,以获得准确的性能评估。
conf和conf_thres参数
conf和conf_thres参数都指定置信度阈值,只有置信度高于这个阈值的检测结果才会被考虑。默认值是0.001,这是一个很低的值,确保大多数检测结果都被考虑在内。
iou参数
iou参数指定NMS的IoU阈值。这应该与训练时使用的值一致,以获得准确的性能评估。
device参数
device参数指定运行设备。可以设置为cpu、0(第一个GPU)等。
save_json参数
save_json参数控制是否将验证结果保存为COCO格式的JSON文件。这对于与其他方法比较很有用。
save_hybrid参数
save_hybrid参数控制是否保存混合标签。混合标签结合了真实标签和预测标签,这对于分析模型很有用。
plots参数
plots参数控制是否保存验证图表,如混淆矩阵、PR曲线等。这些图表对于理解模型性能很有用。
rect参数
rect参数控制是否使用矩形验证。如果训练时使用了rect=True,验证时也应该使用相同的设置。
split参数
split参数指定使用数据集的哪个部分进行验证。默认值是val,表示使用验证集。你也可以设置为test,表示使用测试集(如果数据集有测试集的话)。
5.3 验证命令示例
让我们通过一些具体的示例来了解如何使用这些参数:
示例1:基本验证
bash
yolo detect val model=yolov8n.pt data=coco128.yaml
这是一个最基本的验证命令,使用YOLOv8n模型在COCO128验证集上评估性能。
示例2:在测试集上验证
bash
yolo detect val model=best.pt data=coco128.yaml split=test
这个命令在测试集上评估模型性能,而不是默认的验证集。
示例3:保存验证结果为JSON
bash
yolo detect val model=best.pt data=coco128.yaml save_json=True
这个命令将验证结果保存为COCO格式的JSON文件,便于与其他方法比较。
六、导出模式(Export)详解
导出模式用于将YOLOv8模型转换为其他格式,便于在不同平台部署。这一部分将详细介绍如何使用yolo export命令,以及各种参数的作用和用法。
6.1 支持导出的格式
YOLOv8支持导出为以下格式:
| 格式 | 命令 | 说明 |
|---|---|---|
| PyTorch | - | 原生格式 |
| TorchScript | format=torchscript |
TorchScript模型 |
| ONNX | format=onnx |
ONNX格式 |
| OpenVINO | format=openvino |
Intel OpenVINO |
| TensorRT | format=engine |
NVIDIA TensorRT |
| CoreML | format=coreml |
Apple CoreML |
| TensorFlow SavedModel | format=saved_model |
TF SavedModel |
| TensorFlow GraphDef | format=pb |
TF GraphDef |
| TensorFlow Lite | format=tflite |
TF Lite |
| TensorFlow Edge TPU | format=edgetpu |
Coral Edge TPU |
| TensorFlow.js | format=tfjs |
TF.js |
| PaddlePaddle | format=paddle |
PaddlePaddle |
| ncnn | format=ncnn |
Tencent ncnn |
这些格式覆盖了大多数部署场景,无论是服务器端部署(ONNX、TensorRT)、移动端部署(TensorFlow Lite、CoreML)还是Web部署(TensorFlow.js),都有对应的格式。
6.2 导出参数详解
| 参数 | 默认值 | 说明 | 示例 |
|---|---|---|---|
model |
- | 模型文件 | model=yolov8n.pt |
format |
torchscript | 导出格式 | format=onnx |
imgsz |
640 | 输入图像尺寸 | imgsz=320 |
keras |
False | 使用Keras | keras=True |
optimize |
False | 优化模型 | optimize=True |
half |
False | FP16半精度 | half=True |
int8 |
False | INT8量化 | int8=True |
dynamic |
False | 动态轴 | dynamic=True |
simplify |
False | 简化ONNX | simplify=True |
opset |
- | ONNX opset版本 | opset=12 |
workspace |
4 | TensorRT工作空间(GB) | workspace=8 |
nms |
False | 添加NMS到模型 | nms=True |
让我们来详细解释这些参数的作用和使用场景:
model参数
model参数指定要导出的模型文件。通常,你会使用训练过程中得到的最佳模型(best.pt)或最终模型(last.pt)。
format参数
format参数指定导出的格式。默认值是torchscript,但你可以根据需要选择其他格式。
imgsz参数
imgsz参数指定输入图像的尺寸。这应该与训练时使用的尺寸一致,以确保模型性能。
keras参数
keras参数控制是否使用Keras格式导出TensorFlow模型。默认值是False,表示使用SavedModel格式。
optimize参数
optimize参数控制是否对导出的模型进行优化。对于某些格式(如TensorFlow Lite),优化可以减小模型大小和提高推理速度。
half参数
half参数控制是否导出FP16半精度模型。半精度模型可以减小模型大小和提高推理速度,特别是在支持半精度计算的硬件上。
int8参数
int8参数控制是否导出INT8量化模型。量化可以显著减小模型大小和提高推理速度,但可能会略微降低精度。
dynamic参数
dynamic参数控制是否导出动态轴模型。对于ONNX格式,动态轴模型可以处理不同尺寸的输入图像。
simplify参数
simplify参数控制是否简化ONNX模型。简化可以移除冗余操作,减小模型大小。
opset参数
opset参数指定ONNX的opset版本。不同的版本支持不同的操作,默认使用最新版本。
workspace参数
workspace参数指定TensorRT的工作空间大小(GB)。较大的工作空间可以提高优化效果,但需要更多的GPU内存。
nms参数
nms参数控制是否将NMS(非极大值抑制)操作添加到模型中。这可以简化部署流程,但会增加模型大小。
6.3 导出命令示例
让我们通过一些具体的示例来了解如何使用这些参数:
示例1:导出为ONNX格式
bash
yolo export model=yolov8n.pt format=onnx
这个命令将YOLOv8n模型导出为ONNX格式,ONNX是一种通用的模型交换格式,支持多种推理引擎。
示例2:导出为TensorRT格式
bash
yolo export model=yolov8n.pt format=engine device=0
这个命令将YOLOv8n模型导出为TensorRT引擎,TensorRT是NVIDIA的高性能推理引擎,特别适用于NVIDIA GPU。
示例3:导出为TensorFlow Lite格式
bash
yolo export model=yolov8n.pt format=tflite
这个命令将YOLOv8n模型导出为TensorFlow Lite格式,TFLite是Google的轻量级推理框架,特别适用于移动和嵌入式设备。
示例4:导出为CoreML格式(macOS)
bash
yolo export model=yolov8n.pt format=coreml
这个命令将YOLOv8n模型导出为CoreML格式,CoreML是Apple的机器学习框架,适用于iOS和macOS设备。
示例5:导出FP16半精度模型
bash
yolo export model=yolov8n.pt format=onnx half=True
这个命令导出FP16半精度的ONNX模型,可以减小模型大小和提高推理速度,特别是在支持半精度计算的硬件上。
示例6:导出INT8量化模型
bash
yolo export model=yolov8n.pt format=onnx int8=True
这个命令导出INT8量化的ONNX模型,可以显著减小模型大小和提高推理速度,但可能会略微降低精度。
七、其他模式详解
除了预测、训练、验证和导出模式,YOLOv8 CLI还提供了其他一些有用的模式。这一部分将简要介绍这些模式。
7.1 跟踪模式(Track)
跟踪模式用于在视频中对目标进行持续跟踪。它扩展了预测功能,不仅检测每帧中的物体,还在帧之间建立关联,为每个物体分配一个唯一的ID。
bash
yolo detect track model=yolov8n.pt source='video.mp4'
跟踪参数:
tracker:跟踪器类型(botsort.yaml或bytetrack.yaml)persist:持久化跟踪ID
跟踪模式对于视频分析、监控系统等应用非常有用。例如,你可以使用跟踪模式来统计视频中通过某个区域的人数,或者跟踪特定物体的运动轨迹。
7.2 基准测试模式(Benchmark)
基准测试模式用于测试模型在不同格式下的性能。它可以帮助你了解不同格式的速度和精度差异,从而选择最适合你应用的格式。
bash
yolo benchmark model=yolov8n.pt data=coco128.yaml imgsz=640 half=False
基准测试会评估模型在多种格式(如PyTorch、TorchScript、ONNX、TensorRT等)下的性能,包括推理速度和内存使用情况。这对于选择部署格式很有帮助。
7.3 超参数调优模式(Tune)
超参数调优模式使用Ray Tune自动搜索最优超参数。训练深度学习模型需要调整很多超参数,如学习率、批次大小、权重衰减等。手动调整这些参数既耗时又容易出错,而自动超参数调优可以更高效地找到最优组合。
bash
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=10 iterations=100
参数说明:
iterations:超参数搜索的迭代次数
超参数调优会尝试多种超参数组合,并根据验证集性能选择最佳组合。这对于提高模型性能很有帮助,特别是对于竞赛或生产环境中的关键应用。
八、高级使用技巧
这一部分将介绍一些高级使用技巧,帮助你更有效地使用YOLOv8 CLI。
8.1 参数覆盖与配置文件
除了命令行参数,YOLOv8还支持通过配置文件设置参数。配置文件的优先级低于命令行参数,这意味着命令行参数会覆盖配置文件中的相同参数。
默认配置文件位置 :~/.ultralytics/settings.yaml
自定义配置文件:
bash
yolo detect train data=coco128.yaml model=yolov8n.pt cfg=custom.yaml
配置文件是一个YAML文件,包含各种参数的默认值。这对于设置常用参数很有用,特别是当你经常使用相同的参数组合时。
8.2 环境变量设置
YOLOv8支持通过环境变量设置一些全局配置:
bash
# 设置数据集目录
export YOLO_DATASETS_DIR=/path/to/datasets
# 设置运行目录
export YOLO_RUNS_DIR=/path/to/runs
# 设置权重目录
export YOLO_WEIGHTS_DIR=/path/to/weights
环境变量对于设置系统级配置很有用,特别是当你有固定的数据集或输出目录时。
8.3 覆盖默认参数
你可以创建一个settings.yaml文件来覆盖默认参数:
yaml
# ~/.ultralytics/settings.yaml
datasets_dir: /path/to/datasets
weights_dir: /path/to/weights
runs_dir: /path/to/runs
这个文件会覆盖YOLOv8的默认设置,使你能够自定义数据集、权重和输出目录的位置。
8.4 命令组合与脚本化
CLI命令可以轻松组合成脚本,实现自动化工作流。以下是一些示例:
Shell脚本示例
bash
#!/bin/bash
# train.sh - 训练脚本
# 设置参数
MODEL="yolov8n.pt"
DATA="coco128.yaml"
EPOCHS=100
IMGSZ=640
# 训练模型
echo "开始训练模型..."
yolo detect train \
model=$MODEL \
data=$DATA \
epochs=$EPOCHS \
imgsz=$IMGSZ \
batch=16 \
device=0 \
project=my_project \
name=exp1
# 验证模型
echo "验证模型..."
yolo detect val \
model=runs/detect/exp1/weights/best.pt \
data=$DATA
# 导出模型
echo "导出模型..."
yolo export \
model=runs/detect/exp1/weights/best.pt \
format=onnx
echo "完成!"
这个脚本自动化了整个训练、验证和导出流程,大大提高了工作效率。
Makefile示例
makefile
# Makefile
.PHONY: train val export clean
MODEL = yolov8n.pt
DATA = coco128.yaml
EPOCHS = 100
IMGSZ = 640
train:
yolo detect train model=$(MODEL) data=$(DATA) epochs=$(EPOCHS) imgsz=$(IMGSZ)
val:
yolo detect val model=runs/detect/train/weights/best.pt data=$(DATA)
export:
yolo export model=runs/detect/train/weights/best.pt format=onnx
clean:
rm -rf runs/
Makefile提供了另一种组织命令的方式,特别适合复杂的项目。通过简单的make train、make val等命令,你可以执行相应的任务。
九、常见问题与解决方案
这一部分将介绍使用YOLOv8 CLI时可能遇到的一些常见问题及其解决方案。
9.1 命令无法识别
问题 :运行yolo命令时提示"command not found"
解决方案:
- 确认YOLOv8已正确安装:
pip install ultralytics - 确认虚拟环境已激活
- 尝试使用Python模块方式运行:
python -m ultralytics ...
如果你是在Jupyter Notebook或某些IDE中运行,可能需要使用!前缀:!yolo ...。
9.2 参数设置无效
问题:设置的参数没有生效
解决方案:
- 检查参数拼写是否正确
- 检查参数值格式是否正确(布尔值用
True/False,不是true/false) - 查看帮助确认参数是否存在:
yolo detect train --help
有些参数可能只在特定模式下有效,例如save_txt参数只在预测模式下有效。
9.3 训练中断恢复
问题:训练过程中断,如何恢复
解决方案:
bash
# 使用resume参数恢复训练
yolo detect train model=runs/detect/train/weights/last.pt resume=True
YOLOv8会自动保存训练检查点,包括last.pt(最新模型)和best.pt(最佳模型)。使用resume=True参数可以从最新的检查点恢复训练。
9.4 多GPU训练问题
问题:多GPU训练时报错
解决方案:
- 确保所有GPU都可用:
nvidia-smi - 尝试使用DataParallel而不是DistributedDataParallel
- 减小批次大小
多GPU训练需要足够的GPU内存,如果内存不足,可以尝试减小批次大小或使用更少的GPU。
9.5 内存不足
问题:训练或推理时报内存不足错误
解决方案:
bash
# 减小批次大小
yolo detect train data=coco128.yaml model=yolov8n.pt batch=8
# 减小图像尺寸
yolo detect train data=coco128.yaml model=yolov8n.pt imgsz=320
# 使用缓存(如果内存充足但显存不足)
yolo detect train data=coco128.yaml model=yolov8n.pt cache=disk
内存不足通常是由于批次大小或图像尺寸过大导致的。减小这些参数可以降低内存使用。如果显存不足但内存充足,可以使用cache=disk将数据集缓存到磁盘而不是内存。
十、CLI命令速查表
这一部分提供了一些常用命令的快速参考,帮助你在需要时快速找到合适的命令。
10.1 预测命令速查
bash
# 基本预测
yolo predict model=yolov8n.pt source='image.jpg'
# 调整置信度
yolo predict model=yolov8n.pt source='image.jpg' conf=0.5
# 检测视频
yolo predict model=yolov8n.pt source='video.mp4' save=True
# 摄像头检测
yolo predict model=yolov8n.pt source=0 show=True
# 只检测特定类别
yolo predict model=yolov8n.pt source='image.jpg' classes=0,2,3
# 批量检测
yolo predict model=yolov8n.pt source='path/to/images/' save=True
10.2 训练命令速查
bash
# 基本训练
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
# 使用更大的模型
yolo detect train data=coco128.yaml model=yolov8m.pt epochs=200 batch=32
# 使用Adam优化器
yolo detect train data=coco128.yaml model=yolov8n.pt optimizer=Adam lr0=0.001
# 单GPU训练
yolo detect train data=coco128.yaml model=yolov8n.pt device=0
# 多GPU训练
yolo detect train data=coco128.yaml model=yolov8n.pt device=0,1,2,3
# 恢复训练
yolo detect train model=last.pt resume=True
10.3 验证命令速查
bash
# 基本验证
yolo detect val model=yolov8n.pt data=coco128.yaml
# 在测试集验证
yolo detect val model=best.pt data=coco128.yaml split=test
# 保存为JSON
yolo detect val model=best.pt data=coco128.yaml save_json=True
10.4 导出命令速查
bash
# 导出ONNX
yolo export model=yolov8n.pt format=onnx
# 导出TensorRT
yolo export model=yolov8n.pt format=engine device=0
# 导出TensorFlow Lite
yolo export model=yolov8n.pt format=tflite
# 导出FP16
yolo export model=yolov8n.pt format=onnx half=True
# 导出INT8
yolo export model=yolov8n.pt format=onnx int8=True
十一、总结
11.1 CLI的核心价值
YOLOv8的CLI工具为计算机视觉开发提供了一个高效、简洁、易用的接口。通过CLI,你可以:
- 快速上手:无需编写代码,一行命令就能完成复杂任务
- 高效实验:快速调整参数,进行大量实验
- 自动化工作流:将命令集成到脚本和流水线中
- 易于复现:命令可以直接分享和复用
这种"一行命令搞定一切"的体验,大大降低了计算机视觉应用的门槛,使得更多人能够利用YOLOv8的强大功能。
11.2 学习建议
- 从预测开始:先掌握基本的预测命令,熟悉CLI的使用方式
- 逐步深入:在掌握基础后,尝试训练和导出等高级功能
- 查阅文档 :遇到问题时,使用
--help查看帮助信息 - 实践为主:多动手实验,在实践中掌握各种参数的作用
学习CLI工具最重要的是实践。不要害怕尝试不同的参数组合,通过实验来理解每个参数的作用。当你遇到问题时,首先查看帮助信息,然后尝试调整参数,最后再查阅文档或寻求帮助。
11.3 下一步
掌握了CLI之后,你可以:
- 尝试在自己的数据集上训练模型
- 探索实例分割、姿态估计等其他任务
- 将训练好的模型导出并部署到不同平台
- 结合Python API开发更复杂的应用
YOLOv8 CLI是一个强大的工具,但它只是YOLOv8生态系统的一部分。当你掌握了CLI之后,可以进一步学习Python API,开发更复杂的应用;或者尝试其他任务,如实例分割和姿态估计;或者将模型部署到不同的平台,如移动设备、Web或边缘设备。
无论你的目标是什么,YOLOv8 CLI都为你提供了一个坚实的起点,让你能够快速实现想法,验证概念,并逐步构建更复杂的应用。
希望这篇教程能帮助你充分发挥YOLOv8 CLI的强大功能,提升你的开发效率!