在实际计算机视觉项目中图像分类、目标检测和图像分割是三个最核心、最基础的任务。过去开发者往往需要为每个任务选择不同的模型框架例如用 ResNet 做分类、用 Faster R-CNN 做检测、用 U-Net 做分割这带来了学习成本高、部署复杂、多模型维护困难等问题。Ultralytics 推出的 YOLOv8 框架通过一个统一的架构和简洁的 API让开发者能够一站式地完成这三种任务极大地简化了从模型训练到部署的流程。无论是学术研究、工业质检、自动驾驶还是医疗影像分析YOLOv8 都提供了一个高效、灵活且易于上手的起点。本文将带你从零开始全面掌握使用 YOLOv8 完成图像分类、目标检测和图像分割的完整流程。我们将从环境配置、数据准备、模型训练、推理验证到常见问题排查一步步构建可复现的实践案例。无论你是刚接触计算机视觉的新手还是希望将 YOLOv8 集成到现有项目中的开发者都能通过本文获得清晰的指引和可落地的代码。1. 理解 YOLOv8 的统一架构与任务模式YOLOv8 并非一个单一的模型而是一个支持多种视觉任务的模型家族。其核心设计思想是使用一个统一的骨干网络Backbone和颈部网络Neck通过更换不同的检测头Head来适配分类、检测和分割任务。这种设计使得代码复用率高且用户只需学习一套 API。1.1 三种核心任务的定义与区别在深入 YOLOv8 之前必须清晰区分这三个任务图像分类回答“图片里有什么”的问题。模型为整张图片分配一个或多个类别标签如“猫”、“狗”。输出是一个类别概率向量。目标检测回答“目标在哪里是什么”的问题。模型不仅要识别出图片中的物体类别还要用矩形框Bounding Box标出它们的位置。输出是多个[x_min, y_min, x_max, y_max, confidence, class_id]格式的检测框。图像分割分为实例分割和语义分割。YOLOv8 主要支持实例分割它是在目标检测的基础上更进一步为每个检测到的物体生成精确的像素级掩码Mask回答“目标的精确轮廓是什么”的问题。输出是检测框和对应的多边形掩码点集。YOLOv8 通过不同的预训练模型文件来区分任务yolov8n.pt: 检测模型默认yolov8n-cls.pt: 分类模型yolov8n-seg.pt: 分割模型1.2 YOLOv8 模型文件解析.pt 与 .pth在 YOLOv8 的生态中你会遇到.pt和.pth两种模型文件它们容易混淆.pt文件这是 Ultralytics 采用的模型权重文件格式它基于 PyTorch 的.pt保存机制但额外打包了模型的架构定义、超参数如nc类别数、训练元数据等信息。你可以直接使用model YOLO(‘yolov8n.pt’)加载一个完整的、可立即用于训练或推理的模型对象。这是 YOLOv8 推荐的标准格式。.pth文件这是 PyTorch 标准的状态字典state_dict保存格式通常只包含模型的可学习参数权重和偏置。要加载.pth文件你需要先实例化一个与保存时结构完全相同的模型类然后使用model.load_state_dict(torch.load(‘model.pth’))加载权重。YOLOv8 官方通常不直接提供.pth文件。注意在绝大多数 YOLOv8 使用场景中你只需要关心.pt文件。从官方仓库下载或自己训练得到的都是.pt文件。.pth文件更多出现在纯 PyTorch 项目或需要深度定制模型结构时。2. 环境配置与项目初始化一个稳定、隔离的 Python 环境是成功的第一步。我们将使用 Conda 进行环境管理并安装 Ultralytics 核心包。2.1 创建并激活 Conda 环境# 创建名为 yolov8 的 Python 3.9 环境3.8-3.11 均可 conda create -n yolov8 python3.9 -y # 激活环境 conda activate yolov82.2 安装 Ultralytics 包Ultralytics 包是 YOLOv8 的官方接口它封装了训练、验证、预测、导出等所有功能。使用 pip 安装是最简单的方式。# 安装最新稳定版的 ultralytics pip install ultralytics # 安装完成后可以验证安装 pip list | grep ultralytics安装完成后你可以通过命令行快速验证 YOLOv8 是否可用并使用预训练模型进行一个简单的目标检测推理# 使用命令行工具用最小的 yolov8n 模型检测一张在线图片 yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg执行上述命令后它会自动下载yolov8n.pt模型并对示例图片进行检测结果会保存在runs/detect/predict目录下。2.3 可选安装 PyTorch 与 CUDAGPU 支持pip install ultralytics会自动安装一个 CPU 版本的 PyTorch。如果你的机器有 NVIDIA GPU 并希望使用 GPU 加速训练和推理需要手动安装对应 CUDA 版本的 PyTorch。首先查看你的 CUDA 版本在命令行输入nvidia-smi查看右上角CUDA Version。 然后访问 PyTorch 官网 获取安装命令。例如对于 CUDA 11.8# 卸载可能已安装的 CPU 版 torch pip uninstall torch torchvision torchaudio -y # 安装 CUDA 11.8 对应的 PyTorch pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 重新安装 ultralytics 以确保兼容性 pip install ultralytics安装后在 Python 中验证 GPU 是否可用import torch print(torch.__version__) print(torch.cuda.is_available()) # 输出 True 表示成功3. 数据准备为不同任务构建数据集YOLOv8 要求数据按特定的目录结构组织。三种任务的数据集格式有细微差别。3.1 目标检测数据集格式这是最常用的格式。目录结构如下datasets/ └── coco8/ # 你的数据集根目录名字自定 ├── images/ │ ├── train/ # 训练集图片 │ │ ├── 0001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 1001.jpg │ └── ... └── labels/ ├── train/ # 训练集标签与 images/train/ 一一对应 │ ├── 0001.txt │ └── ... └── val/ # 验证集标签 ├── 1001.txt └── ...标签文件.txt格式每行代表一个物体。class_id x_center y_center width heightclass_id: 类别索引从 0 开始。x_center, y_center, width, height: 边界框的中心点坐标和宽高必须是归一化后的值即除以图片宽度和高度后的值范围 0-1。你可以使用标注工具如 LabelImg 、 CVAT 或 Roboflow 来生成这种格式的标签。3.2 图像分类数据集格式分类数据集的格式更简单类似于 TensorFlow 的ImageFolder。datasets/ └── my_classification/ ├── train/ │ ├── cat/ │ │ ├── cat001.jpg │ │ └── ... │ └── dog/ │ ├── dog001.jpg │ └── ... └── val/ ├── cat/ └── dog/每个子文件夹的名称就是类别标签。YOLOv8 会自动根据文件夹名映射类别索引。3.3 实例分割数据集格式分割数据集的图片部分与检测相同但标签格式更复杂需要使用多边形点集来描述物体轮廓。YOLOv8 分割标签格式如下class_id x1 y1 x2 y2 ... xn ynclass_id: 类别索引。x1 y1 x2 y2 ... xn yn: 多边形的归一化坐标点序列。这些点按顺序连接起来就构成了物体的掩码边界。通常你需要使用支持多边形标注的工具如 LabelMe 、 CVAT 或 Roboflow 导出时选择 YOLOv8 分割格式来生成这种标签。3.4 创建数据集配置文件data.yaml无论哪种任务你都需要一个data.yaml文件来告诉 YOLOv8 你的数据集在哪里、有哪些类别。# data.yaml 示例 (以目标检测为例) path: /home/user/datasets/coco8 # 数据集根目录的绝对路径或相对路径 train: images/train # 训练集图片路径相对于 path val: images/val # 验证集图片路径相对于 path # test: images/test # 可选测试集 # 类别名称列表 names: 0: person 1: bicycle 2: car # ... 其他类别 # 类别数量 nc: 80对于分类任务train和val可以直接指向train/和val/文件夹。YOLOv8 分类模型会自动识别子文件夹结构。4. 模型训练从零开始训练你的定制模型有了数据和环境就可以开始训练了。YOLOv8 提供了极其简洁的 Python API 和命令行两种方式。4.1 使用 Python API 进行训练推荐以下是一个完整的训练脚本示例适用于目标检测任务。只需修改data.yaml的路径和几个关键参数即可运行。from ultralytics import YOLO # 1. 加载一个预训练模型或从头开始 # 使用预训练模型可以加速收敛迁移学习 model YOLO(yolov8n.pt) # 检测任务 # model YOLO(yolov8n-cls.pt) # 分类任务 # model YOLO(yolov8n-seg.pt) # 分割任务 # 2. 训练模型 results model.train( datapath/to/your/data.yaml, # 数据集配置文件路径 epochs100, # 训练轮数根据数据集大小调整 imgsz640, # 输入图片尺寸通常是 640 batch16, # 批次大小根据 GPU 内存调整 devicecuda, # 使用 GPU如果是 CPU 则写 cpu 或 0 workers8, # 数据加载线程数 projectmy_train_project, # 项目名称所有输出会保存到这里 nameexp1, # 实验名称 exist_okTrue, # 允许覆盖已有的实验目录 pretrainedTrue, # 是否使用预训练权重从加载的模型开始 optimizerauto, # 优化器如 SGD, Adam, AdamW, auto lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 (lr0 * lrf) weight_decay0.0005, # 权重衰减防止过拟合 # ... 更多超参数可以参考官方文档 ) print(“训练完成”)训练开始后控制台会输出损失、精度等指标。所有输出模型权重、日志、可视化结果都会保存在my_train_project/exp1目录下。4.2 关键训练参数详解下表列出了训练时最需要关注的参数及其影响参数名含义常见值/建议调整影响epochs训练总轮数小数据集(100-300)大数据集(50-150)过少欠拟合过多可能过拟合且耗时。imgsz模型输入的图片尺寸640 (默认), 320, 1280尺寸越大精度可能越高但显存占用和训练时间大幅增加。batch批次大小根据 GPU 显存调整如 16, 32, 64越大训练越稳定、越快但需要更多显存。device训练设备‘cuda’,‘cpu’,0(GPU 0)使用 GPU 可极大加速训练。workers数据加载子进程数CPU 核心数左右如 8影响数据读取速度过多可能导致内存问题。lr0初始学习率0.01 (SGD), 0.001 (Adam)太大导致震荡不收敛太小收敛慢。patience早停耐心值50 (默认)验证集指标连续patience轮无改善则停止训练防止过拟合。seed随机种子42 (固定值)固定种子可使实验结果可复现。4.3 训练过程监控与结果解读训练过程中Ultralytics 会实时在终端打印日志并生成一系列可视化文件损失曲线图(results.png): 观察train/box_loss,val/box_loss等是否平稳下降。如果验证损失上升可能过拟合。性能指标图(metrics.png): 关注metrics/mAP50-95(B)或metrics/accuracy(top1)分类任务。这是衡量模型好坏的核心指标。训练后的模型权重保存在weights/目录下best.pt是验证集上表现最好的模型last.pt是最后一轮的模型。验证结果样本在val_batch开头的图片中可以看到模型在验证集上的预测效果直观判断好坏。5. 模型推理与验证使用训练好的模型训练完成后使用best.pt模型进行推理和验证。5.1 单张图片/批量图片推理from ultralytics import YOLO import cv2 # 加载训练好的最佳模型 model YOLO(‘my_train_project/exp1/weights/best.pt’) # 单张图片推理 results model(‘path/to/test_image.jpg’) # 或者使用 OpenCV 读取的图片 img cv2.imread(‘path/to/test_image.jpg’) results model(img) # 可视化结果 annotated_img results[0].plot() # 返回带标注的 numpy 数组图片 cv2.imwrite(‘output.jpg’, annotated_img) # 批量推理一个文件夹下的所有图片 results model(‘path/to/test_images/’) # 获取详细的预测信息 for result in results: boxes result.boxes # 检测框信息 (检测/分割任务) masks result.masks # 分割掩码信息 (分割任务) probs result.probs # 分类概率 (分类任务) # 打印检测到的类别和置信度 if boxes is not None: for box in boxes: cls_id int(box.cls) conf float(box.conf) print(f”检测到类别 {model.names[cls_id]}, 置信度 {conf:.2f}”)5.2 在验证集上评估模型性能在部署前必须在独立的验证集上定量评估模型性能。from ultralytics import YOLO model YOLO(‘my_train_project/exp1/weights/best.pt’) # 在验证集上进行评估 metrics model.val( data‘path/to/your/data.yaml’, # 使用同样的数据配置 split‘val’, # 评估验证集 imgsz640, batch16, device‘cuda’, conf0.25, # 置信度阈值 iou0.6, # NMS 的 IoU 阈值 ) # 打印关键指标 print(metrics.box.map) # mAP50-95 (检测) print(metrics.box.map50) # mAP50 print(metrics.box.map75) # mAP75 # 对于分类任务查看 metrics.top1, metrics.top5 # 对于分割任务查看 metrics.seg.map评估结果会生成一个包含精确率Precision、召回率Recall、mAP 等指标的详细报告。5.3 模型导出为部署格式YOLOv8 训练出的.pt文件可以在 Python 环境中直接使用。但如果要部署到移动端、嵌入式设备如 RK3588, RV1126或使用 C 接口需要导出为其他格式。from ultralytics import YOLO model YOLO(‘my_train_project/exp1/weights/best.pt’) # 导出为 ONNX 格式广泛支持的中间格式 success model.export(format‘onnx’, imgsz640, simplifyTrue) # 导出为 TensorRT 格式NVIDIA GPU 极致加速 # success model.export(format‘engine’, imgsz640) # 导出为 OpenVINO 格式Intel CPU/GPU # success model.export(format‘openvino’, imgsz640) # 导出为 CoreML 格式Apple 设备 # success model.export(format‘coreml’, imgsz640)导出后你会得到如best.onnx的文件可以使用相应的推理引擎进行加载和预测。6. 常见问题排查与解决方案在实际使用 YOLOv8 的过程中你可能会遇到以下典型问题。6.1 环境与依赖问题问题现象可能原因检查与解决方案ImportError: No module named ‘ultralytics’未安装或不在正确的 Python 环境。1. 确认已激活 Conda 环境 (conda activate yolov8)。2. 在当前环境中重新安装pip install ultralytics。CUDA out of memoryGPU 显存不足。1. 减小batch-size和imgsz。2. 使用更小的模型如yolov8n换成yolov8s。3. 在model.train()中设置device‘cpu’暂时用 CPU 训练。训练速度极慢可能在使用 CPU 训练。在 Python 中检查torch.cuda.is_available()。如果为 False重新安装 GPU 版 PyTorch。6.2 数据与训练问题问题现象可能原因检查与解决方案WARNING ⚠️ No labels found标签路径错误或标签文件夹为空。1. 检查data.yaml中path,train,val路径是否正确。2. 确认labels/train/文件夹下存在.txt文件。3. 检查标签文件内容格式是否正确归一化坐标。损失 (loss) 不下降或为 NaN学习率过高、数据有问题、模型结构不适配。1. 大幅降低lr0如从 0.01 降到 0.001。2. 检查数据集确保图片能正常打开标签文件与图片对应且坐标值在 [0,1] 区间。3. 对于自定义任务确认data.yaml中的nc类别数与模型预期一致。验证集 mAP 很低但训练集损失正常模型过拟合。1. 增加数据集大小和多样性。2. 使用数据增强YOLOv8 默认已开启。3. 增加weight_decay参数。4. 减少模型复杂度或使用早停 (patience)。训练时出现Misaligned or corrupted bounding box标签坐标超出 [0,1] 范围。使用脚本检查所有标签文件python -c “from ultralytics.yolo.data.utils import check_det_dataset; check_det_dataset(‘path/to/your/data.yaml’)”6.3 推理与导出问题问题现象可能原因检查与解决方案推理结果为空检测不到目标置信度阈值 (conf) 设置过高或训练数据与推理数据差异大。1. 降低推理时的conf参数model.predict(source…, conf0.1)。2. 检查推理图片是否与训练数据相似光照、尺度、背景。3. 确认模型是检测/分类/分割中的正确类型。导出的 ONNX/TensorRT 模型推理结果与原模型不一致导出时输入输出节点或动态维度设置问题。1. 确保导出命令中imgsz与训练时一致。2. 使用simplifyTrue参数简化 ONNX 模型。3. 使用 ONNX Runtime 验证导出模型并与 PyTorch 推理结果逐层对比。在 RK3588/RV1126 等嵌入式设备上部署失败设备支持的算子或数据类型有限。1. 导出时尝试使用int8量化如果设备支持。2. 使用设备厂商提供的专用转换工具链如 RKNN Toolkit。3. 简化模型结构或使用为嵌入式设备优化的轻量模型。7. 进阶技巧与最佳实践掌握了基础流程后以下实践能帮助你更好地运用 YOLOv8。7.1 数据增强策略YOLOv8 内置了强大的数据增强默认配置已适用于多数场景。你可以在model.train()中通过augment参数进行调整model.train( data‘data.yaml’, epochs100, augmentTrue, # 开启增强 hsv_h0.015, # 色调增强强度 hsv_s0.7, # 饱和度增强强度 hsv_v0.4, # 明度增强强度 degrees10.0, # 随机旋转角度 translate0.1, # 随机平移 scale0.5, # 随机缩放 shear0.0, # 随机剪切 flipud0.0, # 上下翻转概率 fliplr0.5, # 左右翻转概率 )对于特殊场景如小目标检测可以适当减弱颜色扰动 (hsv_*)增强几何变换 (scale,translate)。7.2 模型选择与超参数调优模型选择YOLOv8 提供不同尺寸的模型在精度和速度间权衡。yolov8n(nano): 最快体积最小精度最低。yolov8s(small)yolov8m(medium)yolov8l(large)yolov8x(extra large): 最慢体积最大精度最高。 通常从yolov8m或yolov8l开始如果速度不达标再换更小的模型。超参数调优可以使用 YOLOv8 内置的调优功能进行小范围搜索。model.tune( data‘data.yaml’, epochs30, iterations100, # 超参数组合尝试次数 optimizer‘AdamW’, lr0(1e-5, 1e-1), # 学习率搜索范围 … # 其他参数范围 )7.3 自定义模型结构添加注意力机制等许多热搜词提到“yolov8添加ca注意力机制”。YOLOv8 支持通过修改配置文件来定制模型。基本步骤如下克隆 Ultralytics 仓库找到模型配置文件如ultralytics/models/v8/yolov8.yaml。复制一份按需修改网络结构例如在 Backbone 或 Head 中添加注意力模块。创建一个新的模型构建文件如my_yolov8.py注册你的自定义模块。训练时使用model YOLO(‘my_yolov8.yaml’)加载你的架构并加载预训练权重如果需要。注意自定义模型结构需要对 CNN 和 YOLO 架构有较深理解且需要自行实现模块的前向传播。对于大多数应用官方预训练模型已经足够优秀。7.4 生产环境部署考量模型量化使用model.export(format‘onnx’, int8True)尝试 INT8 量化可以大幅减少模型体积、提升推理速度但可能会有轻微精度损失。TensorRT 加速对于 NVIDIA GPU 生产环境务必导出为 TensorRT (engine) 格式并结合 Triton Inference Server 等工具部署以获得最佳性能。监控与日志在生产服务中记录模型的推理耗时、输入输出分布、异常情况等便于性能分析和问题追溯。版本管理对训练数据、模型代码、超参数、训练出的权重文件进行版本化管理如使用 DVC, MLflow。通过以上步骤你不仅能够使用 YOLOv8 完成图像分类、检测、分割的基础任务还能掌握数据准备、模型训练调优、问题排查和部署上线的完整链路。建议从一个公开的小数据集如 COCO128开始跑通整个流程再迁移到自己的业务数据上逐步迭代和优化。
YOLOv8一站式实战:从零掌握图像分类、检测与分割
发布时间:2026/7/1 3:42:42
在实际计算机视觉项目中图像分类、目标检测和图像分割是三个最核心、最基础的任务。过去开发者往往需要为每个任务选择不同的模型框架例如用 ResNet 做分类、用 Faster R-CNN 做检测、用 U-Net 做分割这带来了学习成本高、部署复杂、多模型维护困难等问题。Ultralytics 推出的 YOLOv8 框架通过一个统一的架构和简洁的 API让开发者能够一站式地完成这三种任务极大地简化了从模型训练到部署的流程。无论是学术研究、工业质检、自动驾驶还是医疗影像分析YOLOv8 都提供了一个高效、灵活且易于上手的起点。本文将带你从零开始全面掌握使用 YOLOv8 完成图像分类、目标检测和图像分割的完整流程。我们将从环境配置、数据准备、模型训练、推理验证到常见问题排查一步步构建可复现的实践案例。无论你是刚接触计算机视觉的新手还是希望将 YOLOv8 集成到现有项目中的开发者都能通过本文获得清晰的指引和可落地的代码。1. 理解 YOLOv8 的统一架构与任务模式YOLOv8 并非一个单一的模型而是一个支持多种视觉任务的模型家族。其核心设计思想是使用一个统一的骨干网络Backbone和颈部网络Neck通过更换不同的检测头Head来适配分类、检测和分割任务。这种设计使得代码复用率高且用户只需学习一套 API。1.1 三种核心任务的定义与区别在深入 YOLOv8 之前必须清晰区分这三个任务图像分类回答“图片里有什么”的问题。模型为整张图片分配一个或多个类别标签如“猫”、“狗”。输出是一个类别概率向量。目标检测回答“目标在哪里是什么”的问题。模型不仅要识别出图片中的物体类别还要用矩形框Bounding Box标出它们的位置。输出是多个[x_min, y_min, x_max, y_max, confidence, class_id]格式的检测框。图像分割分为实例分割和语义分割。YOLOv8 主要支持实例分割它是在目标检测的基础上更进一步为每个检测到的物体生成精确的像素级掩码Mask回答“目标的精确轮廓是什么”的问题。输出是检测框和对应的多边形掩码点集。YOLOv8 通过不同的预训练模型文件来区分任务yolov8n.pt: 检测模型默认yolov8n-cls.pt: 分类模型yolov8n-seg.pt: 分割模型1.2 YOLOv8 模型文件解析.pt 与 .pth在 YOLOv8 的生态中你会遇到.pt和.pth两种模型文件它们容易混淆.pt文件这是 Ultralytics 采用的模型权重文件格式它基于 PyTorch 的.pt保存机制但额外打包了模型的架构定义、超参数如nc类别数、训练元数据等信息。你可以直接使用model YOLO(‘yolov8n.pt’)加载一个完整的、可立即用于训练或推理的模型对象。这是 YOLOv8 推荐的标准格式。.pth文件这是 PyTorch 标准的状态字典state_dict保存格式通常只包含模型的可学习参数权重和偏置。要加载.pth文件你需要先实例化一个与保存时结构完全相同的模型类然后使用model.load_state_dict(torch.load(‘model.pth’))加载权重。YOLOv8 官方通常不直接提供.pth文件。注意在绝大多数 YOLOv8 使用场景中你只需要关心.pt文件。从官方仓库下载或自己训练得到的都是.pt文件。.pth文件更多出现在纯 PyTorch 项目或需要深度定制模型结构时。2. 环境配置与项目初始化一个稳定、隔离的 Python 环境是成功的第一步。我们将使用 Conda 进行环境管理并安装 Ultralytics 核心包。2.1 创建并激活 Conda 环境# 创建名为 yolov8 的 Python 3.9 环境3.8-3.11 均可 conda create -n yolov8 python3.9 -y # 激活环境 conda activate yolov82.2 安装 Ultralytics 包Ultralytics 包是 YOLOv8 的官方接口它封装了训练、验证、预测、导出等所有功能。使用 pip 安装是最简单的方式。# 安装最新稳定版的 ultralytics pip install ultralytics # 安装完成后可以验证安装 pip list | grep ultralytics安装完成后你可以通过命令行快速验证 YOLOv8 是否可用并使用预训练模型进行一个简单的目标检测推理# 使用命令行工具用最小的 yolov8n 模型检测一张在线图片 yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg执行上述命令后它会自动下载yolov8n.pt模型并对示例图片进行检测结果会保存在runs/detect/predict目录下。2.3 可选安装 PyTorch 与 CUDAGPU 支持pip install ultralytics会自动安装一个 CPU 版本的 PyTorch。如果你的机器有 NVIDIA GPU 并希望使用 GPU 加速训练和推理需要手动安装对应 CUDA 版本的 PyTorch。首先查看你的 CUDA 版本在命令行输入nvidia-smi查看右上角CUDA Version。 然后访问 PyTorch 官网 获取安装命令。例如对于 CUDA 11.8# 卸载可能已安装的 CPU 版 torch pip uninstall torch torchvision torchaudio -y # 安装 CUDA 11.8 对应的 PyTorch pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 重新安装 ultralytics 以确保兼容性 pip install ultralytics安装后在 Python 中验证 GPU 是否可用import torch print(torch.__version__) print(torch.cuda.is_available()) # 输出 True 表示成功3. 数据准备为不同任务构建数据集YOLOv8 要求数据按特定的目录结构组织。三种任务的数据集格式有细微差别。3.1 目标检测数据集格式这是最常用的格式。目录结构如下datasets/ └── coco8/ # 你的数据集根目录名字自定 ├── images/ │ ├── train/ # 训练集图片 │ │ ├── 0001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 1001.jpg │ └── ... └── labels/ ├── train/ # 训练集标签与 images/train/ 一一对应 │ ├── 0001.txt │ └── ... └── val/ # 验证集标签 ├── 1001.txt └── ...标签文件.txt格式每行代表一个物体。class_id x_center y_center width heightclass_id: 类别索引从 0 开始。x_center, y_center, width, height: 边界框的中心点坐标和宽高必须是归一化后的值即除以图片宽度和高度后的值范围 0-1。你可以使用标注工具如 LabelImg 、 CVAT 或 Roboflow 来生成这种格式的标签。3.2 图像分类数据集格式分类数据集的格式更简单类似于 TensorFlow 的ImageFolder。datasets/ └── my_classification/ ├── train/ │ ├── cat/ │ │ ├── cat001.jpg │ │ └── ... │ └── dog/ │ ├── dog001.jpg │ └── ... └── val/ ├── cat/ └── dog/每个子文件夹的名称就是类别标签。YOLOv8 会自动根据文件夹名映射类别索引。3.3 实例分割数据集格式分割数据集的图片部分与检测相同但标签格式更复杂需要使用多边形点集来描述物体轮廓。YOLOv8 分割标签格式如下class_id x1 y1 x2 y2 ... xn ynclass_id: 类别索引。x1 y1 x2 y2 ... xn yn: 多边形的归一化坐标点序列。这些点按顺序连接起来就构成了物体的掩码边界。通常你需要使用支持多边形标注的工具如 LabelMe 、 CVAT 或 Roboflow 导出时选择 YOLOv8 分割格式来生成这种标签。3.4 创建数据集配置文件data.yaml无论哪种任务你都需要一个data.yaml文件来告诉 YOLOv8 你的数据集在哪里、有哪些类别。# data.yaml 示例 (以目标检测为例) path: /home/user/datasets/coco8 # 数据集根目录的绝对路径或相对路径 train: images/train # 训练集图片路径相对于 path val: images/val # 验证集图片路径相对于 path # test: images/test # 可选测试集 # 类别名称列表 names: 0: person 1: bicycle 2: car # ... 其他类别 # 类别数量 nc: 80对于分类任务train和val可以直接指向train/和val/文件夹。YOLOv8 分类模型会自动识别子文件夹结构。4. 模型训练从零开始训练你的定制模型有了数据和环境就可以开始训练了。YOLOv8 提供了极其简洁的 Python API 和命令行两种方式。4.1 使用 Python API 进行训练推荐以下是一个完整的训练脚本示例适用于目标检测任务。只需修改data.yaml的路径和几个关键参数即可运行。from ultralytics import YOLO # 1. 加载一个预训练模型或从头开始 # 使用预训练模型可以加速收敛迁移学习 model YOLO(yolov8n.pt) # 检测任务 # model YOLO(yolov8n-cls.pt) # 分类任务 # model YOLO(yolov8n-seg.pt) # 分割任务 # 2. 训练模型 results model.train( datapath/to/your/data.yaml, # 数据集配置文件路径 epochs100, # 训练轮数根据数据集大小调整 imgsz640, # 输入图片尺寸通常是 640 batch16, # 批次大小根据 GPU 内存调整 devicecuda, # 使用 GPU如果是 CPU 则写 cpu 或 0 workers8, # 数据加载线程数 projectmy_train_project, # 项目名称所有输出会保存到这里 nameexp1, # 实验名称 exist_okTrue, # 允许覆盖已有的实验目录 pretrainedTrue, # 是否使用预训练权重从加载的模型开始 optimizerauto, # 优化器如 SGD, Adam, AdamW, auto lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 (lr0 * lrf) weight_decay0.0005, # 权重衰减防止过拟合 # ... 更多超参数可以参考官方文档 ) print(“训练完成”)训练开始后控制台会输出损失、精度等指标。所有输出模型权重、日志、可视化结果都会保存在my_train_project/exp1目录下。4.2 关键训练参数详解下表列出了训练时最需要关注的参数及其影响参数名含义常见值/建议调整影响epochs训练总轮数小数据集(100-300)大数据集(50-150)过少欠拟合过多可能过拟合且耗时。imgsz模型输入的图片尺寸640 (默认), 320, 1280尺寸越大精度可能越高但显存占用和训练时间大幅增加。batch批次大小根据 GPU 显存调整如 16, 32, 64越大训练越稳定、越快但需要更多显存。device训练设备‘cuda’,‘cpu’,0(GPU 0)使用 GPU 可极大加速训练。workers数据加载子进程数CPU 核心数左右如 8影响数据读取速度过多可能导致内存问题。lr0初始学习率0.01 (SGD), 0.001 (Adam)太大导致震荡不收敛太小收敛慢。patience早停耐心值50 (默认)验证集指标连续patience轮无改善则停止训练防止过拟合。seed随机种子42 (固定值)固定种子可使实验结果可复现。4.3 训练过程监控与结果解读训练过程中Ultralytics 会实时在终端打印日志并生成一系列可视化文件损失曲线图(results.png): 观察train/box_loss,val/box_loss等是否平稳下降。如果验证损失上升可能过拟合。性能指标图(metrics.png): 关注metrics/mAP50-95(B)或metrics/accuracy(top1)分类任务。这是衡量模型好坏的核心指标。训练后的模型权重保存在weights/目录下best.pt是验证集上表现最好的模型last.pt是最后一轮的模型。验证结果样本在val_batch开头的图片中可以看到模型在验证集上的预测效果直观判断好坏。5. 模型推理与验证使用训练好的模型训练完成后使用best.pt模型进行推理和验证。5.1 单张图片/批量图片推理from ultralytics import YOLO import cv2 # 加载训练好的最佳模型 model YOLO(‘my_train_project/exp1/weights/best.pt’) # 单张图片推理 results model(‘path/to/test_image.jpg’) # 或者使用 OpenCV 读取的图片 img cv2.imread(‘path/to/test_image.jpg’) results model(img) # 可视化结果 annotated_img results[0].plot() # 返回带标注的 numpy 数组图片 cv2.imwrite(‘output.jpg’, annotated_img) # 批量推理一个文件夹下的所有图片 results model(‘path/to/test_images/’) # 获取详细的预测信息 for result in results: boxes result.boxes # 检测框信息 (检测/分割任务) masks result.masks # 分割掩码信息 (分割任务) probs result.probs # 分类概率 (分类任务) # 打印检测到的类别和置信度 if boxes is not None: for box in boxes: cls_id int(box.cls) conf float(box.conf) print(f”检测到类别 {model.names[cls_id]}, 置信度 {conf:.2f}”)5.2 在验证集上评估模型性能在部署前必须在独立的验证集上定量评估模型性能。from ultralytics import YOLO model YOLO(‘my_train_project/exp1/weights/best.pt’) # 在验证集上进行评估 metrics model.val( data‘path/to/your/data.yaml’, # 使用同样的数据配置 split‘val’, # 评估验证集 imgsz640, batch16, device‘cuda’, conf0.25, # 置信度阈值 iou0.6, # NMS 的 IoU 阈值 ) # 打印关键指标 print(metrics.box.map) # mAP50-95 (检测) print(metrics.box.map50) # mAP50 print(metrics.box.map75) # mAP75 # 对于分类任务查看 metrics.top1, metrics.top5 # 对于分割任务查看 metrics.seg.map评估结果会生成一个包含精确率Precision、召回率Recall、mAP 等指标的详细报告。5.3 模型导出为部署格式YOLOv8 训练出的.pt文件可以在 Python 环境中直接使用。但如果要部署到移动端、嵌入式设备如 RK3588, RV1126或使用 C 接口需要导出为其他格式。from ultralytics import YOLO model YOLO(‘my_train_project/exp1/weights/best.pt’) # 导出为 ONNX 格式广泛支持的中间格式 success model.export(format‘onnx’, imgsz640, simplifyTrue) # 导出为 TensorRT 格式NVIDIA GPU 极致加速 # success model.export(format‘engine’, imgsz640) # 导出为 OpenVINO 格式Intel CPU/GPU # success model.export(format‘openvino’, imgsz640) # 导出为 CoreML 格式Apple 设备 # success model.export(format‘coreml’, imgsz640)导出后你会得到如best.onnx的文件可以使用相应的推理引擎进行加载和预测。6. 常见问题排查与解决方案在实际使用 YOLOv8 的过程中你可能会遇到以下典型问题。6.1 环境与依赖问题问题现象可能原因检查与解决方案ImportError: No module named ‘ultralytics’未安装或不在正确的 Python 环境。1. 确认已激活 Conda 环境 (conda activate yolov8)。2. 在当前环境中重新安装pip install ultralytics。CUDA out of memoryGPU 显存不足。1. 减小batch-size和imgsz。2. 使用更小的模型如yolov8n换成yolov8s。3. 在model.train()中设置device‘cpu’暂时用 CPU 训练。训练速度极慢可能在使用 CPU 训练。在 Python 中检查torch.cuda.is_available()。如果为 False重新安装 GPU 版 PyTorch。6.2 数据与训练问题问题现象可能原因检查与解决方案WARNING ⚠️ No labels found标签路径错误或标签文件夹为空。1. 检查data.yaml中path,train,val路径是否正确。2. 确认labels/train/文件夹下存在.txt文件。3. 检查标签文件内容格式是否正确归一化坐标。损失 (loss) 不下降或为 NaN学习率过高、数据有问题、模型结构不适配。1. 大幅降低lr0如从 0.01 降到 0.001。2. 检查数据集确保图片能正常打开标签文件与图片对应且坐标值在 [0,1] 区间。3. 对于自定义任务确认data.yaml中的nc类别数与模型预期一致。验证集 mAP 很低但训练集损失正常模型过拟合。1. 增加数据集大小和多样性。2. 使用数据增强YOLOv8 默认已开启。3. 增加weight_decay参数。4. 减少模型复杂度或使用早停 (patience)。训练时出现Misaligned or corrupted bounding box标签坐标超出 [0,1] 范围。使用脚本检查所有标签文件python -c “from ultralytics.yolo.data.utils import check_det_dataset; check_det_dataset(‘path/to/your/data.yaml’)”6.3 推理与导出问题问题现象可能原因检查与解决方案推理结果为空检测不到目标置信度阈值 (conf) 设置过高或训练数据与推理数据差异大。1. 降低推理时的conf参数model.predict(source…, conf0.1)。2. 检查推理图片是否与训练数据相似光照、尺度、背景。3. 确认模型是检测/分类/分割中的正确类型。导出的 ONNX/TensorRT 模型推理结果与原模型不一致导出时输入输出节点或动态维度设置问题。1. 确保导出命令中imgsz与训练时一致。2. 使用simplifyTrue参数简化 ONNX 模型。3. 使用 ONNX Runtime 验证导出模型并与 PyTorch 推理结果逐层对比。在 RK3588/RV1126 等嵌入式设备上部署失败设备支持的算子或数据类型有限。1. 导出时尝试使用int8量化如果设备支持。2. 使用设备厂商提供的专用转换工具链如 RKNN Toolkit。3. 简化模型结构或使用为嵌入式设备优化的轻量模型。7. 进阶技巧与最佳实践掌握了基础流程后以下实践能帮助你更好地运用 YOLOv8。7.1 数据增强策略YOLOv8 内置了强大的数据增强默认配置已适用于多数场景。你可以在model.train()中通过augment参数进行调整model.train( data‘data.yaml’, epochs100, augmentTrue, # 开启增强 hsv_h0.015, # 色调增强强度 hsv_s0.7, # 饱和度增强强度 hsv_v0.4, # 明度增强强度 degrees10.0, # 随机旋转角度 translate0.1, # 随机平移 scale0.5, # 随机缩放 shear0.0, # 随机剪切 flipud0.0, # 上下翻转概率 fliplr0.5, # 左右翻转概率 )对于特殊场景如小目标检测可以适当减弱颜色扰动 (hsv_*)增强几何变换 (scale,translate)。7.2 模型选择与超参数调优模型选择YOLOv8 提供不同尺寸的模型在精度和速度间权衡。yolov8n(nano): 最快体积最小精度最低。yolov8s(small)yolov8m(medium)yolov8l(large)yolov8x(extra large): 最慢体积最大精度最高。 通常从yolov8m或yolov8l开始如果速度不达标再换更小的模型。超参数调优可以使用 YOLOv8 内置的调优功能进行小范围搜索。model.tune( data‘data.yaml’, epochs30, iterations100, # 超参数组合尝试次数 optimizer‘AdamW’, lr0(1e-5, 1e-1), # 学习率搜索范围 … # 其他参数范围 )7.3 自定义模型结构添加注意力机制等许多热搜词提到“yolov8添加ca注意力机制”。YOLOv8 支持通过修改配置文件来定制模型。基本步骤如下克隆 Ultralytics 仓库找到模型配置文件如ultralytics/models/v8/yolov8.yaml。复制一份按需修改网络结构例如在 Backbone 或 Head 中添加注意力模块。创建一个新的模型构建文件如my_yolov8.py注册你的自定义模块。训练时使用model YOLO(‘my_yolov8.yaml’)加载你的架构并加载预训练权重如果需要。注意自定义模型结构需要对 CNN 和 YOLO 架构有较深理解且需要自行实现模块的前向传播。对于大多数应用官方预训练模型已经足够优秀。7.4 生产环境部署考量模型量化使用model.export(format‘onnx’, int8True)尝试 INT8 量化可以大幅减少模型体积、提升推理速度但可能会有轻微精度损失。TensorRT 加速对于 NVIDIA GPU 生产环境务必导出为 TensorRT (engine) 格式并结合 Triton Inference Server 等工具部署以获得最佳性能。监控与日志在生产服务中记录模型的推理耗时、输入输出分布、异常情况等便于性能分析和问题追溯。版本管理对训练数据、模型代码、超参数、训练出的权重文件进行版本化管理如使用 DVC, MLflow。通过以上步骤你不仅能够使用 YOLOv8 完成图像分类、检测、分割的基础任务还能掌握数据准备、模型训练调优、问题排查和部署上线的完整链路。建议从一个公开的小数据集如 COCO128开始跑通整个流程再迁移到自己的业务数据上逐步迭代和优化。