ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLOv5目标检测模型训练全流程:从数据标注到模型部署实战

2026/8/16 20:43:47 拓冰建站 浏览量
YOLOv5目标检测模型训练全流程:从数据标注到模型部署实战

1. 项目概述:从零开始,用YOLOv5训练你的第一个检测模型

看到“目标检测”、“YOLOv5”、“训练自己的数据集”这些词,是不是觉得头大?感觉这是算法工程师的专属领域,离自己很远?别急着划走,今天我就以一个过来人的身份,跟你聊聊怎么把这件事变得像搭积木一样简单。我见过太多新手,包括几年前的我自己,被环境配置、数据标注、参数调整这些步骤劝退。但事实上,借助现在成熟的工具链,一个完全没接触过深度学习的新手,完全有可能在几个小时内,就训练出一个能识别特定物体的、属于你自己的模型。比如,你想做一个识别自家宠物猫不同姿态的模型,或者一个检测工厂流水线上零件是否合格的模型,这个过程并没有想象中那么神秘和高不可攀。YOLOv5以其简洁的代码结构、优秀的文档和活跃的社区,成为了入门目标检测最友好的选择之一。这篇文章,我就带你走一遍完整的流程,把每个环节掰开揉碎了讲,保证你跟着做,一定能跑通。

2. 核心思路与准备工作:理解我们在做什么

在动手敲命令之前,我们得先搞清楚这一整套流程的“地图”。训练一个目标检测模型,本质上是在教电脑认识图片里的特定物体。这个过程就像教一个不认识苹果的小孩:你先要给他看很多带有“苹果”标签的图片(准备数据集),告诉他“看,这个圆圆的、红红的东西就是苹果”(数据标注)。然后他通过反复看这些例子,自己总结出苹果的特征(模型训练)。最后,你拿一张新的有苹果的图片考他,看他能不能认出来(模型验证与推理)。

2.1 为什么选择YOLOv5?

你可能在网上还看到过YOLOv3, YOLOv4, YOLOv8甚至更复杂的检测模型。对于新手来说,YOLOv5是目前平衡了易用性、性能和社区支持的最佳起点。它的仓库结构非常清晰,训练脚本封装得很好,基本上通过修改几个配置文件就能跑起来。而且它的生态非常完善,从数据标注格式转换到模型导出部署,都有现成的工具和大量的社区案例可以参考。相比之下,更早的版本配置复杂,更新的版本(如v8)虽然性能更强,但部分接口和生态还在快速变化中。所以,先通过v5把整个流程打通,建立直观感受,是最稳妥高效的路径。

2.2 整体流程鸟瞰

我们的行动路线图非常清晰,主要分为五个大阶段:

  1. 环境搭建:给你的电脑安装必要的“软件工厂”(Python, PyTorch等)。
  2. 数据准备:收集图片,并告诉模型图片里有什么、在哪里(标注)。
  3. 项目配置:告诉YOLOv5你的数据放在哪、想训练成什么样。
  4. 模型训练:启动“学习”过程,让模型从数据中提取规律。
  5. 模型使用:用训练好的模型去识别新的图片或视频。

接下来,我们就一个阶段一个阶段地攻克。

3. 环境搭建:打造你的深度学习工作台

这一步是基石,但也是新手最容易踩坑的地方。别担心,我们一步步来。

3.1 基础软件安装:Python与IDE

首先,你需要安装Python。YOLOv5通常要求Python 3.8或更高版本。我强烈建议使用Anaconda来管理Python环境,它能让你为不同的项目创建独立的“软件包空间”,避免包版本冲突这个世界性难题。 去Anaconda官网下载安装包,安装时记得勾选“Add Anaconda to my PATH environment variable”(将Anaconda添加到环境变量),这样后面在命令行里使用会方便很多。

安装好后,我们打开“Anaconda Prompt”(Windows)或终端(Mac/Linux),创建一个专门用于YOLOv5的环境:

conda create -n yolov5 python=3.8 # 创建一个名为yolov5,Python版本为3.8的环境 conda activate yolov5 # 激活这个环境

激活后,你的命令行前面会出现(yolov5)的标识,表示你已经在这个独立的环境里了。

