YOLOv5目标检测入门:从环境搭建到模型训练与部署全流程

📅 2026/8/12 13:11:03
YOLOv5目标检测入门:从环境搭建到模型训练与部署全流程
1. 从零到一为什么选择YOLOv5开启你的目标检测之旅如果你对计算机视觉感兴趣或者手头正好有一些图片数据想试试看能不能让机器自动识别出里面的特定物体——比如识别自家果园里成熟的果子、统计监控画面中的人数、或者从一堆零件照片里找出有瑕疵的那一个——那么目标检测就是你绕不开的技术。而YOLOv5无疑是当前最适合个人开发者和研究者入门的“神器”。我最早接触目标检测时被各种复杂的模型和繁琐的环境配置劝退过好几次。直到用了YOLOv5我才发现原来从零开始训练一个属于自己的检测模型可以如此“傻瓜式”地顺畅。它不像一些学术框架那样高高在上需要你深刻理解每一个模块才能跑起来相反它更像一个开箱即用的工具箱官方提供了极其清晰的文档和脚本让你能把精力集中在“我要检测什么”和“我的数据怎么样”这些核心问题上而不是浪费在环境报错和源码调试上。简单来说YOLOv5解决的核心问题是给你一堆带有标注的图片快速、高效地训练出一个能在新图片上准确框出目标并说出它是什么类别的模型。它适合所有有一定Python和命令行基础想亲手实践AI项目的人。无论你是学生做毕设、工程师做原型验证还是爱好者探索AI可能性这套流程都值得你花一个下午的时间走一遍。你会发现训练自己的AI模型并没有想象中那么遥不可及。2. 战前准备理清核心概念与工具链在撸起袖子开始敲代码之前我们得先把几个关键概念和整个流程的“地图”搞清楚。目标检测训练不是黑盒魔法理解其基本逻辑能帮你避开很多坑。2.1 目标检测到底是什么你可以把它想象成给一个“眼神”很好的AI助手看一张照片然后让它完成两件事定位Localization找出照片里你关心的物体在哪里并用一个矩形框Bounding Box标出来。分类Classification判断这个框里的物体属于哪一类比如“人”、“车”、“狗”。所以一个检测模型的输出通常是若干个[x, y, w, h, confidence, class]这样的数据组合。其中(x, y)是框的中心点坐标(w, h)是框的宽和高confidence是模型对这个预测的置信度class是类别索引。2.2 YOLOv5的独特优势为什么是它在众多目标检测模型中如Faster R-CNN, SSD, YOLO系列YOLOv5能脱颖而出成为入门首选主要因为以下几点极致的易用性PyTorch框架生态友好安装依赖简单。其代码结构清晰训练、验证、检测的脚本都是现成的命令行工具改改参数就能用。卓越的速度与精度平衡YOLOYou Only Look Once系列的核心思想就是“单阶段”检测速度快。YOLOv5在继承这一优点的同时通过更高效的网络结构CSPDarknet53 PANet SPPF和训练技巧在精度上也不输于许多复杂模型。丰富的预训练模型官方提供了从超轻量级到高精度的多个模型n, s, m, l, x你可以根据你的设备算力和精度要求灵活选择。一个常见的问题是训练自己的数据集时需要加载COCO的预训练权重吗答案是强烈建议加载。这被称为“迁移学习”。COCO数据集包含了80个常见类别其预训练权重让模型已经具备了强大的通用特征提取能力如边缘、纹理、形状。我们从这里开始训练相当于让模型在一个很高的起点上专门学习你数据集的独特特征能极大加快收敛速度提升最终效果尤其在你的数据量不大时这是防止过拟合的关键。活跃的社区与生态YOLOv5有非常庞大的用户群和持续更新。这意味着你遇到的大部分问题几乎都能在GitHub Issues或相关论坛里找到解决方案。围绕它的改进方案、部署教程如Jetson Nano部署Yolov5也非常多。2.3 工具链全景图整个训练流程可以概括为以下几个核心环节我们后续的章节会逐一拆解环境配置搭建Python、PyTorch、YOLOv5所需的运行环境。数据准备收集图片进行标注并整理成YOLOv5要求的格式。模型配置选择模型尺寸YOLOv5s/m/l/x并根据你的类别数修改配置文件。训练启动训练脚本监控训练过程调整超参数。评估与验证使用训练好的模型在测试集上评估性能查看指标。推理与部署用训练好的模型对新图片或视频进行预测并考虑如何应用到实际场景如本地API、边缘设备部署。3. 实战第一步搭建无痛的YOLOv5开发环境环境配置是新手的第一道坎。网上教程繁杂依赖冲突、CUDA版本不对等问题层出不穷。这里我分享一个经过多次验证、最稳定高效的配置方案力求一步到位。3.1 基础环境选择与创建强烈建议使用Anaconda或Miniconda来创建独立的Python环境。这能避免与你系统里已有的其他Python项目发生包版本冲突。# 创建一个新的conda环境命名为yolov5指定Python版本为3.83.7-3.9都比较兼容 conda create -n yolov5 python3.8 # 激活该环境 conda activate yolov53.2 PyTorch的精准安装这是最关键的一步。PyTorch的版本需要与你的CUDA版本匹配。首先确认你的显卡是否支持CUDA以及CUDA版本通过nvidia-smi命令查看。假设你的CUDA版本是11.3。# 访问PyTorch官网https://pytorch.org/get-started/locally/获取最准确的安装命令。 # 例如对于CUDA 11.3 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113注意如果你的电脑没有NVIDIA显卡或者不想用GPU可以安装CPU版本的PyTorch但训练速度会非常慢仅适合学习模型结构和小数据量调试。安装完成后可以在Python中验证import torch print(torch.__version__) # 输出PyTorch版本 print(torch.cuda.is_available()) # 输出True表示GPU可用 print(torch.cuda.get_device_name(0)) # 输出你的显卡型号3.3 获取YOLOv5源码与安装依赖直接从官方GitHub仓库克隆代码能保证你获得最新、最全的代码和工具脚本。# 克隆仓库 git clone https://github.com/ultralytics/yolov5 cd yolov5 # 安装项目所需的所有依赖包requirements.txt里已经列好了 pip install -r requirements.txtrequirements.txt文件包含了opencv-python,matplotlib,pandas,seaborn,tqdm,pyyaml等必备库。安装过程通常很顺利。3.4 验证环境运行一个简单的检测脚本使用官方预训练模型对示例图片进行检测确保一切正常。python detect.py --source data/images/bus.jpg --weights yolov5s.pt --conf 0.25如果环境正确这条命令会自动下载yolov5s.pt权重文件并对bus.jpg进行检测结果会保存在runs/detect/exp目录下。打开结果图片能看到公交车上的人和车都被框了出来说明你的YOLOv5环境已经成功搭建。4. 数据的“喂养”准备与标注你的专属数据集模型训练得好不好七分靠数据。对于目标检测数据准备包括收集、标注和格式整理。4.1 数据收集与原则来源可以用手机、相机拍摄也可以从网上公开数据集如鸟类目标检测的数据集、Cityscapes等中抽取你需要的类别。对于小目标检测场景要确保图片分辨率足够高小目标在图片中至少要有几十个像素点否则模型很难学习。数量没有一个绝对的数字但通常每个类别至少需要几百张样本。数据越多、越多样不同光照、角度、背景、遮挡模型泛化能力越强。划分将总数据集按大致比例如70%训练集20%验证集10%测试集随机划分。训练集用于模型学习验证集用于训练过程中调整超参数和监控是否过拟合测试集用于最终评估模型性能在整个训练过程中模型绝对不能“看到”测试集。4.2 数据标注给目标画框并命名你需要一个标注工具来告诉模型图片中哪里是你关心的目标它叫什么。LabelImg是一个经典、开源、跨平台的图形化标注工具非常适合新手。安装LabelImg:pip install labelImg然后命令行输入labelImg启动。标注流程打开图片目录。使用快捷键w调出画框工具精确框住目标物体。在弹出的对话框中输入类别名称如person,car。保存后会为每张图片生成一个同名的.txt标注文件。标注文件格式YOLO格式 生成的.txt文件内容看起来像这样0 0.5 0.5 0.3 0.4 1 0.2 0.7 0.15 0.2每一行代表一个目标框包含5个数字0或1类别的索引对应0person,1car这个映射关系需要你自己定义在一个classes.txt文件里。0.5 0.5边界框中心点的x坐标和y坐标是相对于图片宽度和高度的比例值取值范围0-1。0.3 0.4边界框的宽度和高度同样是相对于图片宽度和高度的比例值。注意这种归一化的坐标格式是YOLO系列的标准使得模型可以处理不同尺寸的输入图片。务必确保你的标注工具输出的是此格式。4.3 组织数据集目录结构YOLOv5对数据集的目录结构有明确要求。按照以下方式组织能避免后续很多路径错误。your_dataset/ ├── images/ │ ├── train/ # 存放训练集图片 │ │ ├── 001.jpg │ │ └── ... │ └── val/ # 存放验证集图片 │ ├── 101.jpg │ └── ... └── labels/ ├── train/ # 存放训练集标注文件 (.txt) │ ├── 001.txt │ └── ... └── val/ # 存放验证集标注文件 (.txt) ├── 101.txt └── ...关键一步创建一个描述数据集的YAML配置文件例如dataset.yaml放在项目根目录下。# dataset.yaml path: ../your_dataset # 数据集根目录的相对路径或绝对路径 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path # 类别数量 nc: 2 # 类别名称列表顺序必须与标注文件中的索引对应 names: [person, car]这个YAML文件是连接你的数据和训练脚本的桥梁。5. 训练的艺术启动、监控与调参数据就绪环境妥当终于来到了最激动人心的训练环节。YOLOv5的训练命令看似简单但背后有很多值得琢磨的细节。5.1 启动训练命令在YOLOv5项目根目录下运行类似下面的命令即可开始训练python train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --weights yolov5s.pt --cfg models/yolov5s.yaml --name my_first_training我们来拆解每个参数--img 640: 输入图片的尺寸会被自动缩放到长边为640像素。更大的尺寸如1280可能提升对小目标的检测精度但会显著增加显存消耗和训练时间。640是一个在速度和精度间取得良好平衡的常用值。--batch 16: 批次大小。一次迭代送入模型的图片数量。越大训练越稳定越快但需要更多显存。如果出现CUDA out of memory错误首先尝试减小batch值如改为8、4。--epochs 100: 训练轮数。整个训练集被完整遍历一次称为一个epoch。100是一个常见的起始值你可以根据验证集指标的变化决定是否提前停止或继续训练。--data dataset.yaml: 指定我们上一步创建的数据集配置文件路径。--weights yolov5s.pt:指定预训练权重路径。这里使用官方的yolov5s.pt会自动下载这就是迁移学习的关键。如果你想从头训练不推荐可以设为空字符串。--cfg models/yolov5s.yaml: 指定模型结构配置文件。我们使用yolov5s.yaml对应最小的s模型。如果你想用m模型就改为models/yolov5m.yaml。--name my_first_training: 本次训练实验的名称。所有输出权重、日志、图表都会保存在runs/train/my_first_training目录下。5.2 训练过程监控训练开始后控制台会打印每个epoch的损失loss和评估指标mAP。更重要的是YOLOv5集成了TensorBoard和Weights Biases (WB)等可视化工具。默认情况下训练日志会实时生成在runs/train/exp或你指定的--name目录中。你可以启动TensorBoard来动态查看各种曲线图tensorboard --logdir runs/train然后在浏览器打开localhost:6006你可以看到损失曲线train/loss和val/loss。理想情况下两者都应稳步下降并最终趋于平缓。如果训练损失下降但验证损失上升可能是过拟合。性能指标metrics/mAP_0.5和metrics/mAP_0.5:0.95。这是衡量检测精度的核心指标。mAP0.5表示在IoU交并比阈值为0.5时的平均精度。mAP0.5:0.95是在多个IoU阈值0.5到0.95步长0.05下的平均值更严格。我们主要关注这两个指标的上升趋势。标签分布查看你的训练集和验证集中各个类别标注框的数量、大小、位置分布是否均衡。如果某个类别样本极少模型可能学不好它。5.3 超参数调优初探YOLOv5有一个hyp.scratch.yaml文件里面定义了所有超参数的默认值。对于初学者不建议一开始就大改。但有几个关键参数可以了解lr0: 初始学习率。如果训练不稳定损失剧烈震荡可以适当调小如从0.01调到0.001。weight_decay: 权重衰减一种防止过拟合的正则化手段。如果模型在验证集上表现变差可以尝试稍微增加此值。flipud/fliplr: 上下/左右翻转的数据增强概率。对于某些不具有对称性的目标如文字需要调低或关闭。更高级的调参可以通过修改hyp.finetune.yaml或创建自己的超参数文件并通过--hyp参数指定。但记住对于大部分自定义数据集使用默认超参数并加载预训练权重已经能取得很不错的效果了。优先确保数据质量比盲目调参更有效。6. 模型评估与性能分析你的模型到底有多“聪明”训练结束后我们得到了保存在runs/train/exp/weights/目录下的最终模型通常是best.pt即在验证集上表现最好的权重。现在需要客观地评估它的性能。6.1 使用验证集进行标准评估运行以下命令模型会在你定义的验证集上自动进行评估并生成详细的指标报告和可视化结果。python val.py --weights runs/train/exp/weights/best.pt --data dataset.yaml --img 640 --task val关键输出包括mAP0.5 (mAP_0.5): 通常最关注的指标。值在0到1之间越接近1越好。对于一般应用0.5以上可以认为不错0.7以上属于良好0.9以上非常优秀。mAP0.5:0.95 (mAP): 更综合、更严格的指标。数值会低很多更能反映模型在精准定位上的能力。Precision (精确率)和Recall (召回率)精确率表示“模型认为是正样本的里面有多少是真的正样本”召回率表示“所有真实的正样本里模型找出了多少”。两者通常相互制约。你可以在TensorBoard的PR曲线中看到两者的关系。每个类别的AP查看模型对每个具体类别的检测能力找出“短板”类别。6.2 结果可视化眼见为实评估脚本还会在runs/val/exp目录下生成一系列可视化文件confusion_matrix.png混淆矩阵。可以看模型最容易把哪个类别错认成另一个类别。F1_curve.pngF1分数曲线精确率和召回率的调和平均。曲线下的面积越大越好。PR_curve.png精确率-召回率曲线。曲线越靠近右上角越好。labels.jpg和labels_correlogram.jpg展示验证集标签的分布与训练集对比检查数据划分是否合理。val_batchX_labels.jpg和val_batchX_pred.jpg直接展示验证集批次图片的真实标签和模型预测结果的对比。这是最直观的判断方式你可以看到模型在哪里漏检False Negative、哪里误检False Positive。6.3 常见问题分析与对策通过分析上述结果你可能会发现一些问题某个类别mAP极低大概率是该类别训练样本太少或质量不高。解决方案是补充该类别数据或使用数据增强如复制粘贴小目标专门加强它。精确率高但召回率低模型很谨慎只对它非常确定的目标才进行预测导致很多真实目标被漏掉。可以尝试在推理时降低置信度阈值--conf。召回率高但精确率低模型过于“激进”预测了很多框但其中很多是错的背景被误认为目标。可以尝试提高置信度阈值或者在训练时检查负样本不包含目标的图片是否足够。小目标检测效果差检查训练时输入的--img尺寸是否太小导致小目标信息丢失。可以尝试增大输入尺寸如1280或者使用专门针对小目标改进的YOLO变体或注意力机制如SimAM,ECA等可以加入到YOLOv5的骨干网络中。7. 让模型“干活”推理、部署与优化模型评估合格后就可以用它来对新数据进行预测了也就是“推理”。同时我们也要考虑如何将它集成到实际应用中。7.1 单张图片/批量图片推理使用detect.py脚本进行推理是最简单的方式。# 检测单张图片 python detect.py --weights runs/train/exp/weights/best.pt --source path/to/your/image.jpg --conf 0.25 --save-txt # 检测一个文件夹下的所有图片 python detect.py --weights best.pt --source path/to/images/folder/ --conf 0.25 # 检测视频文件 python detect.py --weights best.pt --source path/to/video.mp4 --conf 0.25参数说明--source: 输入源可以是图片、文件夹、视频、摄像头0甚至网络流URL。--conf: 置信度阈值。高于此阈值的预测框才会被保留。根据你在验证集上观察到的精确率-召回率平衡情况来调整。--save-txt: 保存预测结果为YOLO格式的.txt文件便于后续分析或处理。--save-conf: 在保存的标签文件中同时保存置信度分数。 结果会默认保存在runs/detect/exp中。7.2 模型导出与部署best.pt是PyTorch的模型权重文件要在其他环境或生产系统中使用通常需要导出为更通用的格式。导出为ONNXONNX是一种开放的模型格式被许多推理引擎支持。python export.py --weights best.pt --include onnx导出时会自动尝试优化模型如融合某些操作。导出的best.onnx文件可以被OpenCV DNN、TensorRT、ONNX Runtime等框架调用。导出为TensorRT如果你在NVIDIA Jetson系列如Jetson Nano或高性能GPU服务器上追求极致推理速度可以导出为TensorRT引擎。python export.py --weights best.pt --include engine --device 0这需要你的环境已安装TensorRT。TensorRT会对模型进行层融合、精度校准FP16/INT8等深度优化大幅提升推理速度。Web API服务使用FastAPI、Flask等框架将模型推理封装成HTTP API方便其他程序调用。核心是加载模型并编写一个接收图片、返回检测结果的接口函数。边缘设备部署在树莓派、Jetson Nano等资源受限的设备上需要选择轻量级模型如YOLOv5n或YOLOv5s并可能需要进行模型量化将FP32权重转换为INT8来减少模型大小和加速推理。社区有大量关于RTX 5060部署Yolov5、Jetson Nano部署yolov5的详细教程可供参考。7.3 模型优化与迭代第一个能跑的模型只是一个开始。要提升模型性能一个循环迭代的过程至关重要分析错误仔细查看验证集和测试集上的错误案例漏检、误检、定位不准。是光线问题遮挡问题目标太小还是和背景太相似针对性增强数据根据错误分析收集更多类似场景的数据或者对现有数据应用针对性的数据增强如调整亮度、对比度、添加模糊、模拟遮挡等。重新训练与评估用增强后的数据从预训练权重或上次训练得到的best.pt开始进行增量训练。通常只需要训练较少的epoch如50个因为模型已经有了较好的基础。重复此过程模型优化是一个持续的过程。每次迭代都可能带来几个百分点的mAP提升。训练自己的YOLOv5模型就像教一个孩子认识新事物。你需要准备清晰、多样的“教材”数据耐心地“讲解”训练并不断通过“测试”评估来发现他的不足然后有针对性地“补习”数据增强和迭代。这个过程充满挑战但当你看到模型准确地识别出你关心的目标时那种成就感是无与伦比的。希望这份详尽的指南能帮你顺利跨出第一步并少走一些我当年走过的弯路。记住在AI项目里高质量的数据和清晰的逻辑往往比复杂的模型结构更重要。