文章来源:[论文整理]动捕数据去噪:Robust Solving of Optical Motion Capture Data by Denoising
数据准备 数据提供: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 ? 3 n * m * j * 3 : 对如上的n个pose,以及该character使用的marker,得到每个marker对每个joint的local offset作为marker configuration
W - m ∗ j role=presentation>m ? j m * j : 每个marker的skinning weights 对于没有设置给markder的joints
(假设marker configuration在同一个演员身上是一样的) (假设skinning weights在所有数据上是一样的)
==Linear Blend Skinning ==
X - n ∗ m ∗ 3 role=presentation>n ? m ? 3 n * 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 ? 3 n *4 * 3 : 把所有n个pose都对齐到上面这个reference pose上,得到相应的偏移量 随后把所有n个数据转到reference pose的local space
==Statistics ==
Y role=presentation>Y Y 的mean - j ∗ 3 ∗ 4 role=presentation>j ? 3 ? 4 j * 3 * 4 和std - j ∗ 3 ∗ 4 role=presentation>j ? 3 ? 4 j * 3 * 4
Z role=presentation>Z Z 的mean - j ∗ m ∗ 3 role=presentation>j ? m ? 3 j * 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>X X 的mean - m ∗ 3 role=presentation>m ? 3 m * 3 和std - m ∗ 3 role=presentation>m ? 3 m * 3
Z ^ role=presentation>Z ^ \hat Z - n ∗ m ∗ 3 role=presentation>n ? m ? 3 n * m * 3 : pre-weighted local offsets(对每个marker,计算它的local offsets的weighted sum)
Z ^ role=presentation>Z ^ \hat Z 的mean - m ∗ 3 role=presentation>m ? 3 m*3 和std - m ∗ j ∗ 3 role=presentation>m ? j ? 3 m*j*3 (???这是为啥?)
输入输出 ==输入 ==
对于每个batch:n个frame的X role=presentation>X X 以及对应的Z ^ role=presentation>Z ^ \hat Z
==输出 ==
对应的n组Y role=presentation>Y Y
网络结构和训练逻辑 ==网络 ==
6层ResNet,每一层2048 hidden units, ReLU激活。用LeCun初始化
==优化器 ==
AmsGrad
==训练逻辑 ==
mini-batch 256。一个batch包含n组数据,以下为一个batch的情况。
得到n组joint globalY role=presentation>Y Y ,用marker configuraton Z role=presentation>Z Z 的mean和cov采样出n组marker configuration。
用LBS计算出marker globalX role=presentation>X X 。
弄脏marker global得到X ^ role=presentation>X ^ \hat X :
计算Z ^ role=presentation>Z ^ \hat Z 。
用早前算好的X role=presentation>X X 和Z ^ role=presentation>Z ^ \hat Z 的mean和std来normalize以上数据。
把以上的东西丢入神经网络得到Y ^ role=presentation>Y ^ \hat Y
反normalize Y ^ role=presentation>Y ^ \hat Y 计算Y ^ role=presentation>Y ^ \hat Y 和Y role=presentation>Y Y 的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 ==
移除原本数据的outlier(特别远的)
D role=presentation>D D - n ∗ m ∗ m role=presentation>n ? m ? m n * m * m : 计算干净数据每帧两两marker之间的距离,得到最小D m i n role=presentation>D m i n Dmin 、最大值D m a x role=presentation>D m a x Dmax ,计算出D r a n g e = D m a x − D m i n role=presentation>D r a n g e = D m a x ? D m i n Drange = Dmax -Dmin 。
运行时,核对对应的值,是否超出min和max的一定范围之外
D ^ < D m i n − δ D r a n g e role=presentation>D ^ < D m i n ? δ D r a n g e \hat D < Dmin - \delta Drange
Dmax + \delta Drange>D ^ > D m a x + δ D r a n g e role=presentation>D ^ > D m a x + δ D r a n g e \hat D > Dmax + \delta Drange
别忘记移除marker的同时要移除它的distance matrix
==Solving ==
数据匹配到preprocessing时候的骨骼里,并且使用未被遮挡的marker得到reference frame F role=presentation>F F (???还要再研究下什么意思)
这个阶段至少需要4个marker
然后把有问题的marker值设置为0
把marker转到reference frame的local,丢入神经网络,之后再转回来。
==Filterling ==
用Savitzky-Golay filter移除高频的噪声和扰动
窗口为1/8秒可根据情况调整,每个joint是独立的。
==Retargeting ==
SVD joint的旋转值,然后丢入Jacobian Inverse Kinematics solver系统计算local值
讨论 ==Temporal Prior ==
论文中唯一时序相关的是在后处理时候用到的Savitzky-Golay filter,但它有时候太过于暴力了。可以考虑加一些时序的东西到网络里面。但是尝试之后发现他们难训,效果也不大好。还不如用更简单快速的网络搭配后处理。看下图:
但将来还是会努力找到一个带时序的网络,效果应该会更好。
==Limitations ==
极限动作可能没有覆盖,如下图:
最好就是直接抓个人来在尽量少的时间里把所有可能的动作都捕捉了。这样可以减少数据量。 然后,虽然我们的结果还是比较准确的,但是跟真实结果相比还是相差了几厘米的。如果想要非常精确的结果的话,用这个还是不大行的。还可能会有滑步的问题。 但我们整套系统的表现依赖于rigid body fitting这个环节能够精确地跑完,而这个环节依赖于outlier removal是否做得好。否则就可能gg,如下图:
可能可以帮助解决这个问题的方法是:训练的时候在F 上加一些扰动
但是我们的方法可以更简单地用在不同的marker layout上,只要用新的marker configuration重新训练就可以了。
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> 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