接下来,你需要一个代码编辑器。VS Code是当前最流行的选择,轻量且插件丰富。安装好后,建议安装Python和Pylance扩展,它们能提供代码提示和语法高亮,极大提升效率。

3.2 核心依赖安装:PyTorch与YOLOv5

深度学习框架我们选择PyTorch,这也是YOLOv5官方使用的框架。安装PyTorch需要去其官网,根据你的系统、包管理工具(我们选Conda)和是否有CUDA(显卡加速)来生成对应的安装命令。

关键选择:用CPU还是GPU训练?如果你的电脑有NVIDIA独立显卡(GPU),并且想获得可接受的训练速度,必须安装CUDA版本的PyTorch。你可以打开任务管理器,在“性能”标签页查看是否有“GPU 0”(通常是NVIDIA字样)。有GPU的话,训练速度可以比CPU快几十倍。 如果只有集成显卡或没有NVIDIA GPU,那就安装CPU版本。对于小型数据集和简单的测试,CPU也能跑,只是需要更多耐心。

假设你有NVIDIA GPU,并且已经安装了对应版本的CUDA工具包(例如CUDA 11.3),那么在刚才激活的yolov5环境中,运行官网生成的命令,可能类似于:

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

安装完成后,可以在Python中验证:

import torch print(torch.__version__) # 查看PyTorch版本 print(torch.cuda.is_available()) # 查看CUDA是否可用,返回True则成功

最后,获取YOLOv5的源代码。我们使用Git来克隆官方仓库:

cd到你想要存放项目的目录 # 例如 cd D:/Projects git clone https://github.com/ultralytics/yolov5 # 克隆代码 cd yolov5 pip install -r requirements.txt # 安装项目所需的所有其他Python包

requirements.txt这个文件里列满了项目依赖,pip install -r命令会自动帮你全部安装好,非常方便。这一步可能会花点时间,请保持网络通畅。

4. 数据准备:模型的“教材”是关键

模型训练得好不好,七分靠数据。这里的数据准备,指的是获取图片并完成标注。

4.1 数据收集与整理

你需要收集包含你目标物体的图片。例如,你要训练一个检测“安全帽”的模型,就需要收集大量工地上有人戴安全帽和没戴安全帽的图片。图片可以从网上公开数据集下载,也可以用手机、相机自己拍摄。注意几点:

  • 多样性:光线(明亮、昏暗)、角度(正面、侧面)、背景(复杂、简单)、目标大小(远、近)都要尽量丰富。
  • 数量:对于一个新类别,建议至少准备200-300张有效图片。太少容易过拟合(模型只记住了训练图片,不会泛化),太多则标注工作量巨大。可以先从小规模开始,验证流程。
  • 格式:常见格式如.jpg, .png都可以。建议统一尺寸,但不是必须,YOLOv5训练时会自动缩放。 将所有图片放在一个文件夹下,比如datasets/helmet/images/

4.2 数据标注:给图片打标签

这是最耗时但最关键的一步。我们需要用标注工具在图片上画出目标物体的边界框(Bounding Box),并告诉它这个框是什么类别。

工具推荐:LabelImg这是最经典、最易用的图像标注工具之一。安装非常简单:

pip install labelImg # 在yolov5环境中安装 labelImg # 启动软件

标注实操步骤:

  1. 打开LabelImg,点击“Open Dir”选择你的图片文件夹(datasets/helmet/images/)。
  2. 点击“Change Save Dir”设置标注文件(.txt)的保存目录。通常创建一个datasets/helmet/labels/文件夹来存放。
  3. 至关重要:在右侧,将标注格式从默认的PascalVOC改为YOLO。这是YOLOv5要求的格式。
  4. 开始标注:按W键激活画框工具,用鼠标拖拽画出目标物体的矩形框。松开鼠标后会弹出对话框,输入类别名称,如“helmet”。然后点击OK。
  5. 一张图片可能有多个目标,重复步骤4标注所有目标。
  6. 标注完一张后,按Ctrl+S保存,会自动在labels文件夹下生成一个同名的.txt文件。然后按D键切换到下一张图片。
  7. 预先定义类别:你可以在labels文件夹同级目录下,创建一个classes.txt文件,里面按行写入你的类别名,例如:
    helmet person
    这样在LabelImg中可以直接选择,避免输错。

