拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

摔倒检测数据集全指南:从模态选型、标注规范到自建基线

摔倒检测数据集全指南:从模态选型、标注规范到自建基线

做摔倒检测这个方向,最让人头疼的从来不是模型结构,而是数据集。我见过太多人一上来就纠结用 SlowFast 还是 TSM,结果卡在第一步:找不到合适的摔倒检测数据集,或者找到了却发现标注格式对不上、场景跟自己要落地的环境差了十万八千里。摔倒检测数据集本质上是一堆"人从站立或坐姿失去平衡、身体重心快速下落并最终接触地面"的时序片段集合,它的价值不在于样本多,而在于摔倒动作的多样性、日常动作的干扰性、以及标注的时序精度。这份内容适合三类人看:刚入门想做老年人看护、养老院监控、独居监护这类课题的学生;需要给产品选一套可复现基线数据的工程师;还有准备自建数据集、但不知道从哪下手录制的团队。我会把公开数据集的实际情况、标注规范怎么定、自建采集的完整流程、以及我踩过的那些坑,一条条摊开讲。

1. 摔倒检测数据集到底分几类:先搞清楚你要解决哪类问题

选数据集之前,必须先回答一个问题:你的传感器是什么。这个问题决定了你能用哪些数据集,也决定了后面所有的模型选型、标注方式、评估指标。摔倒检测在学术和工业界大致分成三条技术路线:视觉路线(摄像头拍)、惯性路线(加速度计和陀螺仪贴身测)、以及新兴的无线信号路线(雷达、WiFi、音频)。这三条路线的数据集几乎完全不通用,一个 RGB 视频数据集没法直接拿去训练 IMU 分类器,反之亦然。很多人第一周就浪费在"下载了一个数据集发现模态不对"上面。

1.1 视觉类数据集:摄像头视角下的摔倒

视觉路线是目前公开资源最丰富的一条。它的核心输入是连续的图像帧,输出通常是一个时序区间或者一组带时序的检测框。视觉数据集的优点是信息量大,能同时拿到人体姿态、位置、环境上下文;缺点是受光照、遮挡、隐私影响严重,夜里没红外补光的摄像头基本废掉一半。

视觉类数据集还能再细分:RGB 单目、多目、深度(Kinect 这类)、热成像。单目 RGB 最常见,也最便宜,部署成本低,但缺乏深度信息,遇到"人蹲下"和"人摔倒"这两个动作在二维图像上姿态相似时容易混淆。深度相机能提供人体离地高度和三维骨架,理论上更好分,但现实是大部分现场装不了深度相机,所以工程落地还是以 RGB 为主,深度数据更多用来做辅助标注或者做研究对比。

我在实际项目里的判断标准很简单:如果你的目标场景是走廊、卫生间、卧室这类固定单机位场景,优先用 RGB 单目数据集起步;如果是多机位大厅或病房,多视角数据集能帮你验证视角融合的价值;如果现场不允许装摄像头(比如对隐私极度敏感的场所),那视觉路线直接放弃,去看第 1.3 节的雷达方案。

1.2 可穿戴与惯性传感器数据集:贴身视角的摔倒

惯性传感器(IMU)路线是另一大流派。核心器件就是三轴加速度计加三轴陀螺仪,采样率通常在 20 Hz 到 200 Hz 之间,数据形式是一串随时间变化的六维数值。它的优势非常明显:不涉及图像隐私、功耗低、成本极低(一个传感器模块几十块钱)、夜间不受影响、可以做成手环或胸带佩戴。缺点也很致命:用户必须愿意佩戴,而且忘记充电、忘戴、洗澡取下都会导致检测盲区。

IMU 数据集的关键变量是佩戴位置。不同位置采集到的信号特征差异极大:腰部(重心附近)能最早感知到身体失稳,信号最干净;手腕位置信号幅度大但噪声也大,因为人挥手、拿东西都会产生类似冲击;胸部适合做呼吸和姿态融合;大腿和脚踝在摔倒前期变化明显。所以选 IMU 数据集时,先看它覆盖了哪些佩戴位置,如果你的产品是手环形态,那就必须找含手腕数据的数据集,否则训出来的模型换到手腕上精度会断崖式下跌。

