GVHMR 原理与脚滑处理总结
1. GVHMR 是什么?
GVHMR(Gravity-View Human Motion Recovery)用于从单目视频恢复人体的世界坐标运动,包括:
- SMPL/SMPL-X 局部姿态;
- 人体形状;
- 相机坐标中的人体运动;
- 与重力方向对齐的世界坐标运动;
- 较稳定的全局轨迹。
论文:
GVHMR 的重点不是用物理公式模拟人体受力,而是利用重力建立一个稳定的竖直坐标系。
它是 gravity-aligned(重力对齐)的,而不是完整的 physics-based(物理动力学模拟)。
2. 为什么需要重力坐标?
普通人体恢复方法通常在相机坐标系中预测人体。如果相机发生俯仰、翻滚,即使人实际站直了,在相机坐标中也可能看起来是倾斜的。
此外,逐帧或自回归地预测全局运动时,旋转误差会不断累积:
text
第 1 帧 → 第 2 帧 → 第 3 帧 → ...
最终可能出现:
- 人体逐渐倾斜;
- 重力方向漂移;
- 全局位置不合理;
- 脚在地面上滑动。
GVHMR 的思路是:
- 每一帧先构建一个重力对齐的 GV 坐标系;
- 在 GV 坐标系中预测人体姿态;
- 再把每帧姿态组合到统一的世界坐标系。
3. Gravity-View 坐标系如何构建?
GV 是 Gravity-View 的缩写,即"重力---视线坐标系"。
对于每一帧,定义:
- 相机视线方向:v = 0, 0, 1ᵀ;
- 世界重力方向在相机坐标中的表示:g_c。
重力方向可以由世界坐标经过相机旋转得到:
text
g_c = R_w→c · g_w
其中 g_w 是世界坐标中的重力方向。
3.1 GV 三个坐标轴
GV 的 y 轴沿重力方向:
text
y_GV = g_c / ‖g_c‖
GV 的 x 轴由重力方向和相机视线共同确定:
text
x_GV = normalize(y_GV × v)
最后使用右手定则得到 z 轴:
text
z_GV = x_GV × y_GV
从相机坐标到 GV 坐标的旋转矩阵为:
text
R_c→GV = [ x_GVᵀ
y_GVᵀ
z_GVᵀ ]
人体在 GV 坐标中的朝向为:
text
Γ_GV = R_c→GV · Γ_c
其中 Γ_c 是人体在相机坐标系中的朝向。
3.2 为什么还需要视线方向?
只知道重力,只能确定"上下方向",不能确定水平面内的朝向。人体仍然可以绕重力轴旋转任意角度。
因此:
- 重力方向负责确定 y 轴,即上下;
- 相机视线负责确定水平面内的 x、z 轴。
这样每一帧的 GV 坐标系就基本被唯一确定。
4. 如何恢复全局人体方向?
每一帧都有自己的 GV 坐标系。相机运动时,相邻帧的 GV 坐标系也会发生变化。
GVHMR 先计算相机到 GV 的旋转:
text
R_c→GVᵗ = Γ_GVᵗ · (Γ_cᵗ)⁻¹
将相机视线变换到 GV 坐标:
text
v_GVᵗ = R_c→GVᵗ · [0, 0, 1]ᵀ
再结合视觉里程计或陀螺仪提供的相机相对旋转,估计相邻 GV 坐标系之间的旋转。
关键约束是:
相邻 GV 坐标系之间的相对旋转只允许绕重力轴 y 旋转。
因此原来需要估计 3 个旋转自由度,现在主要只估计一个水平旋转角 Δφ:
text
R_ΔGVᵗ = Rot_y(Δφᵗ)
以第一帧 GV₀ 作为世界坐标参考:
text
Γ_wᵗ = (R_ΔGV¹ · R_ΔGV² · ... · R_ΔGVᵗ) · Γ_GVᵗ
因为这些相对旋转都绕重力轴,所以重力方向不会像普通自回归方法那样不断漂移。
5. 全局平移如何恢复?
网络预测人体根部在 SMPL 局部坐标系中的速度 v_rootᵗ。
先转换到世界坐标:
text
Δτ_wᵗ = Γ_wᵗ · v_rootᵗ
再累加得到全局平移:
text
τ_wᵗ = τ_w⁰ + ∑ᵢ₌₀ᵗ⁻¹ Γ_wⁱ · v_rootⁱ
这是一种"局部速度预测 + 世界坐标累加"的轨迹恢复方式。
6. 网络输入和输出
输入
- 人体检测框;
- 2D 关键点;
- 图像特征;
- 相机相对旋转或角速度。
网络结构
输入特征被融合为逐帧 token,然后使用带 RoPE 的 Relative Transformer 建模时间关系。
输出
- SMPL 局部姿态;
- 人体形状;
- 相机坐标人体朝向 Γ_c;
- GV 坐标人体朝向 Γ_GV;
- 根部局部速度;
- 手、脚等关节的静止概率;
- 相机参数。
7. GVHMR 如何解决脚滑?
脚滑处理主要分成两层:
- 根据静止关节修正全局平移;
- 使用逆运动学调整腿部姿态。
8. 第一步:预测静止关节
模型会预测一些关节的静止概率,主要包括:
- 左右脚踝;
- 左右脚尖;
- 左右手腕。
如果某只脚处于支撑状态,那么它在世界坐标中的位置应该近似不变:
text
j_footᵗ⁺¹ ≈ j_footᵗ
模型并不是假设脚永远不动,而是逐帧判断某个关节当前是否处于"接触/静止"状态。
9. 为什么静止关节要进行概率加权?
相邻帧中,第 j 个关节的位移为:
text
Δjⱼ = jⱼᵗ⁺¹ − jⱼᵗ
所有静止关节共同估计人体的漂移量:
text
Δc = ∑ⱼ wⱼ Δjⱼ
其中 wⱼ 由静止概率决定。
9.1 判断真正接触地面的脚
例如:
- 左脚静止概率为 0.95;
- 右脚静止概率为 0.10。
那么左脚应成为主要约束,右脚不应该明显影响平移修正。
9.2 避免硬切换带来的抖动
如果使用硬阈值:
text
静止 → 权重 1
运动 → 权重 0
脚刚开始迈步时,约束会突然消失,人体轨迹容易跳变。
概率加权可以实现软切换:
text
p = 0.95:强约束
p = 0.60:中等约束
p = 0.05:几乎不约束
9.3 多个接触点提高鲁棒性
如果两只脚都静止,可以共同估计漂移量。某一个脚踝预测不准时,其他静止关节仍然可以提供约束。
因此,概率加权本质上是"软接触约束":
不强行规定脚一定不能动,而是根据静止预测的置信度决定约束强度。
10. 第二步:修正整体平移
如果脚被判断为静止,但预测结果显示它向前移动了 2 cm,那么这 2 cm 很可能是全局轨迹误差。
GVHMR 会把后续人体平移反向修正:
text
τ′ₖ = τₖ − Δc, k ≥ t + 1
这一步解决的是:
整个人带着脚一起滑动。
11. 什么是循环坐标下降 IK?
CCD IK 是 Cyclic Coordinate Descent,中文通常译为"循环坐标下降逆运动学"。
逆运动学的目标是:
已知脚应该到达的位置,反过来求髋、膝、踝等关节应该如何旋转。
以左腿为例:
text
髋关节 → 膝盖 → 脚踝 → 脚
如果脚当前的位置为 p,目标位置为 p*,CCD 会从脚的上游关节开始逐级调整。
CCD 的基本流程
- 选择脚踝;
- 旋转脚踝,使脚更靠近目标点;
- 选择膝盖;
- 旋转膝盖,使脚继续靠近目标点;
- 选择髋部;
- 重复若干轮,直到误差足够小或达到最大迭代次数。
对于当前关节 q,构造:
text
a = p − q
b = p* − q
然后旋转当前关节,使向量 a 尽量对齐向量 b。
旋转轴大致由:
text
a × b
决定,旋转角度由 a、b 的夹角决定。
12. CCD IK 在 GVHMR 中的作用
整体平移修正之后,脚的位置可能已经接近地面,但腿部姿态仍然不匹配。
例如:
- 脚位置正确;
- 但膝盖方向不自然;
- 或者脚踝没有准确落在接触点。
GVHMR 将修正后的脚位置作为 IK 目标,再调整:
- 髋关节;
- 膝关节;
- 踝关节。
这一步解决的是:
身体轨迹已经修正,但骨骼姿态没有配合的问题。
IK 不会改变骨骼长度,只改变关节旋转,因此比直接修改脚的位置更合理。
13. 为什么还要传播脚的目标位置?
如果第 t 帧脚是静止的,那么下一帧不应该完全重新计算一个新的脚目标。
GVHMR 会根据静止概率混合上一帧目标和当前预测:
text
j_targetᵗ = pᵗ · j_targetᵗ⁻¹ + (1 − pᵗ) · j_predᵗ
含义是:
- pᵗ 高:继续保持原来的接触点;
- pᵗ 低:允许脚跟随人体运动。
因此,脚在支撑阶段保持固定,在迈步阶段可以自然移动。
14. 一个简单例子
假设:
- 右脚踩在地面上;
- 左脚正在向前迈步。
模型预测:
- 右脚静止概率高;
- 左脚静止概率低。
GVHMR 会:
- 主要使用右脚估计人体漂移;
- 反向修正全局平移;
- 保持右脚目标点不动;
- 用 IK 调整右腿;
- 允许左脚继续向前运动。
因此不会把正在迈步的左脚错误地固定在地面上。
15. 方法的优点和局限
优点
- 能显著减少支撑脚滑动;
- 不需要显式物理仿真;
- 不改变人体骨骼长度;
- 通过软概率约束实现平滑的接触切换;
- CCD IK 计算速度快,适合后处理。
局限
- 依赖静止概率预测是否准确;
- 脚被遮挡或接触状态不清晰时容易误判;
- CCD 是局部贪心算法,可能产生不自然的膝盖方向;
- 它没有显式建模摩擦力、碰撞和地面反作用力;
- 不能保证完全符合真实动力学。
16. 总结
GVHMR 的脚滑处理可以概括为:
text
预测静止概率
↓
选择高置信度接触脚
↓
根据静止脚的位移修正全局平移
↓
把脚的位置作为 IK 目标
↓
用 CCD 调整髋、膝、踝关节
↓
得到更稳定的支撑脚和全局轨迹
最核心的区别是:
- 概率加权决定"哪些脚应该被固定、固定程度多大";
- 全局平移修正解决"整个人的轨迹在滑";
- CCD IK 解决"脚固定后,腿部姿态不匹配"。