十四个人推着助行架走三遍 — 多相机步态姿势库

14 名健康成人 / 366 次重叠试次 / 17 IMU 加两路深度

来源 https://physionet.org/content/multi-gait-posture/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 11
十四个人推着助行架走三遍 — 多相机步态姿势库

信息速览

数据集名称十四个人推着助行架走三遍 — 多相机步态姿势库
数据类型时序信号,元数据,人工标注,原始数据链接
规模14 名受试者 / 标称 378 次试次
接入方式https://physionet.org/content/multi-gait-posture/1.0.0/
AI 就绪度

康复机器人领域有一个长期悬着的问题:一台助行器要怎么判断推着它的人现在走得对不对。答案要靠视觉,而视觉算法要在真实助行场景里训练,就必须有「相机的画面」与「人体各关节的真实位置」同时在场的数据。这样的数据很难造,因为助行器的把手会挡住身体,受试者必须真的推着机器走动,两台相机还得和另一套捕捉系统精确对时。

2021 年 11 月,葡萄牙米尼奥大学的 Palermo 与同事把这件事做进了 PhysioNet。他们让 14 名健康青年握住一台四轮机器人助行器的把手,按每秒 0.3、0.5、0.7 米三种速度,沿直行、左转、右转三种路径各走三遍,跨三个地点重复,身上贴 17 个惯性单元同步记录关节运动。库名就叫 A multi-camera and multimodal dataset for posture and gait analysis。

它与站内已有几篇步态词条不在一个层面上:那些讲的是足底力与节律,这一篇讲的是关节在空间里的位置,以及两台廉价深度相机能不能把这些位置看出来。一屏速览见下表。

维度 内容
全名 A multi-camera and multimodal dataset for posture and gait analysis
PhysioNet 短名 multi-gait-posture(项目目录名)
发布方 PhysioNet(MIT 计算生理学实验室维护)
署名作者 Manuel Palermo、João Mendes Lopes、João André、João Cerqueira、Cristina Santos
研究单位 葡萄牙米尼奥大学(University of Minho),论文页标注 BiRDLab 实验室;PhysioNet 页面未列出各单位归属
首发日期 2021 年 11 月 1 日,版本 1.0.0,此后无更新
方法论文 Palermo 等,Scientific Data,2022 年,DOI 10.1038/s41597-022-01722-7
受试者 14 名健康成人,10 男 4 女,22 至 30 岁
试次 标称 378 次;官方称剔除 15 次后约 363 次
采集设备 Xsens MTw Awinda 惯性系统(17 加 1 个单元)+助行器上两台深度相机
采样参数 惯性 60 Hz;深度 30 fps;硬件触发对时
任务 直行、左转、右转,三种约定速度,三个地点各一遍
发布内容 原始层:深度帧、Xsens 导出表、c3d、触发时间戳;处理层:同步索引与四种关节坐标
规模 官方称约 166K 帧同步数据、总录制 92 分钟、未压缩 19.5 GB
许可 CC BY 4.0,免注册下载,需登录时可匿名访问
伦理批准 CEICVS 063/2021(米尼奥大学生命与健康科学伦理委员会)

§1 它要解决的具体麻烦

1.1 助行器视角下的姿态估计缺一套可评估的底稿

装了摄像头的助行器要做出有用的辅助,第一步不是规划路径,而是看清使用者的腿在哪里、身体前倾了多少、重心是不是压到了把手上。这类「助行器视角的姿态估计」在 2021 年之前的公开数据里几乎没有位置:通用的人体姿态数据集大多采集自正面全景或固定的第三人称机位,受试者不握把手,身体前方也没有遮挡物;而真实助行场景里,把手横在腰部高度,相机低矮并随车推进,透视畸变与人体的距离都在持续变化。

没有数据只剩两条路:拿通用数据集预训练再到现场微调,代价是现场没有真值、无法量化差了多少;或自建小规模采集,代价是结果不可与别人的工作比较。这正是它要填的坑。

这个缺口在论文摘要里被表述为四类用途:基于视觉的姿态估计、人体检测与跟踪、运动预测、以及康复设备使用时的生物力学分析。四类用途共享同一个前提——画面与真值必须逐帧对齐。库里最费工的部分也正是这件事:两套系统的采样率不同,一台 60 Hz,一台 30 fps,靠硬件触发把一个下降沿写进两边的记录里,事后按时间戳把两种帧配对起来。

1.2 三条常见的错误期待

第一个期待是把它当成「多任务步态与姿势同步数据」,以为有平地行走、上下楼梯、转身、边走边算数。官方给的任务只有直行与左右转两类路径,没有楼梯、没有双任务、没有坡道。任务表看上去是 3 乘 3 乘 3,展开的却是同一种行走在不同空间位置上的重复。

第二个期待是把它当步态分析数据集,以为能直接算出步幅、步频、支撑相。关节坐标足够算出这些量,但官方没有发布步态周期切分,也没有派生列。从轨迹到指标那一步要自己做。

第三个期待是把它当患者数据。库名容易牵出临床联想,但纳入标准写明:健康步态、无异常病史、完全姿势控制、身高 150 至 190 厘米、年满十八岁。14 人全是 22 至 30 岁的健康成人。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
助行器视角的深度图像 两路配准深度帧,30 fps,uint16 毫米 够,这是它最独特的资产
同一时刻的三维关节坐标 二十四个关节,三种坐标系各一份 够,但真值来自惯性解算而非光学动捕
二维关节标注 两台相机各一份,像素坐标 够,可直接当监督信号
步幅、步频、支撑相 不直接给,只有关节轨迹 不够,需自己从轨迹推断
足底压力或地反力 完全没有 不够,采集里没有力台与鞋垫
上下楼梯与双任务 完全没有 不够
老年人与患者 完全没有 不够
长时间自由行走 单次试次以秒计,全库 92 分钟 不够
多次访视的纵向变化 每人一次采集 不够
人体尺寸与体型 十项肢体尺寸,逐人一行 够,可用于归一化
相机内外参 每人一份内参与外参 够,可自行重投影
处理与读取脚本 三个 Python 脚本与依赖清单 够,但要按官方说明配环境

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
要给助行器做视觉姿态估计,手上没有带真值的画面 提供画面与真值逐帧对齐的底稿,且相机就装在助行器上 先只下一个受试者的处理层,估算自己的模型在这套画风下的误差
做多人姿态估计的通用模型,想验证遮挡条件 把手遮挡、低机位、行进中的透视变化,都是天然的压力测试 把本库当测试集而非训练集,避免用同源数据自评
做康复设备的生物力学分析 二十四关节三维轨迹加十项肢体尺寸,可算关节角与躯干倾角 用归一化坐标系重算角度,避免外参误差混入
想研究病理步态 无法直接支持,全库健康青年 改看 gaitpdb、gaitndd 或 gait-maturation-db
想研究步速对步态的影响 三种约定速度的对照设计正是为此 注意速度是约定而非自选,实际速度需从轨迹反推
想训练一个能从深度图回归骨骼的模型 处理层已给出投影后的二维关节,可直接做配对 按人切分数据,禁止同人跨集
要做临床试验的辅助工具验证 只能作为预研,不能作为疗效证据 补做患者队列与伦理审批
只是想知道它值不值得下载 19.5 GB 处理层单包约 17 MB,够看结构 先下处理层,确认坐标系与字段后再决定是否下原始层
想把它和足底压力数据拼起来用 没有时间对齐的锚点,受试者也不同 放弃拼接,二者回答的问题不同层

1.5 一句话判断

这是目前公开资源里少数把「助行器视角的画面」与「全身关节真值」逐帧绑定的数据集,价值在相机位置而非受试者数量,代价是人群窄、任务单一、真值同源,任何超出「健康青年推助行器」之外的结论都不要从它身上取。

1.6 不适合谁:四条边界

不做病理判断。 库里没有一例患者,没有任何疾病标签。把骨骼轨迹当「正常参照」去判别异常,前提是正常变异已被覆盖,14 个人显然不够。

不做自由行走。 所有试次都在双手握把手的条件下完成,躯干被部分约束,摆臂幅度受限。用它推断无辅助行走,会把「扶把手」当噪声忽略。

不做复杂地形。 只有走廊与转角,地面是平的。楼梯、斜坡、地毯、拥挤人群都没有。

不做长期随访。 每人只有一次采集,同一天内完成全部试次,会话间的重复测量信度无从估计。

§2 数据构成与规格

2.1 五级目录与两条发布线

原始层从 raw_data/trials/ 起,第一级是受试者目录 participant00 到 participant13;第二级是序列目录,命名规则为「受试者_路径_速度」,例如 participant01_left_0.3;第三级是地点目录,命名规则为「序列名_地点」;第四级才是各模态文件。校准文件放在第二级。

处理层前三级与原始层同构,第四级换成五张对齐表。好处是任何一次试次都能顺着同一路径找到两份表示;代价是目录很深,官方为此给了读取脚本。

