首页/新闻资讯/正文详情

Kornia 修复详解:1 像素图像下 LAF 归一化与 Patch 提取的零除崩溃问题

发布时间:2026/9/23 21:23:05 来源:云帆数科 栏目:资讯中心
Kornia 修复详解:1 像素图像下 LAF 归一化与 Patch 提取的零除崩溃问题
计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载导读本文围绕 Kornia 官方变更记录 changelog.d/migration-112.fixed.md 中所记载的缺陷修复深入剖析当输入图像在高度或宽度上仅剩 1 个像素singleton axis即 1 像素宽的窄带图像时normalize_laf、denormalize_laf与generate_patch_grid_from_normalized_LAF三个局部仿射特征LAFLocal Affine Frames核心函数所暴露的除零异常与数值坍缩问题以及修复后它们如何做到有限、可往返round-trip并保证两大 Patch 提取器在默认normalize_lafs_before_extractionTrue路径下返回有限 Patch。读完本文你将掌握 Kornia 中 LAF 归一化坐标约定的数学本质、边界图像导致崩溃的根因、修复策略的实现细节以及仓库测试中对这一行为的具体验证方式。一、背景什么是 LAF 归一化为什么会踩到 1 像素边界1.1 LAF 的数学表示在 Kornia 的局部特征体系中每个局部仿射帧LAF是一个形状为(B, N, 2, 3)的张量其中B为批大小、N为每张图的 LAF 数量[a11 a12 x] [a21 a22 y]左上2x2子块为仿射线性变换描述尺度与方向第三列(x, y)为该 LAF 中心在图像像素坐标系下的位置。相关实现全部集中在 kornia/feature/laf.py 中。1.2 归一化与反归一化的坐标约定normalize_laf与denormalize_laf的核心约定见 kornia/feature/laf.py是5 像素宽图像坐标 04的中心是 2而不是 2.5。也就是说归一化基准是size - 1而非size归一化像素尺度 →[0,1]相对尺度MIN_SIZE min(H - 1, W - 1) [a11 a12 x] [a11/MIN_SIZE a12/MIN_SIZE x/(W-1)] [a21 a22 y] → [a21/MIN_SIZE a22/MIN_SIZE y/(H-1)]反归一化相对尺度 → 像素尺度[a11 a12 x] [a11*MIN_SIZE a12*MIN_SIZE x*(W-1)] [a21 a22 y] → [a21*MIN_SIZE a22*MIN_SIZE y*(H-1)]这个中心在(size-1)/2的约定与align_corners语义一致保证了采样网格与像素中心的严格对齐。在常规图像上该变换是可逆的先normalize_laf再denormalize_laf应当精确还原原始 LAF。1.3 崩溃点size - 1 0当图像高度或宽度为 1 时例如形状(1, 1, 1, 5)或(1, 1, 5, 1)的窄带图像H - 1或W - 1等于 0由此产生两个对称的缺陷记录于 changelog.d/migration-112.fixed.mdnormalize_laf抛出ZeroDivisionError归一化时x/(W-1)、y/(H-1)以及线性项a/MIN_SIZE都会遇到除以零denormalize_laf静默将每个 LAF 坍缩为零反归一化时x*(W-1)直接乘零所有坐标与尺度项被清零输出看似正常实则完全失真。更严重的是两个 Patch 提取器extract_patches_simple与extract_patches_from_pyramid在默认参数normalize_lafs_before_extractionTrue下都会先调用normalize_laf因此窄带图像会让默认提取路径直接崩溃只有显式传入normalize_lafs_before_extractionFalse才可能绕过——但绕过后又会进入denormalize_laf的静默坍缩分支见 kornia/feature/laf.py 与 kornia/feature/laf.py 的调用链。二、修复策略单像素轴按1 像素范围处理2.1 核心思想修复后的代码引入了一个统一原则kornia/feature/laf.py 与 kornia/feature/laf.py 的注释明确说明单例轴没有空间范围no spatial extent它按一个像素的宽度参与计算而不是用size - 1 0参与除法。实现上通过max(size - 1, 1)同时保护两个方向wf float(max(w - 1, 1)) hf float(max(h - 1, 1)) min_size min(hf, wf)常规轴size 2max(size - 1, 1) size - 1行为与旧版完全一致单例轴size 1退化为1分母不为零归一化保持有限。2.2 为什么1而不是0是正确的选择单例轴上的合法坐标只有一个像素 0因此归一化坐标0 / 1 0与唯一合法坐标映射到归一化区间端点的语义一致反归一化0 * 1 0不会把 LAF 中心错误地坍缩到 0 值之外的地方往返一致性先归一化再反归一化时两次max保护相互抵消normalize ∘ denormalize identity依然严格成立。这一选择还保证了非单例轴不受牵连例如(H, W) (1, 5)的图像高度轴按 1 像素处理宽度轴仍按5 - 1 4参与计算LAF 在宽度方向上的空间变化被完整保留参见下文测试验证。2.3 采样网格的对应修复generate_patch_grid_from_normalized_LAFkornia/feature/laf.py负责把归一化 LAF 转成grid_sample可用的仿射网格。修复后的实现同样使用max(w - 1, 1)/max(h - 1, 1)作为归一化分母LAF_renorm denormalize_laf(LAF, img) grid F.affine_grid(LAF_renorm.view(B * N, 2, 3), [B * N, ch, PS, PS], align_cornersFalse) grid[..., :, 0] 2.0 * grid[..., :, 0].clone() / float(max(w - 1, 1)) - 1.0 grid[..., :, 1] 2.0 * grid[..., :, 1].clone() / float(max(h - 1, 1)) - 1.0同时金字塔提取路径_extract_patches_from_pyramid_levelwise内部的逐层缩放也遵循同一约定kornia/feature/laf.pymin_l float(min(max(h_l - 1, 1), max(w_l - 1, 1))) k base_grid.new_tensor([2.0 * min_l / float(max(w_l - 1, 1)), 2.0 * min_l / float(max(h_l - 1, 1))])边界填充padding_modeborder会重复单例轴上的那唯一一个像素而另一轴保持其空间变化——这正是注释中所说的单例轴坍缩自己但不连累另一轴。三、修复后的行为保证根据 changelog.d/migration-112.fixed.md修复带来三条明确的行为保证有限finitenormalize_laf不再抛ZeroDivisionErrordenormalize_laf不再把 LAF 坍缩为零所有输出张量均为有限值可往返round-trip在 1 像素轴图像上normalize_laf → denormalize_laf依然精确还原原始 LAF在常规图像上这早已成立见下文测试提取器默认路径可用extract_patches_simple与extract_patches_from_pyramid在默认normalize_lafs_before_extractionTrue下对 1 像素高/宽图像返回全部有限的 Patch形状保持(B, N, CH, PS, PS)。3.1 与PS1金字塔极端的联动修复还覆盖了一个相关极端场景当 Patch 尺寸PS1时金字塔下采样可能一直降到 1 像素层如12 → 6 → 3 → 1。pyrdown无法对 2 像素源做 reflect 填充因此 2 像素层必须保持为最粗可用层。该行为与本次修复共享单例轴按 1 像素处理的约定共同保证整条提取链路不产生 NaN。四、测试验证仓库如何锁定这一行为4.1 归一化/反归一化的往返测试TestNormalizeLAF 中的往返测试验证了宽图与高图两种非方形情形test_roundtrip_non_square_wide宽图(120, 320)坐标x与尺度被分别归一化后denormalize_laf(normalize_laf(laf))与原始 LAF 精确一致test_roundtrip_non_square_tall高图(240, 80)验证相反宽高比下的往返。test_conversion则用(9, 5)图像直接钉死数值LAF[[1,0,1],[0,1,1]]归一化后必须得到[[0.25, 0, 0.125], [0, 0.25, 0.25]]对应1/4尺度、x1/8、y1/4TestDenormalizeLAF 再反推回原值构成闭合的数值证据链。此外这两个函数都通过了gradcheck与torch.jit.script一致性测试说明修复不影响可微性与脚本化。4.2 1 像素轴专项测试本次修复的核心回归测试TestExtractPatchesPyr 中新增了三个针对性测试test_one_pixel_axis_does_not_raisetests/feature/test_laf.py对形状(1, 1, 5, 1)与(1, 1, 1, 5)的窄带图像在normalize_lafs取False/True、提取器取extract_patches_from_pyramid/extract_patches_simple的全部组合下断言不抛异常、输出形状为(1, 1, 1, 4, 4)、且所有元素isfinite()。test_one_pixel_axis_preserves_non_singleton_extenttests/feature/test_laf.py使用torch.arange(5)构造1x5/5x1斜坡图像验证全图 LAF 提取出的 Patch 等于img.expand(1, 1, 5, 5)—— 即非单例轴上的斜坡被完整保留而非在两个方向上都退化为中心像素。该测试同时覆盖像素 LAF 归一化开启与已归一化 LAF 归一化关闭两条入口。test_one_pixel_level_does_not_raisetests/feature/test_laf.py参数化(12,12)/(8,8)/(2,8)/(8,2)四种尺寸以PS1强制金字塔下探到 1 像素层断言输出形状(1, 1, 1, 1, 1)且有限。4.3 周边防线TestExtractPatchesSimple与TestExtractPatchesPyr中的既有测试如test_shape、test_same_odd/even、test_small_image_single_level、test_mixed_dtype_laf_under_autocast保证了修复没有破坏常规尺寸下的行为半精度float16/bfloat16与 autocast 场景下网格 dtype 会被提升到 float32见 kornia/feature/laf.py进一步规避了窄带坐标在低精度下的量化误差。五、实战验证与使用建议5.1 最小复现与验证代码修复后的行为可以直接在 Python 中验证import torch import kornia # 构造 1 像素宽的窄带图像W 1 img torch.rand(1, 1, 5, 1) laf torch.rand(1, 1, 2, 3) # 修复前抛 ZeroDivisionError修复后有限且可往返 laf_n kornia.feature.normalize_laf(laf, img) # 不再除零 laf_back kornia.feature.denormalize_laf(laf_n, img) assert torch.allclose(laf_back, laf) # round-trip 成立 # 两个提取器在默认 normalize_lafs_before_extractionTrue 下均返回有限 Patch for extract in (kornia.feature.extract_patches_simple, kornia.feature.extract_patches_from_pyramid): patches extract(img, laf, PS4) # 默认路径无需改参数 assert patches.shape (1, 1, 1, 4, 4) assert torch.isfinite(patches).all()5.2 使用建议若你的检测/提取流水线可能接收极端长宽比或窄带图像如扫描线、条码、细长 ROI保持默认normalize_lafs_before_extractionTrue即可安全运行无需为规避崩溃而关闭归一化——关闭后反而会损失 LAF 尺度到像素的映射精度涉及金字塔提取且PS较小如PS1时仓库已将2 像素层作为最粗可用层的处理纳入同一约定无需额外防护该修复同时服务于训练态稳定性对含非有限 LAF 的帧提取器会在网格算术之前整帧清零并返回零 Patch见 kornia/feature/laf.py 的masked_fill逻辑与本次边界修复互补保证反向传播路径安全。六、小结本次修复changelog.d/migration-112.fixed.md以单例轴按 1 像素范围处理这一统一约定同时治愈了normalize_laf的ZeroDivisionError、denormalize_laf的静默零坍缩与采样网格的除零风险并让两个 Patch 提取器的默认路径在 1 像素宽/高图像上保持有限输出。其核心改动集中在 kornia/feature/laf.py 的normalize_laf、denormalize_laf、generate_patch_grid_from_normalized_LAF与金字塔级采样器四处而 tests/feature/test_laf.py 中新增的专项回归测试则为该行为提供了跨设备、跨 dtype、跨提取器的完整保障。对开发者而言这意味着 Kornia 的局部特征提取在边界图像上从崩溃或静默失真走向了有限、精确、可往返。赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐Kornia 像素归一化矩阵整数 dtype 修复normal_transform_pixel 与 normal_transform_pixel3d 的 ValueError 防护机制解析Kornia 像素归一化矩阵整数 dtype 修复 normal_transform_pixel 与 normal_transform_pixel3d 的 V计算机视觉人工智能深度学习图像处理Kornia 图像归一化修复normalize 与 normalize_min_max 全面支持非连续张量Kornia 图像归一化修复normalize 与 normalize_min_max 全面支持非连续张量 导读 在图像预处理流水线中 transpose计算机视觉深度学习人工智能图像处理Kornia LAF 边界校验修复解析laf_is_inside_image 像素范围约定与 ScaleSpaceDetector 检测行为修正Kornia LAF 边界校验修复解析 laf_is_inside_image 像素范围约定与 ScaleSpaceDetector 检测行为修正 导读 本文计算机视觉人工智能深度学习图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

