本文对基于IMU传感器+SMPL模板三维人体姿态捕捉方法SIP[1]做一个介绍。由于采用的是传统优化方法同时优化所有帧,此方法无法实时为离线方法。如有错误,欢迎评论指正。
一.算法步骤
1.准备工作
传感器
如图1所示,采用6个IMU
传感器,放置于小腿,下臂,腰部和头部位置。(注:这里采用的应该都是九轴IMU
,输出的原始数据有加速度、角速度和磁力值,经内部融合算法得到姿态数据。后续动捕算法中会用到姿态数据和加速度数据。)
形状估计
如果有三维激光扫描人体模型,则拟合SMPL
到该模型;否则,则根据[5]中方法从用户的文字描述生成SMPL
模型。因为关注的姿态,所以这里形状是预先估计的。
初始传感器位置和初始姿态
由于传感器绑在人体上位置固定,手动从SMPL
上选定相应的顶点作为传感器位置;初始姿态由数据集提供,对于户外在线的录制则要求从直立的胳膊和腿的姿势开始。预先获取这两种数据是用于估计下述局部传感器到局部骨骼的变换矩阵
G
B
S
G^{BS}
GBS 的。
2.坐标系
如图2所示(注:原图来自[1][4],这里按自己理解进行了修改和统一)。请读者注意,后面公式中一些变量的上标表示了这里的坐标系:
-
F
S
F^S
FS (
local IMU-aligned sensor coordinate system
):局部传感器坐标系 -
F
I
F^I
FI (
global inertial coordinate system
):全局传感器坐标系 -
F
B
F^B
FB (
local bone coordinate system
):局部骨骼坐标系 -
F
G
F^G
FG (
global tracking coordinate system
):全局动作捕捉坐标系 -
G
G
B
:
F
B
−
>
F
G
G^{GB}:F^B->F^G
GGB:FB−>FG (
from bone to tracking coordinate system
):局部骨骼到全局动作的变换矩阵 -
G
I
S
:
F
S
−
>
F
I
G^{IS}:F^S->F^I
GIS:FS−>FI(
from local IMU sensor to global inertial coordinate system
):局部传感器到全局传感器的变换矩阵 -
G
G
I
:
F
I
−
>
F
G
G^{GI}:F^I->F^G
GGI:FI−>FG(
from global inertial to global tracking coordinate system
):全局传感器到全局动作的变换矩阵,已知 -
G
G
S
(
t
)
=
G
G
I
G
I
S
(
t
)
G^{GS}(t)=G^{GI}G^{IS}(t)
GGS(t)=GGIGIS(t)(
from local IMU sensor to global tracking coordinate system
):局部传感器到全局动作的变换矩阵 -
G
B
S
=
G
B
G
(
0
)
G
G
S
(
0
)
G^{BS}=G^{BG}(0)G^{GS}(0)
GBS=GBG(0)GGS(0)(
from local IMU sensor to bone
):局部传感器到局部骨骼的变换矩阵,恒定的,由第一帧计算
3.优化目标
这里采用了常见的思路,即同时优化多帧,从而消除累计误差,总的优化函数如下:
x
1
:
T
∗
=
arg
min
x
1
:
T
E
m
o
t
i
o
n
(
x
1
:
T
,
ω
1
:
T
,
a
1
:
T
)
=
w
o
r
i
⋅
E
o
r
i
(
x
l
:
T
,
R
l
:
T
)
+
w
a
c
c
⋅
E
a
c
c
(
x
1
:
T
,
a
1
:
T
)
+
w
a
n
t
h
r
o
⋅
E
a
n
t
h
r
o
(
x
l
:
T
)
\begin{aligned} \mathbf{x}_{1:T}^*=\underset{\mathbf{x}_{1:T}}{\arg\min}E_{\mathrm{motion}}(\mathbf{x}_{1:T},\mathbf{\omega}_{1:T},\mathbf{a}_{1:T}) = & w_{\mathrm{ori}}\cdot E_{ori}(\mathbf{x}_{\mathrm{l}:T},\mathbf{R}_{\mathrm{l}:T}) \\ &+w_{\mathrm{acc}}\cdot E_{\mathrm{acc}}(\mathbf{x}_{1:T},\mathbf{a}_{1:T}) \\ &+w_{\mathrm{anthro}}\cdot E_{\mathrm{anthro}}(\mathbf{x}_{\mathrm{l}:T}) \end{aligned}
x1:T∗=x1:TargminEmotion(x1:T,ω1:T,a1:T)=wori⋅Eori(xl:T,Rl:T)+wacc⋅Eacc(x1:T,a1:T)+wanthro⋅Eanthro(xl:T)
式中,
1...
T
1...T
1...T为时间,
x
1
:
T
∈
R
75
T
x_{1:T}\in R^{75T}
x1:T∈R75T式SMPL
模型的姿态参数(注:待求解参数),
R
1
:
T
R_{1:T}
R1:T为传感器姿态,
a
1
:
T
a_{1:T}
a1:T为传感器加速度,目标函数由方向项
E
o
r
i
E_{ori}
Eori、加速度向
E
a
c
c
E_{acc}
Eacc和人体测量项
E
a
n
t
h
r
o
E_{anthro}
Eanthro共同组成。
方向项
E o r i = 1 T N ∑ t = 1 T ∑ n = 1 N ∣ ∣ e o r i , n ( t ) ∣ ∣ 2 E_{ori}=\frac{1}{TN}\sum_{t=1}^{T}\sum_{n=1}^{N}||\mathbf{e}_{ori,n}(t)||^2 Eori=TN1∑t=1T∑n=1N∣∣eori,n(t)∣∣2
R ^ G S ( x t ) = R G B ( x t ) R B S \mathbf{\hat{R}}^{GS}(\mathbf{x}_t)=\mathbf{R}^{GB}(\mathbf{x}_t)\mathbf{R}^{BS} R^GS(xt)=RGB(xt)RBS
e
o
r
i
(
x
t
)
=
log
(
R
^
G
S
(
x
t
)
(
R
G
S
(
t
)
)
−
1
)
∨
\mathbf{e}_{ori}(\mathbf{x}_{t})=\log\left(\mathbf{\hat{R}}^{GS}(\mathbf{x}_{t})\left(\mathbf{R}^{GS}(t)\right)^{-1}\right)^{\vee}
eori(xt)=log(R^GS(xt)(RGS(t))−1)∨
式中,
N
N
N指传感器个数,衡量了估计的传感器姿态
R
^
G
S
\mathbf{\hat{R}}^{GS}
R^GS(注:由当前估计smpl姿态)和传感器测量姿态
R
G
S
\mathbf{R}^{GS}
RGS之间的误差。
加速度项
E a c c = 1 T N ∑ t = 1 T ∑ n = 1 N ∣ ∣ e a c c , n ( t ) ∣ ∣ 2 E_{\mathrm{acc}}=\frac{1}{TN}\sum_{t=1}^{T}\sum_{n=1}^{N}||\mathbf{e}_{\mathrm{acc},n}(t)||^2 Eacc=TN1∑t=1T∑n=1N∣∣eacc,n(t)∣∣2
a t G = R t G S a t S − g G \mathbf{a}_t^G=\mathbf{R}_t^{GS}\mathbf{a}_t^S-\mathbf{g}^G atG=RtGSatS−gG
a ^ t G = p t − 1 G − 2 p t G + p t + 1 G d t 2 \hat{\mathbf{a}}_t^G=\frac{\mathbf{p}_{t-1}^G-2\mathbf{p}_t^G+\mathbf{p}_{t+1}^G}{dt^2} a^tG=dt2pt−1G−2ptG+pt+1G
p
ˉ
G
(
x
)
=
G
G
B
(
x
)
p
ˉ
B
(
0
)
\bar{\mathbf{p}}^G(\mathbf{x})=\mathbf{G}^{GB}(\mathbf{x})\bar{\mathbf{p}}^B(0)
pˉG(x)=GGB(x)pˉB(0)
e
a
c
c
(
t
)
=
a
^
G
(
x
t
−
1
,
x
t
,
x
t
+
1
)
−
a
t
G
\mathbf{e}_{\mathtt{acc}}(t)=\mathbf{\hat{a}}^G(\mathbf{x}_{t-1},\mathbf{x}_t,\mathbf{x}_{t+1})-\mathbf{a}_t^G
eacc(t)=a^G(xt−1,xt,xt+1)−atG
式中,
a
t
G
\mathbf{a}_t^G
atG为全局跟踪坐标系下的传感器测量加速度,
a
^
t
G
\hat{\mathbf{a}}_t^G
a^tG为由当前估计姿态计算得到的加速度(注:需要事先确定6个IMU传感器绑定位置在smpl模型上的对应点,只需做一次,然后利用前后帧
t
±
1
t\pm1
t±1计算),
p
G
p^G
pG为全局跟踪坐标系下的SMPL
顶点位置,衡量了估计加速度和传感器测量加速度之间的误差。
人体测量项
E
anthro
=
w
mahal
1
T
∑
t
=
1
T
d
mahal
(
t
)
2
+
w
limit
1
T
∑
t
=
1
T
∣
∣
e
l
i
m
i
t
(
t
)
∣
∣
2
E_\text{anthro}=w_\text{mahal}{ \frac 1 T }\sum_{t=1}^Td_\text{mahal}{ ( t ) }^2+w_\text{limit}{ \frac 1 T }\sum_{t=1}^T||\mathbf{e}_{\mathrm{limit}}(t)||^2
Eanthro=wmahalT1∑t=1Tdmahal(t)2+wlimitT1∑t=1T∣∣elimit(t)∣∣2
d
m
a
h
a
l
=
(
x
−
μ
x
)
T
Σ
x
−
1
(
x
−
μ
x
)
d_{\mathrm{mahal}}=\sqrt{\left(\mathbf{x}-\mu_{\mathbf{x}}\right)^T\Sigma_{\mathbf{x}}^{-1}\left(\mathbf{x}-\mu_{\mathbf{x}}\right)}
dmahal=(x−μx)TΣx−1(x−μx)
e
l
i
m
i
t
=
min
(
x
−
l
l
o
w
e
r
,
0
)
+
max
(
x
−
l
u
p
p
e
r
,
0
)
\mathbf{e_{limit}}=\min(\mathbf{x}-\mathbf{l_{lower}},\mathbf{0})+\max(\mathbf{x}-\mathbf{l_{upper}},\mathbf{0})
elimit=min(x−llower,0)+max(x−lupper,0)
式中,
d
m
a
h
a
l
d_{\mathrm{mahal}}
dmahal约束估计姿态符合从大量姿态数据集中拟合的多变量高斯分布,(
e
l
i
m
i
t
\mathbf{e_{limit}}
elimit约束部分关节点姿态的极限值(注:都属于基于图像估计SMPL
模型时常见的优化项)。
4.求解
非线性最小二乘问题,采用LM
算法进行求解。核心就在于手推以上三项的Jacobi
矩阵,从而用于迭代过程中求增量。这里就不推导了,详情见论文。
二.其它
感觉这篇工作主要就是在于对IMU
传感器数据的应用,对于笔者这些平时只处理图像和点云这类数据的人有些不太熟悉。此类型更多的工作可参考清华大学[2]的几篇工作,有的基于深度学习的方法已经可以做到实时了。特别地,EgoLocate
这个项目, 将IMU
动捕和视觉SLAM
结合起来,笔者觉得还挺有意思的。
三.参考
[1] Sparse Inertial Poser: Automatic 3D Human Pose Estimation from Sparse IMUs
[2][https://github.com/Xinyu-Yi](https://github.com/Xinyu-Yi)
[3][IMU 运动/惯性传感器 - 人人都懂物联网](https://getiot.tech/zh/sensor/imu-sensor)
[4]Analyzing and Evaluating Markerless Motion Tracking Using Inertial Sensors
[5]Body Talk: Crowdshaping Realistic 3D Avatars with Words