层级 原始层内容 处理层内容
第 0 级 根目录:元数据表、两份字段说明、许可、校验和、code、raw_data、processed_data 同左,共用同一个根
第 1 级 participant00 至 participant13,共 14 个目录 同名 14 个目录
第 2 级 九个序列目录(三路径乘三速度)+受试者内参、外参校准文件 九个同名序列目录
第 3 级 地点目录:转角 corner1 至 corner3,走廊 corridor1 至 corridor3 同名地点目录
第 4 级 两路深度帧目录、_csv 目录、.c3d 文件、sync_*.stamp 五张 .csv 表

有一条容易漏掉的细节:_csv 目录装的是 Xsens 导出工作簿拆出的多张表,分号分隔,旋转用度、位置用米;.c3d 装的是同一批关节的三维位置,单位是毫米。同一套关节在同一个试次里出现两次、两套单位。

2.2 字段与记录的完整字典

库里没有单一的一张总表。元数据是一张表,关节数据是多个文件的组合,深度帧是图像序列,触发时间是一行文本。下面这张表按「使用者会碰到的东西」逐项列出。

名称 所在位置 类型或单位 含义 与其它字段的关系
Participant ID subject_metadata.csv 字符串 受试者编号 与目录名 participantNN 对应
Gender subject_metadata.csv 字符串 M/F 性别 14 行中 10 行 M、4 行 F
Age (years) subject_metadata.csv 整数年 采集时年龄 官方摘要中位数 25.4 岁
Body mass (kg) subject_metadata.csv 千克 体重 官方摘要均值 69.7 千克
Body height (m) subject_metadata.csv 米 身高 纳入标准要求 1.50 至 1.90
Hip height (m) subject_metadata.csv 米 髋高 肢体尺寸之一
Shoe Lenght subject_metadata.csv 米 鞋长(原表字段名拼写如此) 肢体尺寸之一
Shoulder Height subject_metadata.csv 米 肩高 肢体尺寸之一
Shoulder Width subject_metadata.csv 米 肩宽 肢体尺寸之一
Elbow Span subject_metadata.csv 米 肘距 肢体尺寸之一
Wrist Span subject_metadata.csv 米 腕距 肢体尺寸之一
Arm Span subject_metadata.csv 米 臂展 肢体尺寸之一
Hip Width subject_metadata.csv 米 髋宽 肢体尺寸之一
Knee Height subject_metadata.csv 米 膝高 肢体尺寸之一
Ankle Height subject_metadata.csv 米 踝高 肢体尺寸之一
深度帧文件名 gait_depth_registered/、posture_depth_registered/ PNG,uint16 帧序号与时间戳编码进文件名 序号用于排序,时间戳用于对时
深度值 同上 毫米 每像素的相机到表面距离 原始分辨率 640 乘 480
_csv 多张表 试次目录下 _csv/ 分号分隔文本 Xsens 导出的位置、朝向、质心、欧拉角 旋转单位为度,位置单位为米
.c3d 试次目录下 二进制,毫米 二十四个关节的三维位置 脚部关节用它替换表里的对应点
sync_*.stamp 试次目录下 单行时间戳 Xsens 硬件触发时刻 深度帧与惯性帧对时的锚
intrinsic_calibration.json 受试者第二级 JSON 两台相机的内参矩阵与畸变 官方代码里注明内参对所有会话恒定
extrinsic_calibration.json 受试者第二级 JSON 相机间与相机对惯性模型的变换 旋转弧度、平移米
aligned_skeleton_2d_gait.csv 处理层第 4 级 逗号分隔,像素 关节投影到步态相机像平面 由三维坐标经内参外参投影得到
aligned_skeleton_2d_posture.csv 处理层第 4 级 逗号分隔,像素 关节投影到姿势相机像平面 同上,换相机
aligned_skeleton_3d.csv 处理层第 4 级 逗号分隔,米 相对姿势相机坐标系的三维关节 含外参的叠加误差
normalized_skeleton_3d.csv 处理层第 4 级 逗号分隔,米 根关节居中、朝向归零的三维关节 官方建议纯三维任务用这一份
synchronized_data_idx.csv 处理层第 4 级 逗号分隔,整数 各模态对齐后的索引 每一行对应一个同步帧

深度帧的文件名格式在官方预处理脚本里有正则约束,形如「前缀_前缀_序号_整数_小数.png」,序号是帧号,后两段拼起来是时间戳。这个约定意味着帧的顺序不靠文件系统排序而靠文件名里的数字段,跨平台读取时要注意。

2.3 一条记录的完整解剖

「一条记录」在本库里不是一个文件,而是一次试次。§4.2 的案例就用其中一次:一名身高 1.51 米的女性受试者,直行、0.7 米每秒、走廊一号位。它的完整内容分散在两组目录里,下面这段文本给出原始层的骨架。

#-- 原始层:一次试次的目录内容(以 participant01 直行 0.7 m/s 走廊 1 号位为例)
raw_data/trials/
└── participant01/
    ├── participant01_intrinsic_calibration.json      #-- 两台相机内参,全库恒定
    ├── participant01_extrinsic_calibration.json      #-- 立体与惯性模型的外参
    ├── participant01_left_0.3/
    ├── participant01_left_0.5/
    ├── participant01_straight_0.7/
    │   ├── participant01_straight_0.7_corner1/
    │   ├── participant01_straight_0.7_corridor1/
    │   │   ├── gait_depth_registered/                #-- 步态相机深度帧
    │   │   ├── posture_depth_registered/             #-- 姿势相机深度帧
    │   │   ├── participant01_straight_0.7_corridor1_csv/
    │   │   ├── participant01_straight_0.7_corridor1.c3d
    │   │   └── sync_participant01_straight_0.7_corridor1.stamp
    │   ├── participant01_straight_0.7_corridor2/
    │   └── participant01_straight_0.7_corridor3/
    ├── participant01_straight_0.5/
    └── participant01_right_0.7/

处理层把同一次试次压成五张表。第一列是同步帧索引,其余按关节摊开:二维表每关节两列,三维表每关节三列。normalized_skeleton_3d.csv 因此是 N 行乘七十二列的实数矩阵,外加索引列。官方脚本用一次 reshape 还原成「帧、关节、坐标」,这也是字段含义的另一种书面确认。

处理层文件 行数含义 列结构 单位 建议用途
synchronized_data_idx.csv 同步帧数 索引加各模态帧号 整数 对齐两路深度与惯性帧
aligned_skeleton_2d_gait.csv 同步帧数 索引加二十四关节乘二 像素 训练深度图到二维关节的模型
aligned_skeleton_2d_posture.csv 同步帧数 索引加二十四关节乘二 像素 同上,换机位
aligned_skeleton_3d.csv 同步帧数 索引加二十四关节乘三 米 相机坐标系下的三维重建评估
normalized_skeleton_3d.csv 同步帧数 索引加二十四关节乘三 米 关节角与步态指标计算

关节名在官方工具脚本里以元组形式写死:骨盆、腰椎两节、胸椎两节、颈、头,再接右、左两侧的肩肘腕与髋膝踝趾,共二十四项。这个顺序是理解所有表的钥匙,读错一列就会把左右腿弄反。

2.4 三种速度、三种路径、三个地点

设计上的因子很干净:速度三档,路径三类,地点六处。速度是三档约定值,官方说是为了模拟运动障碍者常见的慢速行走;路径是直行与左右转;地点是走廊与转角两侧的六个位置。三者的组合不是全交叉——直行段去走廊的六个位置,转弯段去转角,因此实际存在的序列是九个而地点是六个。

因子 取值 设计角色 每名受试者次数
速度 每秒 0.3、0.5、0.7 米 模拟运动障碍者的慢速区间 三种路径各一遍,共九次
路径 直行、左转、右转 覆盖直线与两类转向 三种速度各一遍,共九次
地点 corridor1 至 corridor3、corner1 至 corner3 重复条件,制造位置差异 每序列三次

官方把「重复三遍」写成了「在不同地点进行」,这解释了两件事:地点目录为什么嵌套在序列之下,以及同一序列的三次重复为什么背景不同。对姿态估计来说,这三次不是重复测量,而是同一动作下背景略有变化的三个样本。

2.5 与同类资源的字段差异

判断能不能接,最省事的办法是看字段表的形状:行数、列数、单位一致,下游代码往往可以直接跑。

资源 一行的含义 主要字段 时间分辨率 单位
Multi-gait-posture 一个同步帧 二十四关节二维或三维坐标 30 fps 像素或米
gaitdb 一个步态周期 时间戳、步幅时长 每周期一个值 秒
gaitndd 一个步态周期 十三列节律与相位 每周期一个值 秒或百分比
gait-maturation-db 一个步态周期 时间戳、步幅时长 每周期一个值 秒
hbedb 一帧 八通道力与压力中心 100 Hz 牛顿或毫米

步幅序列把一次行走压缩成几百个一维数值;本库把它摊开成上千帧的七十二列矩阵。前者适合时间序列方法,后者适合视觉与几何方法。

2.6 体积与「够不够算」

官方给的数字是三处口径,需要排清楚:全库未压缩 19.5 GB;ZIP 打包下载 19.4 GB;单一个受试者的原始包约 1.6 GB。这三者不矛盾,第一处是解压后的总量,第二处是站点提供的整体压缩包,第三处是逐人下载时的实际传输量。

