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

10 篇文章 2 订阅
9 篇文章 0 订阅

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

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

  如下图所示,对输出的四元数tensor进行规范化,第一个数字就全部是正的了(使用的数据与上图不一样,仅展示效果用)。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeeq_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值