尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv5摔倒检测实战:从数据标注到模型部署全流程解析

YOLOv5摔倒检测实战:从数据标注到模型部署全流程解析 简介目标检测是计算机视觉的核心任务之一旨在识别图像中的物体并定位其位置。其原理通常基于深度学习模型通过卷积神经网络提取特征并预测边界框和类别。这项技术的价值在于为众多智能应用提供了“视觉感知”能力是实现自动化、智能化分析的关键。在安防监控、工业质检、自动驾驶等应用场景中目标检测技术发挥着重要作用。本文聚焦于一个具体的工程实践——基于YOLOv5的摔倒检测深入探讨了模型训练与工程化部署的完整链路包括数据准备、超参数调优以及如何将训练好的模型集成到实际应用中为相关领域的开发者提供了一份详实的落地指南。1. 项目概述从“摔倒检测”到“YOLOv5源码”的工程化落地最近在社区里看到不少朋友在讨论“摔倒检测”这个应用尤其是结合YOLOv5这个目标检测框架。这确实是一个非常有价值的场景无论是用于独居老人的安全监护还是在一些特定工作场所如建筑工地、工厂车间的安全预警都有着迫切的需求。我手头正好有一个基于YOLOv5的摔倒检测项目源码并且已经完成了从环境搭建、数据准备、模型训练到部署测试的全流程。今天我就把这个过程完整地拆解一遍不仅仅是给出一份代码更重要的是分享我在这个过程中踩过的坑、总结的经验以及如何让一个听起来很“学术”的模型真正变成一个稳定、可用的工程化应用。这个项目的核心是利用YOLOv5模型识别视频或图像中的人体姿态并判断其是否处于“摔倒”状态。听起来简单但里面涉及到的细节非常多YOLOv5的版本选择和环境配置有什么讲究摔倒检测的数据集从哪里来怎么标注模型训练的超参数如何调优才能达到最好的效果训练好的模型如何部署到实际环境中比如一个简单的Web服务或者边缘设备上这些问题我都会在接下来的内容里结合源码和实操一一为你解答。无论你是刚接触计算机视觉的新手还是想将YOLOv5应用到具体业务中的开发者相信这份“实战笔记”都能给你带来直接的帮助。2. 技术选型与核心思路拆解为什么是YOLOv5在开始动手之前我们得先搞清楚为什么选择YOLOv5以及我们实现摔倒检测的基本逻辑是什么。这决定了我们后续所有工作的方向和效率。2.1 YOLOv5的版本优势与工程化友好性YOLO系列一直是实时目标检测的标杆。相比于更早的YOLOv3/v4YOLOv5在易用性和工程化方面做了巨大的改进这也是我选择它的首要原因。首先极简的环境配置与训练流程。YOLOv5官方仓库Ultralytics维护提供了非常清晰的requirements.txt依赖明确。更重要的是其训练脚本设计得如同“黑盒”般简单你只需要准备好符合格式的数据集运行train.py并指定几个关键参数训练就能自动开始中间过程的可视化损失曲线、精度指标也集成得非常好。这对于快速验证想法和迭代模型至关重要。其次灵活的模型尺寸。YOLOv5提供了从n纳米、s小、m中、l大到x超大五种预定义模型架构。YOLOv5s模型只有几兆大小在CPU上也能达到不错的帧率非常适合部署在资源受限的边缘设备而YOLOv5x则能提供更高的精度适合对准确率要求极高的服务器端应用。这种“按需取用”的灵活性让我们可以根据实际部署场景是云端服务器还是嵌入式开发板来选择合适的模型起点。再者强大的数据增强与自动化Anchor计算。YOLOv5内置了Mosaic数据增强、自适应图片缩放等策略这些都能有效提升模型泛化能力尤其是在我们自建的数据集规模可能不大的情况下。其autoanchor功能可以在训练前自动根据你的数据集重新计算聚类Anchor框尺寸避免了手动调整Anchor的麻烦通常能带来直接的精度提升。最后完善的导出生态。训练好的PyTorch模型.pt文件可以通过YOLOv5内置的export.py脚本一键导出为多种格式包括TorchScript、ONNX、CoreML、TensorRT等。这为模型部署到各种平台如使用ONNX Runtime的C#/C应用、NVIDIA Jetson等边缘设备铺平了道路。注意网络上关于YOLOv5的教程很多但质量参差不齐。强烈建议以Ultralytics的官方GitHub仓库和文档为第一手资料这是最权威、更新最及时的参考源。2.2 摔倒检测的核心逻辑从“人”到“状态”摔倒检测本质上是一个行为识别或姿态估计任务但直接用YOLOv5这类通用目标检测器来做需要一些技巧。YOLOv5本身只能输出物体的边界框Bounding Box和类别置信度。它不认识“摔倒”这个动作它只认识“人”这个类别。因此我们的核心思路是让YOLOv5学会将“处于摔倒姿态的人”识别为一个独立的类别。也就是说我们不再仅仅检测“人”person而是检测两种状态“站立/行走的人”person_standing和“摔倒的人”person_fallen。这是最直接、也最有效的方法。这带来了两个关键任务数据准备我们需要收集或制作一个数据集里面的图片既包含正常姿态的人也包含各种摔倒姿态的人侧摔、前扑、后仰等并且将他们分别标注为不同的类别。模型微调我们通常不会从零开始训练一个YOLOv5模型那样需要海量数据和计算资源。更实际的做法是迁移学习使用在COCO等大型通用数据集上预训练好的YOLOv5模型权重作为起点然后用我们的“站立/摔倒”二分类数据集去微调它。预训练模型已经具备了强大的通用特征提取能力如边缘、纹理、人体部件我们只需要让它“微调”一下学会区分这两种特定姿态即可这能极大加快收敛速度并提升最终精度。除了这种“端到端”的分类方法还有一种思路是先用人体关键点检测模型如YOLO-Pose AlphaPose检测出人体的骨骼关节点然后通过关节点之间的角度、位置关系例如人体中轴线与地面的夹角来逻辑判断是否摔倒。这种方法更符合人的直觉但流程更复杂需要串联两个模型实时性会受影响且对关键点检测的精度要求很高。对于大多数以落地应用为目标的场景我推荐第一种“端到端”分类的方法因为它更简单、更高效、更容易部署。3. 环境搭建与源码结构解析工欲善其事必先利其器。一个清晰、可复现的环境是项目成功的基石。我们首先来搭建开发环境并剖析一下项目源码的目录结构让你对整体有个把握。3.1 基于Conda的Python环境隔离我强烈建议使用Conda或Venv进行Python环境管理避免不同项目间的包版本冲突。以下是详细的步骤和版本选择考量# 1. 创建并激活一个全新的conda环境命名为yolo_falldet conda create -n yolo_falldet python3.8 -y conda activate yolo_falldet # 2. 安装PyTorch。这是最关键的一步版本必须匹配你的CUDA环境如果有GPU。 # 前往PyTorch官网https://pytorch.org/get-started/locally/获取最准确的安装命令。 # 例如对于CUDA 11.3的Linux系统 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 如果没有GPU则安装CPU版本 # pip install torch torchvision torchaudio # 3. 克隆YOLOv5官方仓库并安装依赖 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt版本选择心得Python 3.8这是一个非常稳定且与绝大多数深度学习库兼容良好的版本。不建议使用太新如3.11或太旧3.7的版本。PyTorch 1.12YOLOv5代码对PyTorch版本有一定兼容性要求。太旧的版本可能缺少某些API太新的版本如2.0在导出ONNX等操作时可能遇到未知问题。1.12.x是一个经过大量项目验证的稳定选择。CUDA版本务必与你的NVIDIA显卡驱动匹配。使用nvidia-smi命令查看最高支持的CUDA版本。安装匹配的PyTorch CUDA版本能最大化GPU利用率。3.2 项目源码目录结构详解假设我们的摔倒检测项目文件夹名为Fall_Detection_YOLOv5其结构如下。理解这个结构你就能知道各个文件的作用方便后续的修改和调试。Fall_Detection_YOLOv5/ ├── data/ │ ├── images/ # 存放所有图片训练集验证集 │ │ ├── train/ │ │ └── val/ │ └── labels/ # 存放对应的YOLO格式标注文件.txt │ ├── train/ │ └── val/ ├── dataset.yaml # **核心配置文件**定义数据集路径、类别名等 ├── models/ │ └── yolov5s.yaml # 模型配置文件我们使用yolov5s架构 ├── weights/ # 存放预训练模型和训练得到的模型 │ └── yolov5s.pt # 从官网下载的预训练权重 ├── train.py # 训练脚本 ├── detect.py # 检测/推理脚本 ├── export.py # 模型导出脚本 ├── utils/ # 工具脚本来自官方YOLOv5 └── runs/ # 训练和检测的输出目录自动生成 ├── train/ # 训练过程日志、权重、可视化结果 └── detect/ # 检测结果图片/视频关键文件解读dataset.yaml这是数据集的“说明书”。你需要在这里指明图片和标签的路径以及类别信息。内容示例# Fall Detection Dataset path: ../Fall_Detection_YOLOv5/data # 数据集根目录 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径 # 类别数量和名称 nc: 2 # number of classes names: [standing, fallen] # 类别名顺序很重要对应标注文件中的class idmodels/yolov5s.yaml我们选择yolov5s模型进行微调。你通常不需要修改这个文件除非你想自定义网络结构。关键是要确认开头的nc类别数是否改成了2以匹配我们的任务。train.py主训练脚本。我们通过命令行参数来控制整个训练过程。预训练权重yolov5s.pt需要从YOLOv5官方GitHub的Release页面下载并放入weights/目录。它提供了在COCO数据集上学习到的通用特征是我们迁移学习的基础。4. 数据准备构建高质量的摔倒检测数据集数据是模型的“粮食”质量直接决定模型性能的上限。对于摔倒检测这个相对小众的任务公开可用的高质量数据集很少我们往往需要自己动手构建。4.1 数据收集与爬取策略完全从零拍摄标注成本很高。一个高效的策略是“混合数据源”公开数据集寻找包含“摔倒”Fall场景的监控视频数据集如UR Fall Detection Dataset、Multiple Cameras Fall Dataset等。这些通常是研究机构发布的场景相对规范。网络爬取在遵守法律法规和平台协议的前提下可以从一些视频网站如YouTube搜索“fall down”、“slip and fall”等关键词下载相关视频片段。然后使用视频抽帧工具如ffmpeg将视频按一定间隔如每秒1帧抽取成图片。模拟拍摄为了增加数据的多样性和真实性可以在保证安全的前提下邀请志愿者在多种场景地板、地毯、户外、穿着不同服装、以不同姿势进行模拟摔倒并用摄像头记录。务必注意安全使用软垫等保护措施。负样本收集“站立/行走”的图片更容易获取。可以使用COCO数据集中“人”的图片或者从日常监控录像中抽取正常行走、坐、蹲的图片作为负样本。最终你的images/train和images/val文件夹里应该包含两类图片一类是各种摔倒姿态的人另一类是各种正常姿态的人。建议初始数据量至少达到训练集1000张验证集200张以上并且正负样本比例尽量均衡例如1:1到1:2之间。4.2 使用LabelImg进行YOLO格式标注我们使用LabelImg这个图形化工具进行标注。安装和使用都非常简单。# 安装LabelImg pip install labelImg # 启动 labelImg标注实操步骤与要点打开目录在LabelImg中打开存放图片的文件夹如data/images/train。设置标注格式在菜单栏选择View-Auto Save mode可选然后务必在左侧选择标注格式为YOLO默认可能是PascalVOC。创建预定义类别点击Edit-Predefined Classes输入我们的两个类别standing和fallen。这样在标注时可以直接选择避免输入错误。开始标注使用W键快速创建矩形框快捷键效率远高于鼠标。仔细框选整个人体对于摔倒姿势框应该能够完整覆盖倒地后伸展的肢体。在弹出的类别选择框中选择正确的类别standing或fallen。一张图片里可能有多个目标每个都需要标注。保存标注完成后LabelImg会自动在与图片同目录的labels文件夹下需提前建好生成一个同名的.txt文件。生成的YOLO格式标签文件.txt解读 每一行代表一个目标格式为class_id center_x center_y width heightclass_id类别索引从0开始。对应dataset.yaml中names列表的顺序。例如names: [standing, fallen]那么standing的id是0fallen的id是1。center_x, center_y边界框中心点的归一化坐标除以图片宽度和高度。width, height边界框的归一化宽高。例如一个标签文件内容可能是0 0.5 0.5 0.2 0.6 # 一个位于图片中央的站立的人 1 0.7 0.8 0.5 0.3 # 一个位于右下角摔倒的人实操心得标注质量是生命线。有几个常见坑点1)框体要紧凑框住目标即可不要留太多背景。2)处理遮挡对于被部分遮挡的人体尽可能框出可见部分。3)统一标准对于“即将摔倒”、“半蹲”等模糊状态需要提前定义好规则统一归为某一类避免歧义。建议多人标注时先一起标注几十张样本进行校准。4.3 数据集划分与配置文件编写将收集好的所有图片和对应的标签文件按照大约8:2的比例随机分成训练集和验证集分别放入images/train,labels/train和images/val,labels/val文件夹。最后编写dataset.yaml文件如上文所述确保路径正确。至此数据准备工作全部完成。5. 模型训练超参数调优与监控有了数据和环境我们就可以开始“炼丹”训练模型了。这个过程充满了技巧也是提升模型性能的关键。5.1 启动训练与核心参数解析我们使用YOLOv5官方提供的train.py脚本。一个典型的启动命令如下python train.py \ --img 640 \ # 训练图片尺寸必须是32的倍数 --batch 16 \ # 批次大小根据GPU内存调整 --epochs 100 \ # 训练轮数 --data ./dataset.yaml \ # 数据集配置文件路径 --cfg ./models/yolov5s.yaml \ # 模型配置文件路径 --weights ./weights/yolov5s.pt \ # 预训练权重路径 --name falldet_v1 \ # 本次实验的名称用于保存结果 --cache \ # 使用缓存加速加载如果内存/显存足够 --device 0 \ # 使用GPU 0如果是CPU则用 --device cpu --workers 4 # 数据加载的线程数核心参数深度解读--img 640YOLOv5支持动态尺寸训练但通常固定为640x640。更大的尺寸如1280可能提升对小目标的检测精度但会显著增加显存消耗和训练时间。对于摔倒检测人体通常是中大型目标640基本够用。--batch 16批次大小是影响训练稳定性和速度的最重要参数之一。原则是在不导致GPU内存溢出的前提下尽可能设大。更大的Batch Size意味着梯度估计更准确训练更稳定可能允许使用更大的学习率。RTX 308010G上yolov5s模型img640时batch16通常是安全的。--epochs 100轮数需要根据数据集大小和模型收敛情况来定。可以通过观察训练日志中的损失loss曲线来判断。当验证集损失不再明显下降甚至开始上升时过拟合就可以提前停止。100轮是一个常用的起始值。--weights ./weights/yolov5s.pt指定预训练权重。这是迁移学习的关键不要从零开始训练。--cache将数据集加载到内存或固态硬盘缓存中可以极大加速epoch之间的数据读取速度特别是当你的图片很多时。前提是你的内存足够大通常需要32GB以上。--workers 4数据加载的并行进程数。通常设置为CPU核心数的2-4倍。设置得太高可能导致内存占用过大。5.2 训练过程监控与指标解读训练开始后控制台会打印日志同时会在runs/train/falldet_v1目录下生成大量有用的文件。你需要重点监控以下几个文件和指标results.csv和results.png这是训练过程的“仪表盘”。results.png是一张综合图表包含损失曲线Box, Objectness, Classification三条损失都应随着epoch增加而稳步下降最终趋于平缓。如果训练损失持续下降但验证损失上升是典型的过拟合迹象。精度指标Precision, Recall, mAP0.5, mAP0.5:0.95Precision精确率模型预测为“摔倒”的目标中真正是摔倒的比例。越高越好表示误报少。Recall召回率所有真实的摔倒目标中被模型找出来的比例。越高越好表示漏报少。mAP0.5在IoU交并比阈值为0.5时的平均精度均值是衡量检测性能的核心指标。对于摔倒检测这个值通常能达到0.85以上才算一个不错的模型。mAP0.5:0.95在不同IoU阈值0.5到0.95步长0.05下的平均mAP是更严格的指标。train_batchx.jpg和val_batchx_labels.jpg这些图片展示了训练/验证批次的数据增强效果和标签情况。检查它们可以确保数据加载和增强是正确的标签是对齐的。weights/目录下的模型文件best.pt在验证集上表现最好的权重根据mAP0.5:0.95指标。last.pt最后一个epoch的权重。部署时应使用best.pt。5.3 超参数调优实战技巧如果初始训练结果不理想不要灰心调参是必经之路。YOLOv5提供了一个超参数配置文件data/hyps/hyp.scratch-low.yaml我们可以基于它进行修改。关键可调超参数lr0初始学习率。太大容易震荡不收敛太小收敛慢。一般从0.01开始尝试。如果使用预训练权重可以设小一点如0.001。lrf最终学习率与初始学习率的比值用于余弦退火调度。lr0 * lrf就是训练结束时的学习率。momentum优化器动量一般保持0.937不变。weight_decay权重衰减用于防止过拟合。可以尝试从0.0005微调。warmup_epochs学习率预热轮数。在训练初期学习率从0线性增加到lr0有助于稳定训练。数据集较小时可以适当增加如3-5轮。hsv_h,hsv_s,hsv_vHSV颜色空间增强的强度。可以适当增加如0.015来提升模型对光照变化的鲁棒性。translate,scale,shear几何变换增强的强度。对于摔倒检测可以适当增加translate平移和scale缩放模拟不同距离和角度下的摔倒。调参策略先进行1-2个epoch的快速试跑确保代码、数据路径无误损失在正常下降。固定其他参数每次只调整1-2个观察mAP0.5的变化。建议优先调整lr0和weight_decay。使用TensorBoard进行可视化YOLOv5默认集成了TensorBoard。在训练命令后加上--logger tensorboard然后运行tensorboard --logdir runs/train可以在浏览器中更直观地对比不同实验的曲线。如果过拟合明显训练集指标远好于验证集可以尝试增加数据增强强度、使用--label-smoothing参数、增大weight_decay、或者使用更小的模型如从yolov5m换到yolov5s。如果欠拟合训练集指标也很差可以尝试减少数据增强、增大模型如换到yolov5m、增加训练轮数、或者稍微增大学习率。6. 模型推理与部署应用训练出满意的模型后下一步就是让它“干活”即对新的图片或视频进行推理并集成到实际应用中。6.1 使用detect.py进行快速验证YOLOv5提供了非常方便的detect.py脚本用于快速测试模型效果。python detect.py \ --weights ./runs/train/falldet_v1/weights/best.pt \ # 使用我们训练好的最佳模型 --source ./test_video.mp4 \ # 输入源可以是图片、视频、文件夹或摄像头0 --img 640 \ # 推理尺寸通常与训练一致 --conf 0.5 \ # 置信度阈值高于此值才显示 --iou 0.45 \ # NMS的IoU阈值 --device 0 \ # 使用GPU --save-txt \ # 保存检测结果的标签文件 --save-conf \ # 在标签文件中保存置信度 --name falldet_demo # 输出结果保存的目录名运行后检测结果会保存在runs/detect/falldet_demo目录下里面包含了画好检测框的图片或视频。参数调优建议--conf这是最重要的参数之一。置信度阈值直接决定了系统的敏感度。设得太高如0.8很多正确的检测会被过滤掉漏报设得太低如0.2会产生很多错误的检测误报。需要通过验证集反复测试找到一个平衡点。对于安全要求高的摔倒检测可能倾向于调低阈值以提高召回率宁可误报不可漏报但需要后端逻辑做进一步过滤。--iou非极大值抑制阈值。当同一个目标被多个框预测时用于剔除冗余框。默认0.45适用于大多数情况如果发现同一个目标被重复框出可以适当调低如0.3。6.2 将模型集成到Python应用中在实际项目中我们很少直接调用命令行脚本。我们需要将模型加载到Python代码中以便集成到Web服务、桌面应用或自动化脚本里。YOLOv5提供了简洁的API。import torch import cv2 import numpy as np class FallDetector: def __init__(self, model_path, conf_thres0.5, iou_thres0.45, devicecuda:0): 初始化摔倒检测器 Args: model_path: 训练好的.pt模型文件路径 conf_thres: 置信度阈值 iou_thres: NMS IoU阈值 device: 推理设备cuda:0 或 cpu self.device torch.device(device if torch.cuda.is_available() else cpu) # 加载模型 self.model torch.hub.load(ultralytics/yolov5, custom, pathmodel_path, force_reloadFalse) self.model.to(self.device).eval() self.model.conf conf_thres # 置信度阈值 self.model.iou iou_thres # NMS IoU阈值 # 获取类别名 self.names self.model.names def detect(self, image_bgr): 对单张BGR格式的OpenCV图像进行检测 Args: image_bgr: numpy数组BGR格式 Returns: results: 检测结果包含框、置信度、类别等信息 annotated_img: 绘制了检测框的图像 # YOLOv5模型期望RGB格式 image_rgb cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) # 进行推理 with torch.no_grad(): results self.model(image_rgb) # 解析结果 detections results.xyxy[0].cpu().numpy() # 格式: [x1, y1, x2, y2, conf, class] # 绘制结果 annotated_img image_bgr.copy() for det in detections: x1, y1, x2, y2, conf, cls_id map(int, det[:6]) if det[-1].is_integer() else (*map(int, det[:4]), det[4], int(det[5])) label f{self.names[cls_id]} {conf:.2f} # 画框和标签 color (0, 255, 0) if self.names[cls_id] standing else (0, 0, 255) # 绿色-站立红色-摔倒 cv2.rectangle(annotated_img, (x1, y1), (x2, y2), color, 2) cv2.putText(annotated_img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) return results, annotated_img # 使用示例 if __name__ __main__: detector FallDetector(./runs/train/falldet_v1/weights/best.pt, conf_thres0.5) cap cv2.VideoCapture(0) # 打开摄像头 while True: ret, frame cap.read() if not ret: break results, annotated_frame detector.detect(frame) cv2.imshow(Fall Detection, annotated_frame) # 可以在这里添加业务逻辑例如检测到‘fallen’就触发报警 detections results.xyxy[0].cpu().numpy() for det in detections: if len(det) 6 and det[5] 1: # 类别id 1 对应 fallen print([警报] 检测到摔倒) # 触发声音、灯光、发送通知等... if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这段代码封装了一个简单的检测类你可以轻松地将其嵌入到Flask/Django Web后端或者与PyQt等GUI框架结合构建一个完整的监控应用。6.3 模型优化与加速部署当应用对实时性要求极高如多路视频流分析或需要在资源受限的设备如树莓派、Jetson Nano上运行时就需要对模型进行优化和加速。1. 模型导出为ONNX/TensorRTPyTorch模型.pt在推理时存在一定的开销。导出为ONNX或TensorRT格式可以显著提升推理速度。# 导出为ONNX格式 python export.py --weights ./runs/train/falldet_v1/weights/best.pt --include onnx # 导出为TensorRT格式需要先安装TensorRT python export.py --weights ./runs/train/falldet_v1/weights/best.pt --include engine --device 0ONNX模型可以被多种推理引擎ONNX Runtime, OpenVINO等加载实现跨平台部署。TensorRT是NVIDIA GPU上的极致优化方案通常能获得数倍的性能提升。2. 使用更高效的推理后端ONNX Runtime支持CPU和GPU部署简单性能优于原生PyTorch。TensorRTNVIDIA官方推理优化器通过层融合、精度校准FP16/INT8等技术在NVIDIA GPU上能达到最快的速度。INT8量化甚至可以在精度损失极小的情况下进一步提升速度并降低显存占用。OpenVINOIntel推出的工具套件对于Intel CPU和集成显卡有非常好的优化。3. 工程化优化技巧批处理Batch Inference如果同时处理多张图片将它们组成一个批次Batch输入模型比逐张处理要高效得多因为GPU的并行计算能力得到了充分利用。异步处理在Web服务中使用异步框架如FastAPI处理推理请求避免阻塞。模型剪枝与蒸馏如果对模型大小有极端要求可以探索模型剪枝移除不重要的神经元连接或知识蒸馏用大模型教小模型来获得更小、更快的模型但这通常需要更深入的研究和实验。7. 常见问题排查与性能优化实录在实际开发和部署过程中你一定会遇到各种各样的问题。这里我记录了一些典型问题的排查思路和解决方法。7.1 训练阶段常见问题问题1Loss损失为NaN或突然变得巨大。可能原因学习率lr0设置过高数据中存在损坏的图片或标签批次大小batch太大导致梯度爆炸。排查步骤检查数据集运行python -c from utils.general import *; check_dataset(data/dataset.yaml)验证数据路径和标签格式是否正确。将学习率lr0降低一个数量级例如从0.01降到0.001重新训练。减小批次大小batch。在train.py命令中添加--hyp data/hyps/hyp.scratch-low.yaml使用更保守的超参数。问题2验证集mAP很低但训练集mAP很高过拟合。可能原因训练数据量太少数据增强不够模型过于复杂训练轮数太多。解决方案增加数据收集更多样化的摔倒和站立数据特别是验证集中表现差的场景。增强数据在hyp.yaml文件中增大数据增强参数如hsv_h/s/v,translate,scale。正则化增大weight_decay参数如从0.0005增加到0.001使用--label-smoothing 0.1参数。简化模型换用更小的模型如从yolov5m换到yolov5s。早停Early Stopping监控验证集mAP当其连续多个epoch不再提升时手动停止训练。问题3某个类别如“摔倒”的AP平均精度始终为0。可能原因数据集中该类别的样本数量严重不足标签错误该类别的class_id与dataset.yaml中的names列表不匹配。排查步骤检查dataset.yaml中names列表的顺序确保与标注时的class_id一致。使用脚本统计每个类别的样本数量。如果“摔倒”样本远少于“站立”需要补充数据或使用类别权重Focal Loss等YOLOv5默认已使用。检查“摔倒”类别的标注质量是否框得太小或太大是否包含了大量模糊、难以判断的样本。7.2 推理部署阶段常见问题问题1推理速度慢FPS帧率低。可能原因模型过大推理尺寸img过大使用了CPU进行推理没有进行模型优化。优化策略模型层面换用更小的模型yolov5n或yolov5s。输入层面减小推理图片尺寸如从640降到320这会以牺牲一定精度为代价换取速度大幅提升。硬件层面确保使用GPU--device 0并安装了正确的CUDA和PyTorch GPU版本。使用nvidia-smi命令查看GPU是否被占用。优化层面将模型导出为TensorRT或ONNX格式并使用对应的推理引擎。对于TensorRT可以尝试FP16甚至INT8量化。问题2误报False Positive率高把坐、蹲下等姿势识别为摔倒。可能原因训练数据中“摔倒”和“非摔倒”的边界样本不足置信度阈值conf设置过低。解决方案数据层面在数据集中增加更多“易混淆”的负样本如坐在地上、弯腰捡东西、躺下休息等并明确标注为standing或新增一个sitting类别。后处理层面提高--conf阈值。可以针对“摔倒”类别单独设置一个更高的阈值。逻辑层面加入时间连续性判断。真正的摔倒是一个连续过程可以要求连续多帧如5帧都被检测为“摔倒”才最终触发报警这样可以过滤掉瞬间的误检。问题3漏报False Negative率高某些摔倒姿势检测不到。可能原因训练数据中缺少此类摔倒姿势如特定角度的摔倒、被部分遮挡的摔倒模型泛化能力不足。解决方案补充数据针对性收集和标注漏检场景的数据加入训练集重新训练。调整模型尝试使用更大的模型如yolov5m或增加输入图片尺寸--img 1280。降低阈值适当降低--conf阈值但需与误报率权衡。7.3 性能优化速查表问题现象可能原因排查与优化方向训练Loss为NaN学习率过高、坏数据、梯度爆炸1. 降低lr02. 检查数据与标签3. 减小batch4. 使用hyp.scratch-low.yaml过拟合训练好验证差数据少、模型复杂、训练久1. 增加数据/增强2. 增大weight_decay3. 换更小模型4. 早停某类别AP为0样本极少、标签ID错误1. 检查dataset.yaml的names顺序2. 统计并补充该类数据推理速度慢模型大、分辨率高、用CPU1. 换yolov5n/s模型2. 降低--img尺寸3. 确保使用GPU4. 导出为TensorRT/ONNX误报多混淆样本少、置信度阈值低1. 增加易混淆负样本2. 提高--conf阈值3. 加入多帧确认逻辑漏报多缺少特定场景数据、模型能力不足1. 补充漏检场景数据2. 换更大模型或增大输入尺寸3. 适当降低--conf阈值这个项目从构思到落地最深的体会就是“数据决定上限调参逼近上限”。一份干净、多样、标注准确的数据集远比折腾复杂的网络结构来得有效。在调参时要有耐心像做实验一样控制变量并善用TensorBoard这样的可视化工具来对比分析。最后模型的部署不是终点而是起点。在实际场景中持续收集bad case模型判错的样本不断迭代优化数据集和模型才能让一个演示系统变成一个真正可靠的产品。本文还有配套的精品资源点击获取
返回列表