还有一点常被忽略:IMU 数据集标注的不是"帧",而是"事件"。每一段记录通常对应一个动作,标注就是动作类别(摔倒的哪种类型 / 哪类日常动作)。这种做法简化了标注,但也导致滑窗切分这一步必须由使用者自己完成,而滑窗参数直接决定了最终的召回率和误报率,后面第 4.2 节会详细讲。

1.3 新兴模态:雷达、WiFi信号与音频

这几年毫米波雷达和 WiFi 信道状态信息(CSI)做人体动作识别的研究越来越多,摔倒检测是其中一个热门场景。雷达的优势是不拍脸、不受光照影响、穿透部分遮挡,很适合卫生间、卧室这类隐私场景。WiFi CSI 更极端,完全无感,但受环境布局影响巨大,换个房间模型就得重训。音频路线则靠摔倒瞬间的撞击声、呼救声做判别,通常作为辅助模态,单独用误报率偏高(关门声、重物落地声都会触发)。

这三类数据集的公开资源比视觉和 IMU 少得多,规模也小,多数是实验室自采。我的建议是:如果你做的是本科毕设或者快速验证,别碰这三个方向,数据难找、复现成本高;如果是产品预研,雷达方案值得投入,但要提前接受"数据集要自己采"这个现实。

1.4 选型对照表:不同场景该从哪个数据集入手

下面这张表是我给团队新人做培训时用的,直接照着对号入座就行。

你的场景推荐模态起步数据集方向主要顾虑
养老院走廊监控RGB 单目视觉类经典数据集光照、遮挡、夜间
卫生间防跌倒毫米波雷达自采为主公开数据稀缺
老人手环IMU(手腕)含手腕的 IMU 数据集佩戴依从性
病房多机位RGB 多目 / 深度多视角数据集部署成本
快速毕设验证RGB 单目小规模经典数据集类别不平衡
手机 App 检测手机内置 IMU手机采集的 IMU 数据集手机放置位置随机

选型的原则是"数据先行":先看你能拿到什么模态的数据,再决定技术路线,而不是先选好模型再去凑数据。这个顺序反了,项目大概率会在第三周停摆。

2. 公开数据集盘点:那些真正能下载、能跑通的资源

网上关于摔倒检测数据集的介绍文章很多,但真正把"能下载、格式能用、许可没问题"这三件事说清楚的不多。我按模态分类,把常用的几个数据集的实际使用体验讲一遍。需要说明的是,很多数据集的具体样本数在不同论文里引用不一致,下面写的是我查到的公开说明里比较通行的数字,实际使用时请以官方页面为准。

2.1 视觉类经典数据集逐个过一遍

UR Fall Detection Dataset(URFD)是视觉路线的"Hello World"。它由热舒夫大学发布,规模不大,大概七十段序列,其中三十段是摔倒、四十段是日常动作,同时提供 RGB 视频和 Kinect 深度数据,分辨率不高、帧率约 30 fps。这个数据集最大的优点是干净、标注清楚、下载方便,适合做第一个 baseline。缺点是场景单一(就是一条室内走廊),受试者数量少,模型在上面刷到 99% 的准确率,换个场景可能直接掉到 70%。所以我一直说,URFD 用来验证代码跑通没问题,用它证明"我的算法很鲁棒"就是自欺欺人。

Le2i Fall Detection Dataset是我比较推荐的一个。它大约有近两百段视频,覆盖了家庭、办公室、教室、咖啡厅四种场景,每个场景有不同的家具和光照条件。多场景意味着它能暴露模型对背景过拟合的问题。不过它的标注以视频级类别为主,也就是说它告诉你"这段视频里有摔倒",但摔倒具体发生在第几帧,需要你自己看或者自己补标。做时序检测任务的话,这个补标工作量不小。