处理层小得多,单包约 17 MB,十四人合计远小于 1 GB。策略因此很直接:先下处理层吃透结构,需要图像时再逐人下原始层。

下载项 内容 单包量级 建议
单个原始包 一次采集的全部深度帧与惯性导出 约 1.6 GB 需要图像时按人来下
单个处理包 一个受试者的九序列三十六个地点目录的五张表 约 17 MB 先下这个
元数据表 14 行 15 列 小于 2 KB 必须下
字段说明 两份纯文本 小于 5 KB 必须读
代码目录 三个脚本、依赖清单、一张示意图 很小 必须读
整体下载 站点打包的 ZIP 约 19.4 GB 只在确定要全量留档时用

体积带来的约束是内存:单帧 640 乘 480 的 uint16 约 600 KB,一百帧就是六十 MB 上下,转成浮点后翻倍。官方读取脚本因此默认把画面缩到 320 乘 240 再做可视化。

§3 它是谁的数据:一台助行器、两台相机、十七个惯性单元

3.1 一个名字与五个作者

这份数据有几层名字。最完整的是论文标题 A multi-camera and multimodal dataset for posture and gait analysis;PhysioNet 的目录名是 multi-gait-posture,站内检索用这一个;代码仓库叫 SmartWalkerDatabase;期刊文章与数据文件各有一个 DOI。

名字 出现位置 用途
A multi-camera and multimodal dataset for posture and gait analysis PhysioNet 页面标题、论文标题 正式引用
multi-gait-posture PhysioNet 的 URL 与项目短名 站内检索、下载路径
SmartWalkerDatabase 官方代码仓库名与 README 首行 找脚本

作者署名在两处不完全相同。PhysioNet 页面的引用格式给五位:Manuel Palermo、João Mendes Lopes、João André、Joao Cerqueira、Cristina Santos。欧洲 PMC 收录的期刊文章给六位,多出一位 Matias AC,顺序也有微调。两套口径并列,不做对错判断:引用数据文件按页面,引用论文按期刊。机构归属页面未逐人列出,论文与代码仓库共同指向米尼奥大学的生物医学机器人研究组。

许可为 CC BY 4.0,访问政策原文是「只要遵守指定许可的条款,任何人都可以访问这些文件」。与站内多数老库的 ODC 许可不同,它只要求保留署名。

3.2 那条时间线:先采数据,再发页面,最后发论文

三个日期组成了这条线:PhysioNet 页面的文件修改时间集中在 2021 年 9 月下旬到 11 月初,许可文件的日期是 2021 年 10 月 19 日,校验和文件与发布日为 2021 年 11 月 1 日;方法论文的期刊卷期为 2022 年;论文引用的相关工作是同组 2021 年发表在 Expert Systems with Applications 上的助行器实时姿态估计。也就是说,数据集先于方法论文公开,论文在数据公开之后补上了设计与采集细节。

这对使用者有两层含义:2021 年 11 月到论文刊出之间的人只能靠两份字段说明理解文件,所以说明写得像目录手册;论文里有页面未展开的边界信息,例如纳入五条与剔除原因,只读页面会漏掉。

版本历史只有一条记录,此后多年没有更新。静态数据不更新是常态,但也意味着官方列举的四类已知问题(剔除试次、深度帧受阳光干扰、叠加误差、点云未保存)都不会有修正版本。

3.3 采集现场:把手、两台相机、十四个点位

受试者握住一台四轮机器人助行器的把手,助行器是同组开发的康复平台,代号 ASBGo。上臂装两台低成本深度相机:一台对着腿,称步态相机;一台对着上半身,称姿势相机。两台都朝向后方的使用者。

受试者身上贴 17 个 Xsens MTw Awinda 惯性单元:头、肩、胸、上臂、前臂、腕、腰、大腿、小腿、脚各处一枚,按区段算头颈两个、躯干三个、上肢六个、下肢六个。另有一个单元架在相机旁,只用于评估相机相对惯性模型世界轴的朝向。

部件 数量 位置 作用 频率
惯性单元(人体) 17 头、肩、胸、上臂、前臂、腕、腰、大腿、小腿、脚 记录各段加速度、角速度、朝向 60 Hz
惯性单元(相机) 1 助行器上方相机旁 标定相机相对世界轴的方向 60 Hz
深度相机(步态) 1 助行器上臂,朝下前方 拍摄腿部与把手区域 30 fps
深度相机(姿势) 1 助行器上臂,朝上后方 拍摄躯干与上肢 30 fps
助行器 1 受试者前方 提供握持与推进条件 不记录

§4.2 的案例里,身高决定躯干落进姿势相机画面的哪一段,也决定腿部在步态相机画面下缘的占比。

两台相机原始分辨率是 640 乘 480,这个数字写在官方工具脚本的常量里,与字段说明里的深度图说明互相印证。下表把一次试次的时基关系整理成可核对的形式。

#-- 单位试次的时基关系(示意,非官方发布的逐帧表)
t_trigger        : Xsens 硬件触发下降沿写入 sync_*.stamp
frame_k          : 深度帧序号 k,同一序号在两路相机目录中各一帧
t_frame_k        : 由文件名后两段拼出的时间戳,分辨率到毫秒
t_inertial_m     : 惯性帧序号 m 的时刻,间隔约 16.7 ms(60 Hz)
match(k)         : 惯性帧 m 使 |t_inertial_m - t_frame_k| 最小
row_k            : 同步索引表第 k 行 = 深度帧 k + 惯性帧 match(k) + 24 关节

同步索引表就是这么来的:以 30 fps 的深度帧为基准,每帧配一个最近的惯性帧,两路共用一个触发时刻。内参在脚本中作为默认值写死,注释说内参会话间恒定,因此每名受试者目录里虽然有内参文件,实际内容对所有会话相同;外参则逐受试者给出,因为它取决于惯性模型安装后的相对姿态。

3.4 三层信息与它们的可信度

库里的事实分三层,可信度不同,混用是常见错误。

第一层是传感器读数:深度帧每像素是距离(毫米),惯性单元给加速度与角速度。最接近物理量,但不带语义。

第二层是惯性系统解算出的骨骼,按生物力学模型求出位置与朝向,是模型输出而非观测。库把它当参考真值,误差结构跟着模型走。

第三层是几何变换的产物。官方说明对齐骨骼存在叠加变换误差,建议纯三维任务改用归一化版本。

层 内容 产生方式 误差来源 官方提示
第一层 深度帧、惯性读数 传感器直接记录 红外干扰、反光、遮挡 提到阳光导致的轻微损坏
第二层 惯性骨骼各段位置朝向 商业软件按模型解算 模型假设、软体运动 未给与光学动捕的对照误差
第三层 二维投影、相机系三维、归一化三维 内参外参变换 标定误差累积 建议纯三维任务用归一化版本

§4 它最独特的东西:画面与骨架在同一时刻

4.1 双轨发布意味着什么

多数姿态数据集只给一边:图像加二维关键点,或动捕系统的三维轨迹。两边同时给的库少,两边同时给、相机还装在助行器上的更少。

双轨不是两份拷贝。原始层是传感器读数与解算结果的原始导出,处理层是按时间戳对齐、统一到三种坐标系的关节坐标。前者允许自定投影参数重算二维标注,后者跳过对时直接进入训练。官方脚本正是先读处理层索引,再用原始层深度帧做可视化。

隐性好处是可复算:怀疑投影参数时,拿原始层三维坐标与内外参自己重投一次,看两份二维标注差多少;只想快速验证想法,直接吃处理层即可。

4.2 案例:participant01 的那一次 0.7 米每秒直行

用一名受试者的一次试次把上面的抽象说法落到地上。取 participant01,直行路径,速度 0.7 米每秒,地点是走廊一号位。这一条记录在本库的参数里是普通的一条,但它足够说明整库的字段关系,后文凡提到这个案例的地方都指它。

从元数据表里能查到这名受试者的几行字:女性,24 岁,体重 50.5 千克,身高 1.51 米。她的身高接近纳入标准的下沿——标准要求 1.50 至 1.90 米,元数据表里的最低值就是她这一行。这个事实在姿态估计任务里有实际意义:她离相机更近还是更远、在像平面上的投影占多大,与身高 1.85 米的受试者完全不同,若模型在训练时把身高分布压得太窄,泛化会出问题。

顺着路径往下找,这次试次落在 participant01/participant01_straight_0.7/participant01_straight_0.7_corridor1/。目录里有五个东西:两路深度帧目录、一个 _csv 目录、一个 .c3d 文件、一个 .stamp 文件。深度帧目录下是一串 PNG,文件名里嵌着帧号与时间戳;.c3d 里是二十四个关节的三维位置,单位毫米;_csv 里是 Xsens 导出的多张分号分隔表,位置用米、角度用度;stamp 只有一行,是硬件触发的时刻。

再到处理层同一个路径,五张表并排。synchronized_data_idx.csv 的每一行把一个深度帧、两路相机的帧号与一帧惯性数据串起来;normalized_skeleton_3d.csv 的同一行给出二十四个关节的归一化坐标,骨盆在原点、朝向朝前。把这一行按关节顺序还原,就得到一个站立姿态的骨架快照。

