1. 项目概述从零到一掌握YOLOv5模型训练最近在项目里用YOLOv5做了一批定制化的目标检测模型从简单的物品识别到复杂的工业场景都有涉及。每次有朋友问起怎么训练自己的模型我总得从头讲一遍索性把整个流程和踩过的坑系统性地整理出来。目标检测这个领域YOLO系列绝对是绕不开的而YOLOv5以其出色的平衡性——速度快、精度不错、生态友好——成为了很多工程师和研究者入门乃至商用的首选。这篇文章的目的很直接假设你手头有一批自己的图片比如你想识别车间里的零件瑕疵、果园里的成熟水果或者自己收集的某种特定物品我将带你一步步完成数据准备、环境搭建、模型训练、评估优化的全过程最终得到一个能实际跑起来的、属于你自己的检测模型。整个过程我会尽量说人话把原理和实操结合起来让你不仅知道怎么“点按钮”更明白背后“为什么这么点”。2. 核心思路与方案选型为什么是YOLOv5在动手之前我们得先搞清楚为什么选YOLOv5以及面对自己的任务时整个技术方案应该如何规划。目标检测的模型很多从老牌的Faster R-CNN到后来的SSD再到YOLO系列本身就有v1到v8等多个版本。选择YOLOv5是基于几个非常实际的考量。2.1 YOLOv5的核心优势与版本选择首先YOLOv5并非官方YOLO作者的作品而是Ultralytics公司的开源项目但这丝毫不影响它的流行。它的优势在于“工程化”做得极好。相比早期的YOLOv4配置复杂、环境依赖棘手YOLOv5用PyTorch框架重写环境配置一条pip install -r requirements.txt基本就能搞定对新手极其友好。其次它提供了从轻量到高精度的多个预训练模型n, s, m, l, x你可以根据你的硬件条件和精度要求灵活选择。比如在RTX 3060上用YOLOv5s训练一个模型可能只需要几小时而YOLOv5x则可能需要几天但精度通常会更高。注意网络上常有关于YOLOv5和YOLOv8孰优孰劣的讨论。我的经验是对于大多数自定义数据集训练的场景尤其是数据量不大几千张图片时YOLOv5的成熟度、社区资源和教程丰富度依然有巨大优势更容易成功跑通并部署。YOLOv8在特定任务上可能有提升但YOLOv5是一个经过充分实战检验的、更稳妥的起点。2.2 自定义训练的整体工作流训练自己的模型本质上是一个“迁移学习”的过程。我们不会从随机初始化的权重开始训练那需要海量数据和计算资源而是站在巨人的肩膀上——使用在COCO等大型通用数据集上预训练好的模型权重作为起点。我们的任务就是用自己特定的、带标注的数据去微调Fine-tune这个模型让它“忘记”一些通用的东西转而“记住”我们关心的特定目标。因此整个流程可以拆解为以下几个核心阶段数据准备与标注收集图片并用标注工具框出目标生成模型能读懂的标注文件。环境配置与项目搭建配置Python、PyTorch、CUDA等环境克隆YOLOv5代码仓库。数据格式整理与配置将自己的数据集整理成YOLOv5要求的目录格式并编写配置文件告诉模型你的数据在哪、有哪些类别。模型训练与调参启动训练监控训练过程根据情况调整超参数。模型评估与测试训练完成后在验证集和新的图片上测试模型效果分析性能。模型导出与部署将训练好的PyTorch模型转换为ONNX、TensorRT等格式以便在不同平台如Jetson Nano、移动端上高效运行。下面我们就深入每一个环节看看具体怎么做以及有哪些需要特别注意的“坑”。3. 数据准备从图片到标准标注文件数据是模型的“粮食”粮食的质量直接决定模型的上限。这一步往往最耗时但也最不能马虎。3.1 图像数据采集的核心原则你的图片从哪里来可以是手机拍摄、网络爬取、公开数据集混合或是工业相机采集。无论来源如何都要遵循几个原则多样性目标物体要在不同的光照强光、弱光、背光、角度正面、侧面、俯视、背景、尺度和遮挡情况下出现。如果你的训练数据全是阳光明媚下的正面照模型在阴天或侧面视角下很可能失效。代表性图片必须覆盖你未来应用场景中可能出现的所有情况。比如做安全帽检测就要包含远近不同、佩戴方式不同甚至未正确佩戴、与其他物体颜色相近的图片。数量与平衡每个类别的图片数量不宜相差太远。如果一个类别有1000张图另一个只有50张模型会严重偏向数量多的类别。对于新手项目每个类别准备200-500张质量较高的图片是一个不错的起点。分辨率一致虽然YOLOv5训练时会自动将图片缩放到统一的尺寸如640x640但建议原始图片的长宽比不要差异过大并且分辨率不宜过低否则小目标的信息会丢失严重。3.2 标注工具选择与实操要点有了图片就需要告诉模型目标在哪里。这需要用到标注工具在图片上画出包围框Bounding Box并打上标签。目前最主流的是LabelImg和Roboflow。LabelImg开源免费本地运行支持PASCAL VOCXML格式和YOLOTXT格式两种输出。对于个人或小团队项目它足够用了。Roboflow在线平台提供了数据增强、版本管理、团队协作等更多功能免费版有一定额度适合更复杂的项目或团队使用。这里以LabelImg为例标注时要注意框要尽可能紧贴目标物体但不要切入物体内部。框得太大会引入过多背景噪声太小则会丢失物体边缘信息。对于被遮挡的物体只要可见部分超过50%通常建议标注整个物体的预估位置。如果遮挡严重可视情况舍弃或仅标注可见部分。统一标注规范比如“人”这个类别是标注整个人体还是只标注头部在项目开始前团队内部必须统一并形成简单的标注文档。标注完成后LabelImg选择YOLO格式会为每张图片生成一个同名的.txt文件。文件内容格式如下class_id x_center y_center width height例如0 0.5 0.5 0.2 0.3。这里的坐标是归一化后的即中心点x坐标/图片宽度中心点y坐标/图片高度框宽度/图片宽度框高度/图片高度。所有值都在0到1之间。3.3 数据集目录结构规范YOLOv5对数据集的目录结构有明确要求。一个清晰的结构能避免后续很多路径错误。建议按如下方式组织your_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── image1.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── image100.jpg │ └── ... └── labels/ ├── train/ # 训练集标签 (与train/图片一一对应) │ ├── image1.txt │ └── ... └── val/ # 验证集标签 (与val/图片一一对应) ├── image100.txt └── ...你需要手动将总图片按一定比例如8:2或9:1分割为训练集train和验证集val并分别放入对应的images和labels文件夹下。验证集用于在训练过程中评估模型性能防止过拟合绝对不能与训练集重合。实操心得在划分数据集前可以先对所有图片进行一遍简单的清洗删除模糊、完全不相关或质量极差的图片。一个小技巧是可以写个简单的Python脚本利用哈希值去除完全重复的图片避免数据泄露。4. 环境配置与项目初始化数据准备好了接下来搭建训练环境。YOLOv5的环境配置相对简单但仍有几个关键点。4.1 基础环境搭建首先确保你安装了Python3.8或3.9版本兼容性较好和pip。然后强烈建议使用Conda或Venv创建独立的虚拟环境避免包版本冲突。# 使用Conda创建环境 conda create -n yolov5 python3.8 conda activate yolov5接下来从GitHub克隆YOLOv5的官方仓库并安装依赖。git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtrequirements.txt里包含了PyTorch、torchvision、opencv-python等核心依赖。如果网络不畅可以尝试更换pip源如清华源、阿里源。4.2 PyTorch与CUDA的匹配这是最容易出问题的一步。YOLOv5依赖PyTorch而PyTorch需要与你的CUDA版本匹配才能调用GPU加速训练。首先查看你显卡支持的CUDA版本通过nvidia-smi命令查看。然后去 PyTorch官网 获取对应的安装命令。例如你的CUDA版本是11.8可以这样安装pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安装完成后在Python中运行以下命令验证GPU是否可用import torch print(torch.__version__) # 查看PyTorch版本 print(torch.cuda.is_available()) # 应为True print(torch.cuda.get_device_name(0)) # 显示你的GPU型号如果torch.cuda.is_available()返回False说明PyTorch未能正确识别你的CUDA环境需要检查CUDA、cuDNN的安装以及PyTorch版本是否匹配。4.3 准备数据集配置文件我们需要创建一个YAML配置文件告诉YOLOv5我们的数据集在哪里、有哪些类别。在yolov5/data/目录下新建一个文件例如my_custom_data.yaml。# 数据集配置文件my_custom_data.yaml # 训练和验证图像的路径可以是相对路径或绝对路径 train: ../your_dataset/images/train/ val: ../your_dataset/images/val/ # 类别数量 nc: 2 # 例如我只有两个类别cat 和 dog # 类别名称列表 names: [cat, dog]train和val路径指向你之前创建的images/train和images/val文件夹。nc你的目标类别总数。names类别名称列表顺序很重要它会与标注文件中的class_id0, 1, 2...一一对应。5. 模型训练参数解析与过程监控万事俱备可以开始训练了。训练命令看似简单但里面的参数决定了训练的效率和最终模型的质量。5.1 启动训练命令与核心参数最基本的训练命令如下python train.py --img 640 --batch 16 --epochs 100 --data data/my_custom_data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name my_first_train我们来拆解每个参数--img 640输入图像的大小会被自动缩放到长边为640的正方形。更大的尺寸如1280可能提升小目标检测精度但会显著增加显存消耗和训练时间。--batch 16批处理大小Batch Size。一次迭代送入模型的图片数量。越大训练越稳定、越快但受限于GPU显存。如果出现“CUDA out of memory”错误首先降低batch大小如改为8、4。--epochs 100训练轮数。所有训练数据被完整遍历一次称为一个epoch。轮数太少模型学不够太多可能导致过拟合。通常从100-300开始根据验证集指标变化决定是否早停。--data指向我们刚创建的数据集配置文件路径。--cfg模型结构配置文件。yolov5s.yaml对应YOLOv5s小模型。你也可以选择yolov5m.yaml,yolov5l.yaml等。--weights yolov5s.pt指定预训练权重。yolov5s.pt会自动从Ultralytics的服务器下载。使用预训练权重是迁移学习的关键能极大加速收敛并提升最终性能。--name my_first_train本次训练的实验名称。所有输出模型权重、日志、图表都会保存在runs/train/my_first_train目录下。5.2 训练过程监控与日志解读执行命令后训练开始。控制台会输出类似以下信息Epoch gpu_mem box_loss obj_loss cls_loss Instances Size 0/99 3.21G 0.1xxxx 0.0xxxx 0.0xxxx 32 640: 100%|█████| 100/100 [01:2300:00, 1.20it/s] Class Images Instances P R mAP50 mAP50-95: 100%|█████| 10/10 [00:0500:00, 1.80it/s] all 100 500 0.850 0.780 0.820 0.550损失Lossbox_loss边界框回归损失、obj_loss目标置信度损失、cls_loss分类损失。训练初期这些值会较高随着训练进行应呈下降趋势。如果损失剧烈波动或长时间不降可能是学习率过大、数据有问题或模型结构不适合。性能指标每个epoch结束后会在验证集上计算。P(Precision)精确率模型预测为正的样本中真正为正的比例。越高说明误报越少。R(Recall)召回率所有真实的正样本中被模型预测出来的比例。越高说明漏报越少。mAP50以IoU交并比阈值为0.5计算的均值平均精度。这是衡量检测模型精度的核心指标值在0~1之间越高越好。mAP50-95IoU阈值从0.5到0.95步长0.05的平均mAP是更严格的指标。可视化工具训练结束后在runs/train/my_first_train目录下会生成一系列重要的可视化文件results.png损失和指标随epoch变化的曲线图。这是分析训练过程最重要的工具。confusion_matrix.png混淆矩阵查看各类别间的误检情况。val_batchX_labels.jpg和val_batchX_pred.jpg验证集批次的实际标签和模型预测对比直观看到检测效果。5.3 超参数调优初探YOLOv5有一个默认的超参数文件data/hyps/hyp.scratch-low.yaml。对于自定义数据集微调超参数能进一步提升效果。最常调整的两个是学习率lr0和动量momentum。学习率lr0控制模型参数更新的步长。太大可能导致震荡不收敛太小则收敛慢。一般可以从默认值如0.01开始如果训练不稳定损失NaN可以尝试降低到0.001或0.0001。你可以通过--hyp参数指定自定义的超参数文件。数据增强YOLOv5默认开启了Mosaic、MixUp等强力的数据增强这能有效提升模型泛化能力防止过拟合。如果你的数据集非常小可以保持或增强但如果你的数据集已经很大且多样有时适度减弱增强如降低旋转、缩放的程度反而可能让模型更快收敛到更好的位置。实操心得第一次训练时建议先用小模型如YOLOv5s、较少的epoch如50跑一个“快速实验”目的是验证整个数据流水线数据格式、路径、标注是否正确。看到损失在正常下降验证集上有一定的mAP后再换大模型、延长epoch进行“正式训练”这样可以节省大量时间。6. 模型评估、测试与导出训练完成后我们得到了保存在runs/train/my_first_train/weights/下的最佳权重best.pt和最后权重last.pt。接下来就是检验成果的时候了。6.1 模型性能评估使用val.py脚本在验证集上对训练好的模型进行正式评估python val.py --weights runs/train/my_first_train/weights/best.pt --data data/my_custom_data.yaml --img 640这会输出详细的评估表格包含每个类别的精确率、召回率、mAP等。仔细分析这些数据如果某个类别的P很低但R很高说明模型对这个类别“宁可错杀不可放过”误检很多。如果某个类别的R很低说明模型漏检了很多这个类别的目标。通过混淆矩阵可以看是否经常把A类别误检为B类别这可能是两者外观相似需要补充更多区分性的训练数据。6.2 使用模型进行推理测试用训练好的模型对新图片或视频进行检测使用detect.py脚本python detect.py --weights runs/train/my_first_train/weights/best.pt --source test_image.jpg # 检测单张图片 python detect.py --weights runs/train/my_first_train/weights/best.pt --source test_video.mp4 # 检测视频 python detect.py --weights runs/train/my_first_train/weights/best.pt --source 0 # 调用摄像头实时检测检测结果会保存在runs/detect/exp/目录下。这是最激动人心的环节看看你的模型在“实战”中表现如何。如果发现某些场景下检测不好可以有针对性地补充这些场景的数据到训练集中进行下一轮训练增量训练。6.3 模型导出为部署格式要在生产环境如服务器、嵌入式设备Jetson Nano、手机中高效运行模型通常需要将PyTorch模型.pt转换为其他格式。导出为ONNXONNX是一种开放的模型交换格式被很多推理引擎支持。python export.py --weights runs/train/my_first_train/weights/best.pt --include onnx导出为TensorRT如果你在NVIDIA GPU上部署TensorRT能提供极致的推理速度加速。python export.py --weights runs/train/my_first_train/weights/best.pt --include engine --device 0注意导出TensorRT引擎需要本地有TensorRT环境。导出时务必注意模型的输入输出尺寸--img要与训练和推理时保持一致。导出的模型就可以被集成到C、Python或其他语言的应用程序中了。7. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到各种问题。这里我整理了最典型的几个及其解决方法。7.1 训练过程中的常见错误问题现象可能原因解决方案CUDA out of memory1.Batch Size太大。2. 模型太大如用了YOLOv5x。3. 输入图片尺寸太大。1. 减小--batch参数。2. 换用更小的模型如从l换到m。3. 减小--img参数如从640到320。Loss为NaN1. 学习率过高。2. 数据标注有严重错误如坐标超出0-1范围。3. 数据中存在损坏的图片。1. 降低学习率修改hyp文件中的lr0。2. 检查标注文件格式。3. 使用verifyTrue参数在训练前验证数据集。mAP一直为0或很低1. 数据集路径或配置文件错误模型根本没读到数据。2. 类别ID与names列表不匹配。3. 数据质量极差或任务本身太难。1. 检查my_custom_data.yaml中的路径是否正确。2. 确认标注文件中的class_id是从0开始且小于nc。3. 可视化一些训练样本train_batch0.jpg看图片和标注框是否正常显示。训练很快过拟合1. 训练数据太少。2. 数据增强不够。3. 模型复杂度远高于任务需求。1. 收集更多数据或使用数据增强。2. 在hyp文件中调整增强参数如增加mosaic,mixup的概率。3. 换用更小的模型。7.2 推理部署时的典型问题检测框置信度阈值选择detect.py默认使用--conf-thres 0.25。如果发现很多误检可以调高这个值如0.5如果发现漏检多可以调低这个值如0.1。这是一个需要在精确率和召回率之间权衡的参数。在Jetson Nano等边缘设备上速度慢务必使用TensorRT加速。先在x86机器上导出TensorRT引擎.engine文件再部署到Jetson。降低推理时的输入图像分辨率--img 320。使用最轻量的模型YOLOv5n或YOLOv5s。确保Jetson Nano运行在最大功率模式sudo nvpmodel -m 0。检测不到小目标增加训练时的输入尺寸--img 1280但这会大幅增加计算负担。在模型结构上可以尝试修改models/yolov5s.yaml中的detect层前的上采样方式或引入注意力机制如SimAM、ECA来提升小目标特征提取能力。但这属于进阶修改需要一定经验。最根本的确保你的训练数据中包含足够多、标注清晰的小目标样本。7.3 数据层面的技巧与陷阱标注一致性多人标注时即使有规范对“模糊目标”的判断也可能不同。建议定期进行交叉检查或者由一个人进行最终审核确保标准统一。负样本YOLO本身不严格需要负样本不含任何目标的图片但加入一些背景图片即不含任何待检测目标的图片可以帮助模型降低将背景误判为目标的概率。只需将这些图片放入images/train/和images/val/并创建对应的空标签文件.txt内容为空即可。数据增强的度过强的数据增强如大角度的旋转、极端的色彩抖动可能会让模型学习到不真实的模式特别是对于方向、颜色有明确意义的物体如交通标志。需要根据具体任务调整增强策略。训练自己的YOLOv5模型是一个迭代的过程很少有一次就达到完美效果的情况。通常的流程是准备一版数据 - 训练一个基线模型 - 在测试集上评估 - 分析错误案例哪些没检测到、哪些误检了- 针对性地补充或修正数据 - 重新训练。经过几轮这样的循环模型的性能会得到稳步提升。这个过程本身就是对问题和数据理解不断加深的过程也是机器学习项目中最有价值的部分。