
计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载本文基于 benchmarks/feature/graf_benchmark.md 记录的一次正式 A/B 基准评测系统讲解 Kornia0.9.0rc1三条本地特征提取管线——SIFT、SIFT–AffNet–HardNet、KeyNet–HardNet——在优化提交e8e4ec0f等相对基线提交601b5a4a等下的端到端性能差异包括 RTX 4090 / Intel i7-14700K / Apple M1 三种硬件的速度与质量数据、torch.compile 选择性编译的收益边界以及方向直方图累积scatter_add_、亚像素精化批处理、channels-last 激活等优化的源码级实现。读完本文你将掌握如何解读这类加速但保质量的基准报告、如何用仓库内的基准脚本在 CPU/CUDA/MPS 上复现以及哪些优化路径在哪种硬件上真正生效。基准概览工作量、被比较提交与评测口径该基准使用Oxford graf序列6 张 640×800 原始分辨率图像及其 5 个H1toKp单应矩阵真值输入为灰度 float32、batch 1、请求4096个特征。第一、二小节GPU/CPU采用 eager 模式不开启 autocast 也不做 torch.compile两版实现的金字塔层数、尺度、迭代预算、描述子、权重、匹配阈值与 RANSAC 设置完全一致因此速度差异只来自实现层面而非配置漂移。小节基线提交优化提交GPU / CPU eager601b5a4ae8e4ec0f选择性编译CUDA601b5a4afb66de1d同一优化库实现 编译模式MPS1eea5835f61ea9e4计时口径由基准脚本 benchmarks/feature/local_features.py 定义包含两张图像的特征提取与 SNN 匹配排除图像 I/O 与 RANSAC每格取五对图像1–2 … 1–6各自 median 的均值原始中位数与 IQR 保留在 JSON 中。质量指标为平均 L1 角点重投影误差像素即用 RANSAC 估计的单应与真值单应分别把图像四个角点投影后的平均距离实现见 benchmarks/feature/scale_space_detector.py。GPU 端到端速度与质量RTX 4090环境RTX 4090、PyTorch 2.14.0cu130、Python 3.11.14、Kornia 0.9.0rc1、WSL2 Linux。单位 ms/pair管线基线 ms/pair优化 ms/pair加速比平均角点误差 基线 → 优化SIFT215.9114.51.89×223.640 → 223.640SIFT–AffNet–HardNet269.4174.11.55×2.183 → 2.183KeyNet–HardNet131.5126.91.04×5.638 → 5.638几个需要谨慎解读的结论KeyNet–HardNet 的约 4% 提升小于观测到的计时波动不足以构成端到端 GPU 加速的证据SIFT 与 SIFT–AffNet–HardNet 的提升则远大于波动。两版 GPU 运行在每一对图像、每一条管线上的匹配数、RANSAC 内点数与角点误差完全相同——加速没有以牺牲匹配质量为代价。逐对 GPU 角点误差px图像对SIFT 误差SIFT–AffNet–HardNet 误差KeyNet–HardNet 误差1–21.3811.3252.0291–31.5061.2161.4281–42.7770.8602.5311–5507.1322.6243.7001–6605.4054.89118.500表中揭示一个重要事实纯 SIFT 在两个最大视角变化1–5、1–6上本已严重失败数百像素误差优化前后失败模式完全一致——大均值误差不是只平均成功对造成的假象优化也没有掩盖失败。GPU 峰值额外显存MiB指一次提取匹配调用中超出已驻留图像/模型/输出的最大新增张量分配不含 RANSAC 与分配器预留管线基线峰值额外 CUDA MiB优化峰值额外 CUDA MiBSIFT576.0665.8SIFT–AffNet–HardNet1058.31058.6KeyNet–HardNet1057.71057.7SIFT 的提速大约以90 MiB 额外峰值显存为代价换来更少的精化refinement启动次数。从源码看计时实现脚本在 benchmarks/feature/local_features.py 中对 CUDA 使用torch.cuda.reset_peak_memory_stats记录峰值分配并通过 benchmarks/common.py 的time_us内部封装torch.utils.benchmark.Timer.blocked_autorange得到带预热、多次重复的 median/IQR 墙钟时间。CPU 速度与质量Intel Core i7-14700K环境为单 CPU 线程。代表性 1–2 对被反复计时其余四对仍全部评估质量JSON 中这些对的 timing 字段为null表示有意不计时。每格为 median ± IQR单位为秒/pair管线基线 s/pair优化 s/pair加速比SIFT3.861 ± 0.0222.856 ± 0.0511.35×SIFT–AffNet–HardNet16.343 ± 0.14512.714 ± 0.0801.29×KeyNet–HardNet16.368 ± 0.03112.887 ± 0.1131.27×CPU 上的匹配数、内点数与重投影误差同样在每对图像上完全一致。注意CPU 与 GPU 的结果不可直接互比两者的自适应精化后端与数值内核不同正确的做法是各自与同设备的基线对比。逐对 CPU 角点误差px图像对SIFT 误差SIFT–AffNet–HardNet 误差KeyNet–HardNet 误差1–21.2471.3431.2631–31.4351.2271.6791–42.6111.5481.8331–5507.0371.7923.6581–6605.42711.6588.828Apple SiliconMPS速度与质量环境Apple M18 GB、macOS 26.5.1、PyTorch 2.14.0、Python 3.11.14、Kornia 0.9.0rc1与 CPU/CUDA 运行使用相同输入input_sha256一致。每对图像都计时每格同样为五对 median 的均值管线基线 ms/pair优化 ms/pair加速比平均角点误差 基线 → 优化SIFT1787.81068.81.67×223.546 → 223.546SIFT–AffNet–HardNet3066.72342.21.31×3.741 → 3.741KeyNet–HardNet2109.52118.61.00×3.452 → 3.452MPS 评测有两个关键工程细节见 benchmarks/feature/local_features.pyharness 在计时区域内显式调用torch.mps.synchronize而 RANSAC 由于其批量化 SVD 在 MPS 上会使进程崩溃issue #4201/#4204被放到 CPU 上评估且 RANSAC 位于计时区域之外因此计时不受影响。MPS 上peak_extra_cuda_bytes为null。逐对 MPS 计时median ± IQRms图像对SIFT ms 基线 → 优化SIFT–AffNet–HardNet ms 基线 → 优化KeyNet–HardNet ms 基线 → 优化1–21770 ± 23 → 1059 ± 103115 ± 43 → 2353 ± 312118 ± 33 → 2120 ± 171–31789 ± 10 → 1062 ± 183069 ± 20 → 2344 ± 232107 ± 6 → 2122 ± 241–41778 ± 6 → 1068 ± 63067 ± 4 → 2338 ± 42107 ± 6 → 2121 ± 101–51791 ± 12 → 1078 ± 23046 ± 4 → 2343 ± 22107 ± 17 → 2110 ± 91–61812 ± 48 → 1076 ± 103037 ± 16 → 2334 ± 102108 ± 18 → 2120 ± 9逐对 MPS 角点误差px图像对SIFT 误差SIFT–AffNet–HardNet 误差KeyNet–HardNet 误差1–21.2471.9271.2631–31.4351.3651.6791–42.5861.9611.8331–5507.0371.7923.6571–6605.42711.6588.828MPS 上所有对的匹配数、内点数与角点误差在两次运行间也完全一致。KeyNet–HardNet 在 MPS 上完全不变噪声范围内因为 channels-last 转换只在 CPU/CUDA 生效且 KeyNet 使用 OriNet 而非梯度直方图定向MPS 上这条管线没有走到任何优化路径——这正是源码里 kornia/feature/keynet.py 的x.device.type in (cpu, cuda)条件门控的直接结果。选择性编译CUDAtorch.compile 只编译关键热区第三组实验对比基线601b5a4a与fb66de1d同一优化库实现 编译基准模式。注意这不是全管线编译——现有工厂只编译尺度空间金字塔、响应与亚像素模块或 KeyNet 的响应/NMS使用dynamicTrue与默认 Inductor 设置描述子、定向、仿射适应、匹配与 RANSAC 保持 eager。管线基线编译 ms/pair优化编译 ms/pair加速比平均角点误差 基线 → 优化SIFT94.6471.231.33×223.654 → 223.654SIFT–AffNet–HardNet158.27132.871.19×2.381 → 2.381KeyNet–HardNet106.01105.081.01×5.638 → 5.638解读要点KeyNet 的差异仍是计时噪声两个编译版本间所有对的匹配数、内点数、特征数与角点误差完全一致。编译本身会改变部分尺度空间结果因此 eager 与编译的质量必须分开比较例如 SIFT–AffNet–HardNet 编译后均值误差 2.381 pxeager 为 2.183 px。每个版本在独立进程中用全新的TORCHINDUCTOR_CACHE_DIR启动首次调用被排除在预热与稳态计时之外但记录在 JSON 中SIFT 首次提取匹配调用基线 43.42 s / 优化 43.38 sKeyNet 15.25 s / 16.84 s。SIFT–AffNet–HardNet 在 SIFT 之后运行复用了已编译的检测器图0.233/0.209 s因此其首次调用不是独立的冷编译测量首次延迟包含实际执行与初始化不只是编译时间。编译模式峰值额外 CUDA 分配SIFT 566.9 → 690.1 MiBSIFT–AffNet–HardNet 1058.6 → 1058.6 MiBKeyNet–HardNet 1057.7 → 1057.7 MiB。五对各自的 median/IQR 与首次调用延迟全部保留在原始 JSON 中。编译模式命令源码见 benchmarks/feature/local_features.py 的--compile参数.venv/bin/python -m benchmarks.feature.local_features --seq /data/graf --device cuda --compile --json graf-compiled.json从 benchmarks/feature/scale_space_detector.py 可以看到编译范围scalespace 方法通过compile_modules[subpix, resp, scale_pyr]编译三个模块KeyNet 方法则在 KeyNetExtractor 中执行det.model torch.compile(det.model, dynamicTrue)与det.nms torch.compile(det.nms, dynamicTrue)——注释说明 model 与 nms 在 6 种不同图像尺寸上运行dynamicTrue可避免重复编译而 aff/ori/descriptor 不编译因为extract_patches_from_pyramid若被追踪每个 (特征数, patch 尺寸) 组合都会特化出新图导致预热尖峰。本次未运行编译模式的 CPU 对比。更早的 SIFT 运行时图表benchmarks/feature/sift_runtime.md覆盖公开尺度空间 SIFT 预设在 batch 1 的 CPU eager/编译以及 CUDA batch 1/4/8 的运行时与本次 graf 配对基准是不同的工作量单图提取 vs 双图提取匹配不要互比绝对数值优化实现细节源码级佐证原文档Implementation一节列出了四项核心优化均可直接对应到当前仓库源码1. 用scatter_add_累积方向直方图。每个梯度像素只向相邻的两个方向 bin 投票替代原来对整块 patch 的 36 次完整扫描。实现在 kornia/feature/orientation.py 的PatchDominantGradientOrientation.forward先计算 36-bin 角度与加权幅度然后两次ang_bins.scatter_add_分别累加左右两个 bin半精度输入提升到 float32 累积后再除回 patch 面积。文档注释同时提醒CUDA 上scatter_add_使用原子操作两次相同输入可能产生 ulp 级差异极端接近的 bin 可能返回相邻峰torch.use_deterministic_algorithms(True)可恢复确定性。2. 内建亚像素模块的正/负响应精化批处理。正负响应精化合并为批量调用减少 kernel 启动次数这也是 GPU 显存表中以约 90 MiB 换更少精化启动的由来NMS 邻域保持分离自定义模块与精化器保留独立调用并带候选数上限且精化迭代次数不变。3. 合并前只 gather 被选中的坐标。在合并正/负结果前先按选中坐标 gather避免在整个 octave 上做密集的三坐标合并。4. KeyNet / HardNet 的 channels-last float32 激活。KeyNet 窄卷积块在 CPU/CUDA 上于块边界转换一次 channels-lastkornia/feature/keynet.pyHardNet 在 CPU 上同样处理kornia/feature/hardnet.py。参数布局与 checkpoint 键保持不变因此预训练权重契约不受影响——这也是 MPS 上 KeyNet 管线完全看不到收益的原因。复现指南数据准备。使用 Oxford affine graf 数据集Oxford affine 评测数据集中的 graf 序列归档 SHA-256 为999871b945ee968a00a0d5f9af957d1382fb9dae1511cdee9553366817b53b5b每张输入图像与单应矩阵的哈希同样记录在 JSON 元数据的input_sha256字段中见 benchmarks/feature/graf_results/optimized-cuda.json可逐字节校验输入一致性。原版 Oxford PPM 优先仅当 PPM 不存在时才用 PNG转换副本可能解码出不同像素。运行命令在仓库根目录、使用.venv解释器# CUDA五对全部计时 .venv/bin/python -m benchmarks.feature.local_features --seq /data/graf --device cuda --json graf-cuda.json # CPU--timing-pairs 2 只计时代表性 1–2 对但仍评估全部五对质量 .venv/bin/python -m benchmarks.feature.local_features --seq /data/graf --device cpu --timing-pairs 2 --json graf-cpu.json # MPS五对全部计时RANSAC 自动落到 CPU .venv/bin/python -m benchmarks.feature.local_features --seq /data/graf --device mps --json graf-mps.json基线对比。在基线 worktree 根目录用主检出primary checkout的显式解释器通过runpy.run_path运行同一 harness并确认打印的kornia.__file__指向基线 worktree 而非 editable 主检出。最终基准进程顺序执行、无并发测试干扰。管线配置与文档一致全部在 benchmarks/feature/scale_space_detector.py 中可查尺度空间管线ScalePyramid(3, 1.6, 32, double_imageTrue)3 层 3 个额外层、DoG 极小/极大值、AdaptiveQuadInterp3d默认参数、32 像素梯度方向 patch。SIFT 使用SIFTDescriptor(32, rootsiftTrue)RootSIFTSIFT–AffNet–HardNet 在定向前加预训练 AffNet、定向后加预训练 HardNetKeyNet–HardNet 使用公开预设与预训练 OriNet。SNN 匹配 ratio 0.85单应 RANSAC 参数threshold 2.0、max_iter 10、batch_size 8196、confidence 0.9999、seed 3407见 benchmarks/feature/local_features.py模型构建使用 PyTorch seed 0。方法论约束详见 benchmarks/common.py 与 benchmarks/README.md 的 methodology contract计时预算至少扩展到 5 次预热调用时长避免慢 CPU 调用退化为单一样本CPU 线程数为 1与共享 Timer 一致matmul TF32 被禁用cuDNN 保持默认 TF32 并记录在元数据中结果 JSON 为严格合法 JSONNaN 转为 null形状为{metadata: ..., results: [...]}。原始结果文件以下 JSON 保留每对的 median/IQR、首次调用延迟、特征数、匹配数、内点数、峰值显存与完整元数据benchmarks/feature/graf_results/基线 CUDA优化 CUDA基线 CPU优化 CPU基线选择性编译 CUDA优化选择性编译 CUDA基线 MPS优化 MPS需要强调的是这些是本地基准结果而非发布级的性能承诺。它们是 benchmarks/README.md 意义上的对比工件comparison artefacts由benchmarks/results_schema.py的results_schema.validate_artefact在 CI 中校验测量发生在 harness 记录聚合load快照之前且各次运行顺序执行、无并发负载。引用任何数字时请同时引用 Kornia 版本与git_commit因为一个kornia-version目录可能横跨多个提交。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia SIFT 尺度空间基准全解析patch 与 pyramid 双后端在 Oxford graf 上的性能与质量对比Kornia SIFT 尺度空间基准全解析patch 与 pyramid 双后端在 Oxford graf 上的性能与质量对比 SIFTFeatureScal计算机视觉深度学习人工智能图像处理OpenMed CPU INT8 分类头快速路径本地端 token 分类的量化推理、SIMD 分派与基准验证OpenMed CPU INT8 分类头快速路径本地端 token 分类的量化推理、SIMD 分派与基准验证 导读 OpenMed 的 CPU INT8 Cl人工智能NLP医疗健康数据脱敏本地部署大模型AI 应用MCP 服务联邦学习50万行Excel不崩溃Apache Fesod高性能处理实战50万行Excel不崩溃Apache Fesod高性能处理实战 Apache Fesod孵化中是一款面向 Java 1.8 的 Excel 处理库它的后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考