Multiple Cameras Fall Detection Dataset(MCFD)是蒙特利尔那边发布的,特色是有八个同步机位拍摄同一个场景,二十多个脚本化场景。它的价值在于验证多视角融合。要注意的是它的视频文件组织方式有点绕,需要花时间整理目录结构。

CAUCAFall是一个相对新的数据集,受试者十人左右,每人执行多种日常动作和多种摔倒动作,每个动作多次重复,双机位拍摄。它的优点是类别划分细、动作脚本设计得比较贴近真实生活,适合做类别细分实验。规模偏小,通常用来做补充验证而不是主训练集。

UP-Fall Detection Dataset是多模态的代表,同步采集了侧向和正向两个摄像头的视频、腰部 IMU 数据,甚至还有脑电设备的数据,十几位受试者每人执行十一种动作、每种动作重复三次。想做视觉加 IMU 融合的同学,这个数据集几乎是首选,因为它省掉了你自己做时间同步这件极其痛苦的事。

还有一个绕不开的名字是NTU RGB+D。它不是专门的摔倒数据集,但包含"摔倒"这个动作类别,规模是几万段级别,提供骨骼、深度、RGB 多种模态。好处是可以拿它做预训练,或者做骨骼序列的通用动作识别;坏处是摔倒只占其中很小一部分,直接做二分类会严重不平衡,需要额外采样策略。

2.2 可穿戴类经典数据集的实际差异

SisFall是 IMU 摔倒检测里的标杆。它大概有四千多条样本,分成摔倒和日常动作两大类,受试者分为年轻组和年长组,用了两块传感器板,采样率很高(约 200 Hz),加速度计量程宽。年轻组和年长组的动作速度、幅度不同,这个设计很重要——很多模型在年轻组上训、在年长组上测就翻车,SisFall 提前帮你把这个坑暴露出来。

UMAFall的特点是传感器节点多,覆盖腰部、胸部、脚踝等位置,同时给了手机端和专用传感器板两种采样率。如果你想研究"传感器放哪儿最合适",这个数据集能直接回答你。

MobiFall用的是手机传感器,放在口袋里采集,包括摔倒和日常动作几百段。如果你的产品是手机 App,这个数据集最贴合,因为口袋姿态、手机晃动、传感器噪声都和真实场景一致。

FallAllD规模更大一些,十几位受试者,传感器放在腰部、手腕、颈部三个位置,采集时长累计几十小时,采样率 200 Hz,含加速度计、陀螺仪、磁力计。它的优势是位置覆盖全、数据量大,适合训练泛化性更好的模型。想同时支持手环和腰带的团队,可以重点看这个。

tFall也是常被引用的一个,规模较小,受试者约十人,主要用来做补充对比。它对摔倒类型的划分比较细,如果你关心"向前摔"和"向后摔"的区分,它有一定参考价值。

这里插一个实操提醒:这些 IMU 数据集的文件格式五花八门,有 txt、csv、mat、bin,列顺序、单位(有的用 g,有的用 m/s²)、坐标系定义都不一样。我建议第一步先写一个统一的加载器,把所有数据集转成同一种内部格式(时间戳、ax/ay/az、gx/gy/gz、标签),否则后面每换一个数据集就要改一遍代码,非常消耗精力。

2.3 工程友好型资源:Kaggle与Roboflow

如果你只是想快速跑通一个 YOLO 系的摔倒检测 demo,学术数据集其实不是最优选择,因为它们的标注格式通常是"视频级"或"自定义文本",不是标准的目标检测格式。这时候可以直接找Kaggle上的摔倒图像数据集,以及Roboflow Universe上的项目。Roboflow 上有一批公开的摔倒检测项目,标注是标准的 YOLO 或 COCO 格式,带数据增强和划分好的 train/val/test,下载下来改个配置文件就能开训。

但要提醒一句:这类工程友好型数据集的质量参差不齐。我见过标注框只框住上半身的,也见过把"坐在地上"标成摔倒的。用之前务必自己抽检五六十张,看一眼标注框的贴合度和类别一致性。抽检这一步花二十分钟,能省掉后面两天调参却怎么都上不去的困惑。

