YOLOv5实战:从源码包到边缘设备部署的全流程指南
2026/9/9 14:48:05 网站建设 项目流程

简介: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看看数据集配置文件长什么样。这一步花不了多少时间,但能让你对整个项目的运作逻辑有个整体认识。

提示:解压路径不要包含中文和空格,最好也避免过长的嵌套路径,这能省掉很多潜在的环境问题。

依赖库看起来很多,实际上必须装的没几个:torchopencv-pythonnumpymatplotlibpyyamltqdm。用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指定数据集根目录,trainval指定图片目录,nc是类别数量,names是类别名字列表。改成自己的数据时,很多人只改nc和names,path写错,导致后面报错找不到文件。

这个文件有一个容易忽略的小细节:path字段支持相对路径和绝对路径。如果你用相对路径,它是相对于你执行训练命令的工作目录来解析的。所以你从别的目录执行python train.py,可能就找不到数据集了。为了省心,我直接写绝对路径,代价是换机器要改配置,但这比排查不明所以的路径错误要快得多。

2.3 数据标注工具选哪个

你要是自己从零标注数据集,我推荐两个:LabelImg和Labelme。LabelImg生成的格式是PASCAL VOC(XML),Labelme默认是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.ptlast.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,然后在板子上用LibTorch(PyTorch的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 3060,FP16精度)下做过实测。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-smifree -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和你的数据集描述文件一起归档,标注清楚训练的日期、参数量和部署平台。半年后你回头想复现或者接手新项目,这份记录能让你少折腾好几天。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询