解决低版本pytorch和onnx组合时torch.atan2()不被onnx支持的问题

news2024/10/23 3:32:11

解决这个问题,最简单的当然是升级pytorch和onnx到比较高的版本,例如有人验证过的组合: pytorch=2.1.1+cu118, onnxruntime=1.16.3

但是因为你的模型或cuda环境等约束,不能安装这么高的版本的pytorch和onnx组合时(例如我的环境是pytorch1.12,onnxruntime=1.19.2,即使onnxruntime版本比较高但是Pytorch的版本底也照样报这个错: tan2 to ONNX opset version 16 is not supported),那就只能考虑自己基于torch.atan()实现torch.atan2()的功能了。

torch.atan()因为不能区分坐标落在哪个像限,如果直接用来计算物体的朝向角的话,因为可能这个缺陷导致计算出来的物体的朝向是完全相反的方向,或者朝向沿着x轴做对称翻转了,例如

   torch.atan(-1/10)和torch.atan(1/(-10))是没有区别的,atan2()就是为了解决这种问题的,atan2()的实现原理大致如下图所示:

    

有人基于atan()对atan2()做了如下近似实现:

torch.atan((rot_sine / (rot_cosine + 1e-8)).sigmoid())                
+ ((1 - torch.sign(rot_cosine)) / 2) * torch.sign(rot_sine) * torch.pi

显然后半部分根据x和y的正负做加/减torch.pi是正确的,但是前半部分对(y/x)做sigmoid()运算把值一律转到不带符号的(0,1)之间在有的情况下是有一定误差的。

网上没找到其他更好的实现,于是我基于上面图中的计算规则做了如下实现:

            rot_sine = bboxes[..., 6:7]
            rot_cosine = bboxes[..., 7:8]
           
            idx = torch.where(rot_cosine == 0)
            rot_cosine[idx] = 1e-6

            rot = torch.atan(rot_sine / rot_cosine)

            mask_yp = (rot_sine >= 0) & (rot_cosine < 0)
            mask_yn = (rot_sine < 0) & (rot_cosine < 0)
            idx_yp = torch.where(mask_yp)
            idx_yn = torch.where(mask_yn)
            rot[idx_yp] += torch.pi
            rot[idx_yn] -= torch.pi

用数据测试发现上述计算步骤计算出的结果和torch.atan2()计算出来是一致的,仅当x==0(或者说上面的rot_cosine==0)时,用小量1e-6代替0,计算出的角度和正负torch.pi/2可能有点很细微差异而已,这基本不影响物体朝向的正确性。

将上述实现封装成函数替代调用处的torch.atan2(),导出onnx就可以顺利成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2213386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单细胞转录组亚群分析

1 单细胞转录组亚群常见分析内容 重磅综述&#xff1a;三万字长文读懂单细胞RNA测序分析的最佳实践教程 &#xff08;原理、代码和评述&#xff09; 如何使用Bioconductor进行单细胞分析&#xff1f; 单细胞转录组亚群分析的内容根据样品数目多少&#xff0c;可以分为单个样…

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习 项目地址&#xff1a;https://gitcode.net/EricLee/light_pose 1、数据集来源&#xff1a;coco2017 数据集 * coco 数据集官方网站&#xff1a;https://cocodataset.org/#home * [数据集下载地址(百度网盘 Pa…

CogVideoX:Text-to-Video Diffusion Models with An Expert Transformer

研究背景 背景介绍: 这篇文章的研究背景是文本到视频模型的快速发展&#xff0c;特别是Transformer架构和扩散模型的应用。早期尝试预训练和扩展Transformer生成视频已经显示出巨大潜力&#xff0c;如CogVideo和Phenaki。扩散模型在多模态生成方面也取得了显著进展&#xff0c…

数据结构 -- 排序算法

一 排序 1.1 排序的概念 所谓排序&#xff0c;就是一种使一串数据记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减地组织起来的操作。 从排序方式上&#xff0c;排序算法一般被分为比较排序和非比较排序。从比较排序的内容上&#xff0c;它一般被分为…

Excel:vba实现拆分单元格成一字一单元格

我拿到的表格如下&#xff1a; 我想实现的表格效果如下&#xff1a; 要求就是&#xff1a;将A列的千字文拆分成一个单元格一个字&#xff0c;并整理成4列 我这里是将效果呈现到一个新的表里面&#xff0c;没有在原表里面(在原表里…

SpringBoot统一日志框架

在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。 1.日志框架的选择 市面上常见的日志框架有很多&#xff0c;它们可以被分为两类&#xff1a;日志门面&#xff08;日志抽象层&#xff09;和日志实…

使用 PyTorch 构建 LSTM 股票价格预测模型

目录 引言准备工作1. 训练模型&#xff08;train.py&#xff09;2. 模型定义&#xff08;model.py&#xff09;3. 测试模型和可视化&#xff08;test.py&#xff09;使用说明模型调整结论 引言 在金融领域&#xff0c;股票价格预测是一个重要且具有挑战性的任务。随着深度学习…

