[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing

Xsens动作捕捉 2022-10-11 14395

文章来源:[论文整理]动捕数据去噪:Robust Solving of Optical Motion Capture Data by Denoising

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第1张



数据准备

数据提供:mocap的点、marker配置、skinning权重

==Scaling==

目的:抵消身高差距,但是还是会有不同的身体比例 方式:可以从Tpose计算(说是average length of characters joints),或者从mocap软件直接得到(caliibration stage会计算)

==Representation==

Y - n∗j∗(3∗4) role=presentation>n?j?(3?4)n * j * (3 * 4): 对单个character,准备n个pose,以及它们对应的j个骨骼的global旋转和位置信息,齐次坐标表达

Z - n∗m∗j∗3 role=presentation>n?m?j?3n * m * j * 3: 对如上的n个pose,以及该character使用的marker,得到每个marker对每个joint的local offset作为marker configuration

W - m∗j role=presentation>m?jm * j: 每个marker的skinning weights 对于没有设置给markder的joints

(假设marker configuration在同一个演员身上是一样的) (假设skinning weights在所有数据上是一样的)

==Linear Blend Skinning==

X - n∗m∗3 role=presentation>n?m?3n * m * 3: 通过已知的joint的位置和,以及markers的local位置,使用LBS(linear blend skinning)计算markers的global positions

(当然也可以用其他的skinning functions,比如Dual Quaternion Skinning等)

==Local Reference Frame==

对每个reference pose,做rigid body alighment。取一些躯干周围的marker以及躯干上的一个骨骼(通常是某个spine骨骼),计算所有数据中这些marker的平均位置,以这个平均位置对于这个骨骼的相对位置作为坐标系(其实就是把这个骨骼作为世界root,marker的平均值作为身体的root,计算偏移量)

F - n∗4∗3 role=presentation>n?4?3n *4 * 3: 把所有n个pose都对齐到上面这个reference pose上,得到相应的偏移量 随后把所有n个数据转到reference pose的local space

==Statistics==

Y role=presentation>YY的mean - j∗3∗4 role=presentation>j?3?4j * 3 * 4和std - j∗3∗4 role=presentation>j?3?4j * 3 * 4

Z role=presentation>ZZ的mean - j∗m∗3 role=presentation>j?m?3j * m * 3和cov -(m∗j∗3)∗(m∗j∗3) role=presentation>(m?j?3)?(m?j?3)(m * j * 3) * (m * j * 3)

X role=presentation>XX的mean - m∗3 role=presentation>m?3m * 3和std - m∗3 role=presentation>m?3m * 3

Z^ role=presentation>Z^\hat Z - n∗m∗3 role=presentation>n?m?3n * m * 3: pre-weighted local offsets(对每个marker,计算它的local offsets的weighted sum)

Z^ role=presentation>Z^\hat Z的mean - m∗3 role=presentation>m?3m*3和std - m∗j∗3 role=presentation>m?j?3m*j*3 (???这是为啥?)


输入输出

==输入==

对于每个batch:n个frame的X role=presentation>XX以及对应的Z^ role=presentation>Z^\hat Z

==输出==

对应的n组Y role=presentation>YY


网络结构和训练逻辑

==网络==

6层ResNet,每一层2048 hidden units, ReLU激活。用LeCun初始化

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第2张


==优化器==

AmsGrad

==训练逻辑==

mini-batch 256。一个batch包含n组数据,以下为一个batch的情况。

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第3张

得到n组joint globalY role=presentation>YY,用marker configuraton Z role=presentation>ZZ的mean和cov采样出n组marker configuration。

用LBS计算出marker globalX role=presentation>XX

弄脏marker global得到X^ role=presentation>X^\hat X:

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第4张

计算Z^ role=presentation>Z^\hat Z

用早前算好的X role=presentation>XXZ^ role=presentation>Z^\hat Z的mean和std来normalize以上数据。

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第5张

把以上的东西丢入神经网络得到Y^ role=presentation>Y^\hat Y

反normalize Y^ role=presentation>Y^\hat Y 计算Y^ role=presentation>Y^\hat YY role=presentation>YY的L1norm

再加一个γ=0.01 role=presentation>γ=0.01\gamma = 0.01的L2

==注意事项==

不同的joint,以及不同joint的rotation和translation都可能给不同的权重。


Marker Corruption

主要是为了模拟marker可能出现的问题,比如 遮挡、对调、噪声。

他们发现,随机移动一个marker的位置要比swap来的更有效。因为marker未必一定是跟当前角色的marker对调,如果是多人互动,也可能和别人的对调。

设置了参数来控制corruption的等级:

αo role=presentation>αo\alpha ^o: 被遮挡的概率

αs role=presentation>αs\alpha ^s:被移动的概率

β role=presentation>β\beta:随机移动的范围

他们分别设置为0.1, 0.1 ,50cm


应用

步骤:

==移除outlier==

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第6张

移除原本数据的outlier(特别远的)

D role=presentation>DD - n∗m∗m role=presentation>n?m?mn * m * m: 计算干净数据每帧两两marker之间的距离,得到最小Dmin role=presentation>DminDmin 、最大值Dmax role=presentation>DmaxDmax,计算出Drange=Dmax−Dmin role=presentation>Drange=Dmax?DminDrange = Dmax -Dmin

运行时,核对对应的值,是否超出min和max的一定范围之外

D&#x005E;&lt;Dmin&#x2212;&#x03B4;Drange role=presentation>D^<Dmin?δDrange\hat D < Dmin - \delta Drange

Dmax + \delta Drange>D&#x005E;&gt;Dmax+&#x03B4;Drange role=presentation>D^>Dmax+δDrange\hat D > Dmax + \delta Drange

别忘记移除marker的同时要移除它的distance matrix

==Solving==

数据匹配到preprocessing时候的骨骼里,并且使用未被遮挡的marker得到reference frame F role=presentation>FF(???还要再研究下什么意思)

这个阶段至少需要4个marker

然后把有问题的marker值设置为0

把marker转到reference frame的local,丢入神经网络,之后再转回来。

==Filterling==

用Savitzky-Golay filter移除高频的噪声和扰动

窗口为1/8秒可根据情况调整,每个joint是独立的。

==Retargeting==

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第7张

SVD joint的旋转值,然后丢入Jacobian Inverse Kinematics solver系统计算local值


讨论

==Temporal Prior==

论文中唯一时序相关的是在后处理时候用到的Savitzky-Golay filter,但它有时候太过于暴力了。可以考虑加一些时序的东西到网络里面。但是尝试之后发现他们难训,效果也不大好。还不如用更简单快速的网络搭配后处理。看下图:

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第8张

但将来还是会努力找到一个带时序的网络,效果应该会更好。

==Limitations==

极限动作可能没有覆盖,如下图:

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第9张

最好就是直接抓个人来在尽量少的时间里把所有可能的动作都捕捉了。这样可以减少数据量。 然后,虽然我们的结果还是比较准确的,但是跟真实结果相比还是相差了几厘米的。如果想要非常精确的结果的话,用这个还是不大行的。还可能会有滑步的问题。 但我们整套系统的表现依赖于rigid body fitting这个环节能够精确地跑完,而这个环节依赖于outlier removal是否做得好。否则就可能gg,如下图:

[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第10张

可能可以帮助解决这个问题的方法是:训练的时候在F上加一些扰动

但是我们的方法可以更简单地用在不同的marker layout上,只要用新的marker configuration重新训练就可以了。



[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第11张 data-caption= data-size=normal data-rawwidth=1148 data-rawheight=977 class=origin_image zh-lightbox-thumb lazy width=1148 data-original=https://pic3.zhimg.com/v2-1b480f5364a7b63b644f36d5818bd5b2_r.jpg data-actualsrc=https://pic3.zhimg.com/v2-1b480f5364a7b63b644f36d5818bd5b2_b.jpg>
[论文整理]动捕数据去噪:Robut Solving of Optical Motion Capture Data by Denoiing  第12张 data-caption= data-size=normal data-rawwidth=569 data-rawheight=878 class=origin_image zh-lightbox-thumb lazy width=569 data-original=https://pic1.zhimg.com/v2-0d7c7115eb9b040cf360eeb4a85a584c_r.jpg data-actualsrc=https://pic1.zhimg.com/v2-0d7c7115eb9b040cf360eeb4a85a584c_b.jpg>

文章来源:[论文整理]动捕数据去噪:Robust Solving of Optical Motion Capture Data by Denoising

The End