2.4 下载与使用时的许可和格式坑

先说许可。学术数据集通常只允许非商业研究用途,有些还要求你签署使用协议、承诺不传播、不在论文之外公开原始数据。如果你想做商业产品,正确做法是只用这些数据集做算法验证和预训练,真正上线用的模型必须在自有数据上重新训练,或者购买有明确商业授权的数据。

再说格式坑。常见的有这么几类:一是视频容器问题,有些老数据集的 avi 文件用了冷门编码,OpenCV 直接读会返回空帧,这时候需要换解码后端或者先转码,转码时注意别丢掉帧率信息。二是文件名与标签的对应关系,有的数据集靠文件名前缀编码标签,有的靠单独的 txt 列表文件,还有的把标签写在文件夹名上,处理时一定要先做一次"标签覆盖率检查",确认每个视频都能找到对应标签。三是时间戳对齐,多模态数据集如果给的是各传感器的原始时间戳,务必先做一次时间轴归一化,否则融合模型拿到的两路信号根本不同步。

提示:下载任何数据集后,先做三件事——统计类别分布、抽查标注质量、确认许可范围。这三件事没做完,不要开始写训练代码。

3. 标注规范设计:一篇好数据集的核心竞争力

公开数据集能满足通用研究,但真正落地时几乎一定要自建数据集。而自建数据集的成败,八成取决于标注规范,而不是录制设备。我见过设备花了几万块、画面极其清晰的数据集,因为类别定义模糊,最后训出来的模型误报率高得没法用。

3.1 类别体系怎么定:二分类只是起点

最简化的类别体系是二分类:摔倒 / 非摔倒。这种设计标注快、模型简单,但实际落地时会遇到大量"擦边"情况。比如一个人扶着墙慢慢滑坐到地上,算摔倒吗?一个人蹲下去捡东西,膝盖着地了,算吗?一个人躺到床上,动作很快,算吗?

我的建议是把类别体系设计成三层。第一层是必选的动作大类:摔倒、日常动作。第二层是干扰类,把最容易误报的动作单独标出来,比如"快速坐下""蹲下捡物""弯腰系鞋带""躺下""快速起身"。第三层是可选的状态标记,比如"摔倒后有自主起身""摔倒后长时间未动"。第三层对产品的报警策略极其重要——如果人摔了但马上自己站起来了,很多场景下不需要报警;如果摔倒后 30 秒没动,那才是高危事件。

把干扰类单独标注的好处是,你可以在评估阶段精确知道模型的误报来自哪一类动作,从而针对性加数据。只标二分类的话,你只知道"误报多",但不知道错在哪,调优就变成盲猜。

3.2 时间维度标注:帧级、片段级还是事件级

时序标注的粒度直接决定你能做什么任务。

片段级标注是最省事的:标出摔倒动作从第几秒到第几秒。这种标注适合做时序动作检测,评估指标是区间重叠度(比如 tIoU)。缺点是边界模糊,不同的标注员对"摔倒开始"的判定可能差出半秒到一秒。我的经验是统一约定:以身体重心开始明显下坠的那一帧为起点,以身体主要部位稳定接触地面后不再移动的那一帧为终点。把这句话写进标注手册,一致性会好很多。

帧级标注更细,每一帧都要标"当前是否为摔倒状态"。成本极高,通常只在做逐帧分类或者需要精确计算检测延迟时使用。

事件级标注最简单,只记录摔倒发生的时间点。适合做"多久之内报出来"这类延迟评估。

实际项目里我推荐混合方案:主体用片段级标注,同时对每个片段额外记录一个"触发时刻"。评估时用区间重叠度算精度,用触发时刻算检测延迟。检测延迟这个指标在工程上比准确率还重要——一个准确率 95% 但平均延迟 3 秒的模型,在真实场景里可能比准确率 90%、延迟 0.8 秒的模型更难用。

3.3 标注工具与质量控制流程

工具方面,视频时序标注用CVAT比较顺手,它支持逐帧标注、区间标注、关键点标注,还能多人协作和审核。纯图像检测框标注可以用Label Studio或LabelImg系列工具。关键点标注的话,如果用现成姿态估计模型预生成骨架再人工修正,效率能提高好几倍。

