+
10
-

回答

训练 YOLO(You Only Look Once)模型来识别新的物体(自定义数据集)是一个非常标准的计算机视觉任务,通常称为迁移学习(Transfer Learning)微调(Fine-tuning)

目前最流行且易于上手的是 YOLOv8 (由 Ultralytics 开发),以下的教程将以 YOLOv8 为例,但流程对 YOLOv5/v7 也大致通用。

核心流程概览

环境准备 (安装依赖)

数据收集 (获取图片)

数据标注 (画框并分类)

数据集配置 (生成 YAML 文件)

模型训练 (运行训练脚本)

验证与推理 (测试效果)

第一步:环境准备

你需要 Python 环境(建议 3.8+)和 PyTorch。

# 安装 ultralytics 包(包含 YOLOv8)
pip install ultralytics

# 验证安装
yolo version

注意:训练强烈建议使用 GPU (NVIDIA 显卡 + CUDA)。如果没有本地 GPU,可以使用 Google Colab 或 Kaggle 的免费云端 GPU。

第二步:数据收集

收集你要识别的物体的图片。

数量:每个类别建议至少 100-500 张 图片(越多越好,且需覆盖不同场景)。

多样性:包含不同的光照、角度、背景、遮挡情况和距离。

格式:JPG 或 PNG。

第三步:数据标注 (Annotation)

你需要告诉模型图片里的物体在哪里。

下载标注工具:推荐 LabelImg (经典) 或 Roboflow (在线/本地),或者 X-AnyLabeling

开始标注

打开图片,画矩形框(Bounding Box)框住物体。

输入类别名称(例如:cat, dog, cup)。

导出格式:选择导出为 YOLO 格式

YOLO 格式是一个 .txt 文件,每一行代表一个物体:class_id x_center y_center width height (坐标是归一化到 0-1 之间的)。

第四步:整理数据集目录结构

YOLO 要求特定的目录结构。假设你的项目文件夹叫 my_custom_dataset,结构应如下:

my_custom_dataset/
├── images/
│   ├── train/       # 训练集图片
│   │   ├── img1.jpg
│   │   └── ...
│   └── val/         # 验证集图片 (用于评估模型,不参与训练)
│       ├── img2.jpg
│       └── ...
├── labels/
│   ├── train/       # 训练集标注文件 (与图片同名,后缀为.txt)
│   │   ├── img1.txt
│   │   └── ...
│   └── val/         # 验证集标注文件
│       ├── img2.txt
│       └── ...
└── data.yaml        # 数据集配置文件

建议比例:训练集 80%,验证集 20%。

第五步:配置 data.yaml

在根目录下创建 data.yaml 文件,告诉模型数据在哪里以及有哪些类别。

# data.yaml 内容示例

path: /absolute/path/to/my_custom_dataset  # 数据集根目录的绝对路径
train: images/train  # 训练集图片相对路径
val: images/val      # 验证集图片相对路径

# 类别名称 (顺序必须与标注时的 class_id 对应,从 0 开始)
names:
  0: apple
  1: banana
  2: orange

注意:path 最好填写绝对路径,避免路径错误。

第六步:开始训练

你可以使用 Python 代码或命令行进行训练。推荐使用预训练权重(如 yolov8n.pt),这样收敛更快,效果更好。

方法 A:使用 Python 脚本 (推荐)

创建 train.py:

from ultralytics import YOLO

# 1. 加载预训练模型 (n=nano, s=small, m=medium, l=large, x=xlarge)
# 新手建议从 yolov8n.pt 或 yolov8s.pt 开始
model = YOLO('yolov8n.pt')  

# 2. 训练模型
results = model.train(
    data='data.yaml',    # 数据集配置文件路径
    epochs=100,          # 训练轮数
    imgsz=640,           # 输入图片尺寸
    batch=16,            # 批次大小 (根据显存调整,显存小则调小)
    device=0,            # 使用 GPU 0,如果是 CPU 则设为 'cpu'
    project='runs/detect', # 结果保存目录
    name='my_custom_train' # 本次训练的任务名
)

运行:python train.py

方法 B:使用命令行
yolo detect train data=data.yaml model=yolov8n.pt epochs=100 imgsz=640

第七步:查看结果与推理

训练完成后,结果会保存在 runs/detect/my_custom_train/ 目录下。

results.png:查看损失函数下降曲线(Loss 越低越好)。

confusion_matrix.png:查看混淆矩阵。

weights/best.pt:这是你训练好的最终模型文件

测试新图片 (推理)
from ultralytics import YOLO

# 加载训练好的最佳权重
model = YOLO('runs/detect/my_custom_train/weights/best.pt')

# 预测
results = model('test_image.jpg')

# 显示结果
results[0].show()

常见问题与优化技巧 (Tips)

显存溢出 (CUDA OOM)

减小 batch 大小 (例如从 16 改为 8 或 4)。

减小 imgsz (例如从 640 改为 416)。

使用更小的模型 (如 yolov8n 而不是 yolov8x)。

识别效果不好

数据质量:检查标注是否准确,框是否贴合物体。

数据增强:YOLO 默认开启增强(旋转、变色等),如果物体有方向性(如文字),可在配置中关闭某些增强。

增加 Epochs:如果损失曲线还在下降,增加训练轮数。

类别不平衡:如果某个类别的图片特别少,模型会学不好。尝试收集更多该类别的图片。

如何导出模型到手机/嵌入式

YOLOv8 支持导出为 ONNX, TensorRT, OpenVINO, CoreML 等格式。

命令:yolo export model=best.pt format=onnx

YOLOv5 vs YOLOv8

如果你必须用 YOLOv5 (因为旧项目兼容),流程几乎一样,只是安装 yolov5 库,且 data.yaml 格式略有不同(v5 需要 nc 类别数量字段)。但新手强烈建议直接上 v8。

总结

训练 YOLO 识别新物体的核心不在于代码,而在于数据“垃圾进,垃圾出” (Garbage In, Garbage Out) 是 AI 界的铁律。花 80% 的时间在收集高质量图片和精准标注上,剩下的 20% 时间用来跑代码,你就能得到一个很好的模型。

网友回复

我知道答案,我要回答