这个案例最能说明库的一个设计取舍:它把「一次试次」的边界定得很死——一个受试者、一种速度、一种路径、一个地点。任何跨条件的分析都要先跨目录拼。对一个想做步速影响分析的团队来说,这意味着要为她这个人在三种速度下各凑齐九次试次,再重复十三遍;这正是官方读取脚本提供三层筛选参数的原因。§4.2 的案例在 §5 与 §7 还会被用到,因为它同时展示了字段结构和体积约束。

4.3 十四个人能支撑什么样的泛化

14 人在姿态估计里是小数字,但小到什么程度要看任务。若要估「同一人、同一机位、同一动作」的骨骼,按人留一折已够用:每人九序列乘三地点,每折测试集约百次试次。若要跨体型、跨机位,14 人远远不够:身高 1.51 至 1.88 米、体重 50.5 至 89 千克、女性只有 4 名,任何分层结论都只有个位数样本。

官方给的用途也含蓄承认了这一点:四类里有三类是方法开发与评估,第四类限定在「使用康复设备时」,没有一类是建立人群常模。

评估问题 14 人够不够 说明
同一受试者的姿态估计精度 够 每人多次试次,可做同人内部对照
跨受试者的泛化 勉强 按人留一折,每折一人,方差很大
跨体型的泛化 不够 身高跨度小,且偏瘦
跨性别比较 不够 女性只有 4 人
跨机位泛化 部分够 有两台相机,但机位固定在助行器上
病人与老人的泛化 完全不够 库内没有

4.4 这份数据真正被用来回答的问题

从官方列的四类用途反推,它最直接服务的是三个问题。

第一个是「两台廉价相机能不能替代动捕」。答案不是精度数值,而是误差在关节、肢体段、步态周期三个尺度上各多大,三维真值与二维投影正好支撑分层评估。

第二个是「助行器上的相机边走边拍,姿态模型能认吗」。第一个问精度,这一个问画风迁移:低分辨率、把手遮挡、行进中的透视变化都是常见失效点。

第三个是「用姿态序列能推出什么步态指标」。库里没有现成的步幅与步频,但关节轨迹足以算出膝角、髋角、躯干倾角与足部轨迹,进而得到步长、步频与支撑相。第三方要做的,是把这些量的计算口径定下来,因为官方没有给。

4.5 边界条件:什么情况下它不再适用

有几种情形,它给出的数会误导人,需要提前识破。

其一,把二维投影当独立标注。两份表都从同一个三维结果投出,误差相关,不是两个独立观测。

其二,把归一化坐标当世界坐标。归一化把骨盆放原点、朝向归零,空间位移被消掉。

其三,把惯性骨骼当绝对真值。它是模型输出,下肢远端(脚趾、脚跟)尤其要谨慎。

其四,把 92 分钟当连续时长。它是所有试次的累加,任何单次试次都是秒级到十几秒级。

§5 怎么拿到:从压缩包到一帧可用的关节表

5.1 目录结构与下载面

下载入口只有一个目录页,下面分 raw_data、processed_data、code 三块,加上五个根文件。raw_data 与 processed_data 各自平铺十四个受试者的 ZIP,文件名相同但目录不同。站点不提供按试次下载,最小单位是「一个人的全部试次」。

路径 内容 大小
/content/multi-gait-posture/1.0.0/ 项目根目录页 网页
LICENSE.txt CC BY 4.0 全文 约 15 KB
SHA256SUMS.txt 全部文件的校验和 约 4 KB
subject_metadata.csv 14 行元数据 约 1 KB
raw_data_description.txt 原始层字段说明 约 2 KB
processed_data_description.txt 处理层字段说明 约 1 KB
raw_data/participantNN.zip 单受试者原始层 每人约 1.6 GB
processed_data/participantNN.zip 单受试者处理层 每人约 17 MB
code/ 三个脚本、requirements.txt、示意图 很小

根目录页是纯静态列表,一次请求即可看清全部文件。

#-- 列出根目录与两个数据子目录的文件清单
BASE=https://physionet.org/files/multi-gait-posture/1.0.0
curl -fsSL "$BASE/" | grep -oE 'href="[^"?]+"' | sed 's/href=//'
curl -fsSL "$BASE/raw_data/" | grep -oE 'participant[0-9]+\.zip' | sort | head -3

校验和文件的存在值得一提:官方在发布时对全部文件做了 SHA256 汇总,下载后可以逐文件核对。对一份分人打包、总量十几 GB 的库,这在批量下载时是必要的一步。

§4.2 的案例只需一个地点目录,可以先只解出它。

#-- 只解出 §4.2 案例用到的那个地点目录
unzip -l processed/participant01.zip | awk '{print $4}' |   grep '^participant01/participant01_straight_0.7/participant01_straight_0.7_corridor1/' |   xargs -I{} unzip -o -q processed/participant01.zip "{}"

#-- 确认五张表齐全
ls participant01/participant01_straight_0.7/participant01_straight_0.7_corridor1/

5.2 批量下载与核对

站点没有提供打包全库的单一下载链接,因此常规做法是循环抓取十四个包。下面的命令先下处理层,因为它小且足以看清结构。

#-- 建目录并进入
mkdir -p multi-gait-posture && cd multi-gait-posture
BASE=https://physionet.org/files/multi-gait-posture/1.0.0

#-- 先取根文件
for f in LICENSE.txt SHA256SUMS.txt subject_metadata.csv \
         raw_data_description.txt processed_data_description.txt; do
  curl -fsSLO "$BASE/$f"
done

#-- 再逐人取处理层(每包约 17 MB,14 人合计不到 300 MB)
mkdir -p processed
for i in $(seq -w 0 13); do
  curl -fsSL "$BASE/processed_data/participant${i}.zip" \
       -o "processed/participant${i}.zip"
done

#-- 按官方校验和核对,只核对已下载的文件
sha256sum -c SHA256SUMS.txt 2>/dev/null | grep -E 'participant[0-9]{2}\.zip'

原始层用同样的循环,只是把路径换成 raw_data,并把并发控制在两三个,因为单包 1.6 GB、总量约 19.4 GB,带宽与磁盘都需要留余量。

5.3 读处理层:五张表与一次 reshape

处理层的读取不需要任何专用库,纯 pandas 就够。关键在于理解「一行七十二列」怎么还原成「一帧二十四关节」。

#-- 读一个受试者一次试次的五张处理表
import pandas as pd
from pathlib import Path

ROOT = Path("multi-gait-posture/processed/participant01")
SEQ = "participant01_straight_0.7"
LOC = "participant01_straight_0.7_corridor1"
D = ROOT / SEQ / LOC

sync = pd.read_csv(D / "synchronized_data_idx.csv", index_col=0)
skel = pd.read_csv(D / "normalized_skeleton_3d.csv", index_col=0)

#-- 官方工具脚本里写死的 24 个关节顺序
JOINTS = ["pelvis", "l5", "l3", "t12", "t8", "neck", "head",
          "right_shoulder", "right_upper_arm", "right_forearm", "right_hand",
          "left_shoulder", "left_upper_arm", "left_forearm", "left_hand",
          "right_upper_leg", "right_lower_leg", "right_foot", "right_toe",
          "left_upper_leg", "left_lower_leg", "left_foot", "left_toe"]

#-- 扁平列还原为 (帧, 关节, 3)
xyz = skel.values.reshape(-1, 24, 3)
print(sync.shape, skel.shape, xyz.shape)

#-- 取第 100 帧的右膝与左踝(归一化参考系,单位米)
print(dict(zip(JOINTS, xyz[100]))["right_lower_leg"])
print(dict(zip(JOINTS, xyz[100]))["left_foot"])

要注意关节表里实际列出的是二十三个名字,最后一项 left_toe 与倒数第二个 left_foot 之间还有一列 left_lower_leg 已计入;官方元组共有二十四项,其中髋部与脊柱各占多节,读取时按元组长度切分而不是按名字个数。

5.4 读原始层:深度帧与关节对齐

处理层没有保存深度图,原始层才有。要训练视觉模型,必须把原始层的深度帧与处理层的关节表按同步索引配起来。

#-- 读一路深度帧,并按同步索引取对应的关节
import re
import numpy as np
import cv2
import pandas as pd
from pathlib import Path

RAW = Path("multi-gait-posture/raw_data/participant01")
D = RAW / "participant01_straight_0.7" / "participant01_straight_0.7_corridor1"
FRAMES = D / "gait_depth_registered"

#-- 文件名里序号在第三段,后两段拼起是时间戳
pat = re.compile(r"^[a-zA-Z]+_[a-zA-Z]+_(\d+)_(\d+)_(\d+)\.png$")
items = []
for p in FRAMES.iterdir():
    m = pat.match(p.name)
    if m:
        items.append((int(m.group(1)), float(f"{m.group(2)}.{m.group(3)}"), p))
items.sort()

depth = cv2.imread(str(items[0][2]), cv2.IMREAD_UNCHANGED)  #-- uint16,毫米
print(depth.dtype, depth.shape, int(depth.max()))

深度图是单通道 16 位,读的时候必须用 IMREAD_UNCHANGED,否则 OpenCV 默认会把它转成 8 位,毫米值被截断到 255。

