信息速览
康复机器人领域有一个长期悬着的问题:一台助行器要怎么判断推着它的人现在走得对不对。答案要靠视觉,而视觉算法要在真实助行场景里训练,就必须有「相机的画面」与「人体各关节的真实位置」同时在场的数据。这样的数据很难造,因为助行器的把手会挡住身体,受试者必须真的推着机器走动,两台相机还得和另一套捕捉系统精确对时。
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 — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