【观察】超聚变:跨越智能算力“四座大山”,全方位重构“智算底座”

毫无疑问&#xff0c;今天在人工智能的推动下&#xff0c;企业数智化转型已进入规模化“倍增创新”的阶段&#xff0c;尤其是以大模型为代表的AI技术加速演进&#xff0c;以及应用场景的不断拓展加深&#xff0c;都让各类AI创新应用如雨后春笋般涌现&#xff0c;并加速惠及千行…

C++中cout的一些扩展

需要添加<iomanip>头文件 cout有许多扩展功能&#xff0c;比如一直很麻烦的保留小数数位的问题。 这里用几个问题来引入 cout实现保留小数数位 #include<iostream> #include<iomanip> using namespace std; int main(){double x123.345;double y342.324…

【未公开0day】金和OAC6 SignUpload SQL注入漏洞【附poc】

免责声明&#xff1a;本文仅用于技术学习和讨论。请勿使用本文所提供的内容及相关技术从事非法活动&#xff0c;若利用本文提供的内容或工具造成任何直接或间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果均与文章作者及本账号无关。 fofa语…

2024/10/14 英语每日一段

Advocates of the working pattern—100% of the work done in 80% of the time for 100% pay—claim the shorter working week boosts productivity, public health and builds a society “where we work to live, rather than live to work”. But the TaxPayers’ Allianc…

threejs-UV

一、简介 1.介绍 1.什么是UV映射&#xff1f; UV映射是一种将二维纹理映射到三维模型表面的技术。在这个过程中&#xff0c;3D模型上的每个顶点都会被赋予一个二维坐标&#xff08;U, V&#xff09;。U和V分别表示纹理坐标的水平和垂直方向。这些坐标用于将纹理图像上的像素与…

SQL优化,我就用了这几招

先赞后看&#xff0c;Java进阶一大半 阿里巴巴社区博客最近发表了一篇探究MySQL索引策略的博客&#xff0c;下图是一条查询SQL的执行过程。 我是南哥&#xff0c;相信对你通关面试、拿下Offer有所帮助。 敲黑板&#xff1a;本文总结了MySQL语句优化、索引优化常见的面试题&…

景区卫生间智能刷脸取纸机,灵活设置取纸长度、取纸间隔时间

在旅游景区&#xff0c;卫生间的服务质量直接影响着游客的体验。景区卫生间智能刷脸取纸机的出现&#xff0c;为解决游客用纸需求、提高资源利用效率以及提升景区管理水平带来了创新性的解决方案。 一、智能刷脸取纸机功能 1. 精准取纸&#xff1a;能够根据游客的实际需求&…

“链动2+1+消费增值:用户留存新策略“

大家好&#xff0c;我是吴军&#xff0c;目前在一家以创新为核心的软件开发公司担任产品经理。今天&#xff0c;我将深入探讨一个经受住了时间考验且依然充满活力的商业模式——“链动21”模式&#xff0c;并通过一个实例及相关数据展示它如何巧妙应对用户留存与复购的挑战。 首…

每日OJ题_牛客_HJ63DNA序列_滑动窗口_C++_Java

目录 牛客_HJ63DNA序列_滑动窗口 题目解析 C代码 Java代码 牛客_HJ63DNA序列_滑动窗口 孩子们的游戏(圆圈中最后剩下的数)_牛客题霸_牛客网 描述&#xff1a; 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例&#xff08;定义为 GC-Ratio &#xff09;是…

[SQL] 数据库图形化安装和使用

一 安装 1.1 图形化安装 下载DataGrip安装包 点击此处一直下一步即可。点击免费使用。 进去界面后,选择新建一个项目 点击加号&#xff0c;创建一个Mysql连接。输入Mysql的连接信息。点击DownLoad下载Mysql的驱动 接下来点击创建的mysq项目中后面的三个点&#xff0c;选择…

Facebook的全球影响力:跨文化交流与信息共享的前沿

引言 在数字化时代&#xff0c;社交媒体已成为全球沟通的重要平台。自2004年成立以来&#xff0c;Facebook迅速发展成为拥有超过20亿活跃用户的巨头。其强大的影响力使其成为跨文化交流与信息共享的前沿平台。 跨文化交流的促进 Facebook的多语言支持让来自不同文化背景的用户…

如何在mkdocs-material文档主题下设置多版本文档系统?

引言 前一段时间&#xff0c;参与了PaddleOCR开源项目的文档站点搭建工作&#xff0c;基于mkdocs工具&#xff0c;采用mkdocs-material主题&#xff0c;基于Github Pages来搭建整个文档站点。目前该站点已经搭建完毕&#xff0c; 支持多语言、文档搜索等诸多功能。 最近得知&…

【C++ 算法进阶】算法提升二

算法提升二 最大分配工资问题 &#xff08;贪心&#xff09;题目分析代码详解 数组有序问题 &#xff08;贪心&#xff09;题目分析代码详解 消息流问题 &#xff08;数据结构设计&#xff09;题目分析代码详解 可乐问题 &#xff08;Coding能力&#xff09;题目分析代码详解 司…