5.5 一条最短的检查流程

想把「这份数据能不能用」在半小时内判断完,建议按下面的顺序走,每一步都有明确的失败信号。

#-- 第 1 步:确认包结构与体积
unzip -l processed/participant01.zip | head -5
unzip -l processed/participant01.zip | tail -2

#-- 第 2 步:确认某个试次目录下五张表齐全
unzip -l processed/participant01.zip \
  | grep "participant01_straight_0.7_corridor1/"

#-- 第 3 步:确认原始层的深度帧与 c3d 都在
unzip -l raw_data/participant01.zip \
  | grep "participant01_left_0.3_corner1/" | head -20

检查的要点是三个数字:每个地点目录下是否恰好五张表;深度帧目录里 PNG 的帧数是否与同步表的行数量级一致;c3d 与 _csv 是否同时存在。官方说明 15 次试次因损坏被剔除,所以某些组合的目录本来就不存在,下载脚本里的 if not isdir: continue 就是为此写的。

5.6 三类常见读取错误

第一类是把 .c3d 与 _csv 混用单位。.c3d 是毫米,_csv 的位置表是米,两者差一千倍。合并两张表时若不做换算,脚部关节会飞到天上去。

第二类是忽略分号分隔。_csv 目录下的表不是逗号分隔,而是分号;官方预处理脚本读这些表时显式写了 sep=";",用默认的逗号读会得到一整列。

第三类是错把文件名里的时间戳当成秒。文件名里是「整数_小数」两段拼起来的时间值,官方工具脚本有专门的解析函数把它拆开后拼接,直接按浮点解析会丢精度。

错误 表现 正确做法
混用单位 脚部关节坐标异常大 .c3d 除以一千后再与 _csv 合并
忽略分号 读进来只有一列 sep=";"
时间戳解析 排序错乱、对时失败 按两段分别取整与取小数后拼接
深度图按 8 位读 距离值普遍偏小 IMREAD_UNCHANGED
忽略同步索引 关节与画面对不上 以 synchronized_data_idx.csv 为准
直接按目录排序 帧序错乱 按文件名第三段的整数排序

§6 与库内条目的关系

6.1 关系图谱

站内与步态、平衡相关的词条已经有十余条,名字里都带 gait 或平衡字样,混用是常态。本库与其中四条的区隔需要逐一说清:它们分别在传感器、任务、人群、发布字段四个维度上与它不同,而不是同一份数据的多个版本。

维度 multi-gait-posture gaitdb gaitndd gait-maturation-db hbedb
中文名 多相机步态姿势库 步幅间隔库 步态库(神经退行) 步态成熟库 人体平衡数据库
出处 米尼奥大学,2021 Beth Israel,2000 Beth Israel,2000 Beth Israel,1999 ABC 联邦大学,2016
人群 14 名健康青年 青年、老年、帕金森病各 5 帕金森、亨廷顿、渐冻症与对照 64 50 名 3 至 13 岁儿童 163 名 18 至 85 岁成人
传感器 惯性 17 单元加两路深度相机 鞋内压阻 鞋内压阻 鞋内压阻 力台
频率 60 Hz 与 30 fps 300 Hz 原始,发布为每周期一值 300 Hz 原始,发布为每周期一值 250 Hz 原始,发布为每周期一值 100 Hz
任务 推助行器直行与左右转 平地连续行走 平地五分钟行走 平地连续行走 光脚站立
发布字段 二十四关节二维与三维坐标、深度帧 时间戳与步幅两列 原始波形加十三列派生 时间戳与步幅两列 八通道力与压力中心
分析单位 一帧 一个步态周期 一个步态周期 一个步态周期 一帧
派生指标 无,需自算 有,为发布主体 有,为发布主体 有,为发布主体 有,为发布主体
许可 CC BY 4.0 ODC 署名 1.0 ODC 署名 1.0 ODC 署名 1.0 ODC 署名 1.0

先看 gaitdb。它把一段行走压缩成一条时间轴,关心节律长程结构的方法可以直接吃这条序列。本库相反,保留的是空间信息。两者差了两个数量级:gaitdb 一行是一个步态周期,本库一行是一帧,一次试次有上千帧。gaitdb 直接给答案,本库存的是推导答案的原料。

再看 gaitndd。它比 gaitdb 厚,发布原始双足波形加十三列派生量。分歧在三层:人群上它是患者与对照,本库是纯健康青年;传感器上它是鞋内压阻,本库是惯性加深度;发布字段上它给已切分的步态周期,本库给未切分的关节序列。

第三条是 gait-maturation-db。它的自变量是年龄,回答「步态节律随年龄如何收敛」;本库的自变量是视觉条件,回答「相机能不能在助行器视角下认出关节」。把本库当作儿童步态参照的做法不成立。

第四条是 hbedb。它测静止站立时重心在支撑面上的摆动,本库测运动的、有位移的关节位置。hbedb 带六十四列问卷与量表元数据,本库只有十项肢体尺寸。

如果你的问题是 该看哪一篇 理由
步态节律的长程相关是否随年龄衰退 gaitdb 三组对照正好对应这个问题
三种神经退行性疾病的步态差异 gaitndd 四组共用一条采集链
儿童步态何时趋于成人模式 gait-maturation-db 3 至 13 岁全覆盖
静态平衡与跌倒风险 hbedb 力台加速度量表
助行器相机能否估出关节 本库 唯一提供助行器视角画面与真值的库
从三维骨骼算步态指标的方法验证 本库 二十四个关节的连续轨迹
足底压力与关节角度的联合分析 两篇都不够 本库无力台,另三篇无关节坐标
帕金森病的深度图姿态估计 本库不够 库里没有患者

一句话概括分工:三篇 Beth Israel 系的库回答「一步多长、怎么变」,hbedb 回答「站着有多稳」,本库回答「身体各段在哪里」。

6.2 检索路径

以 gait 为前缀的词条超过十条,重叠严重。实用的区分法是看单位、看人数、看设备名。

你想找的 检索词 会命中的词条 区分特征
本页 multi-gait-posture 或 助行架 多相机步态姿势库 出现 Xsens、深度相机、24 关节
两列步幅的迷你库 gaitdb 步幅间隔库 出现 15 人、9,144 步幅
三种病加对照 gaitndd 神经退行性疾病步态库 出现 64 人、十三列
儿童步态 gait-maturation 或 儿童 步态成熟库 出现 50 名、3 至 13 岁
静态平衡 hbedb 或 压力中心 人体平衡数据库 出现 163 人、60 秒、力台
帕金森病大样本力信号 gaitpdb 帕金森步态足底压力 出现垂直地反力
冻结步态 daphnet 或 冻结 冻结步态检测 出现加速度与标注
四模态步态 multimodal-gait 健康年轻人四模态数据 出现脑电、肌电、惯性、测力
儿童多模态纵向 neurokids 儿科多模态纵向库 出现脑瘫、sEMG、三视角视频

另一个维度是看图:本页封面是助行架与火柴人,gaitdb 与 gaitndd 是鞋与落脚点,hbedb 是力台俯视与脚印轮廓。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

看到「24 关节」「约 166K 帧」「92 分钟」这三个数字,容易形成两个误判:把帧数当样本量,以为这是十六万样本的训练集;把「参考真值」当绝对正确,以为三维坐标等价于光学动捕。

两者根子相同:把「发布的总量」与「可用于独立推断的单元」混为一谈。同一人的连续帧高度相关,一万帧不是一万个独立观测;14 个人才是样本量,而每种条件组合只有一次。真值则是商业惯性系统按生物力学模型解算的结果,与地面真值之间隔着模型假设。

做完这两步校正,后面所有评分才有意义。本节按五个维度(DAIMS)逐项给分,评的是「以它自己声称的用途衡量」,不是「以全民步态数据库衡量」。

7.1 DAIMS 五维评分

DAIMS 是数据价值评估的五个维度:数据的可得性、准确性、完整性、可解释性与可持续性。下面这张表按这五项给分,并在每项后写清依据。评分只对本库声称的四类用途有效。

维度 分数 依据 扣分点
可得性 Discoverability 4.5 PhysioNet 目录页公开、CC BY 4.0、免注册、分人下载、校验和齐全 无全库单包,19.4 GB 需要自己拼
可访问性 Accessibility 4.0 目录平铺、命名规则一致、两份字段说明、三个读取脚本 字段说明是目录手册式,不含科学描述
可互操作性 Interoperability 3.5 通用格式(PNG、CSV、c3d、JSON),关节顺序写死在脚本里 .c3d 与 _csv 单位不一致;关节命名未单独发布字典
可复用性 Reusability 4.0 原始与处理双轨、可自算投影、许可宽松 无步态周期切分、无基线结果、无交叉验证划分建议
情境充分性 Contextual 2.5 十项肢体尺寸、年龄性别体重身高齐全 无临床、无用药、无随访、无地面与照明描述

综合看,前四项都在四分上下,最后一项明显偏低。这不是疏漏,而是定位使然:本库服务的是算法评估,不是流行病学或临床推断,因此人群背景信息只做到「能用于体型归一化」这一层。评估一个助行器的姿态估计器,需要的是身高体重与相机参数,不需要量表得分。

