十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kornia 像素坐标归一化修复解读:单例轴中心映射、非正尺寸校验与低精度精度提升(4006)

Kornia 像素坐标归一化修复解读:单例轴中心映射、非正尺寸校验与低精度精度提升(4006) 计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载本篇技术指南聚焦于 kornia 仓库中changelog.d/migration-123.fixed.md记录的修复变更像素坐标归一化体系normalize_pixel_coordinates/denormalize_pixel_coordinates及其 3D 变体、normal_transform_pixel/normal_transform_pixel3d在尺寸为 1 的单例轴上由 NaN 修正为有限值、对非正尺寸显式抛错、保留空 warp 目标并弃用冗余的eps参数。读完本文你将掌握这套坐标系约定的精确语义、低精度float16/bfloat16下的精度改善原理以及该修复如何传导至create_meshgrid、warp_perspective、spatial_soft_argmax2d等下游算子。一、修复背景像素坐标归一化在 kornia 中的定位在 kornia 的几何管线中几乎所有涉及网格采样、透视变换、软 argmax 的操作都需要在像素坐标与归一化坐标之间切换。所谓归一化就是把一幅宽为width、高为height的图像坐标映射到[-1, 1]区间以与torch.nn.functional.grid_sample的约定保持一致。以normalize_pixel_coordinates为例其默认align_cornersTrue映射为x_norm 2 * x / (width - 1) - 1 y_norm 2 * y / (height - 1) - 1即首列/末列像素分别落在-1与1corner-aligned 约定。denormalize_pixel_coordinates是其逆运算x (width - 1) * (x_norm 1) / 2。该变更涉及的六个核心函数均位于 kornia/geometry/conversions.py函数定义位置作用normalize_pixel_coordinatesL14752D 像素坐标 → 归一化坐标denormalize_pixel_coordinatesL15742D 归一化坐标 → 像素坐标normalize_pixel_coordinates3dL16533D 体素坐标 → 归一化坐标(d, x, y)顺序denormalize_pixel_coordinates3dL17403D 归一化坐标 → 体素坐标normal_transform_pixelL2049生成(1, 3, 3)的像素↔归一化齐次变换矩阵normal_transform_pixel3dL2274生成(1, 4, 4)的 3D 齐次变换矩阵二、核心修复一单例轴size-1 维度映射到归一化中心旧行为当某个轴尺寸为 1 时公式分母size - 1 0坐标归一化出现除零。旧代码要么直接产生nan要么用eps替换分母得到一个失真结果。新行为单例轴使用尺度1、偏移0——该轴唯一合法的像素坐标被映射到归一化区间的中心0同时单位尺度的扩展保证函数在唯一有效坐标之外仍然精确可逆。以normalize_pixel_coordinates的 eager 分支为例conversions.py L1539-L1542sx 1.0 if width 1 else 2.0 / (width - 1.0) sy 1.0 if height 1 else 2.0 / (height - 1.0) tx 0.0 if width 1 else -1.0 ty 0.0 if height 1 else -1.0在align_cornersFalse的半像素映射下尺度2/size、偏移1/size - 1size1 时公式自动落在中心尺度 2、偏移 0因此无需特判——这一点在normal_transform_pixel中也有明确注释conversions.py L2226-L2236。单例轴修复波及的算子正如变更记录所指出的这个修复不局限于那几个辅助函数——每一个用含 size-1 维度坐标框做归一化的操作都会受益。变更记录给出的可复现结果包括算子旧结果单例轴新结果create_meshgrid(1, 4, normalized_coordinatesTrue)单例分量nan0warp_perspective/crop_by_transform_mat/homography_warp/warp_image_tps目标高 1 像素全nan有限行与 2 像素控制结果一致spatial_soft_argmax2d/spatial_expectation2d输入高 1 像素nan0conv_soft_argmax2d/conv_soft_argmax3d及ConvSoftArgmax*模块核或输入轴为 1偏移一个归一化单位如(3, 1)核返回[-1.6667, -1.0, ...][-1.0, -0.3333, ...]其中create_meshgrid的新约定已写入其文档字符串kornia/geometry/grid.py L36-L41单例轴用0归一化区间中心表示同时与像素坐标归一化不同零空间尺寸产生的是对应形状的空网格zero spatial size 会产生空网格而零尺寸的像素坐标系本身是未定义的。三、核心修复二拒绝非正尺寸Non-positive Sizes在此之前height 0或width 0会静默进入除法产生错误结果。现在六个函数统一在入口处校验if not torch.jit.is_tracing() and (height 0 or width 0): raise ValueError(fInput image size must be positive. Got height{height}, width{width}.)校验范围2D 函数检查height/width3D 函数同时检查depth/height/widthconversions.py L1685、L1769、L2184、L2342。TorchScript 例外torch.jit.trace遗留图无法保留 Python 层ValueError因此假定运行时尺寸为正eager、TorchScript、torch.compile调用均会校验文档字符串 conversions.py L1506-L1509。测试佐证tests/geometry/test_conversions.py 中test_non_positive_sizes_raise对四个坐标辅助函数逐一以0和-3参数化验证抛错。注意拒绝非正尺寸与保留空 warp 目标是两个不同的约定前者针对像素坐标系size 必须为正才有定义后者针对网格/warp 输出size 为 0 时输出空张量见create_meshgrid的约定。四、核心修复三保留空 warp 目标Preserve Empty Warp Destinations变更同时保证当 warp 目标为空例如输出维度为 0时相关变换不再崩溃或产生非法数值而是保留空的输出。这与单例轴修复尺寸为 1 的非空退化互为补充覆盖了网格采样管线的另一条退化路径。五、核心修复四弃用冗余的eps参数#4006六个函数签名中仍保留eps参数但已不再参与计算normalize_pixel_coordinates/denormalize_pixel_coordinates/ 3D 变体默认eps1e-8normal_transform_pixel/normal_transform_pixel3d默认eps1e-14当调用方传入非默认eps时eager 模式会发出FutureWarningwarnings.warn(eps is deprecated and ignored by normalize_pixel_coordinates., FutureWarning, stacklevel2)在单例轴上旧代码用eps替换零分母如今已被显式定义的单例轴映射取代因此eps彻底失去作用并将在未来的 breaking release 中移除。需要强调的是eps的弃用仅限这六个归一化辅助函数cart2pol、convert_points_from_homogeneous、normalize_quaternion等其他 API 仍在使用各自的eps参数测试test_wart_default_eps_1e_8_backs_the_remaining_quoted_warning_numbers对此做了守卫。对应的测试test_non_default_eps_warns_and_is_ignoredtests/geometry/test_conversions.py L3583-L3591验证传入eps1.0时触发FutureWarning且输出与默认参数完全一致atol0.0, rtol0.0。六、核心修复五从尺寸直接推导缩放提升低精度精度这是本变更最精细的一处六个函数过去先把尺寸size转成坐标张量的 dtype再计算2 / (size - 1)之类的尺度在float16/bfloat16下许多实际尺寸根本无法被精确表示导致尺度在舍入前就已被污染。新实现尺寸算术至少保持在float32中进行算完后再把最终因子 cast 回输出 dtype。以图捕获graph-capture分支为例conversions.py L1552-L1569out_dtype pixel_coordinates.dtype if pixel_coordinates.is_floating_point() else torch.get_default_dtype() # Low-precision floating types cannot represent every practical image size exactly # (e.g. bfloat16 rounds 257 to 256). Keep the symbolic size arithmetic in at least # float32, then cast the finished factors back to the coordinate dtype. work_dtype torch.float32 if out_dtype in (torch.float16, torch.bfloat16) else out_dtype width_t torch.scalar_tensor(width, devicepixel_coordinates.device, dtypework_dtype) ... factor torch.stack([...]).to(out_dtype)这一提升对normal_transform_pixel{,3d}同样重要其输出 dtype 需先解析dtypeNone时继承torch.get_default_dtype()而默认 dtype 本身可能已是半精度类型再决定是否提升到float32做尺寸运算conversions.py L2245-L2246。测试test_half_default_dtype_does_not_round_the_size_under_tracingtests/geometry/test_conversions.py L4094-L4126专门覆盖了dtypeNone 半精度默认 dtype这条路径选用float16尺寸 2049、bfloat16尺寸 257 作为舍入边界用例float16只能把 2049 表示成 2048bfloat16只能把 257 表示成 256。精度提升的量化结论float32/float64非退化尺寸下结果向精确值靠拢最多偏差1 ulpfloat16/bfloat16改善幅度实质性更大materially more因为旧代码根本无法表示该尺寸。变更记录给出的实例denormalize_pixel_coordinates在bfloat16、尺寸 3000 时旧结果 1504新结果 1496后者更接近精确值 1499.5。测试文件中的注释补充了另一个边界细节float16下尺寸 3001 时两条路径计算的2/3000与2/2999舍入到同一个float16值因此仅不可表示还不够必须选在舍入差异能存活到尺度里的尺寸2049/257做断言。normal_transform_pixel的额外细节该函数文档字符串conversions.py L2057-L2182还记录了与坐标辅助函数按元素乘加在低精度下的细微分歧由于矩阵应用是 matmul以更高精度累积、只舍入一次两条路径在float32/float64下一致但在float16/bfloat16下是否一致取决于构建的 matmul 内核。文档给出的契约性结论是两条路径始终保持在2 * finfo(dtype).eps之内TF32 等把 matmul 输入舍入到更粗格式的后端则按该更粗格式取2 * 2**-10。一个实用建议低精度管线不要混用两条路径并期待完全一致。此外normal_transform_pixel会拒绝整数 dtypeconversions.py L2202-L22132 / (size - 1)对大于 3 像素的维度都是分数整数 dtype 会把它截断为 0返回把每个像素映射到恒定(-1, -1)的秩亏矩阵。该拒绝是无条件的不使用KORNIA_CHECK因此disable_checks()、python -O、KORNIA_CHECKS0都无法关闭属于 issue #3959 覆盖的条款。七、测试矩阵行为如何被钉死tests/geometry/test_conversions.py 为本变更提供了系统的行为钉死pin测试验证点test_singleton_axes_map_to_center_and_keep_unit_extension2D/3D 单例轴映射到中心且保持单位扩展atolrtol0test_singleton_axes_are_exact_inverses单例轴下归一化↔反归一化严格互逆test_non_positive_sizes_raise0与-3尺寸抛ValueErrortest_non_default_eps_warns_and_is_ignored非默认eps触发FutureWarning且被忽略test_pixel_coordinate_singleton_policy_scripts单例轴策略在torch.jit.script下与 eager 一致test_pixel_coordinate_export_crosses_singleton_boundary/test_normal_transform_export_crosses_singleton_boundary动态 shape 导出跨越单例轴边界size 1↔5、bfloat16 257、float16 2049仍一致test_non_default_eps_does_not_break_fullgraph_compiletorch.compile(fullgraphTrue)下非默认eps不破坏图编译test_normalize_and_denormalize_trace_cross_singleton_boundarytrace 图跨越单例轴边界trace 尺寸 2/运行时 1 及反向输出逐位一致test_singleton_axis_maps_to_centerTestNormalTransformPixel系列齐次矩阵形式的单例轴中心映射test_singleton_dsize_produces_finite_homographies单例目标尺寸产生有限 homography这些测试还覆盖了不同 torch 版本/后端cpu、mps、x86_64/arm64下 matmul 内核差异导致的bfloat16分歧见 tests/geometry/test_conversions.py L3913-L3957 中 2.5.1 与 2.9.1 的实测差异记录说明该变更对跨版本稳定性的关注。八、迁移说明与 changelog 工作流本文依据的changelog.d/migration-123.fixed.md属于仓库的 changelog 片段changelog fragment机制changelog.d/README.md 说明每个带用户可见变更的 PR 在changelog.d/下添加一个PR.type.md文件由 Towncrier 在发布时合并进 CHANGELOG.md。migration-*是迁移期的遗留命名保留原有条目前缀orphan prefix避免重复生成 PR 链接。对使用者而言本次变更的迁移要点可总结为单例轴含 size-1 维度的坐标框不再产生nan而是映射到归一化中心0依赖旧nan行为例如用作哨兵值的代码需要调整。非正尺寸传入0或负尺寸现在直接抛ValueError应在调用前做尺寸校验或捕获异常。eps参数已弃用并被忽略请停止传非默认eps并留意未来 breaking release 中该参数的移除。低精度精度float16/bfloat16下的归一化/反归一化结果会向精确值移动如bfloat16尺寸 3000 时denormalize_pixel_coordinates由 1504 变为 1496与精确数学的差距由无法表示尺寸级别的误差收敛到 1 ulp 级别。下游算子create_meshgrid、warp_perspective、crop_by_transform_mat、homography_warp、warp_image_tps、spatial_soft_argmax2d、spatial_expectation2d、conv_soft_argmax2d/3d及ConvSoftArgmax*模块在单例轴上的输出由 NaN/错位变为有限且居中的值任何依赖这些算子输出为 NaN 的容错逻辑都应当重新审视。九、结语migration-123表面上是一次修 NaN的缺陷修复实质上重新定义了 kornia 像素坐标归一化在退化尺寸下的完整语义单例轴落在归一化中心、非正尺寸显式报错、空 warp 目标被保留、eps让位于显式数学定义同时在低精度 dtype 下通过以float32做尺寸算术再回写消除了系统性精度损失。理解这五条约定对于正确使用 kornia 的网格采样、透视 warp 与软 argmax 管线以及在float16/bfloat16部署场景下预估数值行为都具有直接价值。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia 半精度修复深度解读RectangleEraseGenerator 的安全位置采样与非负擦除坐标保障Kornia 半精度修复深度解读RectangleEraseGenerator 的安全位置采样与非负擦除坐标保障 本文围绕 changelog.d/4587.计算机视觉深度学习人工智能图像处理Kornia depth_to_normals 输入校验修复单轴深度图不再静默产出非法法线4458Kornia depth_to_normals 输入校验修复单轴深度图不再静默产出非法法线 4458 本篇技术指南聚焦 Kornia 迁移日志条目 cha计算机视觉人工智能深度学习图像处理Kornia distance_transform 数值修复深度解析从静默下溢错误到显式校验与半精度提升Kornia distance_transform 数值修复深度解析从静默下溢错误到显式校验与半精度提升 导读 本文围绕 changelog 片段 chang计算机视觉深度学习人工智能图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表