YOLO-V5自定义数据训练:从标注到模型部署完整教程

如果你正在寻找一个能快速上手、效果稳定、部署灵活的目标检测方案,那么YOLO-V5绝对值得你花时间深入了解。它不像那些只停留在论文里的模型,而是真正为工程师和开发者设计的工具链。今天,我就带你走一遍完整的流程:从准备自己的数据开始,一步步训练出专属的检测模型,最后把它部署到实际场景中。

整个过程听起来复杂,但跟着步骤走,你会发现其实很清晰。我们不需要深究复杂的数学公式,重点是掌握“怎么做”和“为什么这么做”。无论你是想识别生产线上的零件缺陷,还是监控场景中的特定行为,这套方法都能直接套用。


1. 环境准备:十分钟搞定基础配置

开始之前,我们需要一个干净、稳定的开发环境。这里强烈推荐使用 Anaconda 来管理Python环境,它能帮你避免各种依赖包冲突的“玄学”问题。

1.1 创建专用虚拟环境

打开你的终端(Windows用Anaconda Prompt,Mac/Linux用Terminal),执行以下命令:

# 创建一个名为yolov5的虚拟环境,并指定Python版本为3.9
conda create -n yolov5 python=3.9 -y

# 激活这个环境
conda activate yolov5

为什么是Python 3.9?因为这是目前PyTorch生态兼容性最广、社区支持最好的版本之一,能最大程度减少环境问题。

1.2 安装核心依赖:PyTorch

接下来安装最重要的PyTorch框架。请根据你的电脑硬件情况选择对应的命令:

情况一:你有NVIDIA显卡,并且已经安装了CUDA 11.8 (可以通过 nvidia-smi 命令查看CUDA版本)

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

情况二:你的电脑没有独立显卡,或者只有CPU (比如很多笔记本电脑)

pip install torch torchvision torchaudio

1.3 获取YOLO-V5源码并安装其他依赖

现在来获取YOLO-V5的官方代码库:

# 克隆Ultralytics维护的YOLO-V5仓库
git clone https://github.com/ultralytics/yolov5.git

# 进入项目目录
cd yolov5

# 安装项目所需的所有Python包
pip install -r requirements.txt

这个 requirements.txt 文件包含了OpenCV、Matplotlib、Pandas等二十多个常用库,一条命令就能全部装好。

1.4 快速验证:用预训练模型检测一张图片

环境装好了,怎么知道能不能用呢?最简单的方法就是跑个例子看看:

python detect.py --source data/images/bus.jpg --weights yolov5s.pt

这条命令做了三件事:

  1. 加载一个预训练好的小模型(yolov5s.pt)
  2. 对项目自带的示例图片 bus.jpg 进行推理
  3. 把检测结果保存到 runs/detect/exp/ 目录

打开生成的图片,如果能看到公交车上用框标出了“人”,说明你的环境完全正常,可以进入下一步了。

小提示:yolov5s 是“小(small)”模型,速度最快,适合快速验证和CPU运行。如果你有GPU且需要更高精度,可以试试 yolov5m(中)或 yolov5l(大)。


2. 数据准备:为模型准备“教材”

模型训练就像教孩子认东西,你得先准备好“教材”——也就是标注好的数据。这部分工作决定了模型最终能学得多好。

2.1 理解YOLO的数据格式要求

YOLO-V5要求数据按特定方式组织。假设我们要训练一个识别“猫”和“狗”的模型,目录结构应该是这样的:

my_pet_dataset/          # 数据集根目录
├── images/              # 存放所有图片
│   ├── train/           # 训练集图片
│   │   ├── cat_001.jpg
│   │   ├── dog_001.jpg
│   │   └── ...
│   └── val/             # 验证集图片(用于评估模型)
│       ├── cat_101.jpg
│       ├── dog_101.jpg
│       └── ...
├── labels/              # 存放所有标注文件
│   ├── train/           # 训练集标注
│   │   ├── cat_001.txt
│   │   ├── dog_001.txt
│   │   └── ...
│   └── val/             # 验证集标注
│       ├── cat_101.txt
│       ├── dog_101.txt
│       └── ...
└── data.yaml            # 数据集配置文件(最重要!)

关键点来了:每个图片文件都对应一个同名的 .txt 标注文件。比如 cat_001.jpg 的标注就在 cat_001.txt 里。

2.2 标注文件怎么写?

标注文件的内容格式很简单,每行代表图片中的一个物体:

<class_id> <x_center> <y_center> <width> <height>
  • class_id:类别编号,从0开始(0=猫,1=狗)
  • x_center, y_center:边界框中心点的坐标(相对值,0~1之间)
  • width, height:边界框的宽度和高度(相对值,0~1之间)

“相对值”是什么意思? 假设图片尺寸是 800×600 像素,你标注了一个框,中心点在 (400, 300),框的宽高是 (160, 120)。那么:

  • x_center = 400 / 800 = 0.5
  • y_center = 300 / 600 = 0.5
  • width = 160 / 800 = 0.2
  • height = 120 / 600 = 0.2

所以这一行就是:0 0.5 0.5 0.2 0.2

