资讯动态

YOLOv5自定义训练全流程实战:从数据标注到模型部署

发布时间:2026/8/5 3:35:05 来源:尧图企业网站定制
1. 项目概述从零到一掌握YOLOv5自定义训练全流程在计算机视觉领域目标检测一直是个核心且充满挑战的任务。无论是工业质检中的缺陷识别还是安防监控中的人车检测甚至是农业领域的病虫害监测其本质都是让机器学会“看见”并“定位”物体。YOLOYou Only Look Once系列算法因其出色的速度与精度平衡成为了众多开发者和研究者的首选。而YOLOv5凭借其清晰的工程实现、活跃的社区生态以及友好的用户体验尤其适合我们这些需要快速将想法落地的一线从业者。你可能已经跑通了官方的Demo用现成的模型检测了COCO数据集里的猫猫狗狗和行人车辆但真正的价值在于解决你自己的问题。你的业务场景可能是识别生产线上的特定零件可能是统计停车场内的车辆类型也可能是分析遥感图像中的建筑物。这时“训练自己的数据集”就成了从“玩具”到“工具”的关键一跃。这个过程听起来有点门槛涉及到环境配置、数据准备、标注、训练调参、评估部署等一系列环节任何一个环节卡住都可能让人头疼。别担心这篇内容就是为你准备的。我将以一个在工业场景中实际应用过的项目为例手把手带你走通YOLOv5训练自定义数据的完整闭环。我会假设你有一些Python和深度学习的基础但即使你是刚入门跟着步骤一步步来也能顺利完成。我们的目标不仅仅是“跑起来”更要理解每一步背后的“为什么”以及我在实践中踩过的那些“坑”让你少走弯路真正把YOLOv5用起来解决你的实际问题。2. 环境准备与项目初始化打好地基在开始任何模型训练之前一个稳定、一致的环境是成功的基石。YOLOv5官方推荐使用PyTorch环境这能确保所有依赖库的版本兼容避免后续出现各种令人抓狂的版本冲突问题。2.1 创建并激活虚拟环境我强烈建议使用Conda或Python的venv来管理环境。这就像给你的项目一个独立的“工作间”里面的工具和材料都是专属的不会和其他项目互相干扰。# 使用conda创建环境如果你安装了Anaconda或Miniconda conda create -n yolov5_train python3.8 -y conda activate yolov5_train # 或者使用python自带的venv python -m venv yolov5_env # Windows系统激活 yolov5_env\Scripts\activate # Linux/Mac系统激活 source yolov5_env/bin/activate激活环境后你的命令行提示符前通常会显示环境名如(yolov5_train)这表示你已经进入了这个独立的环境。2.2 安装PyTorch与YOLOv5PyTorch的安装需要根据你的CUDA版本如果你有NVIDIA GPU并打算使用GPU加速来选择。你可以通过nvidia-smi命令查看CUDA版本。# 访问PyTorch官网https://pytorch.org/get-started/locally/获取最准确的安装命令。 # 例如对于CUDA 11.3的Linux系统命令可能如下 pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113对于没有GPU或CUDA环境的用户直接安装CPU版本即可但训练速度会慢很多。pip install torch torchvision torchaudio接下来克隆YOLOv5的官方仓库并安装其依赖。我建议克隆特定版本如v6.1的发布分支以保证代码的稳定性。git clone -b v6.1 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt注意requirements.txt里包含了OpenCV-Python、Matplotlib、Pandas等常用库。安装过程如果遇到网络问题可以考虑使用国内镜像源例如pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。安装完成后你可以运行一个简单的测试来验证环境是否正常。在yolov5目录下执行python detect.py --weights yolov5s.pt --source data/images/bus.jpg这个命令会下载一个预训练的小模型yolov5s.pt并对一张示例图片bus.jpg进行检测。如果一切顺利你会在runs/detect/exp目录下看到生成的结果图片上面画出了检测到的边界框。这证明你的环境已经准备就绪。3. 数据集构建与标注模型学习的“教材”模型训练就像教小孩认东西你得先准备好清晰、准确的“教材”——也就是数据集。这部分工作往往比写代码更耗时但质量直接决定了模型性能的上限。3.1 数据收集与目录结构规划首先你需要收集与你任务相关的图片。图片数量没有绝对标准但对于一个简单的单类别任务建议至少准备500-1000张多类别或复杂场景则需要更多。图片应尽可能覆盖目标物体可能出现的所有场景、光照、角度、尺度和遮挡情况这被称为数据的“多样性”。收集好图片后我推荐采用以下目录结构来组织你的数据这能让你后续的路径管理清晰很多your_custom_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 101.jpg │ ├── 102.jpg │ └── ... └── labels/ ├── train/ # 训练集标签文件与图片同名后缀为.txt │ ├── 001.txt │ ├── 002.txt │ └── ... └── val/ # 验证集标签文件 ├── 101.txt ├── 102.txt └── ...你需要将总图片集按大约8:2或7:3的比例划分为训练集train和验证集val。验证集用于在训练过程中评估模型性能防止过拟合它必须是模型从未“见过”的。3.2 数据标注工具与规范接下来是为图片中的目标物体打标签。标签文件是纯文本文件.txt每一行代表图片中的一个物体格式为class_id x_center y_center width height这里的坐标是归一化后的值即相对于图片宽度和高度的比例范围在0到1之间。class_id类别的整数索引从0开始。x_center,y_center边界框中心点的x, y坐标。width,height边界框的宽度和高度。例如一张640x480的图片中有一个目标其类别ID为0边界框左上角坐标为(100, 120)右下角坐标为(300, 360)。那么计算过程如下中心点x坐标: (100 300)/2 / 640 400/2/640 200/640 0.3125中心点y坐标: (120 360)/2 / 480 480/2/480 240/480 0.5宽度: (300 - 100) / 640 200 / 640 0.3125高度: (360 - 120) / 480 240 / 480 0.5 标签行即为0 0.3125 0.5 0.3125 0.5手动计算太麻烦我们使用标注工具。LabelImg是一个经典的选择它开源且支持YOLO格式。安装和使用都很简单。但这里我更推荐Roboflow或CVAT这类更现代的在线或自托管工具它们支持团队协作、自动标注辅助和更强大的数据管理功能。实操心得标注时务必保证框的精确性。框要紧贴目标边缘既不遗漏也不多包背景。对于被遮挡的目标尽量标注可见部分。标注的一致性也很重要同一个类别的物体在不同图片中的标注标准应该统一。这是提升模型精度的隐性关键。3.3 创建数据集配置文件YOLOv5需要一个YAML文件来告诉它你的数据集在哪里、有哪些类别。在yolov5/data/目录下创建一个新文件例如custom_data.yaml。# custom_data.yaml # 训练和验证图像的路径相对路径或绝对路径 train: ../your_custom_dataset/images/train/ val: ../your_custom_dataset/images/val/ # 类别数量 nc: 2 # 假设你有2个类别例如‘cat’和‘dog’ # 类别名称列表 names: [cat, dog]train和val路径指向你之前创建的图片目录。nc类别的总数。names类别名称列表顺序必须与标注文件中的class_id对应即names[0]对应class_id0。确保路径正确是后续训练能启动的关键。你可以用几行Python代码快速验证一下import yaml with open(data/custom_data.yaml, r) as f: data yaml.safe_load(f) print(data)4. 模型训练与核心参数解析让模型开始学习环境好了数据齐了配置文件也写好了现在可以开始最激动人心的环节——训练模型。YOLOv5的train.py脚本提供了丰富的参数理解它们的作用能让你更好地控制训练过程。4.1 启动训练命令一个最基本的训练命令如下python train.py --img 640 --batch 16 --epochs 100 --data data/custom_data.yaml --weights yolov5s.pt --project runs/train --name exp1我们来拆解一下这些核心参数--img 640输入图像的大小宽度和高度。YOLOv5会自动将图片缩放到这个尺寸。更大的尺寸如1280可能带来更好的精度但会显著增加显存消耗和训练时间。640是一个在速度和精度间取得良好平衡的常用值。--batch 16批次大小。即一次迭代送入模型的图片数量。这个值受你的GPU显存限制。如果训练时出现“CUDA out of memory”错误首先尝试减小batch值。在显存允许的情况下更大的批次通常能使训练更稳定。--epochs 100训练轮数。模型会完整遍历训练集100次。轮数太少可能欠拟合太多可能过拟合。通常需要根据验证集指标如mAP的变化来决定何时早停。--data data/custom_data.yaml指定我们刚刚创建的数据集配置文件路径。--weights yolov5s.pt指定预训练权重。这里使用yolov5s.pt小模型进行迁移学习。这是至关重要的一步使用在COCO等大型数据集上预训练的权重可以让模型从一个较好的初始状态开始学习你的特定任务极大地加速收敛并提升最终性能。YOLOv5还提供了yolov5m.pt中、yolov5l.pt大、yolov5x.pt超大等不同规模的模型模型越大通常精度越高但速度越慢显存需求也越大。--project runs/train和--name exp1指定训练日志、模型权重等输出文件的保存目录。所有输出会保存在runs/train/exp1/下。执行命令后你会看到终端开始输出日志。训练过程主要包括数据加载检查数据集路径和标签文件。模型构建根据预训练权重和你的类别数nc构建模型。注意YOLOv5会自动修改输出层的通道数来匹配你的nc。训练循环开始迭代训练。终端会打印每一轮epoch的训练损失和验证指标。4.2 训练过程监控与可视化训练开始后YOLOv5会自动启动一个本地Web服务用于可视化训练过程。默认情况下你可以在浏览器中打开http://localhost:6006来访问TensorBoard如果你安装了tensorboard或者在runs/train/exp1目录下查看自动生成的图表。最重要的几个图表在runs/train/exp1目录下的results.png和results.txt中损失曲线train/loss, val/loss观察训练损失和验证损失是否同步下降。如果训练损失下降而验证损失上升可能是过拟合的迹象。精度指标metrics/mAP_0.5, metrics/mAP_0.5:0.95mAP_0.5在IoU交并比阈值为0.5时的平均精度均值。这是最常用的一个指标可以直观地看模型好坏。mAP_0.5:0.95在IoU阈值从0.5到0.95步长0.05区间内的平均mAP。这是一个更严格、更综合的指标。混淆矩阵confusion_matrix.png查看模型在各个类别上的分类混淆情况有助于发现哪些类别容易相互误判。注意事项训练初期损失曲线可能会有较大波动这是正常的。重点关注整体下降趋势。如果训练几十轮后损失不再明显下降或者验证集指标开始变差就可以考虑提前终止训练了。你可以随时按CtrlC中断训练已保存的最佳权重best.pt和最后权重last.pt仍然可用。5. 模型评估、测试与推理检验学习成果训练完成后我们得到了模型权重通常是best.pt即在验证集上表现最好的权重接下来需要全面评估它的性能并学会如何使用它进行预测。5.1 模型性能评估YOLOv5提供了专门的val.py脚本用于在验证集上评估模型性能。使用我们刚刚训练好的模型python val.py --weights runs/train/exp1/weights/best.pt --data data/custom_data.yaml --img 640 --task val这个命令会加载best.pt权重在验证集上运行一遍并输出详细的评估报告包括每个类别的精确率Precision、召回率Recall、APAverage Precision。所有类别的mAP0.5和mAP0.5:0.95。推理速度FPS。这份报告是你模型性能的“体检表”。精确率高意味着模型预测出的目标中真实目标的比例高误报少召回率高意味着模型找出了大部分真实目标漏报少。两者往往需要权衡。mAP则是综合了不同置信度阈值下的性能是衡量目标检测模型最核心的指标。5.2 使用模型进行预测推理评估完指标更实际的是用模型去预测新的图片或视频。使用detect.py脚本# 检测单张图片 python detect.py --weights runs/train/exp1/weights/best.pt --source path/to/your/test_image.jpg --conf 0.25 --img 640 # 检测一个文件夹下的所有图片 python detect.py --weights runs/train/exp1/weights/best.pt --source path/to/test_folder/ --conf 0.25 # 检测视频文件 python detect.py --weights runs/train/exp1/weights/best.pt --source path/to/video.mp4 --conf 0.25 # 使用摄像头实时检测0代表默认摄像头 python detect.py --weights runs/train/exp1/weights/best.pt --source 0 --conf 0.25关键参数解释--weights指定训练好的模型权重路径。--source输入源可以是图片、文件夹、视频、摄像头ID或URL。--conf置信度阈值。只有预测框的置信度高于此值的才会被显示。你可以根据需求调整调高会减少误报但可能漏检调低则相反。--img推理时输入的图像尺寸通常与训练时保持一致。--save-txt如果加上这个参数检测结果不仅会生成带框的图片/视频还会保存为YOLO格式的标签文件.txt方便后续分析或用于其他用途。检测结果默认保存在runs/detect/exp或递增的exp2, exp3...目录下。打开生成的图片或视频就能看到模型在你自己的数据上的表现如何了。6. 调优策略与高级技巧从“能用”到“好用”第一次训练出的模型可能只是“能用”距离“好用”或“精准”还有差距。这时就需要一些调优策略。模型性能不佳无非是“数据”、“模型”、“训练过程”这三个方面的问题。6.1 数据层面的优化数据是模型的“天花板”。数据质量检查回顾你的标注。是否存在大量漏标、错标、标框不准的情况用训练好的模型在训练集上跑一遍推理看看模型“认为”困难的是哪些样本例如置信度低的、预测框和标注框IoU低的这些往往是标注有问题的图片。数据增强Data AugmentationYOLOv5在train.py中默认启用了丰富的数据增强如Mosaic四图拼接、随机仿射变换旋转、缩放、平移、色彩空间调整HSV抖动等。你可以在data/hyps/hyp.scratch-low.yaml等超参数文件中调整增强的强度。对于小数据集增强是防止过拟合、提升模型泛化能力的利器。但要注意增强需符合实际场景。例如如果你的目标不会上下颠倒就不应该使用随机旋转180度的增强。类别不平衡问题如果你的数据中“猫”的图片有1000张而“狗”只有100张模型可能会偏向于预测“猫”。解决方法包括对少数类图片进行过采样重复使用、使用数据增强专门为少数类生成更多变体或者在损失函数中引入类别权重Focal Loss等YOLOv5默认已使用变体。6.2 模型与训练策略调优更换模型尺度如果你用yolov5s.pt训练后召回率Recall很低很多目标检不出来但显存还有富余可以尝试换用更大的模型如yolov5m.pt或yolov5l.pt。更大的模型拥有更多的参数和更复杂的特征提取能力。调整超参数YOLOv5的训练超参数定义在data/hyps/目录下的YAML文件中。你可以尝试微调学习率lr0、权重衰减weight_decay等。一个常见的做法是如果训练损失下降很慢可以适当增大学习率如果训练过程不稳定损失剧烈震荡可以减小学习率或增大批次大小batch size。建议初学者先使用默认超参数在第一次训练结果的基础上再进行小范围的微调。早停Early Stopping与模型保存YOLOv5默认会根据验证集mAP自动保存最佳模型best.pt。你可以观察验证集指标当其在连续多个epoch如10-20个内不再提升时就可以手动停止训练避免无效计算和过拟合风险。6.3 集成与测试时增强TTA对于追求极致精度的场景可以考虑模型集成训练多个不同初始化或不同数据子集的模型在推理时对它们的预测结果进行平均或投票。这通常能稳定地提升几个点的性能。测试时增强TTA在推理时对输入图像进行多种变换如翻转、缩放将每个变换后的图像分别输入模型得到预测再将所有预测结果合并。这能提升模型鲁棒性但会成倍增加计算量。YOLOv5的detect.py或val.py可以通过--augment参数启用TTA。7. 常见问题排查与实战心得在实际操作中你几乎一定会遇到各种报错和意外情况。这里我整理了一些典型问题及其解决方案都是我亲身踩过的坑。7.1 训练过程中的典型错误问题1CUDA out of memory (GPU显存不足)现象训练刚开始或中途报错提示显存不够。排查与解决降低批次大小batch size这是最直接有效的方法。将--batch从16降到8或4试试。减小输入图像尺寸img size将--img从640降到416或320。使用更小的模型从yolov5l.pt换到yolov5m.pt或yolov5s.pt。检查是否有其他程序占用显存在命令行使用nvidia-smi查看关闭不必要的GPU进程。使用梯度累积如果显存只差一点可以通过模拟更大批次的效果。这需要在代码层面修改对新手稍复杂。问题2RuntimeError: result type Float can‘t be cast to the desired output type long int现象训练时出现类型转换错误。排查与解决这通常是标签文件格式错误导致的。请严格检查你的标签文件(.txt)。确保每一行有5个数值用空格分隔。class_id必须是整数如0, 1, 2。后面四个坐标值必须是浮点数且在0到1之间。标签文件名称必须与对应的图片文件名称不包括后缀完全一致。 可以使用一个简单的Python脚本批量检查标签文件格式。问题3训练损失loss为NaN或突然变得巨大现象损失曲线出现异常点。排查与解决学习率过高这是最常见原因。尝试使用更低的初始学习率--lr0例如默认是0.01可以尝试0.001。数据有问题检查是否有损坏的图片用OpenCV尝试读取所有图片或者标签坐标有超出0-1范围的情况。梯度爆炸可以尝试在超参数文件中减小学习率或启用梯度裁剪gradient clipping。7.2 模型性能不佳的诊断思路如果模型训练完成了但评估指标mAP很低或者在测试图片上表现很差可以按以下步骤排查第一步检查模型在训练集上的表现用detect.py在训练集的图片上跑一下推理。如果训练集上的检测效果就很差那说明模型根本没有学好。问题可能出在数据标注质量极差重新审查和修正标注。模型容量不足对于复杂场景小模型如yolov5s可能不够用尝试换大模型。训练轮数太少增加epochs。学习率设置不当调整学习率。第二步检查模型在验证集上的表现如果训练集上效果很好但验证集上效果差这是典型的过拟合。模型“死记硬背”了训练集但无法泛化到新数据。解决方案增加数据增强的强度和多样性收集更多、更多样化的训练数据使用正则化技术如DropOut但YOLO结构本身已具备减少模型复杂度如果模型很大的话或者简单地减少训练轮数早停。第三步分析具体错误类型查看验证后生成的confusion_matrix.png混淆矩阵。它清晰地展示了模型混淆了哪些类别。例如如果“猫”和“狗”经常被混淆可能意味着这两类在视觉上本身就很相似。训练数据中这两类的样本特征区分度不够。可以考虑针对性地收集更多区分明显的“猫”和“狗”的图片或者在数据增强时注意不要模糊它们之间的特征差异。7.3 我的实战心得与建议从小开始快速迭代不要一开始就追求完美数据集和超大模型。先用100-200张高质量标注的图片配合yolov5s.pt快速训练一个原型模型。用它去测试你会发现很多数据层面的问题如某些角度、光照条件没有覆盖。根据测试结果去有针对性地补充数据这样效率最高。重视验证集一定要从原始数据中随机划分出验证集并且在训练过程中绝对不要用它来做任何调整除了观察指标决定早停。它是你判断模型泛化能力的唯一可靠依据。保存实验记录每次训练使用不同的--name如exp1, exp2或者记录下你修改的关键参数学习率、数据增强、模型尺度等和最终得到的mAP。这能帮助你科学地比较不同策略的效果而不是靠感觉。理解你的业务指标mAP是学术通用指标但你的业务可能有特殊要求。例如在安防中漏报低召回率可能比误报低精确率后果更严重而在内容审核中误报可能更不可接受。根据业务需求你可以通过调整推理时的--conf置信度阈值来平衡精确率和召回率。部署考虑训练时追求精度但部署时可能更关心速度。yolov5s和yolov5m通常是精度和速度兼顾较好的选择。训练完成后可以利用YOLOv5提供的export.py脚本将PyTorch模型导出为ONNX、TensorRT等格式以在边缘设备或生产环境中获得更高的推理效率。训练自己的YOLOv5模型是一个系统工程需要数据、算法、实验的紧密配合。它没有一成不变的“银弹”参数最好的模型一定是基于你对业务数据的深入理解通过多次迭代优化得到的。希望这份详细的指南能为你扫清障碍让你能够将YOLOv5的强大能力高效地应用到你所关心的实际问题中去。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价