生成的标签文件解读: 打开一个xxx.txt文件,你会看到类似这样的行:

0 0.5 0.6 0.2 0.3

每一行代表一个目标物体。这5个数字的含义是:

  • 0:类别索引。对应classes.txt中的行号(从0开始计数)。0代表“helmet”。
  • 0.5:边界框中心点的x坐标 / 图片宽度。即中心点横坐标相对于整张图片宽度的比例。
  • 0.6:边界框中心点的y坐标 / 图片高度。
  • 0.2:边界框的宽度 / 图片宽度。
  • 0.3:边界框的高度 / 图片高度。 这种归一化的表示方式,使得标签与图片的具体尺寸无关,是YOLO格式的核心。

4.3 数据集划分:训练集、验证集、测试集

我们不能把所有标注好的数据都用来训练,需要留出一部分不参与训练,用于在训练过程中和训练结束后评估模型真正的能力,防止它“死记硬背”。 通常按比例划分:

  • 训练集(Train):70%-80%,用于模型学习。
  • 验证集(Val):10%-15%,用于在训练过程中调整超参数、监控模型表现。
  • 测试集(Test):10%-15%,用于最终评估模型性能,仅在最后使用一次

你可以手动复制图片和标签文件到不同的文件夹,但更推荐写个简单的Python脚本自动划分。划分好后,目录结构应如下所示:

datasets/helmet/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片(可选) └── labels/ ├── train/ # 训练集标签(与训练图片一一对应) ├── val/ # 验证集标签 └── test/ # 测试集标签

5. 项目配置:告诉YOLOv5你的“教材”和“教学计划”

数据准备好了,现在要创建配置文件,让YOLOv5知道去哪里找数据,以及你想训练一个什么样的模型。

5.1 创建数据配置文件

在YOLOv5项目根目录下,找到一个叫data的文件夹,里面有很多.yaml文件(如coco128.yaml),这些都是数据配置的例子。我们仿照它创建一个自己的配置文件,比如helmet.yaml

# helmet.yaml # 数据集路径(可以是绝对路径或相对路径,相对路径是相对于yolov5根目录) path: ../datasets/helmet # 数据集根目录 train: images/train # 训练集图片路径,相对于path val: images/val # 验证集图片路径,相对于path test: images/test # 测试集图片路径(可选) # 类别数量 nc: 2 # 你的目标类别数,例如这里我们有‘helmet’和‘person’两类 # 类别名称列表,必须和classes.txt以及标注时的类别名严格对应 names: ['helmet', 'person']

这个文件是连接你的数据和训练脚本的桥梁。

5.2 选择模型配置文件

YOLOv5提供了不同大小和速度的模型,在models目录下:

  • yolov5s.yaml:小型(Small),速度最快,参数量最小,精度相对较低,适合移动端或快速验证。新手强烈建议从这个开始
  • yolov5m.yaml: 中型(Medium)
  • yolov5l.yaml: 大型(Large)
  • yolov5x.yaml: 超大型(XLarge),速度慢,参数量大,精度最高。

我们不需要修改这些文件,在启动训练时通过参数指定即可。对于第一次训练,用s版本能最快看到结果。

6. 模型训练:启动“学习”过程

激动人心的时刻到了!我们将启动训练脚本。在YOLOv5根目录下打开终端(确保conda环境已激活)。

6.1 启动训练命令

最基本的训练命令如下:

python train.py --img 640 --batch 16 --epochs 100 --data ./data/helmet.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name helmet_detection