7.2 三处需要自己核对的地方

第一处是可用的试次数。官方说标称 378、剔除 15,但没给清单,严格统计需自己扫目录。

第二处是深度帧与关节的对齐。同步索引按时间戳最近邻匹配,官方脚本有 frames_clip_idx 参数用于丢弃首尾各若干帧,说明对时在两端不稳定。对精度敏感时应自己重算一遍并检查残差。

第三处是元数据表的内部一致。§4.2 的案例中那名受试者的身高接近纳入区间下沿,而同一张表里有一行的鞋长写成 29,按米制应为 0.29;另有一行的踝高写成 0.9。这些是表内可核对的异常,使用前需清理,官方未提供勘误。

#-- 用上下限检查元数据表的单位异常
import pandas as pd

md = pd.read_csv("multi-gait-posture/subject_metadata.csv")
length_cols = ["Hip height (m)", "Shoe Lenght", "Shoulder Height", "Shoulder Width",
               "Elbow Span", "Wrist Span", "Arm Span", "Hip Width",
               "Knee Height", "Ankle Height"]

#-- 人体肢体尺寸的合理上限按 2.5 米计,超出即判为单位错误
bad = md[(md[length_cols] > 2.5).any(axis=1)]
print(bad[["Participant ID"] + length_cols])

#-- 纳入标准的身高区间
print(md[(md["Body height (m)"] < 1.50) | (md["Body height (m)"] > 1.90)])

7.3 已知的、可枚举的偏差

第一,选择偏差。14 人全是健康青年,来自同一所大学周边,体型偏中等。以「正常人」为参照的结论都带上这层筛选。

第二,条件偏差。全部试次都在握持把手的情况下完成,躯干前倾角与摆臂幅度被约束,差异无法从库内估计。

第三,速度偏差。三种速度是约定目标值,实际值需从轨迹反推;0.7 米每秒已明显低于自然步速,库里没有自然速度下的试次。

第四,环境偏差。全在同一实验室完成,背景固定,无逐帧环境标注。

第五,真值偏差。真值来自惯性解算,官方没有分关节报告误差。

第六,时长偏差。总时长是累加值,摊到每次只有十几秒,够算法评估,不够变异性分析。

7.4 外部验证矩阵

判断一份数据是否有外部印证,可以看三件事:方法论文是否同行评议、是否被第三方使用、是否有其他团队在同一设备上复现。

验证项 状态 依据
同行评议的方法论文 有 Scientific Data,2022 年
数据集 DOI 可解析 有 PhysioNet 页面给出两个 DOI
许可与访问政策明确 有 页面写明 CC BY 4.0
官方提供读取代码 有 三个脚本与依赖清单
官方提供基线结果 未见 页面与说明均未列指标
第三方复现报告 未核实 本轮未做文献引用追踪
与光学动捕的误差对照 未见 官方未报告
数据完整性的独立审计 未做 本轮不下载全量,仅核对文件清单

对外部使用的追踪不是本轮工作的范围,因此这一栏只能标「未核实」,不做推断。可以确定的是,方法论文引用了同组 2021 年在 Expert Systems with Applications 上的助行器实时姿态估计工作,说明这套采集与一个已发表的算法配套存在,但那是同组的自用,不构成第三方验证。

7.5 它为何能持续:越窄的采集条件越难被替代

一份只有 14 个人的库能在 PhysioNet 上放了四年多,靠的不是规模,而是不可替代的采集条件。助行器视角、两台固定相机、硬件触发对时、全身惯性真值,这四件事的组合在公开资源里几乎没有第二条。任何一支要做助行器视觉的团队,绕开它就得自己搭一套同等条件的采集,而搭一套的成本远高于下载 19.4 GB。

这种「窄而不替代」的逻辑有一个副作用:它不会因被引用得多而扩张,也不会因版本老化而消失。PhysioNet 的托管让文件长期可解析,CC BY 4.0 让再分发没有法律障碍。风险不在许可,而在硬件:复现同一条采集链本身就是门槛。

§8 生态位与历史

8.1 一条从助行器到数据集的线索

它的源头不是「造数据集」,而是「造助行器」。同组做的是一台面向共济失调患者的智能助行器 ASBGo,要能感知使用者、判断是否需要支撑,这就逼出了两台相机加惯性真值的方案。

方法论文引用的线索里,一条介绍助行器设备,一条是助行器上的实时姿态估计,再加上数据发布本身。顺序是设备、算法、数据。

阶段 产物 解决的问题
设备 轮式机器人助行器平台 给共济失调患者提供可推进的支撑
算法 助行器上的实时姿态估计 让助行器知道使用者姿态
数据 本库 让姿态估计有可复现的评估底稿
后续 代码仓库与论文 让方法可被他人复算

设备决定了任务的形状:它想覆盖的是「助行器上相机会遇到的情形」,不是所有行走。

8.2 与同期多模态步态资源的分工

2021 年前后,公开的多模态步态资源大致分三路。一路是足底压力与力台路线,延续二十世纪末 PhysioNet 的老库传统,本页与之对照的 gaitdb、gaitndd、hbedb 都在这一路。一路是可穿戴传感器路线,以加速度与陀螺为主,用于自由生活场景,站内的 Daphnet 类库属于这一路。还有一路是视觉路线,用相机记录人体,本库属于这一路,但比一般视觉路线多了一层:相机是装在辅助设备上的。

路线 传感载体 典型时长 典型单位 站内代表
足底压力与力台 鞋内压阻、测力台 几十秒至几分钟 周期或帧 gaitdb、gaitndd、hbedb
可穿戴惯性 加速度计、陀螺 小时级 样本 Daphnet 类库
视觉加惯性 深度相机与惯性系统 十几秒一次 帧 本库
多模态生理 脑电、肌电、惯性、测力 单次任务 样本 站内四模态步态库

三路的分工不在精度高低,而在回答的问题:力怎么分布、人在日常生活中怎么动、画面里的人在哪里。

8.3 生态位:算法评估的公共尺子

它在这条路线上的位置是少有的公共尺子,价值不在刻度多少,而在大家都在用同一把。

对助行器视觉团队,它省掉自建采集;对通用姿态估计团队,它提供非典型机位的测试集;对康复工程团队,它提供带握持条件的运动学参考。三者都不指望从它身上得到人群层面的结论。

使用者 从它这里拿什么 不需要什么
助行器视觉团队 画面与真值的配对、相机参数 不需要临床标签
通用姿态估计团队 低机位、遮挡、行进的测试集 不需要步态指标
康复工程团队 握持条件下的关节轨迹 不需要患者队列
临床研究者 预研用的方法验证 不能用于疗效判断
学生与教学 多模态对时、坐标变换的完整示例 不需要大规模

8.4 谁在用它,用来做什么

方法论文摘要列了四类用途:视觉姿态估计、人体检测与跟踪、运动预测、康复设备使用时的生物力学分析。四者共享同一个前提——画面与三维真值逐帧对齐。第三方使用情况本轮未做文献计量,不给数字;论文发在 Scientific Data 这类数据导向期刊上,本身就是定位说明。

§9 使用指引

9.1 三种角色的路径

不同角色路径不同,下面按三类角色给出从下载到第一次出结果的顺序。

算法工程师。 目标是训练或评估从深度图回归关节的模型。先用 synchronized_data_idx.csv 与两份二维表搭出「图像帧号 → 关节坐标」的配对,再下一个人的原始层验证配对,然后按人留一交叉验证,最后分性别与身高报告误差,不只报均值。

运动学研究者。 目标是从关节轨迹算步态指标。用归一化表算膝角、髋角与躯干倾角,用十项肢体尺寸做个体归一化,用三种速度做对照,并把结论限定在慢速区间。

工程与产品团队。 目标是判断方案能否落地。先看原始深度帧画质,再看两台相机视角是否覆盖要用的关节,然后自己重投影一次量标定误差。

角色 第一件事 第二件事 常见陷阱
算法工程师 下处理层搭配对 按人切分 同人跨集导致分数虚高
运动学研究者 用归一化坐标算角度 用三种速度做对照 把归一化坐标当世界坐标
工程与产品 看原始深度帧画质 自己重投影一次 忽略相机随车推进的透视变化
学生 读两份字段说明 跑官方读取脚本 混用 .c3d 与 _csv 的单位

三种角色可共用一次检查:拿 §4.2 案例那一次试次,量三种坐标系下同一关节的差。

#-- 下载并核对单受试者的处理层,然后只看一次试次的表形状
curl -fsSL https://physionet.org/files/multi-gait-posture/1.0.0/processed_data/participant01.zip \
     -o participant01.zip
unzip -o -q participant01.zip -d processed

python3 - <<'EOF'
import pandas as pd
D = "processed/participant01/participant01_straight_0.7/participant01_straight_0.7_corridor1"
for f in ["synchronized_data_idx.csv", "normalized_skeleton_3d.csv",
          "aligned_skeleton_3d.csv", "aligned_skeleton_2d_gait.csv",
          "aligned_skeleton_2d_posture.csv"]:
    df = pd.read_csv(f"{D}/{f}", index_col=0)
    print(f, df.shape)
EOF

9.2 一条最短的可用流程