质量控制我一般走三步。第一步是双人交叉标注,随机抽 10% 到 20% 的样本让两个人独立标,然后算一致性。分类任务用 Cohen's kappa,区间任务用区间重叠度的均值。kappa 低于 0.8 就说明标注手册写得不够清楚,得回去改定义。第二步是抽样复核,由我来抽检每个标注员的作品,重点看边界帧的判断。第三步是建立"疑难样本集",把所有有争议的片段单独存起来,这些片段往往就是模型最容易错的样本,后续训练时可以有针对性地加权。

注意:千万不要让同一批人既做录制又做标注,尤其是受试者本人。人对自己的动作有心理预期,标注时会下意识按"我本来想做什么"来标,而不是按"画面里实际发生了什么"来标,这会引入系统性偏差。

3.4 评估指标与评估协议:LOSO 与跨数据集验证

指标这块,二分类常用准确率、精确率、召回率、F1。但摔倒检测有个特殊性:正负样本极度不平衡,摔倒事件在整个时间轴上可能只占百分之一二。这种情况下准确率完全失真——一个把所有样本都判成"非摔倒"的模型,准确率能有 98%,但召回率是 0。所以我更关注三个数:召回率(灵敏度)、特异度、以及每小时误报次数。

每小时误报次数这个指标特别实用。学术论文里很少提,但产品经理一定会问"一天误报几次"。我做过的一个项目,把召回率从 92% 提到 96%,代价是每小时误报从 1.2 次涨到 5 次,最后业务方选了前者,因为误报太多导致护工直接关掉报警。所以指标取舍要跟业务方一起定,不能只看 F1。

评估协议方面,最容易被忽略也最致命的问题是数据泄漏。如果同一个受试者的不同片段被随机分到训练集和测试集,模型可能记住了这个人的体型、衣服、走路节奏,测试指标虚高。正确做法是留一受试者交叉验证(LOSO):每次拿一个受试者的全部数据做测试,其余人的数据做训练,轮流一遍。指标会难看很多,但那才是真实水平。

再进一步是跨数据集验证:在 A 数据集训练,直接到 B 数据集测试。这个过程掉点通常非常惨烈,掉 20 到 40 个百分点都正常,但它是检验泛化能力最诚实的方式。如果你的目标是产品落地,跨数据集验证的结果比在自己数据上刷分有价值得多。

4. 自建数据集实操:从录制到可训练

前面讲的都是"用别人的数据",但真正决定项目上限的是自建数据集。这一节我按实际流程走一遍,包括参数怎么定、代码怎么写。

4.1 录制方案:机位、受试者、动作脚本

机位设计:单机位的话,高度建议在 2.2 到 2.8 米之间,俯角 20 到 30 度。这个角度能看清人体离地高度,同时不会因为俯视太狠导致人体被家具遮挡。如果做多机位,两个机位夹角别小于 60 度,否则视角冗余,融合收益很低。摄像头帧率建议 25 或 30 fps,低于 15 fps 会丢掉摔倒瞬间的关键动态。

受试者设计:这是最容易偷懒的地方。只找三五个年轻男生录,训出来的模型对老年女性、体型偏胖的人基本无效。理想配置是男女各半,年龄覆盖 20 到 80 岁,身高体重跨度尽量大,还要包含穿不同衣服(长裙、拖鞋、宽松睡衣)的情况。如果条件有限,至少保证性别和体型有差异。

动作脚本设计:摔倒类型要覆盖向前摔、向后摔、侧向摔、坐姿滑落、从床上滚落这几类。每类动作至少由不同受试者各做几次,位置分散在场景的不同区域。日常动作要重点覆盖干扰项:快速坐下、蹲下捡东西、弯腰、躺下、爬起、下蹲起立、挥手、开门、拖地。日常动作的样本量应该是摔倒的三到五倍,因为现实中两者出现频率差得更远。