一张图片有多个物体就写多行。例如:

0 0.3 0.4 0.15 0.2   # 一只猫
1 0.7 0.6 0.25 0.3   # 一只狗

2.3 创建数据集配置文件

最后,在数据集根目录创建 data.yaml 文件:

# 训练和验证图片的路径(相对路径或绝对路径)
train: ./my_pet_dataset/images/train
val: ./my_pet_dataset/images/val

# 类别数量
nc: 2

# 类别名称,按class_id顺序排列
names: ['cat', 'dog']

这个文件告诉YOLO-V5:数据在哪里、有几个类别、分别叫什么名字。

2.4 标注工具推荐

手动计算坐标太麻烦?用工具吧:

  • LabelImg:开源免费,支持Windows/Mac/Linux,图形化界面,直接生成YOLO格式
    pip install labelImg
    labelImg
    
  • Roboflow:在线标注平台,支持团队协作,还能自动做数据增强
  • CVAT:功能强大的开源标注系统,适合企业级项目

数据质量黄金法则:宁可要100张标注精准的图片,也不要1000张标注粗糙的图片。模糊的、遮挡严重的、角度极端的样本,该舍弃就舍弃。


3. 模型训练:让模型学习你的数据

数据准备好了,现在开始训练。YOLO-V5支持“迁移学习”——不用从零开始,而是在预训练模型的基础上,用你的数据微调。

3.1 启动训练命令

在yolov5项目目录下,运行:

python train.py \
  --img 640 \              # 输入图片尺寸(像素)
  --batch 16 \             # 每次训练处理的图片数量
  --epochs 50 \            # 整个数据集训练多少轮
  --data ../my_pet_dataset/data.yaml \  # 你的数据集配置文件
  --weights yolov5s.pt \   # 从哪个预训练模型开始
  --cfg models/yolov5s.yaml \  # 模型结构配置文件
  --name my_pet_detector   # 这次训练的名字

参数解释:

参数作用常见值
--img图片输入尺寸640(默认),可增大到1280检测小物体
--batch批次大小取决于GPU显存,16-32较常见
--epochs训练轮数30-100,数据少可适当增加
--data数据配置路径你的 data.yaml 文件路径
--weights初始权重yolov5s.pt(小模型,推荐入门)
--name实验名称任意有意义的名称,用于区分不同训练

3.2 训练过程监控

训练开始后,你会看到类似这样的输出:

Epoch   gpu_mem       box       obj       cls    labels  img_size
  0/49     2.1G   0.05123   0.02011  0.008761        22       640
  1/49     2.1G   0.04689   0.01845  0.007892        18       640
  ...
  • box:边界框定位损失(越小越好)
  • obj:物体置信度损失(越小越好)
  • cls:分类损失(越小越好)

训练结束后,所有结果都保存在 runs/train/my_pet_detector/ 目录下。最重要的几个文件:

  • weights/best.pt:效果最好的模型权重(我们要用的)
  • weights/last.pt:最后一轮的模型权重
  • results.png:训练过程可视化图表

打开 results.png,你会看到多条曲线,最需要关注的是 mAP@0.5 这条线(通常为橙色)。它表示在IoU阈值为0.5时的平均精度,数值越高(接近1),说明模型检测越准。

3.3 实用训练技巧

如果你的数据集很小(比如只有几百张图片):

python train.py --data data.yaml --weights yolov5s.pt --epochs 100 --freeze 10

--freeze 10 会冻结前10层网络(主干特征提取部分),只训练后面的检测头,防止过拟合。

如果你的GPU显存不够:

python train.py --batch 8 --accumulate 2

--batch 8 减小批次大小,--accumulate 2 表示每2个批次更新一次梯度,相当于模拟批次大小为16的效果。

如果想加快训练速度:

python train.py --cache ram

--cache ram 把整个数据集缓存到内存中,大幅减少磁盘IO时间,适合数据集能完全放入内存的情况。


4. 模型验证与测试:看看训练效果如何

训练完成后,别急着用,先验证一下模型在验证集上的表现:

python val.py \
  --weights runs/train/my_pet_detector/weights/best.pt \
  --data ../my_pet_dataset/data.yaml \
  --img 640 \
  --task val

这个命令会输出详细的评估指标:

Class     Images  Instances      P      R      mAP50  mAP50-95
all        100       342      0.892   0.867   0.901    0.672
cat         50       167      0.912   0.880   0.918    0.685
dog         50       175      0.873   0.854   0.884    0.659
  • P:精确率(Precision)——模型认为是猫/狗的框里,有多少真的是猫/狗
  • R:召回率(Recall)——所有真实的猫/狗,有多少被模型找出来了
  • mAP50:IoU阈值为0.5时的平均精度(主要看这个)
  • mAP50-95:IoU阈值从0.5到0.95的平均精度(更严格的指标)

一般来说,mAP50 达到0.8以上就算不错,0.9以上就很好了。

4.1 用测试图片看看实际效果

找几张训练时没见过的图片,看看模型的实际表现:

