基于YOLOv5的摔倒检测系统:从模型训练到边缘部署全流程实战

发布时间:2026/8/28 22:47:58
基于YOLOv5的摔倒检测系统:从模型训练到边缘部署全流程实战 简介目标检测是计算机视觉的核心任务之一旨在识别和定位图像中的物体。其原理通常基于深度学习模型通过卷积神经网络提取特征并预测边界框与类别。这项技术在安防监控、自动驾驶和工业质检等领域具有重要价值。在安防监控场景中实时、精准的人体行为识别尤为关键。本文聚焦于利用YOLOv5这一流行的实时目标检测框架解决摔倒检测这一具体应用难题。文章详细阐述了如何针对摔倒检测任务进行数据准备、模型训练调优并重点介绍了将训练好的模型通过ONNX等格式进行转换以部署到Jetson、RK3568等边缘计算设备的完整工程路径为构建实用的养老监护与安全监控系统提供了清晰的实践指南。1. 项目概述从源码到落地构建一个实用的摔倒检测系统最近在社区里看到不少朋友对基于YOLOv5的摔倒检测项目感兴趣尤其是在养老监护、公共场所安全监控等场景下这个需求变得愈发迫切。我自己也花了些时间从零开始研究并实现了一套可运行的摔倒检测系统。这不仅仅是跑通一个开源代码那么简单它涉及到从环境搭建、数据准备、模型训练调优到最终部署和性能优化的完整链路。今天我就把自己趟过的路、踩过的坑以及一些关键的实操心得系统地梳理出来。无论你是刚接触计算机视觉的新手还是想将YOLOv5应用到具体业务中的开发者这篇内容都能给你提供一个清晰的、可复现的路线图。我们的目标很明确拿到一份“yolov5摔倒检测源码”后不仅能让它跑起来更要理解其每一部分是如何工作的并能根据实际需求进行有效的定制和优化。2. 核心思路与技术选型解析2.1 为什么选择YOLOv5进行摔倒检测摔倒检测本质上是一个特定的目标检测问题需要在一段视频或一系列图像帧中实时、准确地定位出“人”这个目标并判断其姿态是否属于“摔倒”状态。在众多目标检测模型中YOLOv5之所以成为这个场景下的热门选择是基于以下几个核心考量首先是速度与精度的平衡。YOLO系列一贯以“单次前向传播”的极高推理速度著称。YOLOv5在继承这一优点的同时通过更高效的网络结构如CSPDarknet53 backbone PANet neck和更先进的训练技巧在保持实时性的前提下在主流GPU上可达每秒几十甚至上百帧提供了相当不错的检测精度。对于摔倒检测这种需要7x24小时持续监控的应用实时性是刚需否则预警就失去了意义。其次是工程化友好度。YOLOv5的代码库由PyTorch实现结构清晰文档相对完善并且提供了从YOLOv5s小型到YOLOv5x大型一系列预训练模型。这意味着我们可以利用在COCO等大型数据集上预训练的权重进行迁移学习这对于我们数据量可能有限的摔倒检测任务来说是快速提升模型性能的捷径。其提供的完整训练pipeline数据准备、训练、验证、导出大大降低了开发门槛。最后是社区生态与可定制性。YOLOv5拥有极其活跃的社区这意味着遇到问题时更容易找到解决方案或讨论。更重要的是其模块化设计使得我们可以相对方便地修改网络结构、替换损失函数或添加注意力机制等以适应摔倒检测任务的特殊需求例如摔倒的人体姿态往往与站立/行走有显著差异。2.2 摔倒检测任务的关键挑战与应对思路直接使用通用的人体检测模型只能框出“人”是无法完成摔倒检测的。我们必须让模型学会区分“站立/行走”和“摔倒”这两种状态。这里有几个核心挑战姿态定义的模糊性什么是“摔倒”是平躺、侧卧、还是蜷缩倒地不同场景、不同年龄段的摔倒姿态差异很大。这要求我们的数据集必须尽可能覆盖多样化的摔倒姿态。遮挡与复杂背景在实际监控场景中人可能被家具、其他行人部分遮挡背景也可能杂乱。模型需要具备较强的抗干扰能力。实时性与资源限制最终系统可能需要部署在边缘设备如Jetson Nano, RK3568, RV1106等上这对模型的计算量和内存占用提出了苛刻要求。我们的应对思路是“检测分类”两步走但通过一个模型端到端实现基础能力利用YOLOv5强大的目标检测能力精准定位视频帧中的每一个人体。状态判别在YOLOv5的检测头head部分我们不仅预测边界框bbox和物体置信度obj还要增加一个“摔倒状态”的分类分支。也就是说模型的输出会包含[x, y, w, h, confidence, class]其中class在这里只有两类0: person_standing(或正常) 和1: person_fallen。数据驱动通过精心准备和标注的“摔倒”与“非摔倒”人体图像数据集让模型从数据中学习到这两种状态在视觉特征上的区别。3. 环境搭建与源码结构剖析3.1 稳扎稳打YOLOv5运行环境配置指南拿到源码后第一步就是配环境。很多问题都源于环境配置不兼容。我推荐使用conda创建独立的Python环境避免包冲突。# 1. 创建并激活环境 (以Python 3.8为例这是一个兼容性较好的版本) conda create -n yolov5_falldet python3.8 conda activate yolov5_falldet # 2. 安装PyTorch (请根据你的CUDA版本到PyTorch官网选择对应命令) # 例如对于CUDA 11.3 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 3. 克隆YOLOv5官方仓库如果你拿到的源码是基于此的 git clone https://github.com/ultralytics/yolov5 cd yolov5 # 4. 安装依赖项 pip install -r requirements.txt注意requirements.txt里的opencv-python在某些系统上可能需要先安装一些系统库。如果安装失败可以尝试pip install opencv-python-headless这是一个更轻量的版本通常兼容性更好。关键依赖解读torchtorchvision: 模型骨架无需多言。opencv-python: 用于图像/视频的读取、处理和显示。pillow: 图像处理。matplotlib: 绘制训练曲线和检测结果。tensorboard: 可视化训练过程非常关键一定要装。pycocotools: 用于计算mAP等评估指标。3.2 源码目录结构深度解析理解源码结构是进行二次开发的基础。一个典型的YOLOv5项目目录如下yolov5_falldetection/ ├── data/ │ ├── custom.yaml # **核心**你的摔倒数据集配置文件 │ └── images/ labels/ # 存放图片和标注文件通常按train/val划分 ├── models/ │ ├── yolov5s.yaml # YOLOv5s模型结构定义文件 │ ├── yolov5m.yaml # 等等... 你可以选择或修改 │ └── common.py # 包含Conv, Bottleneck, C3等通用模块 ├── utils/ │ ├── datasets.py # 数据加载和增强逻辑 │ ├── general.py # 画框、计算指标等通用函数 │ ├── metrics.py # 计算精度、召回率、mAP │ ├── plots.py # 绘图函数 │ └── torch_utils.py # 模型训练相关工具 ├── runs/ │ ├── train/ # 训练日志、权重、结果都保存在这里 │ └── detect/ # 检测结果输出目录 ├── train.py # **核心**模型训练入口脚本 ├── detect.py # **核心**模型推理/检测入口脚本 ├── val.py # 模型验证脚本 ├── export.py # 模型导出脚本转ONNX, TensorRT等 └── requirements.txt你需要重点关注和修改的文件data/custom.yaml: 这是你项目的“数据地图”。你需要在这里定义数据集的路径、类别名称和数量。# custom.yaml 示例 path: ../datasets/falldet # 数据集根目录 train: images/train # 训练集图片路径相对于 path val: images/val # 验证集图片路径 # 类别数量 nc: 2 # 我们只有2个类别正常人和摔倒的人 # 类别名称 names: [person_normal, person_fallen]models/yolov5s.yaml: 如果你需要修改网络结构例如为摔倒检测任务增加一个注意力模块你需要在这里修改。对于初学者建议先使用默认结构。train.py和detect.py: 这是你主要交互的脚本通过命令行参数控制所有行为。4. 数据集准备与标注实战4.1 数据收集寻找与生成摔倒图像数据是模型的基石。对于摔倒检测公开可用的高质量数据集并不多如UR Fall Detection Dataset, Multicam Fall Dataset但数据量往往有限且场景可能单一。我的策略是“公开数据自制数据数据增强”组合拳公开数据集尽可能收集多个公开的摔倒数据集整合使用。网络爬取与模拟在严格遵守法律法规和伦理的前提下可以从一些公开的视频网站如某些监控视频集或电影片段中截取包含摔倒动作的帧。更安全有效的方法是使用模拟器或3D动画如使用UnityARKit模拟摔倒生成数据这样可以精准控制姿态、光照和背景。关键点确保数据多样性包括不同年龄段老人、成年人、不同着装、不同摔倒方向前摔、后摔、侧摔、不同环境室内、室外、白天、夜晚以及不同程度的遮挡。4.2 数据标注YOLO格式详解与技巧YOLO格式的标注文件.txt是与图像文件同名的文本文件每行代表一个物体格式为class_id x_center y_center width height坐标和宽高都是相对于图片宽度和高度的归一化值0到1之间。使用工具强烈推荐使用labelImg或CVAT这类图形化标注工具。将标注格式设置为YOLO。标注实操心得框体选择对于摔倒的人边界框应紧密贴合人体轮廓。对于蜷缩或伸展姿态框可以适当调整但要确保包含整个身体即使部分在画面外。类别定义清晰定义你的两个类别。例如person_normal包括站立、行走、坐着等所有非摔倒姿态。person_fallen则明确为人体主轴与地面夹角很小近似水平的状态。验证集划分通常按照 8:1:1 或 7:2:1 划分训练集、验证集和测试集。务必确保验证集和测试集与训练集的数据分布场景、光照、姿态没有重大偏差否则评估结果会严重失真。可以使用sklearn.model_selection的train_test_split进行随机但分层的划分。4.3 数据增强针对摔倒检测的专项策略YOLOv5的utils/datasets.py内置了强大的数据增强Mosaic, MixUp等。但对于摔倒检测我们可以有一些针对性的考虑空间增强旋转小角度、平移、缩放对摔倒检测很有用可以模拟不同视角。颜色增强调整亮度、对比度、饱和度、色调模拟不同光照条件。模拟遮挡可以随机添加一些矩形遮挡块提升模型在局部被遮挡时的鲁棒性。注意增强不宜过度。特别是翻转左右、上下要谨慎因为摔倒具有方向性上下翻转可能会生成不合理的姿态。建议在训练脚本中通过--augment参数控制增强强度并观察Tensorboard中增强后的图片预览确保生成的训练样本是合理的。5. 模型训练与超参数调优全记录5.1 启动训练命令参数深度解读假设你的数据集按上述custom.yaml配置好你可以开始第一次训练了python train.py \ --img 640 \ # 训练图像尺寸保持640平衡速度和精度 --batch 16 \ # 批次大小根据你的GPU内存调整。8G显存可尝试16。 --epochs 100 \ # 训练轮数摔倒检测任务通常需要100-200轮 --data data/custom.yaml \ # 指向你的数据集配置文件 --cfg models/yolov5s.yaml \ # 选择模型结构从s最小开始 --weights yolov5s.pt \ # 加载预训练权重这是迁移学习的关键能加速收敛。 --name falldet_s_v1 \ # 本次实验的名称用于在runs/train/下创建文件夹 --cache \ # 使用缓存加速数据加载如果内存/磁盘足够 --device 0 \ # 使用GPU 0如果是CPU则用 --device cpu --workers 4 # 数据加载的进程数根据CPU核心数调整关键参数解析--weights yolov5s.pt: 这是至关重要的一步。它从YOLOv5官方下载在COCO上预训练的权重进行初始化。相比于随机初始化这能让模型从一个很高的起点开始学习“如何检测人”我们只需要微调它去区分是否摔倒。--img 640: YOLOv5默认的训练和推理尺寸。更大的尺寸如1280可能提升对小目标的检测精度但会显著增加计算量和内存消耗需要同步调整--batch-size。--cache: 将数据集加载到内存或磁盘缓存中可以极大加快训练速度尤其是当你的图片很多时。5.2 训练过程监控与指标解读训练开始后控制台会输出损失值。但真正重要的是使用TensorBoardtensorboard --logdir runs/train然后在浏览器打开http://localhost:6006。你需要重点关注以下几个面板Scalars (标量):train/box_loss,train/obj_loss,train/cls_loss: 这三个损失值应随着训练持续下降并逐渐趋于平缓。如果出现剧烈震荡或上升可能是学习率过大或数据有问题。metrics/precision,metrics/recall,metrics/mAP0.5,metrics/mAP0.5:0.95: 这是核心性能指标。mAP0.5(即IoU阈值为0.5时的平均精度) 是我们主要关注的。一个较好的摔倒检测模型在验证集上的mAP0.5应能达到0.85以上。mAP0.5:0.95是更严格的指标。Images (图像):查看训练和验证批次经过数据增强和模型预测后的效果直观检查模型的学习情况。HParams (超参数):如果你进行了多次实验可以在这里对比不同超参数下的效果。5.3 超参数调优实战让模型性能更上一层楼YOLOv5的主要超参数定义在data/hyps/hyp.scratch.yaml从头训练或hyp.finetune.yaml微调中。对于我们的迁移学习任务建议基于hyp.finetune.yaml进行调整。需要重点调整的几个参数学习率 (lr0):这是最重要的超参数。预训练权重微调时学习率不宜过大。默认的0.01可能偏高。我通常会先尝试0.001或0.0005。可以使用--hyp参数指定自定义的超参数文件。python train.py ... --hyp data/hyps/hyp.finetune.yaml在自定义的yaml文件中将lr0修改为0.001。优化器动量 (momentum) 和权重衰减 (weight_decay):一般保持默认即可。权重衰减有助于防止过拟合。数据增强强度:在超参数文件中有hsv_h,hsv_s,hsv_v(色调、饱和度、明度增强)degrees(旋转)translate(平移)scale(缩放) 等参数。如果你的数据集背景复杂可以适当增强增大数值。如果数据集较小可以增强得强一些。但切记观察Images面板确保增强后的图片是合理的。调优流程建议基线实验使用默认超参数和yolov5s.pt权重训练50轮记录最终的mAP。学习率搜索固定其他参数尝试lr0 [0.01, 0.001, 0.0005]各训练50轮选择验证集损失下降最平稳、最终mAP最高的那个。模型大小选择在确定学习率后可以尝试更大的模型如yolov5m.pt或yolov5l.pt。更大的模型容量更高通常能获得更好的精度但推理速度会下降。这是一个精度与速度的权衡。对于边缘部署yolov5s或yolov5m往往是更实际的选择。数据增强调整根据基线模型的过拟合/欠拟合情况调整增强强度。如果训练集精度远高于验证集过拟合则增强强度如果两者都低欠拟合则可能模型容量不够或数据有问题。6. 模型评估、推理与部署实战6.1 模型性能评估不仅仅是看mAP训练完成后在runs/train/falldet_s_v1/weights/目录下会有两个关键权重文件best.pt(验证集上表现最好的) 和last.pt(最后一轮的)。我们使用best.pt进行评估和推理。使用val.py进行详细评估python val.py \ --data data/custom.yaml \ --weights runs/train/falldet_s_v1/weights/best.pt \ --img 640 \ --batch 32 \ --task val \ # 在验证集上评估 --name eval_v1 \ --save-txt # 可选保存预测的标签文件用于进一步分析评估报告会生成一个results.txt文件并打印在终端。除了mAP要特别关注每个类别的精度和召回率确保person_fallen这个类别的召回率Recall足够高。在安全监控场景下漏报摔倒没检测到比误报正常误判为摔倒更严重。因此我们宁愿模型敏感一些召回率高即使精度略有牺牲。混淆矩阵 (confusion matrix):在TensorBoard或生成的图片中查看看模型主要混淆在什么地方。是person_normal和person_fallen之间的混淆还是把背景误判成了人6.2 使用训练好的模型进行推理使用detect.py脚本对图片、视频或摄像头流进行实时检测# 检测单张图片 python detect.py \ --source path/to/your/test_image.jpg \ --weights runs/train/falldet_s_v1/weights/best.pt \ --img 640 \ --conf 0.25 \ # 置信度阈值高于此值才显示。可根据需求调整。 --save-txt # 保存检测结果TXT格式 --save-conf # 在保存的标签中包含置信度 --save-crop # 可选保存裁剪出的检测目标 # 检测视频文件 python detect.py --source path/to/your/video.mp4 ... # 使用摄像头例如默认摄像头0 python detect.py --source 0 ...关键参数--conf: 这是控制模型“敏感度”的阀门。调低如0.15会让模型检出更多目标但误报可能增加调高如0.5则更严格漏报可能增加。对于摔倒检测我建议先在验证集上测试选择一个能保证高召回率的阈值比如0.2或0.25。--save-txt: 保存的TXT文件格式与训练标签相同可用于后续的统计分析或触发报警逻辑。6.3 模型部署优化从PyTorch到生产环境直接使用PyTorch的.pt文件在生产环境中推理效率并非最优。我们需要将其转换为更高效的格式。导出为ONNX格式ONNX是一个开放的模型交换格式可以被多种推理引擎支持。python export.py \ --weights runs/train/falldet_s_v1/weights/best.pt \ --img 640 640 \ # 输入图片尺寸 (高 宽) --batch 1 \ # 批次大小部署时通常为1 --device cpu \ # 导出时使用的设备 --include onnx \ # 导出为ONNX --opset 12 # ONNX算子集版本导出后你会得到一个best.onnx文件。你可以使用Netron工具可视化这个模型检查其结构。使用ONNX Runtime进行推理ONNX Runtime是一个高性能推理引擎。import onnxruntime as ort import cv2 import numpy as np # 加载ONNX模型 session ort.InferenceSession(best.onnx) # 预处理图片 (需要与训练时保持一致BGR-RGB, 归一化调整尺寸等) # ... 预处理代码 ... # 运行推理 inputs {session.get_inputs()[0].name: processed_img} outputs session.run(None, inputs) # 后处理 outputs 得到检测框这种方式比纯PyTorch推理通常有速度提升且不依赖PyTorch环境。针对边缘设备的优化如RK3568, RV1106TensorRT (NVIDIA Jetson):如果你部署在Jetson设备上可以将ONNX模型进一步转换为TensorRT引擎获得极致的加速。RKNN (Rockchip平台):对于RK3568、RV1106这类瑞芯微芯片需要使用官方的RKNN Toolkit将ONNX或PyTorch模型转换成其专用的RKNN格式才能发挥NPU的算力。NCNN/MNN/TFLite (其他移动端/CPU):对于其他ARM设备或纯CPU环境可以考虑腾讯的NCNN、阿里的MNN或TensorFlow Lite。这通常需要先将PyTorch模型转到ONNX再转到对应框架或者直接使用PyTorch Mobile。部署核心心得部署环节的代码预处理、后处理必须与训练时严格一致。图片的归一化方式/255.0、通道顺序RGB还是BGR、输入尺寸640x640等任何细微差别都会导致性能严重下降甚至完全失效。建议将预处理和后处理逻辑封装成函数在训练和部署中复用。7. 常见问题排查与性能优化技巧7.1 训练阶段常见“坑”与解决方案问题现象可能原因排查与解决思路Loss值为NaN学习率过大数据中存在损坏的图片或标签梯度爆炸。1. 大幅降低学习率如设为1e-5。2. 检查数据集用--check-images和--check-labels参数运行训练脚本自动找出问题数据。3. 使用梯度裁剪 (--clip-grad参数)。mAP始终很低0.5数据标注质量差类别不平衡模型容量不足或预训练权重未加载。1. 仔细检查验证集预测结果看框是否准确是否混淆严重。修正错误标注。2. 如果person_fallen样本远少于person_normal尝试在数据加载时过采样摔倒样本或使用类别权重。3. 确认训练命令中包含了--weights yolov5s.pt。尝试换用更大的模型如yolov5m。过拟合训练集mAP高验证集mAP低训练数据量太少数据增强不够训练轮数过多。1. 收集更多数据尤其是覆盖不同场景的验证集数据。2. 增强数据增强强度调整超参数文件中的增强参数。3. 使用早停Early Stopping观察验证集mAP不再提升时停止训练。YOLOv5本身有模型保存策略best.pt就是基于验证集指标的。训练速度慢批次大小batch size太小未使用--cacheCPU数据加载是瓶颈。1. 在GPU内存允许范围内尽可能增大--batch-size。2. 添加--cache参数使用内存或磁盘缓存。3. 增加--workers数量通常设为CPU核心数并确保数据存储在SSD上。7.2 推理阶段问题与优化问题现象可能原因排查与解决思路漏检严重召回率低置信度阈值--conf设得过高训练数据中某些摔倒姿态覆盖不足目标尺寸太小。1. 降低--conf阈值如从0.25降到0.15或0.1。2. 补充难以检测的摔倒姿态数据重新训练。3. 尝试增大模型输入尺寸--img如从640到1280但这会降低速度。误检多精度低置信度阈值--conf设得过低训练数据中包含容易混淆的非人体物体。1. 提高--conf阈值。2. 在数据集中加入更多“困难负样本”容易被误检为人的物体如椅子、雕像、植物等并标注为背景或忽略。推理速度不达标模型过大输入尺寸过大未使用优化后的推理引擎。1. 换用更小的模型变体如从yolov5m换回yolov5s。2. 减小--img尺寸如从640到320速度会成倍提升但精度会下降需权衡。3. 务必进行模型转换和部署优化ONNX, TensorRT等这是提升推理速度最有效的手段。部署后结果与训练时不一致预处理/后处理代码不一致输入数据格式如RGB/BGR错误运行环境差异。1.绝对确保部署代码中的图像预处理缩放、归一化、通道转换与训练时datasets.py中的逻辑完全一致。建议将预处理函数单独模块化两边调用同一个函数。2. 在部署环境中用一张已知结果的图片进行端到端测试对比输出。7.3 提升摔倒检测鲁棒性的独家技巧时序信息融合单纯的单帧图像检测可能会因为瞬间的相似姿态如弯腰捡东西而产生误报。一个有效的技巧是加入简单的时序平滑。例如连续N帧如5帧中有M帧如3帧检测为摔倒才最终判定为摔倒事件。这可以滤除大部分瞬时误报。# 伪代码示例 fall_buffer [] # 一个固定长度的队列 threshold_frames 3 buffer_size 5 for frame in video_stream: result model.detect(frame) if person_fallen in result: fall_buffer.append(1) else: fall_buffer.append(0) if len(fall_buffer) buffer_size: fall_buffer.pop(0) if sum(fall_buffer) threshold_frames: trigger_alarm() # 触发警报关键点辅助判断进阶如果条件允许可以结合人体关键点检测模型如YOLOv8-Pose, MMPose。通过计算人体关键点如肩膀、臀部、脚踝之间的角度或与地面的相对位置可以设计更复杂的规则来判断摔倒与YOLOv5的检测结果进行融合决策能进一步提升准确率减少误报。针对场景的微调如果你的系统最终部署在养老院房间那么就用该房间的真实监控数据需经合规处理对模型进行最后的微调fine-tune。即使只有几百张新场景的数据也能显著提升模型在该特定环境下的表现。这就是所谓的“领域自适应”。从一份“yolov5摔倒检测源码”出发到构建一个稳定可靠的落地系统这条路需要扎实的工程实践和不断的调优迭代。核心在于理解数据、模型和部署环境三者之间的匹配关系。没有放之四海而皆准的最优解最好的模型永远是那个最适应你具体场景的模型。多实验、多分析、多从失败中学习每一次对损失曲线的审视每一次对错误样本的复盘都会让你离一个更鲁棒、更实用的摔倒检测系统更近一步。本文还有配套的精品资源点击获取