☰
YOLOV5行人跌倒检测:5类数据集构建与训练避坑指南
2026/10/15 4:53:24 网站建设 项目流程

简介:本资源是专为YOLOv5目标检测任务设计的行人跌倒检测数据集,面向计算机视觉初学者、算法工程师及智能安防领域开发者,解决跌倒行为识别这一典型安全监控场景下的模型训练与验证需求。数据集严格遵循YOLOv5目录结构组织,含训练集(7609张800×800 RGB图像+对应txt标签)与验证集(1902张图像+标签),共9511张图像及9511个标注文件,另附1个可视化脚本show.py,可一键加载任意图片并绘制五类目标(person、fall等)边界框,支持即开即用。压缩包内共2000个文件,以1999个标准YOLO格式txt标签文件为主,辅以1个轻量级Python可视化工具,整体大小438.48MB,目录层级清晰、无需额外转换。已有403人学习下载,提供完整可用的数据闭环:从原始图像、规范标注到快速可视化验证,显著降低跌倒检测项目的数据准备门槛。 本人最近在做一个安防场景下的行人跌倒检测项目,手里正好整理了一套5类别的YOLOV5格式数据集。先说结论:数据集本身不难做,难的是把类别定义、目录结构、标注规范、训练闭环全部对整齐。很多人拿了一个开箱即用的数据集,训练却报错或者说指标很差,多半不是在算法上,而是在数据这个环节埋了雷。这篇博文就从我这次整理数据集的全过程出发,把YOLOV5目录格式、5类标注思路、实际训练验证的坑一次说透,给正准备做行人跌倒检测、或者想规范自己的目标检测数据集流程的朋友一个可直接参考的版本。

1. 项目定位:为什么做“5类行人跌倒检测”数据集

1.1 跌倒检测场景与现实意义

行人跌倒检测在智慧养老、医院病房、地铁站、工地安全等场景里都是刚需。独居老人跌倒后如果长时间无人发现,后果会很严重,所以监控系统里需要一个能自动识别“这个人摔倒了”的模型。但在实际落地中,单纯只检测“跌倒”这一瞬间其实是很难做稳的,因为跌倒是一个连续动作,不是单帧图像上的一个静态特征。模型如果只见过“倒地”的图片,没有见过“站立”“行走”“蹲坐”“躺卧”这些容易混淆的姿势,误报率就会极高。

也正因为如此,我构建的数据集没有只标一个“fall”,而是把行人状态拆成了5类:站立、行走、蹲坐、跌倒、躺卧。这么做不是给自己加工作量,而是为了让模型真正学会“区分”,而不是“死记”。当模型见过足够多的五类样本后,它会理解“蹲坐和跌倒之间的边界”“躺卧和跌倒之间的区别”,这种区分能力在监控画面中非常关键。

1.2 5个类别到底该怎么定

类别定义这件事,我在项目早期吃过亏,最开始把“蹲坐”和“跌倒”合并成一类,结果模型在检测时经常把正常坐在椅子上的人报警成跌倒。后来改成5类,准确率才上来。5类分别是:

  1. standing(站立)
  2. walking(行走)
  3. squatting(蹲坐)
  4. falling(跌倒)
  5. lying(躺卧)

可能有人会问,行走和站立有必要分开吗?我的答案是,非常有必要。如果模型的目标是报警跌倒,那么“站立”和“行走”都应该算正常状态。但如果不拆开,模型学习到的特征会变得很模糊——它可能把“两条腿交叉的静止姿态”和“正在迈步的姿态”混在一起,导致在动态场景下误判。

还有一点要注意,跌倒和躺卧在视觉上很相似,两者最核心的区别在于“这个人是刚从直立状态摔下来的,还是一直躺着的”。所以我在标注规范里明确要求:如果图片中人物的姿态是延展且贴近地面、有明显的水平方向占优,但画面上下文无法判断摔倒过程时,优先标为lying;如果能看到人物正处于失控下坠、身体倾斜且重心明显偏移的瞬间,则标为falling。这个规则需要标注入员严格遵守,否则类别之间的边界会变得不可控。

1.3 为什么目录格式必须跟随YOLOV5

关于目录格式,最省心的选择就是YOLOV5官方约定的那条路径组织方式。它的特点是:图片和标签分离存放、按train/val拆分、标签为与图片同名的txt文件、每行一个目标。这种格式最大的好处是生态兼容性强。你可以直接用YOLOV5官方仓库训练,也可以把同样的数据丢给YOLOV8、YOLO11,只需要在yaml里做一行数据配置即可。用过COCO或者VOC格式的朋友应该知道,COCO的json标注转换起来很费劲,VOC的xml文件在超大批量时也相对低效。而YOLO的txt标注,一行就是一个目标,读取快、修改方便、配合程序做自检也简单。