python detect.py \
  --source ../test_images/ \          # 测试图片目录
  --weights runs/train/my_pet_detector/weights/best.pt \
  --conf 0.5 \                        # 置信度阈值(只显示置信度>0.5的检测框)
  --name my_test_run

结果会保存在 runs/detect/my_test_run/。打开看看,框的位置准不准?有没有漏检或误检?这是最直观的检验方式。


5. 模型部署:让模型真正跑起来

训练好的模型不能只在实验室里跑,得部署到实际场景中。YOLO-V5支持多种部署方式。

5.1 基础推理:图片、视频、摄像头

单张图片检测:

python detect.py --source test.jpg --weights best.pt

批量处理整个文件夹:

python detect.py --source input_images/ --weights best.pt

处理视频文件:

python detect.py --source video.mp4 --weights best.pt

摄像头实时检测:

python detect.py --source 0 --weights best.pt  # 0表示默认摄像头

5.2 编程调用:集成到你的Python项目中

很多时候我们需要把检测功能集成到自己的系统里。下面是一个完整的Python脚本示例:

import torch
import cv2
from pathlib import Path

# 设置设备(自动选择GPU或CPU)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'使用设备: {device}')

# 加载模型
model = torch.hub.load('ultralytics/yolov5', 'custom', 
                       path='runs/train/my_pet_detector/weights/best.pt',
                       force_reload=True)
model.to(device)
model.eval()  # 设置为评估模式

# 准备图片
img_path = 'test_cat.jpg'
img = cv2.imread(img_path)  # 用OpenCV读取
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR转RGB

# 推理
results = model(img_rgb, size=640)  # size可调整,需与训练时一致

# 处理结果
predictions = results.pandas().xyxy[0]  # 获取检测结果(pandas DataFrame格式)

print(f"检测到 {len(predictions)} 个物体:")
for _, row in predictions.iterrows():
    label = row['name']
    confidence = row['confidence']
    x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
    
    print(f"  - {label}: 置信度 {confidence:.2f}, 位置 [{x1}, {y1}, {x2}, {y2}]")
    
    # 在图片上画框
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    cv2.putText(img, f'{label} {confidence:.2f}', 
                (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 保存结果
output_path = 'detected_' + Path(img_path).name
cv2.imwrite(output_path, img)
print(f"结果已保存到: {output_path}")

# 也可以直接显示
cv2.imshow('Detection Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个脚本展示了如何加载模型、处理图片、解析结果并可视化。你可以把它嵌入到Web服务、桌面应用或自动化脚本中。

5.3 模型导出:适配不同平台

为了在不同设备上高效运行,我们需要把PyTorch模型转换成特定格式:

导出为ONNX(跨平台通用格式):

python export.py --weights best.pt --include onnx --img 640 --batch 1

导出为TensorRT(NVIDIA GPU加速):

python export.py --weights best.pt --include engine --img 640 --batch 1

导出为CoreML(苹果设备):

python export.py --weights best.pt --include coreml --img 640 --batch 1

导出为TFLite(安卓/嵌入式设备):

python export.py --weights best.pt --include tflite --img 640 --batch 1

导出的模型文件可以直接在对应平台上运行,无需安装PyTorch环境。

5.4 性能优化技巧

如果推理速度不够快:

  • 尝试更小的模型(从 yolov5l 换到 yolov5s)
  • 减小输入尺寸(从 --img 640 降到 --img 416)
  • 使用TensorRT或ONNX Runtime加速
  • 开启半精度推理(FP16)

如果检测精度不够高:

  • 检查数据标注质量
  • 增加训练轮数(--epochs)
  • 使用更大的模型(从 yolov5s 换到 yolov5l)
  • 增大输入尺寸(从 --img 640 升到 --img 1280)
  • 调整置信度阈值(--conf,默认0.25)

6. 总结:从数据到部署的完整闭环

走完这一整套流程,你应该已经掌握了YOLO-V5自定义训练的核心要点。让我们回顾一下关键步骤:

  1. 环境搭建:用Anaconda创建独立环境,安装PyTorch和YOLO-V5依赖
  2. 数据准备:按规范组织图片和标注,创建 data.yaml 配置文件
  3. 模型训练:用迁移学习在自有数据上微调,监控训练过程
  4. 模型验证:评估模型在验证集上的表现,确保达到预期效果
  5. 模型部署:将训练好的模型应用到实际场景中,支持多种格式导出

YOLO-V5最大的优势不是学术上的突破,而是工程上的友好性。清晰的文档、活跃的社区、丰富的预训练模型,都让它成为工业界落地目标检测的首选。

遇到问题怎么办?记住这几个资源:

现在,你可以用自己的数据试试了。从简单的开始,比如识别办公室里的“水杯”、“键盘”、“鼠标”,熟悉整个流程后,再挑战更复杂的场景。

训练第一个模型时可能会遇到各种问题,这很正常。重要的是保持耐心,仔细检查每一步:数据格式对不对?配置文件路径对吗?GPU内存够不够?大多数问题都能通过仔细排查解决。

目标检测的世界很大,YOLO-V5只是一个开始。但有了这个扎实的基础,你就能更快地探索更高级的应用,比如多目标跟踪、实例分割、3D检测等等。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