news 2026/9/26 17:32:32

YOLOv5摔倒检测实战:从数据集标注到树莓派部署全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5摔倒检测实战:从数据集标注到树莓派部署全流程

简介:这份资源是面向深度学习入门与计算机视觉实践者的YOLOv5摔倒检测、跌倒识别完整项目包,适合课程设计、毕业设计或安防场景算法练手。包内共193个文件,以75张jpg与11张jpeg图像样本、39个Python源码、17个yaml配置、21个pyc缓存及pt权重、jit模型等为主,另含Dockerfile、md说明与txt记录,压缩包约40.29MB,目录结构清晰,便于按数据、模型、脚本模块检索。源码经本地编译可运行,按文档配置环境即可复现训练与推理流程,助教审定也保证了内容难度适中。已有487人学习下载,读者可据此掌握数据集组织、模型配置、训练脚本调用与跌倒识别推理的完整链路,并借助权重与配置文件快速验证效果,为后续改进检测精度或迁移到其他行为识别任务提供可参考的工程模板。

1. 摔倒检测项目为什么值得用 YOLOv5 从头跑一遍

跌倒识别这件事,听起来像是一个已经被做烂的题目,但真正在工程里落过地的人都知道,它远没有想象中那么简单。你拿到的这个「yolov5 摔倒检测 跌倒识别项目源码+全部数据(高分项目).zip」,本质上是一套完整的目标检测落地案例:用 YOLOv5 在自定义数据集上训练一个能识别「摔倒」和「未摔倒」两类目标的模型,最终部署到边缘设备或服务端做实时推理。它解决的核心问题是——在养老监护、工地安全、医院病房这些场景里,用摄像头自动判断有没有人倒地,而不是靠人盯着屏幕。

适合谁看?如果你正在做 yolov5训练自己的数据集 这件事,或者想找一个 python 经典项目完整源码 来练手目标检测全流程,这个方向非常合适。它覆盖了从 yolov5环境配置、数据标注、超参数调整到 yolov5部署 的完整链路,而且摔倒这个场景的视觉特征足够明确——人体从直立到倒地的姿态变化、长宽比突变、位置骤降——模型学起来不会太玄学。但坑也不少,后面会一条条拆。

2. 摔倒检测的数据集怎么准备:从标注到 YOLO 格式转换

2.1 摔倒数据的采集与标注策略

摔倒检测的数据集质量直接决定模型上限。常见做法是采集两类视频源:一是真实监控场景下的跌倒片段,二是找人模拟摔倒动作。真实数据难拿且涉及隐私,所以大多数高分项目会用模拟数据打底,再混入少量真实场景做微调。

标注时用 LabelImg 或 Roboflow 画框,类别就设两个:fall和person。注意,不要把「蹲下」「坐下」标成 fall,这是后面误报的主要来源。每张图里如果有多个目标,每个目标单独画框。标注文件是 XML 格式(PASCAL VOC),需要转成 YOLO 的 txt 格式。

2.2 从 VOC 转 YOLO:转换脚本与四个边界坑

YOLO 的标注格式是class_id x_center y_center width height,全部归一化到 0~1。下面这个脚本我用了很多次,直接抄:

import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_dir, out_dir, classes): """ xml_dir: VOC标注文件夹 out_dir: 输出YOLO txt文件夹 classes: 类别列表,如 ['fall', 'person'] """ if not os.path.exists(out_dir): os.makedirs(out_dir) for xml_file in os.listdir(xml_dir): if not xml_file.endswith('.xml'): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) root = tree.getroot() size = root.find('size') w = int(size.find('width').text) h = int(size.find('height').text) lines = [] for obj in root.iter('object'): cls_name = obj.find('name').text if cls_name not in classes: continue cls_id = classes.index(cls_name) bbox = obj.find('bndbox') x1 = float(bbox.find('xmin').text) y1 = float(bbox.find('ymin').text) x2 = float(bbox.find('xmax').text) y2 = float(bbox.find('ymax').text) # 边界裁剪,防止标注越界导致归一化后超出0~1 x1 = max(0, min(x1, w)) y1 = max(0, min(y1, h)) x2 = max(0, min(x2, w)) y2 = max(0, min(y2, h)) x_center = (x1 + x2) / 2.0 / w y_center = (y1 + y2) / 2.0 / h bw = (x2 - x1) / w bh = (y2 - y1) / h lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}") txt_name = xml_file.replace('.xml', '.txt') with open(os.path.join(out_dir, txt_name), 'w') as f: f.write('\n'.join(lines)) # 调用示例 voc_to_yolo('./annotations', './labels', ['fall', 'person'])

逻辑说明:遍历 XML 文件,读取图像宽高,对每个目标框做归一化。参数说明:classes的顺序必须和后面训练时 data.yaml 里的 names 一致,否则类别会错位。四个边界坑分别是——标注框超出图像边界导致归一化值大于 1、类别名大小写不一致、XML 里缺少 size 节点、以及空标注文件没被跳过。转换完建议随机抽 10 张用脚本可视化验证一遍。

2.3 数据集划分与 data.yaml 配置

转换完成后按 8:1:1 划分训练集、验证集、测试集。目录结构建议:

dataset/ images/ train/ val/ test/ labels/ train/ val/ test/

data.yaml 这样写:

train: ./dataset/images/train val: ./dataset/images/val test: ./dataset/images/test nc: 2 names: ['fall', 'person']

nc是类别数,必须和 names 长度一致。常见翻车点是路径用了绝对路径但换机器后失效,建议用相对路径并在训练脚本里确认工作目录。

3. YOLOv5 环境配置与训练:从 conda 到第一个权重

3.1 conda 环境与依赖安装的稳定路径

yolov5环境配置 是新手第一道坎。我一般用 conda 建独立环境,避免和系统 Python 打架:

conda create -n yolov5_fall python=3.8 -y conda activate yolov5_fall git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt

Python 3.8 是兼容性最好的版本,3.10 以上有时会碰到 torch 版本冲突。安装完验证:

python -c "import torch; print(torch.__version__, torch.cuda.is_available())"

如果输出False,说明 CUDA 没配好,检查显卡驱动和 torch 版本是否匹配。CPU 也能训,但速度差 10 倍以上,摔倒检测这种中等规模数据集建议至少用一张 8G 显存的卡。

3.2 训练命令与超参数怎么调

YOLOv5 的训练入口是train.py。一个我常用的起步命令:

python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data ./data/fall.yaml \ --weights yolov5s.pt \ --cfg models/yolov5s.yaml \ --name fall_exp1 \ --cache

参数逐个说:--img 640是输入分辨率,摔倒检测里小目标不多,640 够用;--batch 16根据显存调,8G 卡跑 yolov5s 可以到 32;--epochs 100是上限,实际看早停;--weights yolov5s.pt用预训练权重,比从头训收敛快很多;--cache把图片缓存到内存,加速读取但吃内存。

yolov5超参数 里最值得动的是学习率和锚框。默认lr0=0.01,如果 loss 震荡厉害降到 0.001。锚框用--autoanchor让脚本自动聚类,摔倒场景的人体长宽比和 COCO 差异大,自动锚框通常能涨 2~3 个点。

3.3 训练过程监控与中断恢复

训练启动后看runs/train/fall_exp1/下的results.csv和train_batch*.jpg。重点盯三个指标:box_loss是否稳定下降、mAP@0.5是否在涨、precision和recall是否失衡。如果 recall 远低于 precision,说明漏检多,可以调低置信度阈值或增加正样本。

中断了想接着训:

python train.py --resume runs/train/fall_exp1/weights/last.pt

last.pt是最近一个 epoch 的权重,best.pt是验证集最好的。恢复训练会从上次 epoch 继续,优化器状态也保留。

