ARTICLE DETAIL

建站实战干货

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

YOLOv5自定义数据集训练实战:从环境搭建到模型部署全流程详解

2026/8/4 5:20:52 拓冰建站 浏览量
YOLOv5自定义数据集训练实战:从环境搭建到模型部署全流程详解 1. 项目概述从零到一掌握YOLOv5自定义训练如果你正在为如何让YOLOv5识别你自己的目标而发愁比如想让它认出你家后院的猫、工厂流水线上的瑕疵品或是医学影像中的特定细胞那么这篇超详细的实战指南就是为你准备的。网上很多教程要么版本过时要么步骤跳跃让新手一头雾水。我把自己在多个实际项目中踩过的坑、总结的经验整理成这份从环境搭建到模型部署的完整流程。无论你是刚入门计算机视觉的学生还是需要快速落地一个检测项目的工程师跟着这篇指南你都能避开绝大多数弯路成功训练出属于你自己的、性能可用的YOLOv5模型。整个过程就像学做一道菜我会告诉你每一步该放什么“调料”参数火候训练策略怎么控制以及万一“糊锅”训练失败了该怎么补救。2. 核心思路与准备工作拆解2.1 为什么选择YOLOv5在开始动手之前我们得先搞清楚手里的“工具”是否称手。YOLOv5虽然不是官方YOLO系列的最新版本后续有v6, v7, v8等但它至今仍在工业界和学术界被广泛使用这得益于几个关键优势。首先它的代码库非常友好由PyTorch框架实现结构清晰对于有Python和深度学习基础的用户来说极易上手和修改。其次它的生态极其成熟从数据准备、模型训练到模型导出如ONNX, TensorRT都有详尽的脚本和社区支持你遇到的几乎所有问题都能在网上找到解决方案。最后它在速度和精度之间取得了很好的平衡提供了从轻量化的YOLOv5s到高精度的YOLOv5x等多个预训练模型你可以根据你的硬件条件和精度要求灵活选择。对于自定义数据集训练这个任务YOLOv5提供了一套近乎“傻瓜式”的流程大大降低了入门门槛。2.2 训练自己的数据集究竟在做什么理解这个过程的核心能帮你更好地调试和优化。简单来说训练就是让模型学会从图片中“认出”你关心的东西。YOLOv5是一个已经见过海量通用物体如人、车、狗的“学霸”我们的工作是通过“补习”训练让它把注意力集中到我们指定的新事物上比如“电路板上的电容”或“显微镜下的红细胞”。这个过程依赖于我们准备的“补习资料”——也就是标注好的数据集。模型通过反复学习这些资料中“目标物体”和其“位置标签”的对应关系不断调整内部数百万甚至数十亿的参数最终学会泛化到新的、没见过的图片上。因此数据集的质量直接决定了“补习”的效果。2.3 项目环境搭建与依赖安装工欲善其事必先利其器。一个干净、稳定的环境是成功的第一步。我强烈建议使用Anaconda创建独立的Python虚拟环境这能避免不同项目间的包版本冲突。创建并激活环境conda create -n yolov5 python3.8 # 推荐使用Python 3.8兼容性最好 conda activate yolov5安装PyTorch这是最核心的一步。你需要根据你的CUDA版本如果有NVIDIA GPU去PyTorch官网获取对应的安装命令。例如对于CUDA 11.3pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113如果没有GPU则安装CPU版本pip install torch torchvision torchaudio注意务必确认你的CUDA版本通过nvidia-smi命令查看安装不匹配的PyTorch版本是后续各种诡异错误的根源。克隆YOLOv5仓库并安装依赖git clone https://github.com/ultralytics/yolov5 # 克隆官方仓库 cd yolov5 pip install -r requirements.txt # 安装所有依赖包这个过程会自动安装OpenCV, pandas, matplotlib等必要库。验证安装运行一个简单的检测脚本测试环境是否正常。python detect.py --source data/images/bus.jpg --weights yolov5s.pt如果一切正常你会在runs/detect/exp目录下看到一张带有检测框的图片。至此你的“厨房”就准备好了。3. 数据集制作模型“食谱”的精心准备数据集是模型的“粮食”粮食的好坏决定了模型的“身体素质”。这一部分是最耗时但也最关键的。3.1 数据收集与整理原则不要一开始就追求数据量巨大。对于大多数自定义项目几百到几千张高质量图片足以训练出一个不错的初始模型。收集时需注意多样性目标物体应在不同光照、角度、背景、尺度和遮挡情况下出现。例如你要检测螺丝就不能只拍平放在白纸上的还要有在机器内部、有油污、只露出一半的。代表性数据分布应尽可能接近模型将来要应用的真实场景。如果实际场景是昏暗的仓库你的训练图片就不能全是阳光明媚的。格式统一将所有图片整理到一个文件夹如images/建议使用.jpg或.png格式并确保没有损坏的图片文件。3.2 数据标注工具与规范你需要告诉模型图片中哪里是你关心的目标。推荐使用LabelImg或Label Studio这类图形化标注工具。LabelImg轻量级上手快直接生成YOLO格式的标签文件.txt。Label Studio功能更强大支持团队协作和更多任务类型但输出格式可能需要转换。标注规范为每个目标物体画一个紧贴其边缘的矩形框Bounding Box。为每个类别定义一个唯一的名字和ID从0开始例如cat: 0,dog: 1。YOLO格式的标签文件.txt内容如下每一行代表一个目标格式为class_id x_center y_center width height。class_id类别的整数ID。x_center, y_center边界框中心点的x和y坐标归一化到图片宽度和高度值在0-1之间。width, height边界框的宽度和高度同样进行归一化。 例如0 0.5 0.5 0.2 0.3表示类别0的目标位于图片正中央宽度占图宽的20%高度占图高的30%。3.3 数据集目录结构构建YOLOv5要求特定的目录结构。假设你的项目根目录为my_yolo_project结构应如下my_yolo_project/ ├── datasets/ │ └── my_custom_data/ # 你的数据集名称 │ ├── images/ │ │ ├── train/ # 训练集图片 │ │ └── val/ # 验证集图片 │ └── labels/ │ ├── train/ # 训练集标签与训练图片一一对应 │ └── val/ # 验证集标签与验证图片一一对应 └── yolov5/ # 克隆的YOLOv5代码仓库你需要将总图片按大约 8:2 或 7:3 的比例分割为训练集和验证集并分别放入对应的文件夹。标签文件需要与图片文件同名仅后缀不同。3.4 创建数据集配置文件在yolov5/data/目录下创建一个以你的数据集命名的YAML文件例如my_custom_data.yaml。这个文件告诉YOLOv5你的数据在哪、有哪些类别。# my_custom_data.yaml path: ../datasets/my_custom_data # 数据集根目录的相对路径 train: images/train # 训练集路径相对于path val: images/val # 验证集路径相对于path # 类别数量 nc: 2 # 例如你要检测猫和狗这里就是2 # 类别名称列表 names: [cat, dog]这个配置文件是连接你的数据和训练脚本的桥梁。4. 模型训练全流程详解准备工作全部就绪现在可以开始“烹饪”模型了。4.1 选择预训练模型与理解超参数YOLOv5提供了多个预训练模型它们主要在深度和宽度上有差异YOLOv5n / YOLOv5s参数量小速度快适合移动端或边缘设备如Jetson Nano, RK3588精度相对较低。YOLOv5m / YOLOv5l平衡型最常用的选择在速度和精度间取得良好平衡。YOLOv5x参数量最大精度最高但速度最慢需要更强的GPU。对于自定义数据集强烈建议从预训练权重开始训练即迁移学习。这相当于让模型在“通用知识”的基础上学习“专业知识”能极大加快收敛速度提升最终性能。训练的核心命令是train.py其关键参数解析如下python train.py \ --weights yolov5s.pt # 初始权重使用预训练模型 --data data/my_custom_data.yaml # 上一步创建的数据集配置文件 --epochs 100 # 训练总轮数 --imgsz 640 # 输入图片尺寸必须是32的倍数 --batch-size 16 # 批次大小根据GPU内存调整 --device 0 # 使用GPU 0如果是CPU则用 --device cpu --name my_first_train # 本次实验的名称用于保存结果--batch-size一次训练输入的图片数量。越大训练越稳定但需要更多GPU显存。如果出现“CUDA out of memory”错误首先降低这个值。--imgsz图片会被统一缩放到这个尺寸。更大的尺寸通常能带来更好的检测精度尤其是对小物体但也会增加计算量和内存消耗。--epochs整个数据集被完整遍历一次称为一个epoch。通常需要几十到几百个epoch。可以通过观察验证集指标如mAP不再显著上升时提前停止。4.2 启动训练与监控运行上述命令后训练就开始了。控制台会输出每一轮epoch的损失loss和性能指标。更重要的是YOLOv5会自动启动一个TensorBoard服务。 在浏览器中打开http://localhost:6006你可以看到丰富的可视化信息损失曲线关注train/loss和val/loss。理想情况下两者都应稳步下降且验证损失不应显著高于训练损失否则可能是过拟合。性能指标最重要的指标是metrics/mAP_0.5和metrics/mAP_0.5:0.95。mAP是衡量检测精度的核心指标值越高越好。验证样本预览在Images标签页下可以看到模型在当前验证集上的检测效果直观判断好坏。4.3 训练策略与调优技巧如果训练结果不理想不要灰心调参是深度学习工程师的“必修课”。学习率调整学习率是训练中最重要的超参数之一。YOLOv5默认使用了带热身的余弦退火学习率调度器通常效果很好。如果你发现损失震荡剧烈或下降极慢可以尝试通过--lr0参数微调初始学习率默认是0.01。数据增强YOLOv5默认开启了强大的在线数据增强如 mosaic, mixup, 色彩抖动等这能有效提升模型泛化能力防止过拟合。除非你有特殊理由例如医疗影像对几何变换敏感否则不建议关闭。过拟合应对如果验证集指标远差于训练集就是过拟合了。可以尝试增加数据增强的强度在hyp.scratch.yaml或自定义的超参数文件中调整。使用更小的模型如从l换到s。增加正则化如权重衰减--weight-decay参数。收集更多样化的训练数据。欠拟合应对如果训练集和验证集的指标都很低模型可能没学到位。可以尝试增加训练轮数--epochs。使用更大的模型如从s换到m或l。适当提高学习率。检查数据标注是否正确。5. 模型评估、测试与导出5.1 模型性能评估训练结束后最佳模型权重会自动保存在runs/train/my_first_train/weights/best.pt。你可以使用val.py脚本在验证集上对其进行全面评估python val.py --weights runs/train/my_first_train/weights/best.pt \ --data data/my_custom_data.yaml \ --imgsz 640 \ --task val这会输出详细的评估表格包括每个类别的精确率Precision、召回率Recall、mAP等指标帮助你分析模型在哪些类别上表现好或差。5.2 使用模型进行推理用你训练好的模型对新图片或视频进行检测使用detect.py脚本python detect.py --source ./test_images/ \ # 可以是图片、视频、文件夹或摄像头索引 --weights runs/train/my_first_train/weights/best.pt \ --conf-thres 0.25 \ # 置信度阈值高于此值才显示 --iou-thres 0.45 \ # NMS的IoU阈值 --name my_detection结果会保存在runs/detect/my_detection/目录下。你可以通过调整--conf-thres来平衡误检和漏检。5.3 模型导出与部署为了将模型部署到生产环境如服务器、移动端、边缘设备你需要将其转换为高效的推理格式。导出为ONNXONNX是一种开放的模型格式被众多推理引擎支持。python export.py --weights runs/train/my_first_train/weights/best.pt \ --include onnx \ --imgsz 640 640 \ --dynamic # 允许动态输入尺寸可选导出后你会得到一个.onnx文件。导出为TensorRT如果你在NVIDIA GPU上部署TensorRT能提供极致的推理速度。python export.py --weights runs/train/my_first_train/weights/best.pt \ --include engine \ --device 0 \ --imgsz 640 640这需要你的环境已安装TensorRT。导出的.engine文件只能在相同GPU和TensorRT版本的环境中使用。针对边缘设备的导出对于瑞芯微RKNN如RK3588、算能K230等芯片需要使用厂商提供的转换工具将ONNX或PyTorch模型转换为其专用的格式。这个过程通常涉及量化降低精度以提升速度、减小模型体积需要准备一个校准数据集通常是训练集的一个子集来统计激活值分布。6. 实战避坑指南与常见问题这里汇集了我自己和社区里高频出现的问题希望能帮你节省大量排查时间。6.1 训练过程中的典型错误问题现象可能原因解决方案CUDA out of memory批次大小batch-size或图片尺寸imgsz太大超出GPU显存。降低--batch-size如16-8。如果还不行降低--imgsz如640-320。Loss为NaN学习率过高导致梯度爆炸。数据中有损坏的图片或标签。大幅降低学习率--lr0如0.01-0.001。检查数据集可用verify.py脚本。mAP始终为0或极低数据标注格式错误最常见。类别ID不对。数据集路径配置错误。检查标签文件内容确保坐标已归一化ID从0开始。检查data.yaml中的path、train、val路径是否正确。训练损失不下降学习率太低。模型容量太小如用v5n训复杂场景。数据本身无意义或标注全错。适当提高学习率。换用更大模型如v5m。彻底检查数据和标签。验证损失远高于训练损失严重的过拟合。训练集和验证集分布差异太大。增强数据增强。使用更多的验证数据。确保训练/验证集来自同一分布。6.2 数据与标注相关陷阱标签文件与图片不匹配确保labels/train里的每个.txt文件都能在images/train中找到同名的图片文件反之亦然。一个快速检查的方法是使用YOLOv5自带的utils/checks.py脚本。坐标未归一化这是新手最常犯的错误。YOLO格式要求坐标必须是归一化后的值0-1之间。如果你用的标注工具输出的是绝对像素坐标需要手动转换x_center (x_min x_max) / 2 / image_width。类别ID不连续如果定义了3个类[‘A’ ‘B’ ‘C’]那么它们的ID必须是012。中间不能跳过某个数字否则训练会出错。6.3 环境与配置疑难杂症PyTorch与CUDA版本不匹配务必使用conda list | grep torch和nvidia-smi确认版本对应关系。不匹配会导致无法使用GPU或直接报错。“No module named ‘XXX’”通常是因为requirements.txt没有完全安装成功。重新运行pip install -r requirements.txt并注意观察是否有安装失败的包尝试手动安装。训练速度异常慢确认是否真的在用GPU训练。检查train.py输出开头是否有“Using GPU 0”之类的提示。如果用了CPU检查--device参数是否正确设置为0或cuda:0。训练自己的YOLOv5模型是一个系统工程从数据准备到模型调优每一步都需要耐心和细心。这份指南提供了完整的路径和关键的检查点。我的经验是第一次成功跑通整个流程比追求一个高精度模型更重要。先用一个小的子集快速走完一遍确保数据流、训练、评估、推理的管道全部畅通无阻。之后再迭代地优化数据质量、调整模型参数、尝试更复杂的训练技巧。记住高质量的数据永远是最宝贵的资产在数据上多花一小时可能比在模型参数上调一天的效果更显著。当你看到自己标注的图片被模型准确地框选出来时那种成就感就是驱动你继续深入这个领域的最佳动力。