解决低版本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-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就可以顺利成功了。

相关推荐
qianbo_insist1 小时前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
tellmewhoisi5 小时前
深度学习19:PyTorch:自动微分模块
人工智能·pytorch·深度学习
tellmewhoisi10 小时前
深度学习21:PyTorch:激活函数(Sigmoid,Tanh,ReLU,Softmax)
人工智能·pytorch·深度学习
Be for thing1 天前
PyTorch自动求导Autograd详解|requires_grad、backward、grad、梯度清零
pytorch·学习·1024程序员节
小毕超1 天前
从推理到训练:Intel Ultra 核显 GPU 加速 YOLO 模型训练
pytorch·yolo·gpu·intel
摸鱼仙人~1 天前
从 AI 应用开发到 GPU 计算软件:一份完整的 GPGPU、PyTorch、vLLM 与 AI Infra 学习路线
人工智能·pytorch·vllm
计算机毕业编程指导师2 天前
计算机毕设推荐:基于深度学习的动物图像识别方法研究(Python+Django+PyTorch)
pytorch·python·深度学习·计算机·毕业设计·课程设计·图像识别
zh路西法3 天前
【四足强化学习经典算法】(一):RMA——盲视运动控制与快速适应模块
pytorch·强化学习·1024程序员节·四足机器人·dagger·pyhon·rma
Be for thing3 天前
PyCharm安装与PyTorch项目配置|Jupyter Notebook与PyCharm使用对比
pytorch·学习·1024程序员节
zh路西法4 天前
【模型式强化学习】(二)PETS——从概率动力学模型到模型预测控制(MPC)
pytorch·python·强化学习·pe·mpc·ces·pets