我来解释一下每个参数:

  • --img 640: 输入图片的尺寸,会被统一缩放到640x640像素进行训练。你可以根据你的目标大小调整,小目标可以尝试更大的尺寸如--img 1280,但会消耗更多显存。
  • --batch 16:批大小(Batch Size),即一次输入多少张图片进行前向和反向传播。这个值受你的显卡显存限制。如果出现“CUDA out of memory”错误,就调小这个值(如8, 4, 2)。CPU训练则用--batch 1
  • --epochs 100:训练轮数,即整个训练集被完整遍历多少次。100是一个常用的起始值,不够可以再增加。
  • --data ./data/helmet.yaml: 指定我们刚才创建的数据配置文件路径。
  • --cfg ./models/yolov5s.yaml: 指定模型结构配置文件。
  • --weights yolov5s.pt:指定预训练权重。这是极其重要的一步yolov5s.pt是官方在COCO大型数据集上预训练好的权重。使用预训练权重相当于让模型从一个“见过世面”的状态开始学习你的特定任务(迁移学习),能极大加快收敛速度、提升最终精度。脚本会自动下载。
  • --name helmet_detection: 这次训练任务的名称,用于保存结果。

执行命令后,你会看到大量日志输出。如果一切正常,它会开始下载预训练权重,然后显示训练进度条。

6.2 训练过程监控