注胶南红用紫光灯能照出来吗?直播间看到的颜色和实物会有色差吗?
注胶南红用紫光灯能照出来吗?直播间看到的颜色和实物会有色差吗?

南红品牌怎么选不踩坑?选南红品牌,核心是看是否坚守"不注胶、不染色、不烤色"的三不标准。专做南红16年的天喜红运珠宝,拥有5000平米展厅,从原矿到销售一条龙,没有中间商,支持复检(任… · 2026/9/23 21:22:46

ZY-Player开源播放器:跨平台本地与网络视频聚合管理实践
ZY-Player开源播放器:跨平台本地与网络视频聚合管理实践

1. 一个周末刷剧需求引发的开源播放器探索先说结论:如果你手头有一台 Windows 或者 Mac,平时喜欢把各种本地视频、网络视频源集中在一个干净的界面里管理,又不想被各种弹窗广告和会员墙恶心到,那 ZY-Player 这个开源项目值得你花一… · 2026/9/23 21:22:33

系统接口设计对接方案:从契约设计到联调排错的完整实践
系统接口设计对接方案:从契约设计到联调排错的完整实践

简介:系统接口设计对接方案是一份面向系统架构师、后端开发与集成工程师的接口设计文档,重点解决跨系统对接时面临的安全、标准、数据格式与运维责任划分等问题。文档以SOA体系架构为基础,系统讲解了服务目录标准(UDDI v2&#xf… · 2026/9/23 21:21:55

windows11_24h2无法安装net3.5办法
windows11_24h2无法安装net3.5办法

1.先下载ISO映像(相同版本的)2.sources目录下的sxs这个文件夹复制到C盘3.以管理员打开命令提示符4.输入dism.exe /online /enable-feature /featurename:netfx3 /Source:C:\sxs5.等待进度100%6.按照下图选中这两个点击确认即可(其他无需在意&… · 2026/9/23 21:51:28

DeepSeek本地化部署与LoRA微调:三甲医院病历分析诊断模型实战
DeepSeek本地化部署与LoRA微调:三甲医院病历分析诊断模型实战

简介:这是一份面向医疗信息化从业者、数据工程师与临床科研人员的DeepSeek本地化部署实战指南,聚焦三甲医院病历分析与诊断模型构建场景。文档从医疗数据训练概述与DeepSeek模型原理入手,系统讲解环境准备、模型下载与配置、本地化部署、病历… · 2026/9/23 21:51:28

DeepSeek工业误差实时修正:0.02mm级装配闭环控制方案
DeepSeek工业误差实时修正:0.02mm级装配闭环控制方案

简介:本资源是一份面向工业自动化工程师、智能制造研发人员及AI视觉应用从业者的深度技术方案,聚焦精密装配场景中累积误差的实时修正难题,创新性提出基于DeepSeek大模型的视觉伺服定位校正框架。文档共332页,含50个系统化章节&am… · 2026/9/23 21:51:28

用 Python 把 PDF 表格批量导入 SQLite
用 Python 把 PDF 表格批量导入 SQLite

处理 PDF 表格数据的场景很常见:季度报表、对账单、业务台账,业务方给一份 PDF 过来,需要结构化后进数据库做后续分析。本文分享一个完整的 Python 实现,覆盖从表格提取、字段清洗、动态建表到批量入库的全流程。代码依赖免费库 F… · 2026/9/23 21:50:57

PHP调用FFmpeg实现视频切片
PHP调用FFmpeg实现视频切片

注:使用的视频为mp4,转换成.m3u8播放列表和.ts切片文件1、安装FFmpeg我这边是通过Nux Dextop仓库来安装FFmpeg。(1) 安装EPEL仓库1sudo yum install -y epel-release(2)下载并安装Nux Dextop仓库的RPM包1su… · 2026/9/23 21:50:50

运动健身社交媒体数据分析:从数据采集到业务洞察的完整指南
运动健身社交媒体数据分析:从数据采集到业务洞察的完整指南

今年年初,一个做运动消费品牌的朋友问我:社交媒体数据分析到底能不能帮我们定下下一季的产品方向?他手里有几十万条运动健身相关的打卡帖、评论和话题数据,却不知道怎么转化成决策。这个问题我太熟了。过去几年,我帮健… · 2026/9/23 21:50:25

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码