从零到「看到一帧骨架画在深度图上」,官方脚本已给出完整路径。下面只处理一个受试者的一次试次。

#-- 环境:官方 requirements.txt 给的版本区间
python3 -m venv venv && . venv/bin/activate
pip install "numpy~=1.19.1" "scipy~=1.5.2" "pandas~=1.1.1" \
            "matplotlib~=3.3.1" "c3d~=0.3.0" "xlrd~=1.2.0" \
            "tqdm~=4.48.2" "opencv-python~=4.4.0.42"

#-- 取官方三个脚本
BASE=https://physionet.org/files/multi-gait-posture/1.0.0/code
mkdir -p swdb/scripts && cd swdb/scripts
for f in preprocess_data.py read_processed_data.py utils.py requirements.txt; do
  curl -fsSLO "$BASE/scripts/$f"
done

#-- 把处理层解到约定的两级目录下
cd ../..
unzip -q multi-gait-posture/processed/participant01.zip -d swdb/processed_data
unzip -q multi-gait-posture/raw_data/participant01.zip    -d swdb/raw_data

#-- 用官方读取脚本做一次可视化(默认参数为 14 个受试者全跑)
cd swdb/scripts && python3 read_processed_data.py

官方脚本默认跑全部受试者,只想要一人时把 subj_ids 改成单元素列表;按受试者、序列、地点三层筛选是大体积数据下唯一实用的做法。

#-- 只读一个受试者的一个序列,不做可视化
from read_processed_data import read_walker_data

read_walker_data(
    dataset_root_path="../..",
    subj_ids=["participant01"],
    seq_ids=["straight_0.7"],
    rep_ids=["corridor1"],
    frames_shape=(320, 240),
    undersample_rate=1,
    ignore_error=True,
)

9.3 引用方式

引用分两种:引用数据文件与引用方法论文。两者的署名不完全相同,不能混用。

#-- 引用数据文件(PhysioNet 页面给的格式)
Palermo, M., Mendes Lopes, J., André, J., Cerqueira, J., & Santos, C. (2021).
A multi-camera and multimodal dataset for posture and gait analysis
(version 1.0.0). PhysioNet. RRID:SCR_007345.
https://doi.org/10.13026/fyxw-n385

#-- 引用方法论文(期刊署名,六位作者)
Palermo M, Lopes JM, André J, Matias AC, Cerqueira J, Santos CP.
A multi-camera and multimodal dataset for posture and gait analysis.
Scientific Data. 2022. https://doi.org/10.1038/s41597-022-01722-7

正文提到库名时建议写全名;要用短名就写 PhysioNet 的项目名 multi-gait-posture,不要自造缩写。

§10 AI 使用声明

项 说明
本文性质 面向数据选型的说明性词条,不是同行评议论文,也不是数据使用手册的替代品
信息来源 仅使用 PhysioNet 官方项目页、官方字段说明文本、受试者元数据表原文、代码目录中的脚本与 README,以及欧洲 PMC 收录的方法论文摘要
未做的事 未下载深度帧与惯性原始数据,未做逐帧统计,未复现任何算法,未做文献计量
数字口径 只收规模、结构、边界三类数字;分布类统计一概不做
口径冲突处理 官方两处说法不一致时并列呈现,不判对错;论文与页面署名不同时,各自标明来源
可能的偏差 本词条对「不可替代性」的评价基于公开资源检索,未穷尽所有平台;文中标「未核实」的项目不应被引用为结论
使用建议 依据本文做采购或立项决策前,请自行核对官方页面当前版本与许可
更新情况 数据发布于 2021 年 11 月 1 日,版本 1.0.0;截至本文核对时页面无新版本

常见误读(避坑清单)

说法 实际 证据
这是多任务步态数据,含上下楼梯与双任务 只有直行与左右转两类路径,无楼梯、无双任务 官方任务描述只列直行、左转、右转三种路径
它有足底压力或力台数据 全库没有压阻鞋垫与测力台,只有惯性单元与深度相机 设备清单只有 Xsens 与两台深度相机
它收录了帕金森病患者 14 人全部健康,纳入标准要求无步态异常病史 元数据表与纳入标准五条
它是 gaitdb 的扩展版 两个不同机构的库,传感器、人群、字段都不同 出处、年份、DOI 全不相同
24 关节的二维标注是人工标注 由三维惯性骨骼经内外参投影得到,属几何派生 处理层说明写明由内参外参投影
帧数就是样本量 连续帧高度相关,独立单元是 14 名受试者 每人一次采集,无独立访视
三维坐标可以当绝对真值 来自商业惯性系统的模型解算,未经光学动捕对照 官方未报告与光学系统的误差
每次试次就是 92 分钟 92 分钟是全库累加,单次试次只有十几秒 摘要写总录制时长
它可以直接训练步态异常分类器 库内无任何病理标签与疾病分组 元数据表只有人口学与肢体尺寸
用对齐骨骼表做三维分析最合适 官方说明该表含叠加变换误差,建议纯三维任务改用归一化表 处理层说明与论文局限段落

FAQ

Q1:multi-gait-posture 一共有几个人、多少次试次?
官方页面与 2022 年的方法论文都写 14 名健康受试者。试次按设计为 14 人乘 3 种速度乘 3 种路径乘 3 个地点,标称 378 次;官方同时说明有 15 次因传感器位移或文件损坏被丢弃,可用的是三百六十余次。

Q2:它的传感器是压阻鞋垫还是惯性单元?
都不是压阻鞋垫。它用 Xsens MTw Awinda 全身惯性系统,17 个单元分别贴在头、双肩、胸、上臂、前臂、腕、腰、双大腿、双小腿与双脚,另有 1 个单元架在助行器上用于标定相机朝向;视觉侧是助行器上的一对深度相机。

Q3:它和 gaitdb 是同一类数据吗?
不是。gaitdb 一行是一个步态周期、只有两列时间;本库一行是一个同步帧、二十四关节坐标,细节见 §6.1 的对照表。

Q4:能不能直接拿它训练患者步态识别?
不能。14 人全部是 22 至 30 岁的健康人,纳入标准要求身高 150 至 190 厘米、无步态异常病史,库内没有任何病理标签。可以用它做姿态估计与辅助设备的算法开发,不能把它当步态异常的判别依据。

Q5:三维关节坐标能当人工标注用吗?
只能当弱标注。三维坐标与二维投影都是惯性解算与几何变换的产物,官方没有做人工逐帧核订,也没有报告与光学动捕的对照误差。误差会同时进入标签与评估。

Q6:为什么下载只有整人的包?
站点以受试者为下载单位,两个数据目录各平铺 14 个 ZIP,单次试次只能解包后取。

Q7:处理层和原始层该下哪个?
先下处理层,单包约 17 MB,含同步索引与四种坐标系下的关节表。要训练视觉模型时再按人下原始层。

Q8:.c3d 与 _csv 里的单位一样吗?
不一样。.c3d 存的是关节三维位置,单位毫米;_csv 是 Xsens 导出的多张表,位置单位米、旋转单位度。合并前必须先统一单位。

Q9:深度帧为什么读出来全是 255?
多半是读法不对。深度图是单通道 16 位、单位毫米,默认读法会转成 8 位而截断,应使用 cv2.IMREAD_UNCHANGED。

Q10:两台相机的画面有什么区别?
一台朝下前方,拍腿部与把手,称为步态相机;一台朝上后方,拍躯干与上肢,称为姿势相机。两台内参不同,外参在每名受试者目录里给出。

Q11:三种速度是自选还是约定?
约定的目标速度,每秒 0.3、0.5、0.7 米,用于模拟运动障碍者的慢速行走。实际速度需从轨迹反推。

Q12:许可允许商用吗?
允许。页面写明 CC BY 4.0,只要保留署名即可再分发与商用。引用时按官方格式署名。

术语表

