Kornia 角度转换精度修复解析rad2deg/deg2rad 的整数输入与 float64 精度保障【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址: https://gitcode.com/gh_mirrors/ko/kornia导读本篇文章围绕 Kornia 仓库变更记录changelog.d/migration-034.fixed.md对应上游 issue #4358中的一项核心修复展开rad2deg、deg2rad两个角度单位转换函数此前在整数张量输入下会静默产生错误结果且在 float64 双精度下丢失精度而angle_to_rotation_matrix由于内部直接调用deg2rad受同样问题影响。读者在阅读本文后将理解这三个函数的确切行为、精度问题的根因、仓库中的回归测试与修复实现并掌握在实际几何计算中正确使用这些函数的方法。修复背景一个容易被忽视的精度陷阱角度单位转换是计算机视觉中最基础、最频繁的操作之一。Kornia 中大量下游功能——特征点方向估计、姿态评估、图像仿射变换、坐标变换——都在内部依赖角度转换。该修复变更记录指出rad2deganddeg2radnow handle integer tensor inputs correctly and preserve float64 precision.angle_to_rotation_matrixinherits the corrected conversion, while the implementation preserves ONNX export compatibility. (#4358)也就是说本次修复涵盖三个层面整数张量输入此前对整数类型如torch.int64、torch.int32张量调用rad2deg/deg2rad会得到错误甚至不可预期的结果float64 精度保留此前双精度输入在转换过程中精度受损与 issue #3937 相关下游函数继承angle_to_rotation_matrix通过deg2rad继承了修正后的行为同时保持 ONNX 导出兼容性。修复后的实现三个函数的源码全貌rad2deg弧度转角度修复后的实现位于 kornia/geometry/conversions.pydef rad2deg(tensor: torch.Tensor) - torch.Tensor: rConvert angles from radians to degrees. Convention: - the input is in **radians** and the output in **degrees**; the conversion is elementwise and preserves shape, device and float dtype ... if not isinstance(tensor, torch.Tensor): raise TypeError(fInput type is not a torch.Tensor. Got {type(tensor)}) return tensor * (180.0 / math.pi)关键实现要点类型守卫非torch.Tensor输入直接抛出TypeError避免静默错误标量乘法实现tensor * (180.0 / math.pi)中Python 浮点标量与张量相乘会触发 PyTorch 的类型提升type promotion整数张量被自动提升为浮点类型默认torch.float32从而避免整数截断问题同时 float64 输入因乘数本身就是 float64 精度的标量180.0 / math.pi精度得以完整保留逐元素且保形输出 shape、device 与输入一致浮点 dtype 不变。deg2rad角度转弧度同样位于 kornia/geometry/conversions.pydef deg2rad(tensor: torch.Tensor) - torch.Tensor: rConvert angles from degrees to radians. Convention: - the input is in **degrees** and the output in **radians**; it performs the opposite conversion to :func:~kornia.geometry.conversions.rad2deg ... if not isinstance(tensor, torch.Tensor): raise TypeError(fInput type is not a torch.Tensor. Got {type(tensor)}) return tensor * (math.pi / 180.0)与rad2deg对称乘数math.pi / 180.0为 float64 标量同样通过类型提升处理整数输入并保留双精度。angle_to_rotation_matrix角度的旋转矩阵化修复的核心价值在于下游函数angle_to_rotation_matrix见 kornia/geometry/conversions.pydef angle_to_rotation_matrix(angle: torch.Tensor) - torch.Tensor: rCreate a rotation matrix out of angles in degrees. Convention: - angle is in **degrees**, shape :math:(*) in and :math:(*, 2, 2) out - the matrix is [[cos, sin], [-sin, cos]] with det 1; for angle 30 it is [[0.8660, 0.5000], [-0.5000, 0.8660]] ... ang_rad deg2rad(angle) cos_a: torch.Tensor torch.cos(ang_rad) sin_a: torch.Tensor torch.sin(ang_rad) return torch.stack([cos_a, sin_a, -sin_a, cos_a], dim-1).view(*angle.shape, 2, 2)三个值得注意的实现细节角度单位约定是「度」而非弧度该函数接收degrees输入内部第一行就调用deg2rad(angle)完成单位转换——这正是它“继承”修复行为的途径。测试 tests/geometry/test_conversions.py 中专门固定了这一约定convention pin输入30.0得到[[0.8660254, 0.5], [-0.5, 0.8660254]]如果某实现错误地按弧度读取则pi/2会被当作 1.5708 度退化为近单位矩阵测试中的对比值可清晰暴露此类错误输出方向约定矩阵为[[cos, sin], [-sin, cos]]即教科书数学坐标系中逆时针矩阵的转置适配 Kornia 图像坐标 y 轴朝下的约定左乘列向量(x, y)时在图像上呈现逆时针旋转纯张量算子组合整个实现仅由deg2rad、torch.cos、torch.sin、torch.stack、view构成全部是标准 ONNX 可导出算子这正是变更记录中“preserves ONNX export compatibility”的源码依据。测试文件 tests/augmentation/test_onnx_export.py 的注释也印证仿射/shear 的compute_transformation路径依赖deg2rad的内联inlining来保证 eager 与 ONNX 数值等价。回归测试修复如何被验证仓库在 tests/geometry/test_conversions.py 中通过TestRadDegConversions测试类系统性地固定了修复行为与变更记录形成一一对应float64 精度回归对应 issue #3937pytest.mark.parametrize( (op_name, arg, expected), [ (rad2deg, torch.pi, 180.0), (deg2rad, 180.0, torch.pi), (angle_to_rotation_matrix, 90.0, [[0.0, 1.0], [-1.0, 0.0]]), ], ) def test_convention_float64_results_are_exact_3937(self, device, op_name, arg, expected): # Regression for #3937: rad2deg and deg2rad must preserve float64 precision. # angle_to_rotation_matrix inherits the corrected conversion through deg2rad, # so a 90-degree input should produce the expected quarter-turn matrix without # the previous float32 pi bias. # float64 is hardcoded because this regression specifically checks double precision. ... out op(torch.tensor(arg, devicedevice, dtypetorch.float64)) self.assert_close(out, torch.tensor(expected, devicedevice, dtypetorch.float64), atol1e-12, rtol1e-12)这段测试tests/geometry/test_conversions.py揭示了修复前的典型缺陷float32 的 π 偏差float32 pi bias。此前如果转换路径中先将 π 截断为 float3290°转出的旋转矩阵就不会是精确的[[0, 1], [-1, 0]]四分之一转修复后三个函数在 float64 下均以atolrtol1e-12的严格容差通过。测试还注明了 MPS 设备因不支持 float64 而跳过。整数输入提升回归pytest.mark.parametrize( (op_name, arg, expected), [ (rad2deg, [1, 2, 3], [57.29577951308232, 114.59155902616465, 171.88733853924697]), (deg2rad, [180, 90], [3.141592653589793, 1.5707963267948966]), (angle_to_rotation_matrix, [90], [[[0.0, 1.0], [-1.0, 0.0]]]), ], ) def test_integer_input_promotes_to_float_3937(self, device, op_name, arg, expected): op getattr(kornia.geometry.conversions, op_name) out op(torch.tensor(arg, devicedevice)) assert out.dtype torch.float32 ...该测试tests/geometry/test_conversions.py验证整数张量输入被自动提升为torch.float32默认浮点 dtype且数值结果与期望完全一致——例如deg2rad([180, 90])得到[π, π/2]的完整双精度数值。往返一致性测试此外test_rad2deg与test_deg2radtests/geometry/test_conversions.py对多种 batch shape(2, 3)、(1, 2, 3)、(2, 3, 3)、(5, 5, 3)执行了“转过去再转回来”的往返闭合验证并用gradcheck确认梯度可微性保证修复没有破坏自动微分链路。上游与下游的实际影响下游调用链从源码搜索可见本次修复波及的不仅仅是三个孤立函数kornia/feature/orientation.py 在特征方向估计orientation estimation中调用rad2deg(angles_radians)输出角度kornia/feature/laf.py 与 kornia/feature/sift/pyramid.py、kornia/feature/sift/scale_space.py 在 SIFT 金字塔与尺度空间构建中通过torch.rad2deg处理旋转角度kornia/metrics/pose.py 在姿态评估指标中用torch.rad2deg(cos_theta.acos())计算角度误差kornia/geometry/transform/imgwarp.py 在图像仿射变换中执行torch.deg2rad(angles)。其中angle_to_rotation_matrix还被 tests/feature/test_laf.py 直接用于 LAF 旋转矩阵的构造与torch.jit.script脚本化验证说明其行为正确性直接影响特征模块的输出。对 ONNX 导出的意义变更记录特别强调修复“preserves ONNX export compatibility”结合 tests/augmentation/test_onnx_export.py 的注释可以确认在 Kornia 中随机仿射等增强模块的compute_transformation路径会将deg2rad内联进导出的计算图。因此修复必须以“不引入不可导出的新算子”为前提——当前实现完全由乘法与三角函数等标准算子构成天然满足该约束。这也提醒使用者若自行改写实现例如引入torch.deg2rad之外的自定义分支需额外验证 ONNX 导出路径的数值等价性参见 tests/augmentation/test_onnx_export.py 中的 eager 与 ONNX Runtime 数值对比机制。实际使用建议结合本次修复在实际项目中调用这三个 API 时值得注意以下几点角度单位务必分清rad2deg/deg2rad的输入输出单位在 docstring 中已有明确约定kornia/geometry/conversions.py而angle_to_rotation_matrix接收的是degrees不要混用整数输入现在是安全的修复后可以直接传入torch.tensor([90, 180], dtypetorch.int64)这类整数张量类型提升机制会将其转为 float32 并给出正确结果但若追求更高数值精度建议显式构造dtypetorch.float64输入高精度场景显式使用 float64涉及相机标定、姿态评估、SLAM 等对角度误差敏感的场景建议显式指定dtypetorch.float64以利用修复后保留的双精度注意 MPS 设备不支持 float64测试中已跳过依赖 gradcheck 验证可微性两个转换函数均通过gradcheck测试tests/geometry/test_conversions.py可直接用于可微渲染、姿态优化等梯度场景。结语migration-034.fixed.md所记录的这次修复虽然改动量小本质上是乘法标量选择与类型提升的配合却消除了几何计算链路中一个隐蔽的精度隐患整数输入的错误结果与 float64 精度丢失。通过 kornia/geometry/conversions.py 的源码与 tests/geometry/test_conversions.py 中针对性回归测试我们完整还原了问题根因、修复方案与验证手段。对于所有在特征匹配、姿态估计、图像变换中依赖角度运算的 Kornia 使用者而言这一修复意味着更可靠、更精确的角度数值基础。【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址: https://gitcode.com/gh_mirrors/ko/kornia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
vLLM 推理服务故障排查完全指南:OOM、性能瓶颈与分布式部署的系统性排障手册 vLLM 推理服务故障排查完全指南:OOM、性能瓶颈与分布式部署的系统性排障手册 【免费下载链接】AI-Research-SKILLs Comprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/ge… · 2026/9/23 10:24:46
Hermes NAPI 兼容性测试体系:引入 Node.js 官方测试套件并驱动其在本引擎上的落地验证 Hermes NAPI 兼容性测试体系:引入 Node.js 官方测试套件并驱动其在本引擎上的落地验证 【免费下载链接】hermes A JavaScript engine optimized for running React Native. 项目地址: https://gitcode.com/gh_mirrors/hermes/hermes 本文以仓库 external/node… · 2026/9/23 10:24:39
ins视频下载性能优化实战 一文搞懂并发下载提速 ins视频下载性能优化实战 一文搞懂并发下载提速 面试被问原理答不上来?别慌。 很多人觉得 ins视频下载 就是个简单的 HTTP 请求,拿到链接存下来完事。… · 2026/9/23 10:24:33
一文搞懂黑龙江人力资源和社会保障厅晋升底层逻辑 一文搞懂黑龙江人力资源和社会保障厅晋升底层逻辑 复制来的代码跑不通,报错信息一堆,你盯着屏幕发呆,不知道问题出在变量作用域还是依赖冲突?这种“黑盒”般的调试体验,让人抓狂。其实,职业晋升也是一段复杂的代码,如果你只盯着表面的“功能实现”(干… · 2026/9/23 13:10:50
5个坑点让你性能飙升:一文搞懂广义和狭义 5个坑点让你性能飙升:一文搞懂广义和狭义 刚入职的小王拿着同事给的代码片段,运行报错,改参数没反应,查日志一脸懵。这种“复制粘贴即死机”的绝望,是无数开发者的日常。别急着删库跑路,问题往往出在你没搞懂 广义和狭义 的性能定义。… · 2026/9/23 13:10:50
LPDDR5 JESD209-5B标准深度解析:WCK时钟与训练实战 简介:JESD209-5B 是 JEDEC 于 2021 年 6 月发布的低功耗双倍数据速率第五代(LPDDR5)标准第五版规范,面向移动终端、汽车电子、边缘计算等低功耗场景的硬件工程师、存储控制器开发人员及芯片验证测试人员。文档完整定义了 LPDDR5 的… · 2026/9/23 13:10:43
多模态“大一统”落地实践:用TaoToken统一Key接入Uni-MoE-2.0-Omni全模态能力 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 13:10:37
中文微博情感分析实战:从数据清洗到BERT模型选型与工程链路 简介:这份资源面向计算机、人工智能、通信、自动化等相关专业的本科生与研究生,以及需要完成课程设计、大作业或毕业设计的开发者,提供一套完整的中文微博情感分析实战方案。项目围绕中文微博文本,综合运用朴素贝叶斯、SVM、XGBoo… · 2026/9/23 13:10:31
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29