4. 推理部署与性能优化:让模型真正跑起来

4.1 用 detect.py 做单张和批量推理

训练完先验证效果:

python detect.py \ --weights runs/train/fall_exp1/weights/best.pt \ --source ./test_images \ --img 640 \ --conf 0.4 \ --save-txt

--conf 0.4是置信度阈值,摔倒检测建议设 0.3~0.5,太低误报多,太高漏报多。--save-txt会输出每个框的坐标和类别,方便后续做告警逻辑。输出在runs/detect/exp/下。

4.2 导出 ONNX 与 TensorRT 加速

如果要在树莓派5上部署自己训练的yolov5模型,或者用 TensorRT 加速,先导出 ONNX:

python export.py --weights best.pt --include onnx --img 640 --batch 1

导出后可以用 onnxruntime 推理,也可以用 trtexec 转 TensorRT。注意导出时的--img要和训练一致,否则精度掉得厉害。树莓派上建议用 yolov5n 或 yolov5s,yolov5m 以上推理延迟会超过 200ms,实时性不够。

4.3 摔倒判定的后处理逻辑

模型只输出「fall」和「person」的框,真正判断摔倒还需要后处理。常见做法是:连续 N 帧检测到 fall 框且框的中心点低于画面高度 60%,才触发告警。这样可以过滤掉弯腰捡东西的瞬时误报。代码片段:

fall_counter = 0 FALL_THRESHOLD = 5 # 连续5帧 for frame in video_stream: results = model(frame) has_fall = False for det in results.xyxy[0]: cls = int(det[5]) if cls == 0: # fall类别 y_center = (det[1] + det[3]) / 2 if y_center > frame.shape[0] * 0.6: has_fall = True if has_fall: fall_counter += 1 else: fall_counter = 0 if fall_counter >= FALL_THRESHOLD: trigger_alarm()

这段逻辑的关键参数是FALL_THRESHOLD和高度比例,需要根据摄像头角度调。俯拍角度下比例可以降到 0.5,平拍则要 0.7 以上。

5. 避坑与排查:摔倒检测项目里最容易翻车的五件事

5.1 现象:训练 loss 不降,mAP 一直为 0

原因:data.yaml 里的路径写错,或者 labels 文件夹里没有对应的 txt 文件。YOLOv5 找不到标签时会静默跳过,loss 看起来在动但学不到东西。

解决:在 train.py 里加一行print(dataset)确认数据集加载数量,或者手动检查 images 和 labels 文件名是否一一对应(除了扩展名)。

5.2 现象:推理时把所有站立的人也框成 fall

原因:训练集里 fall 和 person 的样本不均衡,fall 样本远多于 person,模型倾向于把所有人都判成 fall。

解决:在 data.yaml 里加cls_weights或者用--balance参数做类别平衡采样。更直接的办法是补充 person 类别的负样本,让两类比例接近 1:1。

5.3 现象:树莓派上推理速度只有 2 FPS

原因:用了 yolov5m 或更大模型,且没有做量化。树莓派 CPU 推理 yolov5s 原生 PyTorch 模型大概 5~8 FPS,yolov5m 直接掉到 2 FPS 以下。

解决:换 yolov5n,导出 ONNX 后用 onnxruntime 的 ARM 版本推理,或者用 NCNN 进一步加速。实测 yolov5n + NCNN 在树莓派5上能到 15 FPS 左右。

5.4 现象:模型在测试集上 mAP 很高,但实际监控画面里频繁误报

原因:测试集和实际场景分布不一致。测试集可能是模拟摔倒的干净背景,实际监控有光照变化、遮挡、多人干扰。

解决:从实际摄像头截取 200~500 帧,人工标注后加入训练集做微调。这一步没有捷径,但效果最明显。

5.5 现象:导出 ONNX 后推理结果和 PyTorch 不一致