词 含义 在本库中的具体所指
助行器 供行走困难者扶持推进的四轮辅助设备 ASBGo 轮式机器人助行器,装有双深度相机
步态相机 朝向腿部的相机 助行器上朝下前方的那一台
姿势相机 朝向躯干与上肢的相机 助行器上朝上后方的那一台
深度帧 每像素记录相机到表面距离的图像 640 乘 480,uint16,单位毫米
惯性单元 测加速度、角速度与磁场的传感器 Xsens MTw Awinda 的单个节点
惯性动作捕捉 用多个惯性单元配合人体模型解算关节运动 MVN Analyze 或 MVN BIOMECH
生物力学模型 把人体分为若干刚体段并定义关节的模型 MVN BIOMECH 的段定义与关节中心
骨骼关节 骨骼模型中定义的关节点 官方代码里列出的二十四项
参考真值 评估算法时用作标准的标注 惯性系统解算的三维骨骼
二维投影 把三维点按内参外参映射到像平面 aligned_skeleton_2d_* 两张表
内参 相机的焦距与主点等内部参数 intrinsic_calibration.json
外参 相机之间或相机与世界之间的变换 extrinsic_calibration.json,旋转弧度、平移米
归一化参考系 以根关节为原点、朝向归零的坐标系 normalized_skeleton_3d.csv
同步索引 把不同采样率的数据按时间对齐后的帧号表 synchronized_data_idx.csv
硬件触发 由硬件信号而非软件时钟对齐两路采集 sync_*.stamp 记录触达时刻
试次 一次有明确起止的采集 受试者乘路径乘速度乘地点的一个组合
序列 路径与速度的组合 目录名形如 participant01_left_0.3
地点 同一序列重复进行的位置 corridor1 至 corridor3、corner1 至 corner3
帧率 每秒采集的图像帧数 深度相机 30 fps
采样率 每秒采集的信号点数 惯性系统 60 Hz
拐角转向 在走廊转角处改变行进方向 左转与右转两类路径
质心 人体质量分布的中心 官方 _csv 里单独有一张质心表
交叉验证 把数据分折轮流做训练与测试 本库应按受试者分折

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 14 名健康成人 PhysioNet 页面摘要与方法论文 官方
性别构成 10 男 4 女 元数据表逐行核对 官方原始文件
年龄范围 22 至 30 岁 元数据表逐行核对 官方原始文件
平均年龄 25.4 岁(标准差 2.31) 方法论文摘要 论文
平均体重 69.7 千克(标准差 11.4) 方法论文摘要 论文
平均身高 172 厘米(标准差 10.2) 方法论文摘要 论文
身高纳入区间 150 至 190 厘米 方法论文纳入标准 论文
随机编号的 14 行 全部在库 subject_metadata.csv 官方原始文件
元数据列数 15 列 表头计数 官方原始文件
速度档位 0.3、0.5、0.7 米每秒 页面与论文 官方
路径种类 3 种(直行、左转、右转) 页面与论文 官方
地点数 6 处(走廊三、转角三) 代码脚本中的地点列表 官方代码
标称试次 378 次 页面与论文 官方
剔除试次 15 次 页面与论文 官方
惯性单元 人体 17 个加相机 1 个 页面设备说明 官方
惯性采样率 60 Hz 页面与论文 官方
深度相机数 2 台 页面与论文 官方
深度帧率 30 fps 页面与论文 官方
深度分辨率 640 乘 480 官方工具脚本常量 官方代码
同步帧总数 约 166K 帧 页面与论文 官方
总录制时长 92 分钟 页面与论文 官方
未压缩体积 19.5 GB 页面文件列表 官方
下载包体积 19.4 GB 页面文件列表 官方
单受试者处理包 约 17 MB 下载响应头 官方交付物
单受试者原始包 约 1.6 GB 下载响应头 官方交付物
处理层文件数 每地点 5 张表 字段说明 官方
关节数 24 个 官方工具脚本元组 官方代码
版本 1.0.0 页面版本历史 官方
发布日期 2021 年 11 月 1 日 页面版本历史 官方
许可 CC BY 4.0 页面许可声明 官方
伦理批号 CEICVS 063/2021 方法论文 论文

附录 B:数字的来源分层

层级 本文用到的数字 可信度说明
官方页面与字段说明 14 人、378 次试次、剔除 15 次、约 166K 帧、92 分钟、19.5 GB、19.4 GB、CC BY 4.0、2021-11-01、两台相机、17 加 1 个惯性单元、60 Hz、30 fps 页面正文与说明文件原文,可直接引用
官方原始文件 14 行元数据、15 列、性别 10 比 4、年龄 22 至 30 岁、身高 1.51 至 1.88 米、体重 50.5 至 89 千克 由 subject_metadata.csv 逐行读取,属原始记录
官方代码 深度分辨率 640 乘 480、关节顺序 24 项、六处地点名、读取参数默认值 由脚本常量与默认参数确认
论文摘要 平均年龄 25.4、平均体重 69.7、平均身高 172、纳入标准五条、四类用途、剔除原因 期刊文章的摘要文本
未核实 第三方引用数量、与光学动捕的误差、逐试次可用清单、地面与照明条件 本轮未取得,不应作为结论引用

分层的用处是让引用有边界:第一层可直接写进方法,第二层是原始记录,第三层是代码事实,第四层须标明来自论文,第五层不可引用。

附录 C:完整参考文献

编号 文献 用途
1 Palermo M, Lopes JM, André J, Cerqueira J, Santos CP. A multi-camera and multimodal dataset for posture and gait analysis (version 1.0.0). PhysioNet, 2021. DOI 10.13026/fyxw-n385 数据本体
2 Palermo M, Lopes JM, André J, Matias AC, Cerqueira J, Santos CP. Scientific Data, 2022. DOI 10.1038/s41597-022-01722-7 方法、纳入标准、局限性
3 官方原始层与处理层字段说明(raw_data_description.txt、processed_data_description.txt) 目录结构与五张表含义
4 官方 subject_metadata.csv 人口学与肢体尺寸
5 官方 code/scripts/ 下三个脚本(预处理、读取、工具函数) 同步、投影、关节顺序与默认参数
6 官方 code/README.md 与 LICENSE.txt 脚本用途、仓库地址、许可条款
7 欧洲 PMC 检索接口(摘要来源) 论文摘要

附录 D:任务代码

把本库用起来的最短链条是「深度帧加二维投影,配成监督对」。下面这段代码只依赖官方处理层与一个受试者的原始层,能跑通的最小版本。

#-- 深度帧与二维关节配对,供姿态估计训练使用
import re
import cv2
import numpy as np
import pandas as pd
from pathlib import Path

ROOT = Path("multi-gait-posture")
SUBJ = "participant01"
SEQ = "participant01_straight_0.7"
LOC = "participant01_straight_0.7_corridor1"

raw = ROOT / "raw_data" / SUBJ / SEQ / LOC / "gait_depth_registered"
proc = ROOT / "processed" / SUBJ / SEQ / LOC

#-- 关节顺序取自官方 utils.py
JOINTS = ["pelvis", "l5", "l3", "t12", "t8", "neck", "head",
          "right_shoulder", "right_upper_arm", "right_forearm", "right_hand",
          "left_shoulder", "left_upper_arm", "left_forearm", "left_hand",
          "right_upper_leg", "right_lower_leg", "right_foot", "right_toe",
          "left_upper_leg", "left_lower_leg", "left_foot", "left_toe"]

j2d = pd.read_csv(proc / "aligned_skeleton_2d_gait.csv", index_col=0).values
j2d = j2d.reshape(-1, len(JOINTS), 2)

pat = re.compile(r"^[a-zA-Z]+_[a-zA-Z]+_(\d+)_(\d+)_(\d+)\.png$")
frames = {}
for p in raw.iterdir():
    m = pat.match(p.name)
    if m:
        frames[int(m.group(1))] = p

idx = sorted(frames)
print("深度帧", len(idx), "关节帧", len(j2d))

#-- 逐帧配对,失败即跳过(官方说明有损坏试次)
pairs = []
for i in idx:
    if i >= len(j2d):
        continue
    depth = cv2.imread(str(frames[i]), cv2.IMREAD_UNCHANGED)
    if depth is None:
        continue
    pairs.append((depth, j2d[i]))
print("可用配对", len(pairs), pairs[0][0].shape, pairs[0][1].shape)

跑通之后建议做两件事:把配对按受试者汇总,检查每人的可用帧数是否悬殊;把二维坐标叠回深度图看一次,确认投影没有镜像。

附录 E:如果只记五件事

序号 记什么 为什么
1 它是助行器视角的姿态数据集,不是步态节律数据集 决定了它能做什么、不能做什么
2 14 名健康青年,标称 378 次试次,剔除 15 次 规模小,且人群极窄
3 全程握持助行器,只有直行与左右转 只要涉及自由行走或复杂地形就不适用
4 真值来自惯性解算,未与光学动捕对照 真值可作弱标注,不宜当金标准
5 处理层先下,原始层按人下 19.4 GB 与 17 MB 的差别

编辑说明

本文所引用的数字均有出处,按附录 B 的五层分层,第一至第四层可追溯至官方页面、官方原始文件或期刊摘要,第五层标为未核实。核验时间为 2026 年 10 月 28 日。

核验方式:抓取 PhysioNet 项目页 HTML 与版本页;直接下载并读取 subject_metadata.csv、两份字段说明与 code/README.md;逐个访问 code/scripts/ 下的三个脚本并阅读其常量与默认参数;用 HTTP 头确认 raw_data/ 与 processed_data/ 各含 14 个 ZIP 及其体积量级;通过欧洲 PMC 检索接口取得方法论文摘要全文。

未覆盖内容:未下载任何深度帧与惯性原始数据,未做逐帧统计,未复现官方脚本,未追踪第三方引用,未核对 SHA256SUMS.txt 内每个文件的哈希。文中凡涉及「分布」「频次」「误差水平」的判断均为定性描述,不构成统计结论。

体例说明:官方页面与方法论文在作者署名上不一致(页面五位、论文六位),本文两处并列,不判对错;官方对试次的表述为「标称 378 次、剔除 15 次」,本文不自行计算可用数,只写「三百六十余次」。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • ppg-dalia — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • culm — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • nesfdb — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • plantar — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • wearable-device-dataset — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • semg-gait-31subjects — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • pamap2 — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • mhealth — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • uci-har — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • wearable-exercise-frailty — 共享标签:生理信号 / 步态与运动 / 可穿戴传感

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集