在pytorch旋转矩阵转四元数及各种旋转表示方式之间的转换实现代码这篇博客里,我提到可以使用pytorch3d实现批量旋转表示方法之间的转换。但是最近在使用它的matrix_to_quaternion函数的时候,发现了一个隐藏的巨大bug:它不会确保输出的四元数中的那个实数w恒为正。这样就存在一个非常大的隐患,因为我们知道,对四元数中的所有数字同时取负,那么它所表示的旋转是不变的。也就是说,matrix_to_quaternion函数转换获得的四元数本身并没有错,但是它没有限制其中的实数w为正,这样就会在诸如我们需要使用四元数的二范数作为网络loss的时候,埋下巨大的隐患(毕竟如果同一个旋转量,一会是正一会是负,网络该信哪个?)。
如下图所示,就是使用pytorch3d.transforms.matrix_to_quaternion
函数将一个batch的旋转矩阵转化为四元数后的结果。按照官方解释,每个四元数的第一个数字为实部w,通常我们会规范实部为正数,而如下图所示的输出,很明显,它没有进行这一约束。
而当我们知道了这一bug以后,针对性的解决方法也比较简单,只需要对第一个数字是负的四元数取反即可,实现代码可参考如下:文章来源:https://www.toymoban.com/news/detail-546809.html
neg_row_ids = torch.where(quats_gt[:,0]<0)
quats_gt[neg_row_ids] *= -1
如下图所示,对输出的四元数tensor进行规范化,第一个数字就全部是正的了(使用的数据与上图不一样,仅展示效果用)。
文章来源地址https://www.toymoban.com/news/detail-546809.html
到了这里,关于pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!