YOLOv5实战:从环境配置到自定义数据集训练与TensorRT部署 简介一套配合B站YOLOv5实战课程的完整代码包面向希望从零上手目标检测与模型部署的开发者。内容按入门、拓展、进阶、部署四个篇章组织覆盖环境安装、数据集构建、模型推理与训练、桌面端与网页端界面搭建、云端服务器远程训练、网络结构改进、注意力机制引入、主干网络替换以及TensorRT加速与Flask服务化部署等完整链路。包内共三百四十个文件以Python脚本、YAML配置、JPG样例图片、TXT标注与说明为主体另含多种格式的模型权重与推理引擎、Dockerfile容器化部署配置、训练事件日志与结果曲线整体压缩包约275.62MB课程配套目录中还包含多个视频讲解、Notebook示例、Shell运行脚本和模型说明文档便于对照学习与二次开发。已有137人学习下载适合跟随视频课程动手实操也可作为YOLOv5从训练到落地的参考代码库。1. YOLOv5.zip 实战把压缩包变成可用的目标检测系统第一次接触 YOLOv5 的人大多是从某处拿到一份 YOLOv5.zip解压后第一件事就是跑 detect.py 看效果。单张图跑通之后问题才开始出现数据怎么组织、类别怎么配、loss 为什么一直不降、模型怎么部署到没有 GPU 的边缘设备。YOLOv5 是 Ultralytics 维护的目标检测代码库虽然没有正式论文支撑工程化程度却是同期算法里最高的支持自定义数据集训练能导出 ONNX、TensorRT 等格式CPU 也能推理。水果识别、车牌识别这类细分项目通常都是拿这套代码改数据配置后直接训练验证成本极低。下文按解压后的实际顺序走一遍先搭环境再跑推理然后训练一份自己的水果数据集最后部署到 Jetson Nano 上。全程给可复制的命令和参数尽量少讲空泛原理。2. 环境配置先建好虚拟环境再解开 YOLOv5.zip2.1 YOLOv5 对 Python 与 PyTorch 的版本要求YOLOv5 的依赖核心是 PyTorch 和 torchvision再配上 opencv、numpy、matplotlib、seaborn 这些常规库。最容易翻车的点始终在 PyTorch 和 CUDA 的版本匹配上PyTorch 2.x 在 CUDA 11.8、12.1 下都能正常训练但如果显卡驱动偏老、只支持到 CUDA 11.7那 PyTorch 1.13.1 反而是更稳的选择。Python 版本优先选 3.8 到 3.103.11 以上部分依赖的预编译包不好找3.10 是当前踩坑最少的版本。这也是为什么第一步要建虚拟环境而不是直接 pip install。系统 Python 里通常还跑着其他项目装上 YOLOv5 依赖后未来更新或卸载都会波及别的环境。conda 和 venv 都能用conda 在管理 CUDA 相关包时更直观适合需要反复试版本的人。2.2 创建 conda 虚拟环境并安装 requirements.txtconda create -n yolov5 python3.9 -y conda activate yolov5 cd YOLOv5 pip install -r requirements.txt第一行创建名为 yolov5、Python 3.9 的环境并自动确认第二行激活环境后续命令都跑在该环境内第三行进入解压后的项目目录最后一行按 requirements.txt 安装全部依赖。如果机器有 NVIDIA 显卡建议先用官方索引单独装 PyTorch再装剩余依赖pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt这里 --index-url 指定 PyTorch 官方预编译 wheel 源cu117 对应 CUDA 11.7 版本。装完后执行python -c import torch; print(torch.cuda.is_available())输出 True 说明 GPU 可用输出 False 时优先检查驱动和 CUDA 匹配不要急着重装 YOLOv5。2.3 解压后目录结构里该认哪些文件YOLOv5.zip 解压后先看这几个关键路径| 路径 | 作用 | | models/yolov5s.yaml | 网络结构定义s/m/l/x 对应不同规模 | | data/coco128.yaml | 官方样例数据集配置可作自定义模板 | | hyp/hyp.scratch-low.yaml | 默认超参数文件训练前在这里调 | | train.py / val.py | 训练与验证入口 | | detect.py | 推理入口 | | export.py | 导出 ONNX、TensorRT 等格式 |项目内的相对路径全部以根目录为基准标注数据集和训练输出尽量不要挪到别处。Linux 服务器上常见的坑是缺少 OpenCV 底层图形库会直接报libGL.so.1: cannot open shared object file执行sudo apt install -y libgl1 libglib2.0-0即可修复Windows 下则要装好 Visual C Redistributable否则加载 dll 时莫名失败。提示不要从网上找整合修改版覆盖目录。YOLOv5 更新频繁不同版本的接口和默认参数有差异出了问题你很难判断是代码问题还是环境问题。装完依赖后建议先跑一条自检命令确认 import 阶段没有段错误python -c import torch, cv2, numpy; print(torch.__version__, cv2.__version__, numpy.__version__)这条自检能提前暴露 numpy 版本过高导致 cv2 导入崩溃的问题。遇到此类问题时把 numpy 固定到 1.24.3 再重装 opencv 是常见解法。3. YOLOv5 第一次推理下载预训练权重与 detect.py 参数拆解3.1 预训练权重从哪里拿yolov5s.ptYOLOv5.zip 内部不含权重文件权重放在官方仓库的 Releases 页面命名为 yolov5n.pt、yolov5s.pt、yolov5m.pt、yolov5l.pt、yolov5x.pt。数字越小模型越轻、推理越快精度相对低yolov5x 精度最高但资源消耗也大。第一次实验通常选 yolov5s.pt速度和精度的平衡最好。把权重文件放到项目根目录detect.py 会按名字自动识别。如果机器网络受限导致下载超时可以手动完整下载后放回根目录文件名必须和 --weights 参数完全一致。这些预训练权重是在 COCO 数据集上训好的即使你后面要训练自己的数据集也应该用它做初始化权重而不是从随机参数开始收敛速度和最终精度都会更好。3.2 跑通最小推理命令并看懂结果python detect.py --weights yolov5s.pt --source data/images/zidane.jpg --conf-thres 0.35 --iou-thres 0.5 --project runs/detect --name first_run--source 指定单张图片路径--conf-thres 0.35 表示只保留置信度高于 0.35 的目标--iou-thres 0.5 是 NMS 的 IoU 阈值用于合并重叠框--project 和 --name 决定输出目录为 runs/detect/first_run。执行完毕后该目录下会出现标注后的 jpg 文件和同名 txt 文件。txt 里每行对应一个检测框格式是class_id x_center y_center width height坐标为归一化相对值。这个格式与训练标签完全一致意味着推理结果可以直接回灌给训练集做半监督。同一结果里还会打印每个目标类别、置信度和坐标信息这些数据是后续做统计或业务逻辑的原始输入。3.3 detect.py 核心参数表与摄像头实时检测| 参数 | 默认值 | 说明 | | --weights | yolov5s.pt | 权重路径 | | --source | data/images | 图片、目录、视频或摄像头 | | --imgsz | 640 | 推理输入分辨率 | | --conf-thres | 0.25 | 置信度阈值 | | --iou-thres | 0.45 | NMS IoU 阈值 | | --max-det | 1000 | 每张图最多输出框数 | | --device | cpu | 0 表示第一块 GPU | | --classes | 无 | 按类别 id 过滤输出 | | --view-img | 关闭 | 弹窗实时显示结果 |摄像头实时检测是验证模型最直接的方式python detect.py --weights yolov5s.pt --source 0 --view-img --conf-thres 0.3--source 0 取默认摄像头有显示器的电脑可以弹窗预览服务器无界面时不要加 --view-img否则会报窗口创建错误。对长视频做批处理时加 --nosave 只跑不存用来测 FPS。yolov5s 在主流 GPU 上一般能稳定超过 60 FPS如果远低于这个量级先确认 --device 是否真的用了 GPU再检查输入分辨率是否被意外放大。4. YOLOv5 训练自己的数据集以水果识别为例配置数据与超参数4.1 标注工具与 YOLO 格式目录组织YOLOv5 训练标签格式和 3.2 节推理输出格式完全一样。用 LabelImg 或 Label Studio 标注时导出类型选 YOLO每张图片对应一个同名 txt 文件。以水果识别为例假设要识别苹果、香蕉、橙子三类把数据按以下结构摆放datasets/fruit/ images/train/ images/val/ labels/train/ labels/val/train 和 val 建议按 8:2 划分并对每个类别的样本数做均衡检查。类别数量相差超过 3 倍时优先补少数类样本而不是靠调权重强拉。标注完成后逐一检查 txt是否为空文件、坐标是否超出 0 到 1 的范围、类别 id 是否小于 nc。这些问题如果流入训练轻则 mAP 一直很低重则产生 NaN loss排查起来比标注本身还耗时。4.2 编写 data.yaml 并快速校验在 YOLOv5 目录下新建 data/fruit.yamltrain: datasets/fruit/images/train val: datasets/fruit/images/val nc: 3 names: [apple, banana, orange]train 和 val 路径先用绝对路径调试确认无误后再换相对路径。nc 必须与 names 的长度一致。写完后先跑 1 个 epoch 快速校验python train.py --data data/fruit.yaml --weights yolov5s.pt --epochs 1这条命令的目的不是训练而是验证数据路径、标签格式和 YAML 语法。几秒钟内就能暴露大部分配置错误比训练到一半再发现问题要省时得多。校验通过后再用完整参数跑正式训练。4.3 train.py 实战参数组合与显存适配python train.py --data data/fruit.yaml --weights yolov5s.pt --epochs 120 --batch-size 16 --imgsz 640 --hyp hyp/hyp.scratch-low.yaml --cache --name fruit_v1--epochs 120 对中小型数据集足够--batch-size 16 在 8G 显存机器上是安全值显存不够就降到 8同时把 --workers 从默认 8 调到 2--cache 会把所有图片预加载到内存加快训练但内存低于 16G 时不建议加--name 指定本次实验输出目录为 runs/train/fruit_v1每次调参换名字方便对比。训练日志会实时显示每个 epoch 的 box_loss、cls_loss、obj_loss 和 mAP 指标。训练的前 10 到 20 个 epoch 不要频繁打断看 loss给优化器一点预热时间。YOLOv5 默认 patience100验证集 mAP 连续 100 个 epoch 无提升会自动早停epochs 设大不会白跑。如果 loss 在前期明显发散优先检查学习率和数据标注而不是急着改网络结构。4.4 hyp 超参数文件里值得先改的 5 项hyp.scratch-low.yaml 是默认从零训练的超参数文件里面每一项都有实际意义但第一次调参建议只动以下 5 项| 参数 | 默认值 | 什么情况下调整 | | lr0 | 0.01 | loss 发散时降到 0.005收敛过慢可试 0.02 | | lrf | 0.01 | 控制余弦退火终点一般不动 | | box | 0.05 | 框定位不准时上调到 0.07 左右 | | cls | 0.5 | 多类别不均衡时适当上调 | | mosaic | 1.0 | 小目标偏多时降到 0.8 |改超参数前复制一份原文件比如 hyp.fruit.yaml用 --hyp 指定不要直接在原文件上改。mosaic 是拼图增强它把多张图拼成一张个别目标会被裁切遇到小目标数据集时降到 0.8 能减少漏检。mixup 默认是 0当训练数据只有几百张时可以开到 0.1 到 0.2 当作正则化手段代价是每个 epoch 耗时明显变长。4.5 训练后的权重选择与 val.py 验证训练结束后runs/train/fruit_v1/weights/ 下会生成 best.pt 和 last.pt。best.pt 是验证集指标最优的权重发布、部署都用它last.pt 是最后一个 epoch 的权重适合在 best 和 last 差距很大时续训。用 val.py 得到更细的评估结果python val.py --weights runs/train/fruit_v1/weights/best.pt --data data/fruit.yaml输出按类别列出精确率、召回率、mAP50 和 mAP50-95。某个类别 mAP 明显低于全类均值时优先补该类的图片无论怎么加训练时长都很难靠调参抹平数据偏差。车牌识别项目处理方式相同只是把 names 换成省份简称和字符集合数据组织和训练命令完全一致。5. Jetson Nano 部署 YOLOv5模型导出与 TensorRT 推理优化5.1 为什么 Jetson Nano 不用 PyTorch 直接推理Jetson Nano 的 GPU 算力有限直接用 best.pt 做检测显存占用高前后处理还拖在 Python 侧帧率很难达到可用水平。更合理的做法是把 PyTorch 权重导出成 TensorRT engine让 TensorRT 做算子融合与显存复用。Jetson 的 JetPack 自带 TensorRT 运行库YOLOv5 的 export.py 已支持直接生成 engine 文件。前提是安装的 PyTorch aarch64 版本与 JetPack 对应否则导出阶段会报算子不支持。5.2 用 export.py 导出 TensorRT 引擎把 best.pt 放到 YOLOv5 根目录后执行python export.py --weights best.pt --include engine --device 0 --half --imgsz 640--include engine 指定输出 TensorRT 引擎格式--device 0 用 GPU 构建引擎构建过程比推理慢很多属正常现象--half 启用 FP16 半精度Jetson 上 FP16 支持完善精度损失一般在 1% 以内。想进一步压榨性能可以导出 INT8python export.py --weights best.pt --include engine --device 0 --int8 --data data/fruit.yaml --imgsz 640--int8 需要一份校准数据集这里直接复用 data/fruit.yaml几百张即可。INT8 的精度损失因数据而异必须在导出后用独立验证集重新测一遍不要默认它一定可用。5.3 FPS 对比与 INT8 精度权衡| 精度模式 | 预期速度提升 | 精度损失参考 | | FP32 | 基准 | 无 | | FP16 | 1.5 到 2 倍 | 1% | | INT8 | 约 3 倍 | 1% 到 5% |用导出的 engine 直接走 detect.pypython detect.py --weights best.engine --source 0 --conf-thres 0.35 --view-img此时检测链路已经是 TensorRT 后端日志中能看到每帧耗时。如果 INT8 下漏检明显增加优先退回 FP16而不是上调置信度阈值来掩盖问题因为阈值上调会让所有类别的召回一起下降。要在保精度的同时提速常见的做法是保持 FP16 引擎不变把输入分辨率从 640 降到 512对小目标场景的影响也远小于量化误差。本文还有配套的精品资源点击获取