我正在研究用于 3D 骨骼角色动画的神经网络模型,我在其中学习关节位置和方向。问题与方向有关。我可以选择几种方式来表示 3D 旋转,但它们都有某种形式的不连续性,这使得我的模型在所有情况下都无法产生稳定的正确旋转。我考虑过的替代方案是:
- 四元数。四元数(或单位四元数)非常常用于 3D 方向,除了单位四元数及其相反表示相同方向外,通常都很好。想出一个损失公式来解释这一点并不难(
1 - abs(sum(componentwise_product(q1, q2)))
工作正常),但问题是在某些情况下,网络不知何故学会了产生具有两个符号的相同四元数,并且从一个随机“翻转”有时会向另一个签名,中间有一些帧,导致一种“闪烁”。一种可能性是只取“一半”的四元数,例如通过将一个组件固定为正数(然后通过平方差来学习)。但是,它并不总是有效。例如,[0.018, 0.743, 0.557, 0.371]
,还有一个像[-0.017, 0.870, 0.348, 0.348]
;[0.017, -0.870, -0.348, -0.348]
这些是相当相似的四元数,但是如果我使第一个分量为正,那么第二个分量将为不正确)。 - 旋转向量。旋转向量具有旋转轴的方向和旋转角度的大小。例如,它们在相位函数神经网络的原始论文中被使用,但它们仍然存在不好的情况。假设向量大小从 0 到 π(更大的角度将沿着相反的轴)。如果您的旋转刚好在 π 的值附近,则旋转矢量将从一个方向“摆动”到相反的方向,再次使网络难以学习它。
- 欧拉角。这些只是以特定顺序沿特定轴(X、Y 或 Z)应用的三个旋转角度。他们通常不鼓励他们,因为他们不是很稳定并且遭受臭名昭著的万向节锁,但除了几何形状,他们仍然有同样的问题。如果我的角度从 -180º 到 180º(或 -π 到 π 的弧度),“边界”中的值总是会导致不稳定。
- 广泛的旋转编码。编码旋转的一种稳定方法是同时给出正弦值和余弦值。因此,例如,我可以同时拥有每个欧拉角的正弦和余弦,或者仅拥有 3D 旋转矩阵的九个值(它们不是正弦和余弦,而是以某种方式从这些值推导出来的,并且也是一个稳定的表示)。然而,这显然会显着增加要学习的值的数量,我会尝试学习它们之间实际上存在关系的独立值。
我还没有找到专门解决这个问题的相关文献,尽管我可能没有使用正确的术语进行搜索。有没有人遇到过这个问题?或者有一些我可以考虑的想法或替代方案?