pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法

  在pytorch旋转矩阵转四元数及各种旋转表示方式之间的转换实现代码这篇博客里,我提到可以使用pytorch3d实现批量旋转表示方法之间的转换。但是最近在使用它的matrix_to_quaternion函数的时候,发现了一个隐藏的巨大bug:它不会确保输出的四元数中的那个实数w恒为正。这样就存在一个非常大的隐患,因为我们知道,对四元数中的所有数字同时取负,那么它所表示的旋转是不变的。也就是说,matrix_to_quaternion函数转换获得的四元数本身并没有错,但是它没有限制其中的实数w为正,这样就会在诸如我们需要使用四元数的二范数作为网络loss的时候,埋下巨大的隐患(毕竟如果同一个旋转量,一会是正一会是负,网络该信哪个?)。
  如下图所示,就是使用pytorch3d.transforms.matrix_to_quaternion函数将一个batch的旋转矩阵转化为四元数后的结果。按照官方解释,每个四元数的第一个数字为实部w,通常我们会规范实部为正数,而如下图所示的输出,很明显,它没有进行这一约束。
pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法_第1张图片
  而当我们知道了这一bug以后,针对性的解决方法也比较简单,只需要对第一个数字是负的四元数取反即可,实现代码可参考如下:

neg_row_ids = torch.where(quats_gt[:,0]<0)
quats_gt[neg_row_ids] *= -1

  如下图所示,对输出的四元数tensor进行规范化,第一个数字就全部是正的了(使用的数据与上图不一样,仅展示效果用)。
pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法_第2张图片

你可能感兴趣的:(python,debug,pytorch,pytorch,3d,矩阵)