所以,我最终确认了这套数据集的核心定位:面向YOLOV5及后续系列模型,5类别行人状态识别,目录严格采用官方格式,帮助使用者跳过数据整理这一步,直接进入模型训练。

2. 数据集目录结构与标注格式逐层拆解

2.1 标准目录:一张图看懂数据组织

先看目录结构,这是YOLOV5训练的基础。我的数据集按照下面的结构组织:

fall_detect_dataset/ ├── data.yaml ├── images/ │ ├── train/ │ │ ├── fall_0001.jpg │ │ ├── fall_0002.jpg │ │ └── ... │ └── val/ │ ├── fall_0001.jpg │ ├── fall_0002.jpg │ └── ... └── labels/ ├── train/ │ ├── fall_0001.txt │ ├── fall_0002.txt │ └── ... └── val/ ├── fall_0001.txt ├── fall_0002.txt └── ...

这里最容易被忽视的一点是:images/train/fall_0001.jpg 必须对应 labels/train/fall_0001.txt,文件名可以不同——只要一一对应上就行。但为了省心,建议保持同名。

我在实际项目里见过很多朋友把数据集下下来就开始训练,结果报错要么是“AssertionError: train: No labels in ...”,要么是训练loss一直是0。最后查下来都是因为图片和标签的对应关系出了问题,比如jpg和JPG后缀不一致、png图片被转换成了jpg但标签没改、或者文件被重命名过导致对不上。这种细节问题非常耗时间,检查起来又很烦躁,所以我建议在目录结构这一层就做严格规划。

关于train/val的划分比例,我习惯用9:1,因为跌倒场景的样本获取成本高,测试集不需要太多,但训练集越丰富越好。如果你的数据量很大,比如超过5万张,那划分成8:2也完全可以。关键是比例确定后,目录结构要始终一致。

2.2 标签txt里到底写什么

YOLOV5的标签格式是每一行代表一个目标,由五部分组成:

<类别索引> <x_center> <y_center> <width> <height>

注意,后面四个坐标值全部是相对于图片宽度和高度的归一化浮点数,而不是像素坐标。举个例子,一张1920x1080的图片中,一个人体目标的边界框左上角是(480, 270),右下角是(1440, 810),那么:

  • 框宽度 = 1440 - 480 = 960
  • 框高度 = 810 - 270 = 540
  • x_center = (480 + 1440) / 2 / 1920 = 0.5
  • y_center = (270 + 810) / 2 / 1080 = 0.5
  • width = 960 / 1920 = 0.5
  • height = 540 / 1080 = 0.5

所以这行标签就是:

3 0.5 0.5 0.5 0.5

如果一张图里有两个人,一个站立一个行走,那就有两行,比如:

0 0.3215 0.4521 0.1684 0.5328 1 0.7002 0.6613 0.2011 0.5489

在制作数据集时,我会写一个Python脚本来检查这些归一化坐标是否越界,是否出现负数,因为这类错误不会在训练启动时报错,而是会悄悄影响mAP。

2.3 data.yaml配置与类别顺序一致性

在使用YOLOV5训练时,需要提供一个data.yaml文件。它是训练配置的地基,内容如下:

train: /your/absolute/path/fall_detect_dataset/images/train val: /your/absolute/path/fall_detect_dataset/images/val nc: 5 names: 0: standing 1: walking 2: squatting 3: falling 4: lying

这里最容易出问题的地方是类别索引。标签txt文件里的第一个数字是类别索引,它们必须和yaml中names的排列顺序完全对应。如果names里把falling放在索引0,而标签里跌倒目标的类别索引是3,那训练时模型就会彻底混乱,检测结果会变得完全不可用。

我在构建数据集时会在所有标签文件生成完成后,跑一遍全量统计,打印出每个类别的目标数量分布,以及随机抽样10个txt文件人工检查类别索引是否符合预期。这个小习惯看起来笨,但能在一开始就拦下绝大多数低级错误。

3. 从零构建一套合格跌倒检测数据集的完整流程

3.1 数据来源怎么找、怎么筛

跌倒检测数据集的来源通常有三个渠道。

第一是公开数据集平移。像UR Fall Detection Dataset、Le2i Fall Detection Dataset、MultiCam Fall Dataset这几个经典数据集都提供了跌倒视频或者抽取帧,虽然它们未必是YOLO格式,但可以通过脚本把标注转成YOLO格式。需要注意版权和使用许可,多数数据集允许学术使用,商用前要逐条确认授权条款。

