wordpress 网页存在哪里,网站优化都是怎么做的,网站建设中的定位设想,营销型网站建设广告语解决这个问题#xff0c;最简单的当然是升级pytorch和onnx到比较高的版本#xff0c;例如有人验证过的组合: pytorch2.1.1cu118, onnxruntime1.16.3
但是因为你的模型或cuda环境等约束#xff0c;不能安装这么高的版本的pytorch和onnx组合时(例如我的环境是pytorch1.12最简单的当然是升级pytorch和onnx到比较高的版本例如有人验证过的组合: pytorch2.1.1cu118, onnxruntime1.16.3
但是因为你的模型或cuda环境等约束不能安装这么高的版本的pytorch和onnx组合时(例如我的环境是pytorch1.12onnxruntime1.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()计算出来是一致的仅当x0(或者说上面的rot_cosine0)时用小量1e-6代替0计算出的角度和正负torch.pi/2可能有点很细微差异而已这基本不影响物体朝向的正确性。
将上述实现封装成函数替代调用处的torch.atan2()导出onnx就可以顺利成功了。