HybrIK阅读笔记(一):利用SVD分解通过根节点的Location计算出根节点的Global Rotation
mathjax: true
在阅读论文HybrIK时发现其通过SVD分解计算出根节点的Global Rotation的方法十分有趣,因此在此进行简单的记录,方便日后需要计算根节点Global Rotation的时候方便查看。
Global Rotation
要得到global rotation,就要通过根节点相对于rest pose中根节点的旋转来计算,以$t_1,t_2,t_3$表示rest pose中根关节的location,$p_1,p_2,p_3$表示预测location,$R_0$表示所要求的global rotation, $R_0$是一个正交矩阵
矩阵形式
其中 $|| \cdot ||_F$表示Frobenius norm, $P_0$ 表示 [$p_0 p_1 p_2$], $T_0$表示[$t_0 t_1 t_2$], 简化表达上式
因此
通过矩阵的迹的性质
而$T_0, R_0$我们是已知的,因此对$T_0P_0^T$做SVD分解,得到
那么这个问题便相当于
通过SVD分解我们得到的$U,V$都为正交矩阵,而由前文我们知道$R$也是正交矩阵,因此令$M=V^TRU$
也是正交矩阵,而正交矩阵的列向量与它的转置相乘结果为1,因此对于所有的$1 \leq j \leq 3$,我们都有
而SVD分解中,$\Lambda$是对角矩阵,且其全部为非负值,因此
而我们的任务是要求得$R_0 = \arg \max_{R\in SO^3}trace(\Lambda V^T RU)$,那么当$m_{ii} = 1, \forall 1\leq i \leq 3$,我们可以得到
$\max_{R\in SO^3}trace(\Lambda M) = \max_{R\in SO^3}trace(\Lambda V^T RU)$,则 $M = I$, $I$为单位矩阵,则我们可以得到最终要求的$R_0$,
这样我们便得到了整个骨架根节点的global rotation,而接下来对于每一个关节我们便只需要计算出其local rotation,便可以得到整个骨架的Pose
原论文:
HybrIK: A Hybrid Analytical-Neural Inverse Kinematics Solution for 3D Human Pose and Shape Estimation; CVPR 2021: https://github.com/Jeff-sjtu/HybrIK