解决低版本pytorch和onnx组合时torch.atan2()不被onnx支持的问题
解决这个问题,最简单的当然是升级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-6rot = 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.pirot[idx_yn] -= torch.pi
用数据测试发现上述计算步骤计算出的结果和torch.atan2()计算出来是一致的,仅当x==0(或者说上面的rot_cosine==0)时,用小量1e-6代替0,计算出的角度和正负torch.pi/2可能有点很细微差异而已,这基本不影响物体朝向的正确性。
将上述实现封装成函数替代调用处的torch.atan2(),导出onnx就可以顺利成功了。
相关文章:

解决低版本pytorch和onnx组合时torch.atan2()不被onnx支持的问题
解决这个问题,最简单的当然是升级pytorch和onnx到比较高的版本,例如有人验证过的组合: pytorch2.1.1cu118, onnxruntime1.16.3 但是因为你的模型或cuda环境等约束,不能安装这么高的版本的pytorch和onnx组合时(例如我的环境是pytorch1.12&…...

javaWeb项目-ssm+jsp房屋出租管理系统功能介绍
本项目源码(点击下方链接下载):java-ssmjsp房屋出租管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端ÿ…...

【R语言】gadm全球行政区划数据库
我R语言不熟、也不是学GIS的。仅用于记录。 文章目录 一、gadm 数据库简介二、R 语言示例三、sf 包的函数 一、gadm 数据库简介 GADM(全称Database of Global Administrative Areas)是一个高精度的全球行政区划数据库,它包含了全球所有国家和…...
3万字66道Java基础面试题总结(2024版本)
本文合计三万字,整合了66道当前Java面试中比较热门的面试题,希望对大家有所帮助。 文章目录 一、Java概念1. JDK和JRE和JVM的区别2. Java语言有哪些特点3. 什么是字节码?采用字节码的最大好处是什么?4. Oracle JDK 和 OpenJDK 的对…...

go 环境安装
最近搭建AIGC大模型聚合平台,涉及到了go语言,随手整理一下环境安装步骤分享给大家。 1、安装 官网下载地址:https://go.dev/ 1.1 Linux 安装 yum install git -y yum install golang -y yum install gcc -y # 日志工具,如需要…...
stereo-seq 细胞、捕获到的分子及其特征的统计描述
Cell Count、Mean/Median Cell Area、Mean/Median DNB Count、Mean/Median Gene Type、Mean/Median MID 这些术语与空间转录组学和单细胞测序等技术中的细胞和基因表达数据分析有关。每个指标都是对细胞、捕获到的分子及其特征的统计描述。以下是每个术语的详细解释: 1. Cell…...
ceph rook-ceph 部署 cephobjectstore 失败
版本信息 helm list WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /Users/zld/kubeconfigs/gir.yaml WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /Users/zld/kubeconfigs/gir.yaml …...

1791. 找出星型图的中心节点
有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。 给你一个二维整数数组 edges ,其中 edges[i] [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你…...

微调小型Llama 3.2(十亿参数)模型取代GPT-4o
微调Llama VS GPT-4o 别忘了关注作者,关注后您会变得更聪明,不关注就只能靠颜值了 ^_^。 一位年轻的儿科医生与一位经验丰富的医师,谁更能有效治疗婴儿的咳嗽? 两者都具备治疗咳嗽的能力,但儿科医生由于专攻儿童医学…...

【JavaEE】【IO】文件操作
目录 一、文件1.1 文件的概念1.2 文件的操作1.3 路径1.4 文件分类 二、Java中的文件元信息、路径操作2.1 属性2.2 构造方法2.3 方法2.3.1 文件路径2.3.2 文件判断2.3.3 文件创建删除2.3.4 其他操作 三、文件读写操作3.1 流(Stream)3.1.1 字节流3.1.1.1 I…...
commonjs和esmodule的导入导出细节
CommonJS和ES Module是JavaScript中两种不同的模块系统,它们在导入导出细节上存在差异,以下是两者的具体对比以及方便区分记忆的方法: 1. 导入导出细节 CommonJS 导出:使用module.exports或exports对象来导出模块中的变量、函数…...

【热门】用ChatGPT做智慧农业云平台——农业ERP管控系统
随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…...

Android从上帝视角来看PackageManagerService
戳蓝字“牛晓伟”关注我哦! 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章,技术文章也可以有温度。 前言 阅读该篇之前,建议先阅读下面的系列文章: Android深入理解包管理–PackageManagerService和它的“小伙伴…...

阵列式位移计与传统测斜仪相比的优势
在岩土工程监测领域,位移测量是确保工程质量和安全的重要环节。传统的测斜仪,如活水平固定测斜仪和固定式测斜仪,尽管在一定程度上满足了工程监测的需求,但某些方面限制了其应用范围。随着阵列式位移计这种新型的传感器的出现&…...

第7章 网络请求和状态管理
一、Axios 1 Axios概述 Axios是一个基于Promise的HTTP库,可以发送get、post等请求,它作用于浏览器和Node.js中。当运行在浏览器时,使用XMLHttpRequest接口发送请求;当运行在Node.js时,使用HTTP对象发送请求。 Axios的…...
苍穹外卖学习笔记(二十七)
客户催单 OrderController /*** 催单*/GetMapping("/reminder/{id}")ApiOperation("催单")public Result reminder(PathVariable("id") Long id) {orderService.reminder(id);return Result.success();}OrderServer /*** 催单*/void reminder(L…...

使用exe4j打包jar包生成exe文件,GUI应用详细使用教程
使用exe4j打包jar包生成exe文件,GUI应用详细使用教程 exe4j应用教程使用方式搞副业 exe4j应用教程 《exe4j 下载地址》 exe4j是一个功能强大的多平台 Java 安装程序生成器,它可以为 Java 应用程序生成本机安装程序和应用程序启动器。exe4j 的优点在于它的易用性、广…...

go jwt 用户登录和返回用户信息 token ----important!!!
1.每一行代码都有详细注释,解释了其功能和作用。这些注释可以帮助你理解代码如何工作,特别是在处理用户登录、生成 JWT、验证 JWT 和返回用户信息的过程中。 package main // 指定这个文件是一个可执行程序import ("fmt" …...

OpenCV高级图形用户界面(12)用于更改指定窗口的大小函数resizeWindow()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::resizeWindow() 函数用于更改指定窗口的大小。这使得你可以根据需要调整窗口的宽度和高度。 注释 指定的窗口大小是指图像区域的大小。工具栏…...

babylonjs shader学习之copy shadertoy案例
shadertoy案例: 准备 const onSceneReady (scene: Scene) > {const light new HemisphericLight(light, new Vector3(0, 1, 0), scene);light.intensity 0.7;Effect.ShadersStore[planeMatVertexShader] precision highp float;attribute vec3 position;attr…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...