第二是自行采集。在办公室、走廊、房间布置摄像头,请同事或者志愿者模拟跌倒动作。我这里说的模拟不是随便躺下,而是要有动作的连贯性——站着、走路、然后突然失去重心摔下去。只有把动作视频抽帧后,模型才能学到真正的“跌倒”特征,而不是“静态躺在画面里的人”。

第三是视频抽帧。自己拍摄或找到合法授权的监控视频素材后,按每秒5帧到10帧抽帧,抽出来的图片再逐张筛选。需要注意,相邻帧的画面很相似,如果不加间隔地全量抽帧,会导致数据集里有大量“孪生样本”,训练时模型会把这类重复样本过度学习,反而影响泛化能力。

筛选标准我总结为三条:

  • 剔除模糊帧,特别是跌倒过程中常见的运动模糊。
  • 剔除目标占比过小的图片,如果行人高度不足图片高度的10%,模型基本学不到有效特征。
  • 剔除严重遮挡目标,如果目标一半以上被家具遮挡,且无法判断具体类别,可以直接放弃,或者裁剪保留清晰的部分。

3.2 标注工具选型与标注规范要点

标注这一步是整个数据集中最耗时、也最决定上限的环节。工具上,我在不同阶段用过LabelImg、Labelme、CVAT,各有适用场景。

  • LabelImg:轻量、适合单机小批量标注,直接输出YOLO格式,新手友好。缺点是大批量标注时效率低,且容易误操作。
  • CVAT:适合团队协作标注,支持在线多人标注、自动保存、导入导出各类格式。它需要部署在服务器上,用Docker启动比较方便,CVAT较适合几百上千张图片以上的项目。
  • Roboflow:可以直接把标注好的数据做增强、格式转换、版本管理,非常方便。但要注意,免费版限制导出数量。

标注规范方面,我给自己定了几条硬性要求:

  1. 边界框要贴合人体,不要包含太多背景。如果框得太大,模型训练时会学到大量无关的周边环境特征;如果框得太小,又会截断肢体,导致特征不完整。
  2. 类别定义要始终一致。前面提过的falling和lying的区分,需要标注人员共同确认。我会在一开始做20张图的试点标注,然后大家开会对齐规则,再正式铺开。
  3. 对于遮挡场景,如果可见区域仍能明确判断类别,就标,但不能保证就放弃。

还有一个经验是:对跌倒检测来说,人体姿态的完整性比框的精细度更重要。跌倒瞬间人的四肢常常呈伸展状态,如果框卡得太紧把手臂切掉,模型反而学不到跌倒时那种“失控展开”的姿态特征。所以对于falling类,我允许边界框略微外扩,保证肢体完整。

3.3 数据增强与样本均衡处理

标注完成之后,处理类别不均衡是绕不开的事情。在我的数据集中,standing和walking的数量通常是最多的,falling相对稀少,squatting的样本往往也是最少的。如果直接训练,模型会对样本量大的类别过拟合,对小类别欠拟合,导致最终在跌倒检测这个核心任务上效果很差。

我处理不均衡的思路有两个,而不是只靠复制少数类样本。

第一是离线增强。对falling、squatting这两类样本做随机水平翻转、亮度调整、轻微旋转(±15度)、随机裁剪。这样模型见到的不是同一张图重复几千次,而是同一张图的不同变体,泛化性会更好。增强后,我会重新统计各类别数量,目标是让最少类别的样本量达到最多类别的一半以上。

第二是场景混合。把目标人物从原图抠出来,贴到不同的背景图里。这个办法对跌倒检测特别有效,因为模型如果只见过“走廊跌倒”一个场景,它会对场景背景过拟合,换一个房间可能就检测不出来了。通过场景混合,让模型把注意力放在人体姿态上,而不是背景地板上。

需要提醒的是,增强不是越多越好。过度的旋转会让“站立”看起来像“倾倒”,反而干扰类别判断。所以在增强参数选择上,我严格控制旋转角度不超过15度,水平翻转只做50%概率,不使用马赛克拼接等破坏人体整体结构的增强方式。

4. 训练前的检查清单与首个YOLO实验配置

4.1 数据集自检脚本:标签、比例、类别数

模型跑不起来,先查数据,这是铁律。我在正式训练前一定会在数据集目录下跑一遍自检脚本,主要检查四个方面:

import os from pathlib import Path for split in ['train', 'val']: img_dir = Path(f'images/{split}') label_dir = Path(f'labels/{split}') img_files = list(img_dir.glob('*.jpg')) + list(img_dir.glob('*.png')) label_files = set(label_dir.glob('*.txt')) missing_labels = [] empty_labels = [] class_counter = {} for img in img_files: label_file = label_dir / (img.stem + '.txt') if label_file not in label_files: missing_labels.append(str(img)) continue lines = label_file.read_text().strip().splitlines() if len(lines) == 0: empty_labels.append(str(img)) else: for line in lines: cls = int(line.split()[0]) class_counter[cls] = class_counter.get(cls, 0) + 1 print(f'[{split}] images={len(img_files)} missing_labels={len(missing_labels)} empty_labels={len(empty_labels)}') print(f'[{split}] class distribution: {dict(sorted(class_counter.items()))}')

这个脚本能输出每个分区的图片数量、缺失标签数量、空标签数量和类别分布。我一般要求类别分布中没有0值类别,如果某类在val里出现次数极少,会导致评估指标不稳定,建议回打回重新划分。

另外还要检查一下标签坐标范围。我写了一个简单的断言逻辑,把解析出来的x_center、y_center、width、height全部落在[0,1]区间,任何一个越界就打印出具体文件路径。这类问题常见的源头是标注工具导出设置不当,或者转换脚本写错除以的方向。

4.2 首次训练的参数设置与快速验证

数据集自检通过后,先不要直接跑几百个epoch。我的习惯是先用一个很小的配置跑一轮快速验证,确认整个链路走通了再说调优的事。具体来说,我会这样做:

python train.py --data data.yaml --weights yolov5s.pt --epochs 1 --batch-size 8 --img 640

这里的关键是epochs=1。如果这一步能顺利跑完,并且loss在下降,说明数据读取、标签解析、模型前向传播全部正常。如果这一步报错,大多能定位到数据集路径、yaml配置、标签格式这些问题上。等1个epoch能跑通,我才会增加epoch和batch-size正式训练。

正式训练的参数我一般按如下设置,以YOLOV5s为例:

python train.py --data data.yaml --weights yolov5s.pt --epochs 200 --batch-size 32 --img 640 --patience 30 --workers 8 --cache
  • batch-size取决于显存大小。8G显存跑yolov5s的话,batch-size 32基本是上限,如果爆显存就降到16。
  • --cache 表示把图片缓存到内存中,能显著加快训练速度,但内存小于32G时不建议开启。
  • --patience 30 表示如果连续30个epoch mAP没有提升就提前停止,能省不少时间。

在训练过程中,我还会同时打开TensorBoard或者直接看终端输出的mAP@0.5、mAP@0.5:0.95、precision、recall这些指标。特别注意,如果precision很高但recall很低,说明模型偏向保守,漏检多,这在跌倒检测场景里是不能接受的,宁可误报也不能漏报,因为跌倒漏检的代价远比误报大。

在我的实际训练中,200个epoch足够让yolov5s在5000多张图片上收敛到较好的水平。如果你的数据量只有一两千张,建议用yolov5s或者更小的nano模型,不要直接上yolov5x,否则很容易过拟合。

4.3 评估指标与模型迭代方向

模型训练完,不能只看验证集的总mAP,要分开看每个类别的表现。我在这个项目里最关注的三个指标是:

  • mAP@0.5: 判断目标是否被检出的基础指标,跌倒检测的mAP@0.5建议至少达到0.9以上。
  • 各类别的召回率:重点是falling和lying,因为这两个类别对应着需要报警的场景。
  • 类别混淆情况:跌倒被识别成蹲坐、躺卧被识别成坐姿,这是最需要防控的。

如果发现falling的召回率偏低,我会回到数据层面补样本,专门采集那些摔倒瞬间姿态多样化的图片。如果lying和squatting之间经常混淆,我会单独检查标注框,看看是不是某些躺卧样本的标注框把头部或者腿部切得太狠,导致视觉特征不完整。

另外,我还会对验证集中被误判的图片做一次人工review。直接用YOLO的val.py跑完,它会把置信度低的预测结果以图片形式保存下来,我逐个看这些图,总结出模型最容易出错的视觉模式,再反向指导数据集的补充方向。这个循环比单纯调参有效得多。

5. 常见问题与避坑实录

5.1 标签异常导致训练报错

我见过最多的问题就是训练启动时报“AssertionError: train: No labels in ...”,这个报错的意思是在某个图片目录下找不到任何对应的标签文件。排查路径一般有三步:

  1. 检查标签文件是否真的存在,文件名和图片文件名是否完全一致,注意大小写。
  2. 检查标签文件内容是否为空。很多标注工具在导出时会把没有目标的图片生成一个空txt,这个文件虽然存在,但YOLO不认。
  3. 检查标签文件的路径是否和data.yaml中指向的目录一致,绝对路径有没有写错。