安全措施:必须用厚垫,受试者必须做热身,每个受试者连续录制不超过二十分钟,摔的动作不要真的硬砸,用"模拟摔倒"的方式做——真实感会下降,但安全第一。这也是学术数据集的共同局限:所有公开数据集里的摔倒基本都是表演出来的,缺少真实摔倒时的肌肉僵直和缓冲动作,这是跨数据集掉点的根本原因之一。

4.2 数据预处理与滑窗切分(含参数计算)

录完的原始素材通常是长视频,需要先按动作切段,再切成固定长度的时间窗。滑窗参数怎么定,我给你一个可推导的思路。

假设帧率 30 fps,摔倒全过程(从起身失衡到落地静止)大概持续 1.5 到 2.5 秒。那么窗口长度至少要覆盖这个过程的主体部分,取 1.2 秒比较合适,也就是 36 帧,取整用 32 帧。窗口太短(比如 0.3 秒)只能看到身体在半空,判别信息不足;窗口太长(比如 4 秒)会把摔倒前后的站立状态混进来,稀释了正样本。

步长决定样本量和延迟。步长 8 帧意味着每 0.27 秒输出一次判断,理论上检测延迟的下限就是 0.27 秒。步长太大(比如 16 帧)延迟增加,步长太小(比如 1 帧)样本高度冗余、训练慢。我一般用窗口长度的四分之一作为步长,32 帧窗口配 8 帧步长。

import numpy as np def sliding_window(frames, labels, win=32, stride=8, fall_ratio_thresh=0.5): """ frames: (T, H, W, C) 或 (T, D) 特征序列 labels: (T,) 逐帧标签 0/1 返回窗口样本及其标签 """ samples, targets = [], [] for start in range(0, len(frames) - win + 1, stride): end = start + win seg = frames[start:end] seg_label = labels[start:end] # 窗口内摔倒帧占比超过阈值才算正样本,避免边界污染 ratio = seg_label.mean() samples.append(seg) targets.append(1 if ratio >= fall_ratio_thresh else 0) return np.array(samples), np.array(targets)

这里有个细节值得强调:窗口标签的判定阈值。如果窗口内只要有一帧是摔倒就标成正样本,那正样本会大量"渗"到摔倒前后的正常片段里,模型会学到"快要摔了"的模糊特征,导致虚警。如果要求窗口内所有帧都是摔倒才算正样本,正样本数量会锐减。阈值取 0.5 左右是我试下来比较平衡的做法,但具体数值要看你数据的边界标注质量。

4.3 增强策略与类别不平衡处理

摔倒检测的类别不平衡是结构性的。一场几小时的监控里可能一次摔倒都没有,而训练集里你人为地把摔倒片段裁出来,比例看起来还行,但滑窗之后正样本又会被稀释。处理方式有这么几种。

过采样:对正样本窗口做重复采样,配合数据增强让每次看到的样本略有不同。简单有效,但过度使用会导致过拟合。

损失加权:在交叉熵或 BCE 里给正类更高权重。权重的经验值可以取负正样本比的平方根,而不是直接用比值,直接用比值往往权重过大导致训练不稳定。

焦点损失(Focal Loss):降低易分类样本的权重,让模型聚焦在难样本上。做摔倒检测这类极端不平衡任务,Focal Loss 通常比加权 BCE 效果好一些,γ 取 2 是常见起点。

两阶段策略:先用轻量模型做人形检测或者姿态估计,只在检测到人的区域/时段做摔倒判别,把搜索空间缩小一个量级,正负比自然就改善了。这也是我在产品里最常用的方案。

数据增强方面,视觉任务常用水平翻转、随机裁剪、亮度对比度扰动、时序抖动(随机丢帧或复制帧)。水平翻转要注意:如果模型输入包含左右侧的语义信息(比如"左手撑地"),翻转会引入错误标签,这时要么不翻转,要么把相关标签一起翻转。IMU 数据可以加高斯噪声、做时间缩放(模拟快慢动作)、做幅度缩放(模拟不同强度的摔倒),但不要做随机轴交换,那会生成物理上不可能的信号。

