首页 / 资讯中心 / 文章详情

Kornia 空 dsize 路径异常类型对齐:warp 系列函数对整型 `src` 统一抛出 `NotImplementedError`

Kornia 空 dsize 路径异常类型对齐:warp 系列函数对整型 `src` 统一抛出 `NotImplementedError` ★ FEATURED ARTICLE
计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载本文聚焦 kornia 几何变换模块中的一次异常一致性修复当warp_affine、warp_perspective、remap、warp_affine3d、warp_perspective3d的输出尺寸dsize含有 0 维度即空目标路径时若传入整型非浮点src现在统一抛出NotImplementedError而非RuntimeError。读完本文你将理解该空目标退化路径的内部实现_empty_warp_output_2d/_empty_warp_output_3d、异常类型不一致的历史成因、与grid_sample行为的对齐方式以及这次变更对现有except捕获逻辑的兼容性影响与迁移建议。变更背景同一非法输入两种异常kornia 的 warp 系列函数在dsize含 0 维时会走空目标退化路径直接返回一个形状为 0 的空张量而不是调用grid_sample做正常采样。问题在于非空路径dsize所有维度 0整型src最终会进入 PyTorch 的grid_sample由它抛出NotImplementedError在较新的 torch 版本上或RuntimeError旧版本来拒绝整型输入空目标路径退化分支此前有自己的显式守卫用RuntimeError先行拦截整型src。结果是对完全相同的非法输入整型src调用者看到的异常类型取决于dsize中是否存在 0 维度。这正是本次变更changelog 条目migration-117.fixed.md关联 issue #4031要消除的不一致。修复后空目标路径与非空路径保持相同的异常类型异常消息文本不变仍为Expected a floating point src, got {dtype}.。涉及的五个函数及其空目标判定修复覆盖 2D 与 3D 两套 warp 接口全部集中在 kornia/geometry/transform/imgwarp.py函数输入形状变换矩阵空目标判定warp_perspectiveL205(B, C, H, W)(B, 3, 3)透视矩阵h_out 0 or w_out 0L288warp_affineL328(B, C, H, W)(B, 2, 3)仿射矩阵dsize[0] 0 or dsize[1] 0L406remapL803(B, C, H, W)map_x/map_y坐标映射map_xy.shape[-3] 0 or map_xy.shape[-2] 0L874warp_affine3dL1235(B, C, D, H, W)(B, 3, 4)3D 仿射矩阵dsize任一维为 0L1283warp_perspective3dL1612(B, C, D, H, W)(B, 4, 4)3D 透视矩阵dsize任一维为 0L1676一个统一约定负的输出维度始终抛出ValueErrorOutput size must be non-negative只有等于 0才走空目标路径。例如 warp_perspective 源码 中先判负再判 0测试 test_imgwarp.py 也验证了(-1, 4)会匹配must be non-negative的ValueError。源码实现空目标路径如何保持校验又保持梯度理解这次异常对齐需要先看空目标路径的实现。2D 版本集中在_empty_warp_output_2dimgwarp.py其设计目标是返回空张量的同时保留与非空路径一致的校验规则和 autograd 连接。整型src的显式拒绝本次变更点在该辅助函数中设备一致性、dtype 规则、batch 广播规则逐项校验后最关键的一步是# An integral src fails inside grid_sample itself on the non-empty path, so it must # fail here too — but name src rather than blaming the other operand for it below. if not src.is_floating_point(): raise NotImplementedError(fExpected a floating point src, got {src.dtype}.)对应源码位置imgwarp.py L123-L129。这段注释准确概括了本次修复的动机非空路径上整型src是在grid_sample内部被拒绝的空目标路径必须在入口处同样拒绝、同样命名而不是抛出指向transform的 dtype 报错。_empty_warp_output_3dimgwarp.py L178-L202在 L191-L192 采用完全一致的写法。1×1 stand-in 采样避免零元素操作数实现还有一个细节值得说明grid_sample本身不允许零元素操作数MPS 在 torch 2.14 之前会直接断言Placeholder tensor is empty!。因此空路径并不直接对空张量调用grid_sample而是从src和transform各取一个零值元素reshape(-1)[:1].sum() * 0.0构造 1×1 的 stand-in 源与网格对 stand-in 执行真正的grid_sample从而让mode、padding_mode、dtype 规则等校验仍由grid_sample本身完成这解释了为什么modeinvalid或padding_modeinvalid在空路径上依然会抛ValueError参见测试 test_imgwarp.py L242-L271把采样结果 expand 回空的(B, C, 0, W)或 3D 的(B, C, 0, H, W)形状。由于 stand-in 张量通过sum()与src/transform保持计算图连接expand 后的空结果同样requires_grad梯度可以零值回流——测试 test_imgwarp.py L128-L134 与 3D 版本 test_imgwarp3d.py L28-L31 专门验证了这一 autograd 连接。各函数如何接入空路径warp_perspective_empty_warp_output_2d(src, M, dsize, ...)batch 广播规则为none要求 batch 完全相等见 imgwarp.py L289-L291warp_affine同样走_empty_warp_output_2d但传入transform_batch_broadcastsrc_when_larger单例 batch 仅在src_batch 1时广播imgwarp.py L406-L417remap没有transform参数以堆叠后的map_xy作为操作数operandmap并禁用fillpaddingallow_fillFalse广播规则为src无条件扩展imgwarp.py L874-L886warp_affine3d/warp_perspective3d均走_empty_warp_output_3dimgwarp.py L1283-L1284、imgwarp.py L1676-L1677。此外空路径的网格 dtype 通过_matrix_warp_grid_dtypeimgwarp.py L69-L80与_remap_grid_dtypeimgwarp.py L83-L94精确复刻非空管线会产生的 dtype确保空路径的 dtype 校验既不更严、也不更松源码注释原话neither stricter nor laxer than a non-empty one。兼容性分析为什么except RuntimeError仍然有效本次变更不会破坏绝大多数既有捕获逻辑关键在于 Python 的异常继承关系RuntimeError └── NotImplementedError # 标准库中 NotImplementedError 是 RuntimeError 的直接子类因此围绕这些函数写了except RuntimeError或更宽泛的except Exception的代码继续能捕获新的NotImplementedError行为无任何变化只有精确匹配异常类型的代码例如except RuntimeError之后又用type(err) is RuntimeError做判断或对RuntimeError与NotImplementedError分别分支才会观察到差异异常消息文本完全不变基于消息内容的match断言如floating point src不受影响。特殊情况MPS 与旧版 torch有两点边界需要留意仓库注释与测试均有说明MPS 后端例外MPS 的grid_sample会接受整型图像并采样回int64而不是拒绝它。kornia 选择遵循 cpu/cuda 的契约在入口处统一拒绝因为匹配 MPS 行为意味着对整型输出做双线性采样语义上不可接受。因此测试 test_imgwarp.py L206-L214 将 MPS 显式跳过torch 版本差异grid_sample在较新 torch 上抛NotImplementedError、旧版本抛RuntimeError。测试采用奇偶对齐策略——先捕获非空路径抛出的异常类型再要求空路径抛出同一except子句能捕获的类型test_imgwarp.py L220-L227而不是钉死某一个类从而在 torch 版本间保持稳健。迁移指南你的代码需要改动吗绝大多数情况下无需任何改动。按以下清单快速自查只用except RuntimeError兜底→ 无需改动新异常仍被捕获按异常消息字符串匹配如matchfloating point src → 无需改动消息未变精确判断type(err) is RuntimeError或分别捕获两类→ 检查空dsize 整型src的调用组合是否在你的异常处理分支中必要时增加对NotImplementedError的处理此前依赖空路径抛 RuntimeError、非空路径抛 NotImplementedError的区别来做分支→ 这是本次修复要消除的行为相关分支逻辑需要重写。总结本次变更changelog 条目 changelog.d/migration-117.fixed.md将五个 warp 函数在空dsize路径上的整型src异常从RuntimeError对齐为NotImplementedError消除同一非法输入、异常类型取决于输出尺寸的不一致使空路径与非空路径完全等价。从源码看这一对齐发生在_empty_warp_output_2d/_empty_warp_output_3d的统一入口校验中同时保留了设备、dtype、batch 广播、grid_sample参数校验和 autograd 连接等完整契约从测试看异常类型奇偶性、消息内容、梯度连接、负尺寸ValueError均有专门用例锁定test_imgwarp.py、test_imgwarp3d.py。由于NotImplementedError继承自RuntimeError这次修复对现有代码是低风险的只有精确匹配异常类型的代码才需要关注。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia warp 系列函数空 dsize 路径异常统一积分输入从 RuntimeError 收敛为 NotImplementedErrormigration-117Kornia warp 系列函数空 dsize 路径异常统一积分输入从 RuntimeError 收敛为 NotImplementedErrormigrat计算机视觉深度学习人工智能图像处理StarRocks VARIANT 类型 get_variant 系列函数实战指南按路径提取类型化数据StarRocks VARIANT 类型 get_variant 系列函数实战指南按路径提取类型化数据 本文全面讲解 StarRocks 中面向 VARIAN数据库OLAP数据仓库大数据湖仓一体数据分析Civitai 图片信息流双路径返回类型对齐getAllImagesIndex 与 getImagesFromFeedSearch 的类型兼容性改造Civitai 图片信息流双路径返回类型对齐getAllImagesIndex 与 getImagesFromFeedSearch 的类型兼容性改造 本文是后端前端AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站