原因:导出时--img尺寸和推理时输入尺寸不匹配,或者动态轴设置不对。

解决:导出命令加--dynamic支持动态 batch,推理时确保预处理(resize、归一化)和训练时完全一致。YOLOv5 的预处理是 letterbox,不是直接 resize,这点容易忽略。

6. 把摔倒检测做成可迭代系统的几个技巧

如果你打算把这个项目从「跑通」推到「能用」,有几个技巧值得试。第一,用 TensorBoard 对比多次实验的超参数组合,YOLOv5 自带--tensorboard参数,打开后能看到每条曲线的叠加对比,比翻 csv 高效得多。第二,把 detect.py 改造成一个常驻服务,用 FastAPI 包一层 HTTP 接口,输入 base64 图片输出检测结果,这样前端和移动端都能调。第三,摔倒判定不要只依赖单帧,加一个简单的 LSTM 或滑动窗口统计,把连续 30 帧的检测结果作为序列输入,误报率能再降一半。

验证方法上,我习惯用「混淆矩阵 + 实际视频回放」双轨验证。混淆矩阵看整体分类倾向,视频回放看具体误报场景。每次调整阈值或补充数据后,固定用同一段 10 分钟的真实监控视频跑一遍,统计误报次数和漏报次数,做成表格跟踪:

版本误报次数漏报次数推理延迟
v1 基线12345ms
v2 加负样本5345ms
v3 连续帧判定2348ms

这张表比任何 mAP 数字都更能说服人。最后说个血泪经验:别在训练集上反复调参调到 mAP 0.95 就以为成了,实际场景里光照和角度一变,模型可能直接崩。我一般会留一个「魔鬼测试集」——专门收集各种刁钻场景的 50 张图,每次改完模型先跑这个集,过了才算数。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 17:31:49

Claude Code 模板完全指南:从 prompt 工程到团队提效

很多人拿到 Claude Code 之后,第一反应是“很强”,第二反应是“为什么我用起来没有别人那么强”。我在实际项目中试了大半年,发现差距往往不在模型本身,而在你喂给它的上下文和指令质量。这也是 claude-code-templates 这类项目存…

作者头像 李华
网站建设 2026/9/26 17:31:25

ADMM与HSS核近似:破解大规模非线性SVM训练瓶颈

前两天帮一个朋友调试模型,他的场景很典型:两万条带标签的样本,几百个特征,任务不算复杂,分类精度要求也不高,但他用RBF核的SVM跑了一下,直接内存报错。换成线性SVM精度又差了一截。这个困境其实…

作者头像 李华
网站建设 2026/9/26 17:29:23

荣耀远航计划:主题精品共创激励的底层逻辑与避坑实操

"荣耀远航计划"最近在创作者圈子里出现的频率越来越高。我第一次看到这个计划,是朋友转来的一张活动海报,当时第一反应是:又是一个刷量投稿的激励活动吧。后来仔细把"主题精品共创激励更新"这几个字拆开读了一遍&#xf…

作者头像 李华
网站建设 2026/9/26 17:29:23

MySQL zip包安装全流程详解:从解压到配置服务与报错排查

说实话,我第一次用zip压缩包装MySQL的时候,完全没意识到这件事和用msi安装包那个“下一步下一步”是两种物种。身边有个人丢了个压缩包过来,说“你解压之后配置一下就能用了”,结果我对着一个没有data目录的文件夹愣了半天&#x…

作者头像 李华
网站建设 2026/9/26 17:29:23

Claude Code模板实战:从上下文工程到高效AI编程工作流

最近 Claude Code 在开发者圈子里已经成了绕不开的话题。命令行里跑一个 AI 编程助手,帮你看代码、改代码、执行命令,这种体验确实比来回复制粘贴要痛快得多。但我发现身边很多朋友装上 Claude Code 之后,用了几次就放在那里吃灰,…

作者头像 李华