尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

YOLOv5目标检测实战:从环境搭建到模型训练与部署全流程详解

YOLOv5目标检测实战:从环境搭建到模型训练与部署全流程详解 1. 项目概述从零上手YOLOv5如果你刚接触目标检测或者想找一个既快又准的模型来练手YOLOv5绝对是个绕不开的名字。它不是官方YOLO系列的开源版本但凭借其极致的工程化、清晰的代码结构和“开箱即用”的特性在工业界和学术界都获得了巨大的成功。简单来说YOLOv5就是一个能让你在图片或视频里快速、准确地框出“猫猫狗狗、行人车辆”等目标的工具。它的核心魅力在于你不仅能用它现成的模型去识别80种常见物体更能轻松地用它来训练一个专属于你自己的检测器——比如识别车间里的零件瑕疵、农田里的病虫害或者像网络热词里提到的“南方湖底鱼类”。我最初接触YOLOv5时也被它繁杂的教程和版本搞晕过。这次我就把自己从环境搭建、数据准备、模型训练到最终部署测试的全流程经验掰开揉碎了分享给你。我们会避开那些华而不实的理论聚焦于“怎么做”和“为什么这么做”目标是让你看完就能动手跑通第一个属于自己的YOLOv5模型。2. 环境准备与项目初始化2.1 选择与配置Python环境第一步不是急着下载代码而是先把“地基”打好。强烈建议使用Anaconda来创建独立的Python环境这能完美解决不同项目间依赖包版本冲突的问题。别直接在系统Python里折腾那是给自己挖坑。打开你的终端Windows用Anaconda PromptLinux/Mac用终端执行以下命令# 创建一个名为yolov5的新环境指定Python版本为3.83.7-3.10都行3.8最稳 conda create -n yolov5 python3.8 # 激活这个环境 conda activate yolov5环境激活后你的命令行提示符前面应该会显示(yolov5)这表示后续所有操作都在这个“沙箱”里进行。接下来是安装深度学习框架PyTorch。这是YOLOv5运行的引擎。去PyTorch官网https://pytorch.org/get-started/locally/根据你的情况选择命令。这里以最常见的、没有独立GPU仅用CPU的情况为例# 使用pip安装选择稳定版支持CUDA 11.8如果你有NVIDIA GPU并安装了对应CUDA驱动 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 如果你只有CPU安装这个 # pip install torch torchvision torchaudio注意有GPU会极大加速训练过程。安装前请用nvidia-smi命令确认你的CUDA版本。安装的PyTorch CUDA版本必须小于等于你系统安装的CUDA版本。2.2 克隆YOLOv5仓库与安装依赖环境准备好了现在把YOLOv5的“工具箱”拿过来。我们使用Git来克隆官方仓库# 克隆仓库到当前目录 git clone https://github.com/ultralytics/yolov5 # 进入项目文件夹 cd yolov5 # 安装项目所需的所有依赖包requirements.txt里列得清清楚楚 pip install -r requirements.txt这个requirements.txt文件包含了opencv-python图像处理、matplotlib画图、pandas数据处理等关键包。安装过程可能会花点时间。安装完成后我强烈建议你进行一次快速验证确保核心组件没问题python detect.py --source data/images/bus.jpg --weights yolov5s.pt这条命令会用官方最小的预训练模型yolov5s.pt对项目自带的一张公交车图片进行推理检测。如果一切顺利你会在runs/detect/exp目录下看到生成的结果图片公交车上的人和车都被框出来了。这一步能帮你排除掉90%的环境配置问题。2.3 理解项目核心目录结构进到yolov5文件夹别被一堆文件吓到我们只需要关注几个核心的data/: 存放数据集配置文件的目录如coco128.yaml以及一些示例图片。models/: 存放模型结构定义文件yolov5s.yaml,yolov5m.yaml等定义了不同大小模型的网络层。weights/: 下载预训练模型权重的位置运行训练或检测时会自动下载。runs/: 所有实验的输出目录包括训练日志、验证结果、检测图片都存放在这里的train、val、detect子文件夹下。核心脚本train.py:训练脚本我们的主角。detect.py:推理检测脚本用训练好的模型预测新图片/视频。val.py:验证脚本评估模型在验证集上的性能。export.py:模型导出脚本将PyTorch模型转为ONNX、TensorRT等格式用于部署。3. 准备自己的数据集3.1 数据标注从图片到标签文件训练自己的模型核心是准备好“问题图片”和“答案标注”。你需要收集包含你目标物体的图片然后用工具标出物体位置和类别。1. 图片收集与整理来源可以是网络爬取、手机拍摄、公开数据集如热词中的“无人机数据集”、“鸟类目标检测的数据集”等。图片尺寸尽量统一建议调整为640x640或1280x1280等标准尺寸有利于训练稳定。YOLOv5内部会自动进行缩放和增强。建立一个清晰的目录比如mydataset/下面再建images/和labels/文件夹。2. 标注工具选择与使用LabelImg经典的可视化GUI工具适合初学者。支持PASCAL VOCXML和YOLOTXT格式我们选YOLO格式。Label Studio更强大的Web端标注平台支持多种任务类型。热词中也提到了它其输出的JSON格式需要转换为YOLO格式。Roboflow在线平台提供标注、预处理、版本管理一站式服务。以LabelImg为例安装后打开将“存放目录”指向你的mydataset/images/“更改存放目录”指向mydataset/labels/格式务必选择YOLO。然后用矩形框框出目标输入类别名如fish。保存后每张图片会生成一个同名的.txt文件在labels/文件夹里。3. 理解YOLO格式的标签文件生成的.txt文件内容看起来像这样0 0.5 0.5 0.3 0.4 1 0.2 0.7 0.15 0.2每一行代表一个目标物体。五个数字用空格分隔[class_id] [x_center] [y_center] [width] [height]class_id: 类别索引从0开始0代表fish1代表boat依此类推。x_center, y_center, width, height: 物体边界框的中心点坐标和宽高数值是相对于整张图片宽高的比例归一化到0-1之间。这是YOLO格式的关键例如(0.5, 0.5, 0.3, 0.4)表示边界框中心在图片正中央宽度是图片宽的30%高度是图片高的40%。3.2 组织数据集目录结构YOLOv5对数据集的目录结构有固定要求。请严格按照以下方式组织mydataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── img1.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── img100.jpg │ └── ... └── labels/ ├── train/ # 训练集标签与训练图片一一对应 │ ├── img1.txt │ └── ... └── val/ # 验证集标签与验证图片一一对应 ├── img100.txt └── ...你需要手动将总图片按一定比例如8:2拆分到train和val文件夹对应的标签文件也要同步移动。验证集用于在训练过程中定期评估模型性能防止过拟合。3.3 创建数据集配置文件这是连接你的数据和训练脚本的“桥梁”。在YOLOv5项目的data/目录下新建一个文件例如mydataset.yaml内容如下# 数据集路径建议使用绝对路径避免出错 path: /home/user/projects/yolov5/mydataset # 指向数据集根目录 train: images/train # 训练集图片路径相对于 path val: images/val # 验证集图片路径相对于 path # 类别数量 nc: 2 # 你数据集的类别数例如2类鱼和船 # 类别名称列表顺序必须与标注时的 class_id 对应 names: [fish, boat]这个配置文件告诉YOLOv5去哪找数据、有多少类、每类叫什么名字。路径一定要写对这是新手最容易出错的地方之一。4. 模型训练全流程解析4.1 启动训练理解核心参数万事俱备只欠训练。打开终端确保在yolov5项目目录下并且conda环境已激活。训练的核心命令是python train.py --img 640 --batch 16 --epochs 100 --data data/mydataset.yaml --weights yolov5s.pt --device 0这条命令信息量很大我们来拆解每个参数--img 640: 输入图片的尺寸训练时图片会被缩放到这个大小。更大的尺寸如1280可能提升精度但显著增加显存消耗和训练时间。--batch 16: 批次大小即一次输入多少张图片给模型。越大训练越稳定、越快但受限于GPU显存。如果出现“CUDA out of memory”错误首先降低这个值如改为8、4。--epochs 100: 训练轮数。整个数据集被完整遍历一次称为一个epoch。轮数太少模型学不好太多可能过拟合。通常100-300轮是个合理的起点。--data data/mydataset.yaml: 指定我们刚刚创建的数据集配置文件路径。--weights yolov5s.pt:指定预训练权重。这是关键技巧使用在COCO等大型数据集上预训练好的模型权重进行初始化而不是从头开始随机初始化这被称为迁移学习。它能极大加速收敛并提升小数据集上的最终性能。yolov5s.pt是最小的模型还有yolov5m.pt中、yolov5l.pt大、yolov5x.pt超大模型越大精度通常越高但速度越慢。--device 0: 指定使用哪块GPU训练0是第一块。如果是CPU则用--device cpu。多卡可以用--device 0,1。执行命令后你会看到终端开始刷屏输出。YOLOv5会先自动下载yolov5s.pt权重文件如果本地没有然后开始训练。4.2 解读训练过程与输出训练开始后你需要关注以下几个关键输出模型结构打印一开始会打印出模型的每一层结构你可以看到YOLOv5s是一个多么精巧的骨干网络Backbone 特征金字塔网络Neck 检测头Head的组合。热词中提到的yolov5 backbone就是指这个骨干网络通常是CSPDarknet负责提取图像特征。训练日志每个批次batch训练后会输出类似下面的信息Epoch gpu_mem box_loss obj_loss cls_loss Instances Size 0/99 3.21G 0.1xxxx 0.0xxxx 0.0xxxx 32 640gpu_mem: GPU显存使用量帮你监控资源。box_loss、obj_loss、cls_loss: 这是三个损失函数值分别衡量边界框定位误差、物体存在置信度误差和分类误差。训练的核心目标就是让这些损失值不断下降。如果损失值震荡不降或变成NaN说明学习率可能太高或数据有问题。验证结果每隔一个epoch默认模型会在验证集上跑一次输出精度指标Class Images Instances P R mAP50 mAP50-95 all 100 500 0.85 0.78 0.832 0.567 fish 100 300 0.88 0.82 0.865 0.601 boat 100 200 0.82 0.74 0.799 0.533P(Precision): 精确率模型预测为正的样本中真正为正的比例。越高说明误报越少。R(Recall): 召回率所有真实的正样本中被模型预测出来的比例。越高说明漏报越少。mAP50: 在IoU交并比阈值为0.5时的平均精度均值是衡量检测性能的核心指标越高越好。mAP50-95: 在IoU阈值从0.5到0.95步长0.05的平均mAP更严格的指标。 你的目标就是看着这些指标尤其是mAP50随着训练轮数增加而稳步上升。可视化结果保存所有训练日志、指标图表、模型权重都会自动保存在runs/train/exp目录下下次训练会变成exp2,exp3...。重点关注weights/保存了best.pt验证集上表现最好的权重和last.pt最后一轮的权重。results.png损失和精度指标随epoch变化的曲线图是分析训练过程最重要的工具。4.3 训练策略与调参经验训练不是设好参数等结果而是一个观察和调整的过程。1. 学习率Learning Rate的奥秘学习率是训练中最重要的超参数之一控制着模型参数更新的步长。YOLOv5默认使用余弦退火调度器并带有热身Warmup阶段。如果训练初期损失下降很慢可以考虑稍微增大学习率通过--lr参数默认是0.01。如果损失值剧烈震荡甚至爆炸变成NaN说明学习率太大了必须减小。对于小数据集使用预训练权重时微调Fine-tuning的学习率通常设得比从头训练小一个数量级如0.001以免破坏预训练好的特征。2. 数据增强Data AugmentationYOLOv5内置了强大的自动数据增强如马赛克Mosaic、随机翻转、色彩抖动等。这是提升模型泛化能力、防止过拟合的利器尤其对于小数据集至关重要。你可以在train.py中通过--augment参数开启或关闭。对于绝大多数情况保持默认开启即可。3. 早停Early Stopping与模型选择训练时要时刻关注验证集指标mAP50。如果连续多个epoch如20-50个该指标不再上升甚至开始下降说明模型已经过拟合了应该停止训练。直接使用runs/train/exp/weights/best.pt作为最终模型它代表了验证集上的最佳性能而不是最后一个epoch的模型。4. 应对常见训练问题显存不足CUDA Out of Memory降低--batch-size减小--img-size使用更小的模型如从yolov5m换到yolov5s。损失不下降检查数据标注是否正确标签文件格式、路径确认数据集配置文件.yaml中的nc和names是否正确尝试增大学习率--lr检查数据集是否太小或类别极度不平衡。过拟合训练集指标好验证集指标差增加数据增强确保--augment开启使用更多的正则化手段如权重衰减--weight-decay收集更多样化的训练数据减少模型复杂度换用更小的模型。5. 模型验证、推理与性能评估5.1 使用最佳模型进行验证训练结束后我们得到了best.pt。但在用它做实际预测前最好在验证集上再做一次全面的评估生成详细的报告。python val.py --weights runs/train/exp/weights/best.pt --data data/mydataset.yaml --img 640 --task val这个命令会加载我们训练好的最佳模型在验证集上运行并输出最终的精度指标表格和混淆矩阵等。它会生成一个val_batchX_labels.jpg的图片将模型的预测框彩色和真实标注框白色画在一起直观地对比模型预测的准确度。绿色框表示正确预测TP红色框表示错误预测FP没被框出的目标是漏检FN。通过观察这些图片你能快速定位模型在哪些场景、哪类物体上容易出错。5.2 对新数据执行推理检测验证通过后就可以用模型来检测新的图片或视频了。这是最有成就感的环节# 检测单张图片 python detect.py --weights runs/train/exp/weights/best.pt --source path/to/your/test_image.jpg --conf 0.25 # 检测一个文件夹下的所有图片 python detect.py --weights runs/train/exp/weights/best.pt --source path/to/test_folder/ --conf 0.25 # 检测视频文件 python detect.py --weights runs/train/exp/weights/best.pt --source path/to/your/video.mp4 --conf 0.25 # 使用摄像头实时检测0代表默认摄像头 python detect.py --weights runs/train/exp/weights/best.pt --source 0 --conf 0.25--conf 0.25: 置信度阈值。模型会输出很多预测框并给每个框一个置信度分数0-1之间。只有分数高于此阈值的预测框才会被保留和显示。调高它如0.5可以减少误报假阳性但可能增加漏报假阴性调低它则相反。你需要根据实际应用场景在精确率和召回率之间做权衡。检测结果默认保存在runs/detect/exp/下打开就能看到画好框的图片或视频。5.3 模型性能分析与优化方向拿到检测结果不是终点。你需要分析模型的表现思考如何改进。分析PR曲线和混淆矩阵在runs/train/exp目录下PR_curve.png展示了不同置信度阈值下的精确率-召回率曲线。曲线下的面积越大越好。confusion_matrix.png混淆矩阵能告诉你模型最容易把哪两类物体混淆。例如你的“鱼”类是否容易被误判为“水草”这为你下一步数据标注或收集指明了方向。速度与精度权衡YOLOv5提供了s/m/l/x不同尺寸的模型。在边缘设备如树莓派、Jetson Nano、RK3588这些在热词中频繁出现上部署时模型大小和推理速度至关重要。你可以用export.py将模型导出为ONNX或TensorRT格式以获得加速。通常的步骤是先用大模型如yolov5l追求高精度确定算法可行性再尝试用小模型yolov5s或通过剪枝、量化热词中的rknn量化来压缩模型以满足部署设备的性能要求。迭代改进深度学习项目是一个循环迭代的过程。根据验证和推理中发现的问题例如某个角度或光照条件下的鱼检测不准你需要补充数据有针对性地收集和标注更多困难样本。调整数据增强或许需要增加模拟水下光线、模糊等特殊增强。微调模型在新增的数据上使用best.pt作为预训练权重进行额外几轮的训练即增量训练或微调让模型适应新情况。6. 进阶技巧与避坑指南6.1 使用WB进行实验追踪当你的实验越来越多调整了学习率、换了数据增强方式、尝试了不同模型尺寸如何管理并对比这些实验手动记录非常低效。推荐使用Weights Biases (WB)这个强大的实验管理工具。安装pip install wandb注册并登录WB官网获取API Key。在训练命令前加上wandb登录wandb login YOUR_API_KEY正常训练YOLOv5会自动集成WB将损失曲线、指标、甚至验证图片和预测结果同步到你的WB云端面板。 这样你可以在一个漂亮的Web界面上对比所有实验的曲线清晰地看到哪种配置效果最好极大提升了调参效率。6.2 处理类别不平衡与困难样本如果你的数据集中“鱼”的图片有1000张而“沉船”只有50张模型会严重偏向于“鱼”类。解决方法数据层面对少数类图片进行过采样重复使用或对多数类图片进行欠采样。算法层面在train.py中使用--class-weights参数自动根据类别频率计算损失权重让模型更关注少数类。YOLOv5默认是开启类别权重的。主动学习用当前模型去检测一批新数据找出那些置信度不高、模棱两可的预测困难样本人工标注它们并加入训练集能高效提升模型在边界情况下的性能。6.3 模型导出与部署浅析训练出的.pt文件是PyTorch格式要在其他平台如C环境、移动端、嵌入式设备部署通常需要转换。导出为ONNXONNX是一种开放的模型交换格式。python export.py --weights runs/train/exp/weights/best.pt --include onnx这会生成一个.onnx文件可以被OpenCV DNN、TensorRT等多种推理引擎加载。针对特定硬件优化NVIDIA Jetson/TensorRT: 将ONNX模型进一步转换为TensorRT引擎.engine获得极致推理速度。瑞芯微RKNN平台使用RKNN-Toolkit将模型转换为专用的.rknn格式在RK3588、K230等芯片上部署。树莓派可以尝试使用ONNX Runtime或LibTorchPyTorch C接口进行推理。 部署是一个深水区涉及性能优化、内存管理等多方面知识但第一步总是从导出标准格式开始。6.4 我踩过的那些坑路径之殇80%的错误源于路径不对。无论是数据集yaml文件里的path还是训练/检测时指定的文件路径尽量使用绝对路径或者确保相对路径的起点工作目录是正确的。标签格式混淆YOLO格式的坐标是归一化的比例值不是像素值。用其他工具如LabelImg的VOC格式标注后务必确认转换正确。一个快速检查方法用Python写个小脚本读一个标签文件将比例坐标还原为像素坐标并在原图上画出来看看框的位置对不对。显存杀手盲目增大img-size和batch-size。训练前先用小参数如--img 320 --batch 4跑几个epoch确保流程通顺再逐步调大。时刻用nvidia-smi命令监控显存占用。迷信轮数不是epoch越多越好。要盯着验证集mAP的曲线。当曲线走平甚至下滑时继续训练就是浪费电和浪费时间还可能损害模型性能。善用best.pt。忽略数据质量垃圾进垃圾出。标注错误、类别模糊、背景干扰大的图片会让再优秀的模型也无能为力。在标注阶段多花一小时仔细检查胜过训练阶段调参一整天。
返回列表