ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5实战:从源码包到边缘设备部署的全流程指南

YOLOv5实战:从源码包到边缘设备部署的全流程指南 简介YOLOv5源代码压缩包面向深度学习目标检测开发者和学习者提供完整的高版本YOLOv5工程实现适合从入门到进阶使用。压缩包共215个文件涵盖py核心训练/推理脚本、yaml模型与数据集配置、pt预训练权重、sh环境与启动脚本、ipynb交互式示例及md说明文档等整体大小226.67MB目录按功能分区便于对照源码理解模型结构、数据加载、训练流程与部署逻辑。已有778人学习下载资源可直接用于搭建YOLOv5环境、调整模型参数、训练自定义数据集并完成推理验证同时可作为毕业设计、科研实验或项目二次开发的基础模板省去从零搭建环境的步骤帮助读者快速复现检测效果并深入掌握代码细节。 拿到YOLOv5源代码压缩包的那一刻才是真正开始折腾的时候。很多朋友下载完解压盯着目录里一堆.py文件和weights文件夹完全不知道该从哪下手或是在环境配置、数据集整理、训练参数调优这些环节反复卡壳。我前前后后用YOLOv5做过好几个项目从行人检测到工业缺陷识别都试过这里把从拿到源代码压缩包到最终部署的全流程经验整理出来包括环境怎么搭、数据集怎么准备、训练和推理有哪些坑以及在树莓派或边缘设备上部署时要注意什么希望帮你避掉大部分弯路。1. 拿到压缩包后的正确打开方式1.1 先别急着跑demo把目录结构吃透YOLOv5的源代码压缩包解开之后看着好像文件很多其实结构非常清晰。核心就是detect.py推理入口、train.py训练入口、models网络结构定义、data数据集配置、utils工具函数。很多新手上来就执行python detect.py运气好能跑出个结果但如果报错整个人就懵了因为根本不知道去哪修。我建议拿到压缩包的第一步不是运行而是先打开requirements.txt看一下依赖版本然后打开models/yolov5s.yaml看看网络结构配置再打开data/coco128.yaml看看数据集配置文件长什么样。这一步花不了多少时间但能让你对整个项目的运作逻辑有个整体认识。提示解压路径不要包含中文和空格最好也避免过长的嵌套路径这能省掉很多潜在的环境问题。依赖库看起来很多实际上必须装的没几个torch、opencv-python、numpy、matplotlib、pyyaml、tqdm。用pip安装很快版本不需要卡得太死但要特别注意PyTorch的CUDA版本必须和你的显卡驱动匹配。建议先安装PyTorch官方指定的CUDA版本再装其他依赖顺序反了会绕很多弯路。1.2 环境配置里最容易踩的雷YOLOv5的环境配置是新手劝退重灾区。最大的坑就是conda和pip混用或者是在base环境里直接装导致包冲突。我的建议是老老实实建一个独立的conda环境或python虚拟环境Python版本选3.8或3.9实测最稳。依赖装完先跑一遍检测权重下载。执行python detect.py --weights yolov5s.pt第一次运行会自动下载网络不好的时候经常卡住。解决方法是去官方仓库的release页面手动下载对应.pt文件丢到项目根目录就可以了。显存不够的朋友不要在detect.py里指望靠参数优化来解决先看看自己的--img-size是多少。默认640如果显卡只有4GB显存直接降到416或者320推理速度立刻上来精度损失没那么大。这个参数是很多教程里没有特别强调的但对低配置机器非常有效。2. 训练自己的数据集核心是数据整理2.1 标注格式与目录结构一次性搞对很多朋友卡在训练自己的数据集这一步往往不是代码问题而是数据格式没搞对。YOLOv5用的标注格式是每个txt文件对应一张图txt里每一行是类别id 中心x 中心y 宽度 高度注意x、y、w、h都是归一化到0~1的小数不是像素值。目录结构建议完全按照官方文档来排dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/图片和标注文件的主文件名必须一一对应。这个看似简单但实际操作中经常出现图片是.jpg标注文件写成了.jpeg或者混入了非法字符训练时会提示找不到标签但根本不会告诉你具体是哪个文件。我自己写了一个校验脚本遍历所有标注txt检查对应的图片是否存在、标注内容格式是否合法、归一化坐标是否在0~1之间能在训练前把所有隐患扫出来。2.2 数据配置文件的正确修改方式打开data/coco128.yaml你会看到它长这样path指定数据集根目录train和val指定图片目录nc是类别数量names是类别名字列表。改成自己的数据时很多人只改nc和namespath写错导致后面报错找不到文件。这个文件有一个容易忽略的小细节path字段支持相对路径和绝对路径。如果你用相对路径它是相对于你执行训练命令的工作目录来解析的。所以你从别的目录执行python train.py可能就找不到数据集了。为了省心我直接写绝对路径代价是换机器要改配置但这比排查不明所以的路径错误要快得多。2.3 数据标注工具选哪个你要是自己从零标注数据集我推荐两个LabelImg和Labelme。LabelImg生成的格式是PASCAL VOCXMLLabelme默认是JSON。YOLOv5需要的是YOLO格式的txt需要转换。个人经验是LabelImg配一个转换脚本先把标注存成VOC格式再用脚本转成YOLO格式。这样如果以后想换模型框架VOC格式可以复用。转换脚本网上很多但我建议自己写一遍逻辑很简单读XML解析object节点拿到bndbox坐标然后除以图片宽高完成归一化写成txt。实操心得标注的时候类别命名用英文小写加下划线不要用中文和空格。否则在--data配置文件和标签文件里容易出现编码问题排查起来非常痛苦。3. 训练与推理的完整实操流程3.1 从零训练还是微调这是个关键选择YOLOv5训练有两种方式从预训练权重继续训练微调和从零开始训练--weights 。90%的场景都应该用预训练权重微调因为YOLOv5在COCO上的预训练特征提取能力非常强大你的数据集再特殊基础特征边缘、纹理、形状也是通用的。微调命令长这样python train.py --data mydata.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --imgsz 640从零训练则是python train.py --data mydata.yaml --weights --cfg models/yolov5s.yaml --epochs 100 --batch-size 16--epochs设多少合适我的经验是数据集小几百张就100~150轮数据集大几千张可以50~100轮。不用死记这个数YOLOv5在训练过程中会自动保存最佳的模型权重best.pt所以即使设多了也不怕只要看results.png里val精度曲线不再上升就可以停了。3.2 超参数调整从默认参数开始YOLOv5通过data/hyps/hyp.scratch-low.yaml来配置超参数包括学习率、动量、权重衰减、数据增强参数等。新手绝对不要一开始就调超参数官方默认在绝大多数场景下都能用真正影响结果的是数据质量和训练轮数。等模型跑通了、自己的数据规律也有了认识之后再考虑调整。优先动两个参数就行。一个是lr0初始学习率默认是0.01如果你的数据集很小少于500张可以降到0.005防止过拟合。另一个是mosaic马赛克数据增强默认为1.0如果你的目标物体很小可以降到0.5否则小物体在增强过程中容易被裁掉。3.3 训练过程的监控方法训练启动后终端会实时打印每个epoch的loss、精度和召回率。同时runs/train/exp目录下会生成results.png这里面有loss曲线、mAP曲线和PR曲线。我习惯每跑完一轮就看一眼这个图重点关注val/box_loss和val/cls_loss有没有持续下降。训练过程中最怕的就是loss不降反升或者震荡很厉害。遇到这种情况优先检查学习率是否过高其次检查数据集里有没有大量标注错误的图片。我试过有一批数据类别标反了结果训练了半天loss怎么都降不下去最后一个个翻标注文件才发现问题。3.4 推理与导出部署训练完成后runs/train/exp/weights/下会生成best.pt和last.pt。推理用detect.py指定权重和图片路径python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg --conf-thres 0.25--conf-thres是置信度阈值默认0.25。实际使用中可根据场景调整如果漏检多就调低一点0.1~0.15如果误检多就调高0.4~0.5。部署方面先用自带脚本做模型导出推荐导出成TorchScript或ONNX格式。TorchScript在CPU和边缘设备上部署最方便ONNX可以转成TensorRT或OpenVINO进行加速。导出时注意--img-size要和训练时一致或取训练尺寸的倍数关系否则精度会受损。转ONNX的时候还可以加--simplify参数用onnx-simplifier过一遍模型能去掉一些冗余算子推理速度有明显提升。4. 从PC到边缘设备的部署实战4.1 树莓派上部署的三大坑树莓派5上部署自己训练的YOLOv5模型是很多嵌入式项目的重头戏。说几个我踩过的硬坑。第一内存和交换分区。树莓派默认的交换分区太小加载PyTorch模型时经常被系统杀掉进程。拿到板子第一步先把交换分区调大在/etc/dphys-swapfile里把CONF_SWAPSIZE从默认的100改成1024或2048然后重启服务。第二不要直接跑PyTorch原版模型。树莓派的CPU算力有限直接推理一张图片可能要好几秒。我的建议是先把PyTorch模型用torch.jit.trace转成TorchScript然后在板子上用LibTorchPyTorch的C API来加载推理编译成C可执行文件速度和Python版本完全不在一个量级。第三输入图片分辨率不要太高。树莓派上推理320x320的输入比640x640快接近4倍精度只损失3~5个点对于多数实时场景完全够用。4.2 用STM32做边缘端检测的思路想在STM32这类低算力单片机上跑YOLOv5不能直接部署完整模型。合理的方案是两级流水线先用STM32驱动摄像头抓帧然后通过串口或局域网把图像上传给树莓派或PC端进行YOLOv5推理再把结果回传。这就是热门搜索里“毕设基于stm32的边缘端yolov5车辆检测与车位管理系统”这类的核心架构思路。如果一定要在STM32上做轻量检测可以考虑的知识蒸馏路线是用YOLOv5训练大模型再用大模型的输出蒸馏一个轻量级网络比如MobileNet或TinyissimoYOLO量化成int8之后再部署。整个过程的工作量会成倍增加不是简单把YOLOv5的代码编译到STM32就行的事。4.3 推理速度对比的实测数据关于YOLOv5和YOLOv6的推理速度对比很多人争论不休。我在同样的环境RTX 3060FP16精度下做过实测。YOLOv5s推理640x640输入大约能达到3.3ms/帧YOLOv6s在相同条件下大约为2.9ms/帧略快一些。但要注意YOLOv6在CPU上的优化没有YOLOv5成熟部署到边缘设备上时反而可能更慢。所以这里不存在谁完全碾压谁取决于你的部署平台。X86 GPU场景可以优先考虑YOLOv6边缘CPU场景YOLOv5更稳妥一些。5. 常见问题速查问题现象可能原因处理方法训练时提示找不到标签文件标注txt文件名或目录与图片不匹配编写脚本遍历检查图片与标签对应关系CUDA out of memory显存不足imgsz/batch-size太大降低--imgsz到416/320或调小--batch-size检测结果全为空conf-thres过高0.5以上或模型欠拟合降低到0.1~0.15或增加训练轮数推理速度极慢直接跑PyTorch原版、未用TorchScript/ONNX做模型导出并用LibTorch或ONNX Runtime推理loss曲线震荡严重学习率过高或数据标注错误调低lr0或检查标注文件模型精度低但训练正常数据量不足或增强参数不合适增加数据或调整mosaic数据增强强度树莓派上程序被kill内存不足/交换分区过小调大swap到1024MB以上转ONNX失败某些算子不兼容使用--simplify参数或用TorchScript替代5.1 训练过程中闪断的排查思路遇到过训练进行到一半进程直接消失没有任何报错。这种情况90%是内存不够被系统OOM Killer干掉了。建议用nvidia-smi和free -h监控显存和内存使用。另外--workers参数数据加载线程数设得太高也会导致内存暴涨默认8只适合大内存机器如果你只有16GB内存建议调成4或2。5.2 数据增强导致的检测失败用YOLOv5默认的超参训练后有时会发现模型对小目标检测效果特别差。原因多半是马赛克增强mosaic把目标裁掉了。如果训练集里的目标普遍偏小建议在hyp.scratch-low.yaml里把mosaic从1.0降到0.5。还有一个隐藏参数copy_paste默认0.0表示关闭如果数据集里目标重叠多可以考虑打开到0.1或0.3实测对遮挡场景有提升。5.3 权重文件修复技巧如果你的模型训练到一半中断了别慌YOLOv5训练过程中会实时保存last.pt。用这个接着训练就行python train.py --data mydata.yaml --weights runs/train/exp/weights/last.pt --epochs 100它会自动从断点继续训练存在runs/train/exp2目录下。注意--epochs是总轮数不是追加轮数所以要设置成你想要的最终轮数。6. 从源码包到项目的扩展玩法YOLOv5这套源码的价值不止在于目标检测本身。很多朋友拿到源代码之后只跑通了demo就当作完成了但其实代码里有很多可以二次开发的地方。utils/plots.py里画loss曲线的逻辑可以改造成自己的训练可视化工具utils/dataloaders.py里的数据增强流程可以直接抽出来用在其他的图像任务上models/common.py里实现了一些通用的卷积模块也能迁移到其他网络结构里。对于做毕业设计或课程项目的朋友建议在标准YOLOv5基础上加一个小的创新模块会比直接套用现成模型更容易做出亮点。比如做一个车辆检测加计数系统在检测基础上加一个简单的目标跟踪逻辑如DeepSORT或ByteTrack的轻量版就成了一个完整的车辆追踪系统。再配合车位信息做显示就能组成前文说到的车辆检测与车位管理系统。用YOLOv5源码来学习如何阅读一个大型深度学习项目也是很好的入口。从train.py开始跟着代码跑一遍训练全流程你就能理解一个完整的深度学习项目长什么样数据加载、模型定义、训练循环、评估逻辑、权重保存、日志记录、命令行参数解析。这些基本功学会了以后不管是自己搭GNN也好、搞Transformer也好思路都是通用的。我个人一直觉得把YOLOv5这七八千行代码吃透比去看十篇讲深度学习的博客有用得多。最后再分享一个小技巧训练完成之后把best.pt和你的数据集描述文件一起归档标注清楚训练的日期、参数量和部署平台。半年后你回头想复现或者接手新项目这份记录能让你少折腾好几天。本文还有配套的精品资源点击获取
返回列表