4.4 从零训练一个基线:YOLOv8-pose加时序分类

我推荐一个能在一周内跑通、且具备实际可用性的基线方案:人体检测/姿态估计 + 骨架序列时序分类。这个方案对光照和背景的鲁棒性比端到端视频分类好,也比直接的检测框方案更抗遮挡。

第一步,用 YOLOv8-pose 或同类姿态模型逐帧提取人体 17 个关键点坐标和置信度。对每一帧,把多人的情况按置信度或面积取主体,得到形状为 (T, 34) 的序列。

第二步,构造人工特征,这些特征比原始坐标更有效:

  • 躯干与竖直方向的夹角:由肩中点和髋中点连线算出,摔倒时这个角会快速超过 45 到 60 度
  • 髋部中心相对画面底部的归一化高度:摔倒时快速下降
  • 髋部中心的垂直速度:短时间内出现大幅负向峰值
  • 边界框的宽高比:从"高瘦"变成"扁平"是一个强特征
  • 头部与髋部的高度差:站立时为正且较大,躺倒后接近零甚至为负

第三步,把坐标加人工特征拼成向量序列,送进一个两层的 LSTM 或 1D 卷积网络做二分类。

import torch import torch.nn as nn class FallNet(nn.Module): def __init__(self, feat_dim=44, hidden=128, num_layers=2, dropout=0.3): super().__init__() self.lstm = nn.LSTM(feat_dim, hidden, num_layers, batch_first=True, bidirectional=True, dropout=dropout) self.head = nn.Sequential( nn.Linear(hidden * 2, 64), nn.ReLU(), nn.Dropout(dropout), nn.Linear(64, 1) ) def forward(self, x): # x: (B, T, feat_dim) out, _ = self.lstm(x) # 用时间维平均池化,比取最后一帧更稳 return self.head(out.mean(dim=1)).squeeze(-1) # 训练配置参考 # 优化器 Adam, lr=1e-3, weight_decay=1e-4 # batch_size=32, epoch=60 # 损失 Focal Loss(gamma=2, alpha=0.75) # 学习率调度 CosineAnnealingLR # 早停 patience=10,监控指标用验证集 F1 而不是 loss

训练时的几个经验:监控指标一定要用 F1 或召回率,不要只看 loss,因为损失在不平衡数据上会被负样本主导,loss 一直降但正样本一个都学不出来是常事。另外务必用留一受试者交叉验证,我见过太多人随机划分后 F1 到 0.98,换成 LOSO 直接掉到 0.7。

5. 常见问题与排查技巧实录

这一节是我这些年踩坑攒下来的,基本都是文档里不会写、但一定会遇到的问题。

5.1 误报重灾区:坐下、躺下、蹲下捡东西

误报排第一的永远是快速坐下。人往沙发或椅子上快速坐下的动作,髋部垂直速度、躯干角度变化跟向后摔倒非常接近,甚至加速度曲线都相似。区分点在于:坐下过程中膝盖和脚踝的相对关系有明确的目标支撑(椅子),且动作结束时人体重心高度稳定在一个"坐姿高度"上,而不是接近地面;另外坐下的减速过程相对平缓,摔倒通常伴随一个明显的冲击峰值。

排第二的是弯腰捡东西。这个动作的特点是头部下降明显但髋部基本不动,而真正的摔倒髋部一定参与。所以髋部高度这个特征比头部高度更可靠,我早期版本的模型就是因为只看头部位移,误报率居高不下。

排第三是躺下。躺到床上或沙发上,姿态和摔倒后完全一样。区别在于过程:躺下通常是先坐下再躺,有一个中间稳定态;摔倒是一气呵成的失衡过程。另外躺下的位置通常在床或沙发区域,可以结合区域掩膜做后处理过滤。

处理这类误报的思路有两种:一是加负样本,把这些动作大量采集进来作为干扰类;二是加后处理规则,比如摔倒触发后做一个 2 到 3 秒的跟踪,如果人体在 3 秒内恢复到站立姿态并且移动正常,就撤销这次报警。后处理规则能显著降低误报,代价是报警延迟增加,具体阈值要跟业务方一起调。

