跳转至

5. 标定

返回目录 · English

5.1 为什么要单独标定

tracker 的读数同时取决于两件事:它装在肢体上的什么位置、什么朝向(安装参数),以及肢体本身怎么动(关节姿态)。如果两者一起拟合,安装上的误差会被当成姿态误差吸收掉。因此每次佩戴后,先用一段规定动作单独解出体型、尺度和五个 tracker 的安装参数,之后的任务录制都沿用这份结果。

标定结果保存为 subject_profile.json,包括:

  • SMPL-X 体型参数 betas(10 维)和尺度 scale;
  • 五个 tracker 相对各自关节的安装平移和旋转;
  • 身体尺寸、转身和步态的个人参考(来自第 16–17 段),以及各 tracker 的残差。

5.2 什么时候要重新标定

  • 换了采集者;
  • 任意一个 tracker 拆下重装,或绑带明显滑动;
  • 换了手套或手背底座。

只要安装没变,同一份标定可以跨天、跨任务使用。换人或重新佩戴都不需要重新训练网络,网络的输入已经去掉了安装参数的影响。

5.3 标定动作

整套动作共 17 段,约 144 秒。静态姿势每个至少保持 3 秒;动态动作要慢、连贯、幅度适中。采集者跟着下面的三视角参考视频做(工具包中的 assets/calibration_protocol_reference.mp4)。

01–17 标定动作参考

参考动作由 SMPL-X 生成,图中数字是该姿势在参考动作中的时刻。左右均指佩戴者自己的左右,画面没有镜像。

段 时长 动作 用于求解
01 7 s 自然站立,脚尖朝前,双臂下垂,目视前方 地面、身高、初始朝向
02 9 s 身体不动,头缓慢左转、右转、低头、抬头,每个方向停 1 秒 头部安装旋转
03 7 s A 字姿势:双臂向下外展约 45°,手心向下 肩宽、上臂
04 7 s T 字姿势:双臂水平侧举,伸直肘,手心向下 臂展、肩到腕的长度
05 7 s 双臂向前平举,伸直肘,手心向下 手背 tracker 的位置和朝向
06 8 s 双臂侧举并翻掌向上,按右、左、右、左依次屈肘 上臂、前臂长度,手背安装参数
07 8 s 保持前平举,手腕依次掌心朝下、翻转、内旋、外旋 手背 tracker 的安装旋转
08 8 s 浅蹲两次,上身尽量直,脚不动 髋、膝、踝的长度,地面
09 7 s 抬左腿再放下,做两次,身体不侧倾 左踝安装参数
10 7 s 抬右腿再放下,做两次 右踝安装参数
11 7 s 原地先踮脚,再翘脚尖 踝部 tracker 的安装旋转
12 7 s 双手前举,五指张开、并拢 手掌尺度、手套零位
13 7 s 慢慢握拳再完全张开,做两次 手指弯曲的尺度和零位
14 9 s 拇指依次碰食指、中指、无名指、小指,再张开 对掌、捏合
15 9 s 食指、中指、无名指、小指依次完全弯曲、伸直 每根手指的映射
16 16 s 小碎步原地转身:先左转 180° 再转回,然后右转 180° 再转回,头和身体一起转 朝向、转身连续性、左右与前后检查
17 14 s 面朝前方,向前走两步,再后退两步回到原位 步态、骨盆平移、地面接触检查

录制要求:

  • 地面平整坚硬,用胶带标出两只脚的站位,脚尖朝同一方向。开头的站位决定了世界坐标里的"左"和"前"(第 11.1 节)。
  • 开机后静置片刻,确认五个 tracker 在同一个坐标系里,没有跳变。
  • 开始动作前先站立 3 秒。
  • 标定和之后的任务录制过程中,tracker 都不能拆装或挪动。

第 16–17 段用来检查整段重建并提取个人的转身和步态参考,不参与体型和安装参数的求解:转身和走路时骨盆一直在动,当成静态姿势会把这些参数解偏。

5.4 运行标定

在工具包根目录下运行,CPU 即可:

PYTHONPATH=src python -m five_tracker_smplx.cli calibrate-subject \
  --data <同一人、同一次佩戴的标定录制目录> \
  --height <身高(米)> --armspan <臂展(米)> \
  --output-dir $WORK/profiles/<名称> \
  --body-model-path models/smplx \
  --vposer-path models/vposer/V02_05 \
  --motion-cache assets/calibration_motion_vposer_mano.npz \
  --iterations 1100 --optimized-betas 5 --device cpu
  • 动作对齐是自动的。 第 01–11 段靠五个 tracker 的位置和旋转识别,第 12–15 段再结合手套的关节运动,第 16–17 段靠头和双踝的转动和位移。每条录制会输出 protocol_alignment.json,记录各段边界和置信度。自动对齐失败时,可以手工标注段边界(*_manual_alignment.json)。
  • 体型先验(可选)。 --smplx-prior <npz> 用视频估计出的 SMPL-X 体型(例如 GVHMR 的结果)作为先验,权重默认 0.18。不加先验时,安装参数基本不变(相差几毫米),体型和尺度会有差别。
  • 求解方式。 每个 tracker 的安装平移和旋转整段只解一份。体型只放开前几个分量,并以身高和臂展作为强约束:只靠五个 tracker 自由求全部 10 个分量是解不出来的。骨盆到颈部相对重力的倾斜只作软约束。

输出目录里是 subject_profile.json 和验收页面 subject_calibration.html。验收通过后,把 subject_profile.json 复制为 $WORK/profiles/<batch>.json,第 7 章的处理会用到它。

5.5 验收

打开 subject_calibration.html,逐项检查:

  • 01–17 段的顺序和边界正确;
  • 转头时躯干不跟着转;屈肘、手腕、浅蹲、抬腿和踝部动作自然,左右没有对调;
  • 静态段双脚平放、不滑;转身由交替的小步完成;行走是前进两步、后退两步,共 4 次落脚;
  • 骨盆没有异常摆动,相邻帧之间没有跳变;
  • 静态段各 tracker 的残差平稳,不随动作逐渐变大。

某个 tracker 的残差长时间超过 3–4 cm 时,先检查绑带是否滑动、角色是否分配正确,再检查坐标系。

5.6 每条录制用哪份标定

标定跟着"人 + 这次佩戴"走,和设备、任务无关。处理时把录制分组(第 7.3 节):一组只包含同一个人、同一次佩戴的录制,整组使用这次佩戴的标定。

  • 同一套设备换人佩戴,就是新的一组,需要新标定;
  • 每条录制由谁、在哪次佩戴下完成,要在采集记录里写清楚;
  • 记录缺失时,可以看站立时头部 tracker 比脚踝 tracker 高出多少。这个高度因人而异,差几厘米就能区分,和各份标定录制里的值比较即可。

用错标定的代价很明显:同一条录制,换成别人的标定后残差从 62 mm 升到 80 mm。