训练开始后,YOLOv5会在项目根目录下自动创建一个runs/train/文件夹,里面会有一个以你--name参数命名的子文件夹(例如runs/train/helmet_detection)。这个文件夹里保存了训练的所有产出,其中最有用的两个是:

  1. 权重文件(weights/:里面保存了训练过程中最优的权重(best.pt)和最后一轮的权重(last.pt)。我们最终要用的就是best.pt
  2. 可视化结果:训练过程中会自动生成很多图表,保存在当前文件夹下。通过tensorboard可以更直观地查看:
    # 在另一个终端中,进入yolov5根目录,激活环境后运行 tensorboard --logdir runs/train
    然后在浏览器中打开它提供的地址(通常是http://localhost:6006),你可以看到损失(loss)曲线、精度(precision)、召回率(recall)等指标的变化。损失曲线稳步下降,精度和召回率稳步上升,是训练正常的表现。

7. 模型验证与使用:看看学得怎么样

训练完成后,我们需要评估模型在从未见过的数据(验证集/测试集)上的表现。

7.1 模型验证

使用val.py脚本,用验证集评估训练出的最佳模型:

python val.py --weights runs/train/helmet_detection/weights/best.pt --data ./data/helmet.yaml --img 640

运行后会输出一系列指标,其中最重要的两个是:

  • mAP@0.5 (mean Average Precision):这是目标检测的核心评价指标。简单理解,它综合衡量了模型检测的准确度和查全度。值在0到1之间,越接近1越好。对于新数据集,能达到0.7以上就算不错,0.8以上很好。
  • mAP@0.5:0.95:在不同IoU阈值下的平均mAP,更严格的指标。

7.2 模型推理:用你的模型检测新图片

这是最有成就感的环节!使用detect.py脚本,用你训练好的模型去检测新的图片或视频。

python detect.py --weights runs/train/helmet_detection/weights/best.pt --source ./your_image.jpg --conf 0.25
  • --source: 输入源。可以是单张图片路径、包含多张图片的文件夹路径、视频文件(如test.mp4)、甚至摄像头(0表示电脑自带摄像头)。
  • --conf:置信度阈值。模型会对每个检测框输出一个置信度分数(0-1),表示它有多确信这个框里是目标物体。高于此阈值的框才会被画出来。默认0.25,你可以根据结果调整。如果发现很多误检(把不是目标的东西框出来),可以调高(如0.5);如果很多目标没被检测到,可以调低(如0.1)。

检测结果会保存在runs/detect/exp/这样的文件夹里,打开就能看到画好了边界框和标签的图片或视频了!

8. 常见问题与避坑指南实录

这里是我和很多新手在实际操作中踩过的坑,希望能帮你顺利过关。

8.1 环境配置与依赖问题

  • 问题:ImportErrorModuleNotFoundError

    • 原因:缺少某个Python包,或者包版本冲突。
    • 解决:首先确保你在正确的conda环境(yolov5)中操作。然后,可以尝试重新安装依赖:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple(使用国内镜像加速)。如果报错指向特定包,可以尝试单独升级或降级该包。
  • 问题:训练时CUDA out of memory

    • 原因:显卡显存不够。批处理大小(--batch)或图片尺寸(--img)设置过大。
    • 解决:这是新手最常见的问题。逐步减小--batch,如从16降到8、4、2。如果降到2还不行,再尝试减小--img,如从640降到416。对于只有CPU的机器,务必设置--batch 1

8.2 数据准备与标注问题

  • 问题:训练时loss(损失)为nan或突然变得巨大

    • 原因:数据标注有问题。最常见的是标签文件(.txt)中的坐标值超出了[0, 1]的范围。YOLO格式要求归一化坐标,必须介于0和1之间。
    • 解决:检查你的标签文件。用Python写个简单脚本遍历所有.txt文件,检查每一行的5个数字,确保第2-5个数字(即坐标和宽高)都在0到1之间。LabelImg在YOLO格式下一般不会出错,但如果你是从其他格式转换过来,或者手动修改过文件,就容易出这个问题。
  • 问题:模型只检测到部分目标,或者框的位置不准

    • 原因1:数据量不足或多样性不够。模型没见过某种场景下的目标。
    • 解决:增加训练数据,特别是覆盖缺失的场景。
    • 原因2:标注质量差。框画得不精确,或者该标的没标。
    • 解决:复查和修正标注。标注时要紧贴目标物体边缘,确保所有可见的目标都被标注。

8.3 训练过程与参数调优

  • 问题:训练了很久,mAP还是很低(比如低于0.3)

    • 检查点1是否使用了预训练权重(--weights yolov5s.pt)?从零开始训练(随机初始化权重)需要极大的数据量和训练时间,新手几乎不可能成功。务必使用预训练权重。
    • 检查点2:数据配置文件(.yaml)中的nc(类别数)和names(类别名列表)是否正确?必须和你的实际类别数、classes.txt文件严格对应。
    • 检查点3:训练轮数--epochs是否足够?对于小数据集,可能需要200-300轮才能收敛。观察TensorBoard中的损失曲线,如果还在缓慢下降,就增加轮数。
  • 问题:训练结果过拟合(训练集指标很好,验证集指标很差)

    • 表现:训练集loss很低,mAP很高,但验证集的mAP上不去,甚至下降。
    • 原因:模型“死记硬背”了训练集,没有学会泛化。
    • 解决
      1. 增加数据:这是最根本的方法。可以通过数据增强(YOLOv5默认已开启强大的数据增强)或收集更多数据。
      2. 减少模型复杂度:换用更小的模型(如从yolov5m换到yolov5s)。
      3. 早停(Early Stopping):观察验证集指标,当它连续多个epoch不再提升时,就停止训练。YOLOv5会自动保存best.pt,就是基于验证集指标的。

8.4 模型推理与部署问题

  • 问题:推理速度很慢

    • 原因:使用了过大的模型(如yolov5x),或者输入图片尺寸(--img)过大。
    • 解决:根据你的应用场景权衡精度和速度。如果对实时性要求高,优先使用sm模型,并尝试减小推理时的--img尺寸(但不要低于训练时的尺寸)。
  • 问题:如何将模型用于其他平台(如手机、嵌入式设备)?

    • 解决:YOLOv5提供了模型导出功能,可以将PyTorch模型(.pt)转换为其他格式。最常用的是转成ONNX格式,它具有很好的跨平台兼容性。
    python export.py --weights runs/train/helmet_detection/weights/best.pt --include onnx

    转换后你会得到一个best.onnx文件,可以被许多推理引擎(如OpenCV DNN, TensorRT, ONNX Runtime等)加载和使用。

整个流程走下来,你会发现训练一个自定义的目标检测模型,核心难点不在于代码和算法本身,而在于对流程的理解、数据的准备和问题的排查。YOLOv5社区已经为我们铺平了大部分道路。我建议你找一个自己感兴趣的小目标(比如检测桌上的水杯、键盘,或者窗外的车辆),从收集几十张图片开始,完整地走一遍这个流程。遇到报错不要慌,仔细阅读错误信息,大部分问题都能通过搜索引擎在GitHub的Issues里找到答案。当你第一次看到自己训练的模型准确地框出目标时,那种成就感就是学习技术最好的动力。