5.2 漏报与训练不收敛的典型原因

漏报的常见原因之一是遮挡。摔倒时如果人被桌子、床挡住,姿态估计直接失败,关键点置信度掉到 0.1 以下。解决办法一是加多机位,二是当关键点置信度普遍偏低时切换到基于检测框运动特征的备用判据,三是调整机位角度避开主要遮挡物。

原因之二是窗口切分把摔倒事件切碎了。摔倒刚好发生在窗口边界,前后两个窗口各包含一半,按 0.5 阈值判定可能两个窗口都不达标。解决方式是让窗口之间有足够的重叠,或者改用有状态的滑动统计(连续多个窗口的得分做平滑)。

原因之三是标注事件时刻偏差。如果标注的摔倒起点比真实起点晚了半秒,训练时窗口对齐就会错位。这个只能靠提高标注规范来解。

训练不收敛的表现通常是 loss 震荡或者召回率长时间为 0。排查顺序是:先确认标签对不对(我遇到过标签列错位导致正样本全是 0 的情况,查了两小时);再确认输入归一化,关键点坐标如果不做归一化,不同分辨率的样本尺度差异会让模型很难学;然后检查类别权重是不是设得过大导致梯度爆炸;最后才考虑换模型结构。

5.3 常见问题速查表

现象可能原因排查动作解决方向
准确率高但召回率接近 0类别极度不平衡打印混淆矩阵过采样 + Focal Loss
训练集 F1 高、测试集崩受试者泄漏检查划分方式改 LOSO 协议
换个场景误报暴涨背景过拟合对比不同场景指标加场景数据 + 姿态特征
检测延迟超过 2 秒窗口过长或步长太大统计端到端耗时缩短窗口、减小步长
夜间几乎失效光照不足抽查夜间样本加红外补光或换雷达
标签全为 0文件与标签对应错统计标签分布修正映射关系

5.4 落地部署的几个经验

最后一个想聊的是部署。数据集里的指标和现场表现之间,通常还有一道坎。

第一,延迟比精度更影响体验。用户能接受偶尔漏报(因为还有别的求助手段),但很难接受频繁误报和长时间延迟。所以模型选型时,不要一味追求大模型,一个轻量的姿态模型加小型时序网络的组合,推理延迟能控制在 300 毫秒以内,实际体验往往好过大而慢的方案。

第二,报警策略要分层。我的做法是分三级:疑似(模型得分中间区间)只记录不报警;确认(得分高且持续 2 秒未恢复)推送提醒给家属端;高危(摔倒后 30 秒未检测到站立、且无自主移动)直接呼叫护工。分级之后,误报带来的干扰被大幅稀释。

第三,隐私处理要前置。视觉方案在卧室、卫生间这类场景会遇到很强的抵触。可行的做法是只存骨骼关键点不存原始视频,或者在设备端做人体轮廓化处理,原始帧不出设备。这不只是为了合规,也是产品能不能被接受的关键。

第四,持续收集线上疑难样本。模型上线后,把误报和漏报的片段自动回传(在用户授权范围内),每周做一次小规模微调。落地半年后你会发现,自有数据带来的提升远超过换任何模型结构。

我自己做这个方向最大的体会是,摔倒检测数据集的质量不体现在样本数量上,而体现在"边界样本"的覆盖度上。一个只有两千段但把坐下、蹲下、躺下、翻身这些擦边动作都标全的数据集,训出来的模型比一个两万段但只有标准摔倒和二分类标签的数据集好用得多。所以如果你正准备自建数据,我的建议是把三分之一以上的录制时间花在那些"看起来像摔倒但其实不是"的动作上,这部分数据的边际价值最高。另外一个小技巧:录制时让受试者在摔倒后做几种不同的后续行为——立刻起身、原地停留、缓慢爬起——把后续状态也标上,这样你的模型不仅能判断"摔没摔",还能判断"需不需要马上介入",产品的可用性会直接上一个台阶。

返回列表