pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法
在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进行规范化,第一个数字就全部是正的了(使用的数据与上图不一样,仅展示效果用)。
pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法相关推荐
- php is_subclass_of,PHP_PHP is_subclass_of函数的一个BUG和解决方法,is_subclass_of的作用:
复制代码 - phpStudy...
PHP is_subclass_of函数的一个BUG和解决方法 is_subclass_of的作用: bool is_subclass_of ( object object, string class ...
- 出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法...
在DNS解析中,出错提示:"Could not flush the DNS Resolver Cache: 执行期间,函数出了问题"的解决方法 . 由于公司网站空间更换了服务商. ...
- 回调函数与回调地狱及其解决方法 | JavaScript
JavaScript中的回调函数与回调地狱及其解决方法 以下为整理的思维导图 图片版+文字版 文末附有参考文章链接 知识点思维导图版 一.什么是回调函数 1.MDN的定义 回调函数是作为参数传给另一个 ...
- Android仿微信朋友圈3评论输入框及点击外部和列表滑动时隐藏输入框和键盘解决方法
接着上一篇的评论点赞弹框之后,这次来说说微信的评论输入框,点击屏幕外部评论框和键盘消失,滑动列表时输入框和键盘也要消失,这里不是说一定要舔微信啥的,只是单纯从技术角度出发,分析原理和实现,解决我们自己 ...
- mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
我们在使用mysql数据库开发项目的时候,有时Mysql系统自带的函数不能完全满足我们开发的需要,解决方法是自己创建函数,可以有可能在你创建函数的过程事会报出Error 1418错误,对于报这种错误的 ...
- thinkphp省略php,ThinkPHP的截取字符串函数无法显示省略号的解决方法
对于ThinkPHP的截取字符串函数无法显示省略号的情况,解决方法如下: 打开Common/extend.php页面,修改msubstr函数如下: function msubstr($str, $st ...
- C#报错“OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码”的解决方法。
在VS下进行C#编程并调用C++的DLL时候,有很小的概率报错"OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码",其解决方法是把VS菜单中的 ...
- C语言函数未定义警告的解决方法
问题:在C语言中,自定义函数并进行调用,运行后提示"函数未定义"的警告 修改前代码段: #define _CRT_SECURE_NO_WARNINGS 1 #include < ...
- php addslashes没用_php中使用addslashes函数报错问题的解决方法
大家看下面的代码,能发现错误在哪里吗? echo function_exists('addcslashes');//检测是否存在该函数 echo get_magic_quotes_gpc().' '; ...
最新文章
- 【Java】类和对象
- 计算机开启时提示键盘错误,电脑开机出现异常提示keyboard not found的故障原因及解决方法_电脑故障...
- 是什么影响了MySQL性能?
- 函数式编程 -- 纯函数、柯里化函数
- localStorage本地存储数组、读取、修改、删除
- LA 4728 (旋转卡壳) Squares
- boa+php 嵌入式,boa 0.94.13 在嵌入式平台的安装与配置
- fiddler 工具作用和使用场景
- ​30 岁了,依然一事无成
- fescar(Seata)详解
- Hash冲突的解决方式
- html中调用javascript函数,如何在HTML中调用JavaScript函数
- Android开发:申请小米开发者账号步骤
- 二维码制作之批量生成名片二维码
- 想问一下一阶电路的开路怎么画仿真电路图,用multisim操作
- C++校内模拟赛-06水题
- PCM音频处理(1)——分离声道、以及声音处理
- 20.JVM监控以及诊断工具-GUI篇
- [python,2018-06-25] 高德纳箭号表示法
- 附近的人打招呼V1.0