2026/8/16 20:17:23

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

YOLOv5目标检测模型训练全流程:从数据标注到模型部署实战 1. 项目概述从零开始用YOLOv5训练你的第一个检测模型看到“目标检测”、“YOLOv5”、“训练自己的数据集”这些词是不是觉得头大感觉这是算法工程师的专属领域离自己很远别急着划走今天我就以一个过来人的身份跟你聊聊怎么把这件事变得像搭积木一样简单。我见过太多新手包括几年前的我自己被环境配置、数据标注、参数调整这些步骤劝退。但事实上借助现在成熟的工具链一个完全没接触过深度学习的新手完全有可能在几个小时内就训练出一个能识别特定物体的、属于你自己的模型。比如你想做一个识别自家宠物猫不同姿态的模型或者一个检测工厂流水线上零件是否合格的模型这个过程并没有想象中那么神秘和高不可攀。YOLOv5以其简洁的代码结构、优秀的文档和活跃的社区成为了入门目标检测最友好的选择之一。这篇文章我就带你走一遍完整的流程把每个环节掰开揉碎了讲保证你跟着做一定能跑通。2. 核心思路与准备工作理解我们在做什么在动手敲命令之前我们得先搞清楚这一整套流程的“地图”。训练一个目标检测模型本质上是在教电脑认识图片里的特定物体。这个过程就像教一个不认识苹果的小孩你先要给他看很多带有“苹果”标签的图片准备数据集告诉他“看这个圆圆的、红红的东西就是苹果”数据标注。然后他通过反复看这些例子自己总结出苹果的特征模型训练。最后你拿一张新的有苹果的图片考他看他能不能认出来模型验证与推理。2.1 为什么选择YOLOv5你可能在网上还看到过YOLOv3, YOLOv4, YOLOv8甚至更复杂的检测模型。对于新手来说YOLOv5是目前平衡了易用性、性能和社区支持的最佳起点。它的仓库结构非常清晰训练脚本封装得很好基本上通过修改几个配置文件就能跑起来。而且它的生态非常完善从数据标注格式转换到模型导出部署都有现成的工具和大量的社区案例可以参考。相比之下更早的版本配置复杂更新的版本如v8虽然性能更强但部分接口和生态还在快速变化中。所以先通过v5把整个流程打通建立直观感受是最稳妥高效的路径。2.2 整体流程鸟瞰我们的行动路线图非常清晰主要分为五个大阶段环境搭建给你的电脑安装必要的“软件工厂”Python, PyTorch等。数据准备收集图片并告诉模型图片里有什么、在哪里标注。项目配置告诉YOLOv5你的数据放在哪、想训练成什么样。模型训练启动“学习”过程让模型从数据中提取规律。模型使用用训练好的模型去识别新的图片或视频。接下来我们就一个阶段一个阶段地攻克。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 python3.8 # 创建一个名为yolov5Python版本为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 cudatoolkit11.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 # 启动软件标注实操步骤打开LabelImg点击“Open Dir”选择你的图片文件夹datasets/helmet/images/。点击“Change Save Dir”设置标注文件.txt的保存目录。通常创建一个datasets/helmet/labels/文件夹来存放。至关重要在右侧将标注格式从默认的PascalVOC改为YOLO。这是YOLOv5要求的格式。开始标注按W键激活画框工具用鼠标拖拽画出目标物体的矩形框。松开鼠标后会弹出对话框输入类别名称如“helmet”。然后点击OK。一张图片可能有多个目标重复步骤4标注所有目标。标注完一张后按CtrlS保存会自动在labels文件夹下生成一个同名的.txt文件。然后按D键切换到下一张图片。预先定义类别你可以在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 数据集划分训练集、验证集、测试集我们不能把所有标注好的数据都用来训练需要留出一部分不参与训练用于在训练过程中和训练结束后评估模型真正的能力防止它“死记硬背”。 通常按比例划分训练集Train70%-80%用于模型学习。验证集Val10%-15%用于在训练过程中调整超参数、监控模型表现。测试集Test10%-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: 中型Mediumyolov5l.yaml: 大型Largeyolov5x.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。这个文件夹里保存了训练的所有产出其中最有用的两个是权重文件weights/里面保存了训练过程中最优的权重best.pt和最后一轮的权重last.pt。我们最终要用的就是best.pt。可视化结果训练过程中会自动生成很多图表保存在当前文件夹下。通过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运行后会输出一系列指标其中最重要的两个是mAP0.5 (mean Average Precision)这是目标检测的核心评价指标。简单理解它综合衡量了模型检测的准确度和查全度。值在0到1之间越接近1越好。对于新数据集能达到0.7以上就算不错0.8以上很好。mAP0.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 环境配置与依赖问题问题ImportError或ModuleNotFoundError原因缺少某个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上不去甚至下降。原因模型“死记硬背”了训练集没有学会泛化。解决增加数据这是最根本的方法。可以通过数据增强YOLOv5默认已开启强大的数据增强或收集更多数据。减少模型复杂度换用更小的模型如从yolov5m换到yolov5s。早停Early Stopping观察验证集指标当它连续多个epoch不再提升时就停止训练。YOLOv5会自动保存best.pt就是基于验证集指标的。8.4 模型推理与部署问题问题推理速度很慢原因使用了过大的模型如yolov5x或者输入图片尺寸--img过大。解决根据你的应用场景权衡精度和速度。如果对实时性要求高优先使用s或m模型并尝试减小推理时的--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里找到答案。当你第一次看到自己训练的模型准确地框出目标时那种成就感就是学习技术最好的动力。