训练 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% 时间用来跑代码,你就能得到一个很好的模型。
网友回复