还有一种特殊情况,就是标签文件里出现了类别索引越界。比如类别是5类,索引范围应该是0到4,但有些转换脚本会把类别从1开始编号,导致写成了1到5。这种情况下训练不会直接报错,但loss会非常诡异,表现就是loss一直在降但mAP几乎为零,非常坑。用我前面的自检脚本扫一遍就能发现。

5.2 检测效果差:从数据侧排查

如果训练正常结束,但实际检测效果不好,比如大量漏检或者误检,我建议按以下优先级去排查:

  • 图片分辨率是否统一。如果训练时使用了640x640输入,但数据集中部分图片本身只有320x240的分辨率,模型学到的特征会非常粗糙。
  • 标注质量是否过关。找个和训练数据分布相近的测试视频,用模型跑一遍,把检测结果的视频抽帧出来,和标注框对比,看看是不是标注本身就有问题。
  • 类别定义是否清晰。蹲坐、跌倒、躺卧这三类的边界模糊是误报率高的头号原因。如果你发现模型经常把蹲坐识别成跌倒,那就说明训练数据里蹲坐和跌倒的视觉区分度不够,需要补充更多“蹲坐但接近地面”的样本,让模型学到更细微的姿态差异。

在监控场景里还有一类常见问题:摄像头高度和角度变化。如果训练数据基本都是平视视角,而实际部署是俯视视角,模型效果会大打折扣。解决办法是在构建数据集时有意识加入不同高度、不同角度的样本,包括俯视和斜视角度下的跌倒姿势。这一点很多公开数据集都做得不够,也是自己构建数据集最大的价值所在。

5.3 五类混淆的精细化修正建议

最后说说我踩过最深的坑:类别混淆的精细化修正。

在训练初期,我发现模型经常把“falling”和“lying”混淆。分析后发现,因为很多跌倒瞬间的抽帧,人物已经几乎贴地,单看一帧确实很难区分是“正在摔倒”还是“已经躺下”。面对这种情况,单纯增加样本量已经很难解决了,我做了两个改变:

  1. 调整类别定义:在标注规范中加入明确的“摔倒过程帧”判断标准。如果画面中人物腿部弯曲但重心还没有完全落地,标为falling;如果人物已经完全水平延展且没有明显支撑动作,标为lying。
  2. 调整输入策略:在推理时,不再只依赖单帧检测结果,而是加入一个简单的时序判断。如果连续5帧中有至少3帧检测到falling或lying,才触发报警。这一点对减少误报非常有帮助。

如果你只是在做单帧检测,不考虑时序,那至少要保证类别定义的边界足够清晰。我的建议是,把“falling”定义为核心报警类,“lying”作为备选报警类,两者在阈值设置上可以分开处理。

还有一个小技巧:在训练完成后,用验证集生成混淆矩阵,重点关注falling被误分成squatting、lying被误分成falling的比例。如果某个方向上的混淆超过10%,就针对性地去补充对应的难例样本。这个方法比盲目加数据要高效得多。

6. 这套数据集的后续扩展方向

数据集不是一次做完就结束的东西。在实际项目里,我通常在完成第一批5类数据集的训练后,还会继续迭代两到三轮。一个很自然的扩展方向是加入“携带物品跌倒”的样本。老人手里拿着拐杖或购物袋时,跌倒姿态和空手跌倒差异很大,如果模型没见过这类样本,部署到真实场景中会漏检。

另一个方向是把5类扩充到更细的类别,比如把standing拆成standing和walking_with_cane,或者把lying拆成lying_front和lying_back。这种细粒度分类在智慧病房场景中很有价值,但标注成本也会明显上升,建议在基础模型稳定后再考虑。

从工程角度来说,这套YOLOV5目录格式的数据集天然可以平移到YOLOV8、YOLO11等框架。你只需要在训练脚本里指定数据yaml路径,其他代码基本不用改。这意味着你现在花时间沉淀的数据资产,未来很长一段时间内都能复用,不会因为算法框架迭代而作废。

我个人在实际操作中的体会是,数据集构建这件事,前期把目录格式、类别定义、标注规范这三件基本功做扎实了,后面训练和调优能省下大量时间。不要觉得标注枯燥就跳过规范,格式混乱带来的返工成本远高于一次性做对的成本。如果你正准备做行人跌倒检测,先从一份结构清晰的5类数据集开始,跑通一轮训练,再根据结果迭代数据,这个节奏是最稳的。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询