ARTICLE DETAIL

资讯详情

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

Kornia AffNet 仿射形状估计实战:用 LAFAffNetShapeEstimator 把圆形局部特征变成贴合物体的椭圆

Kornia AffNet 仿射形状估计实战:用 LAFAffNetShapeEstimator 把圆形局部特征变成贴合物体的椭圆 Kornia AffNet 仿射形状估计实战用 LAFAffNetShapeEstimator 把圆形局部特征变成贴合物体的椭圆【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址: https://gitcode.com/gh_mirrors/ko/korniaAffNet 是 Kornia 提供的一个预训练 PyTorch 模型用于估计局部特征的仿射协变形状affine-covariant shape它把检测器输出的圆形局部区域改写为贴合真实表面几何的椭圆从而让同一表面块在不同视角下被归一化为相同正方形后再送入描述子。本文以 docs/source/models/affnet.rst 为主体结合 kornia/feature/affine_shape.py 等源码带你掌握 LAFAffNetShapeEstimator 的调用方式、LAF 数据格式、底层 CNN 架构以及它与 KeyNet、HardNet 的组合用法。AffNet 要解决什么问题从各向同性圆到仿射椭圆特征检测器如 KeyNet、GFTT、Hessian通常输出各向同性isotropic的局部区域——即一个圆。但在真实场景中同一平面块在不同视角下会呈现仿射变形正对拍摄时是圆倾斜拍摄时就变成椭圆。如果直接用圆形区域提取 patch 并计算描述子视角变化越大描述子匹配越不稳定。AffNet 的核心思想是预测局部区域的仿射形状把检测器输出的圆形 LAF 改写成椭圆 LAF使得同一表面块从两个视角观察时都能被归一化到同一个正方形 patch再送入描述子如 HardNet。正如文档所描述的AffNet predicts the affine shape of a local region so that the same surface patch, seen from two viewpoints, is normalised to the same square before it is described.在 Kornia 中承担这一职责的类是 :class:~kornia.feature.LAFAffNetShapeEstimator源码见 kornia/feature/affine_shape.py它接受任意检测器输出的局部仿射帧LAFs返回形状被替换为估计椭圆的帧。快速开始完整可运行的示例文档给出了一个非常完整的端到端示例我们在此基础上补充了各步骤的输出形状与说明直接复制即可运行需要一张church_1.png灰度图import torch from kornia.color import rgb_to_grayscale from kornia.feature import KeyNetDetector, LAFAffNetShapeEstimator, laf_to_boundary_points from kornia.io import load_image # 加载图像并转为灰度得到 (1, 1, H, W) 的批次输入 gray rgb_to_grayscale(load_image(church_1.png)[None]) # (1, 1, H, W) # 1. KeyNet 检测器输出各向同性圆形的局部仿射帧 detector KeyNetDetector(pretrainedTrue, num_features32).eval() # 2. AffNet 形状估计器预训练权重把圆变成椭圆 affnet LAFAffNetShapeEstimator(pretrainedTrue).eval() with torch.no_grad(): # detector 返回 (lafs, responses) lafs, _ detector(gray) # (1, N, 2, 3) 各向同性局部仿射帧 # affnet 把每个 LAF 的 2x2 线性部分改写为仿射形状 lafs_affine affnet(lafs, gray) # (1, N, 2, 3) 仿射协变帧 # 把椭圆 LAF 转为边界点用于可视化每个椭圆采样 50 个点 boundaries laf_to_boundary_points(lafs_affine) # (1, N, 50, 2) 椭圆轮廓点 (x, y) 像素坐标示例中的两张图docs/source/_static/img/models/affnet.jpg直观展示了前后对比左侧是 KeyNet 检测的 32 个圆形区域右侧是 AffNet 估计后贴合局部表面的椭圆区域椭圆的长轴方向与教堂建筑的几何走向一致。代码要点拆解load_image(church_1.png)[None]Kornia 的 kornia/io/io.py 会返回(H, W, C)图像[None]增加 batch 维rgb_to_grayscale后得到单通道灰度张量KeyNetDetector(pretrainedTrue, num_features32)从网络下载 KeyNet 预训练权重num_features32控制返回的局部特征数量更多参数见下文源码分析LAFAffNetShapeEstimator(pretrainedTrue)构造时自动加载 AffNet 预训练权重并把模块置为eval()模式见 affine_shape.py推理过程应放在torch.no_grad()中避免不必要的梯度开销。LAF 数据格式仿射形状的载体AffNet 输入输出的 LAFLocal Affine Frame形状为(B, N, 2, 3)由 2×2 线性矩阵和 1×2 平移向量组成LAF [ [ a11, a12, x ], [ a21, a22, y ] ]其中(a11, a12, a21, a22)描述区域的线性变形圆→椭圆的拉伸与旋转AffNet 改写的就是这部分(x, y)是区域中心点坐标。Kornia 在 kornia/feature/laf.py 中提供了一整套 LAF 工具函数与本主题直接相关的有laf_to_boundary_points把 LAF 转为n_pts默认 50个椭圆轮廓采样点方便用 matplotlib 绘制make_upright将 LAF 旋转到“竖直”方向消除朝向影响AffNet 在提取 patch 前会先调用它ellipse_to_laf把(a, b, c)椭圆参数转回 LAF 格式extract_patches_from_pyramid按 LAF 从图像金字塔中提取固定尺寸 patch是 LAF→描述子的关键桥梁。深入源码AffNet 的三个核心类affine_shape.py 中按“学习式 / 经典式”提供了一对可互换的估计器以及 AffNet 本身1. PatchAffineShapeEstimator经典的二阶矩估计Baumberg 方法PatchAffineShapeEstimator 不依赖学习而是按 Baumberg2000的经典方法用 patch 内梯度的二阶矩矩阵估计仿射形状输入 patch 尺寸patch_size19eps1e-10用于安全除法内部使用SpatialGradient(sobel, 1)计算梯度并用高斯核get_gaussian_kernel2dsigma patch_size / √2加权计算(gx², gx·gy, gy²)三个通道的均值得到椭圆形状参数(B, 1, 3)退化处理当 2 个及以上元素接近 0如纯黑 patch时回退为圆形[1.0, 0.0, 1.0]最后按最大值归一化保证输出尺度稳定。从源码注释affine_shape.py可以看到对于 float16 / bfloat16 输入梯度与矩计算会在 float32 中进行以避免下溢输出保持输入 dtype。2. LAFAffineShapeEstimator经典形状估计的 LAF 封装LAFAffineShapeEstimator 是上述 patch 级估计器的 LAF 级封装它用extract_patches_from_pyramid按输入 LAF 提取patch_size32的 patch跑 PatchAffineShapeEstimator 得到椭圆形状再通过ellipse_to_laf把新形状与原始中心点组装回 LAF。preserve_orientationTrue时保留原始朝向。3. LAFAffNetShapeEstimator学习式 AffNet本文主角LAFAffNetShapeEstimator 是文档对应的核心类它把 patch 提取后送入一个紧凑 CNN 回归网络直接输出椭圆形状参数。其网络结构为nn.Sequential( nn.Conv2d(1, 16, kernel_size3, padding1, biasFalse), # 输入为 32x32 单通道 patch nn.BatchNorm2d(16, affineFalse), nn.ReLU(), nn.Conv2d(16, 16, kernel_size3, stride1, padding1, biasFalse), nn.BatchNorm2d(16, affineFalse), nn.ReLU(), nn.Conv2d(16, 32, kernel_size3, stride2, padding1, biasFalse), # 下采样 nn.BatchNorm2d(32, affineFalse), nn.ReLU(), nn.Conv2d(32, 32, kernel_size3, stride1, padding1, biasFalse), nn.BatchNorm2d(32, affineFalse), nn.ReLU(), nn.Conv2d(32, 64, kernel_size3, stride2, padding1, biasFalse), # 下采样 nn.BatchNorm2d(64, affineFalse), nn.ReLU(), nn.Conv2d(64, 64, kernel_size3, stride1, padding1, biasFalse), nn.BatchNorm2d(64, affineFalse), nn.ReLU(), nn.Dropout(0.25), nn.Conv2d(64, 3, kernel_size8, stride1, padding0, biasTrue), # 输出 3 个椭圆参数 nn.Tanh(), nn.AdaptiveAvgPool2d(1), )要点patch_size固定为 32输出为 3 个值(a, b, c)经Tanh压缩后表示椭圆参数代码中通过1.0 xy[:, 0]、1.0 xy[:, 2]保证主对角线元素为正构成新的 2×2 线性矩阵输入归一化_normalize_input按 batch 做 mean/std 标准化eps1e-6。源码注释特别警告affine_shape.py必须对mp/sp调用.detach()否则F.grid_sample提取 patch 的梯度噪声极大会让检测器训练完全不稳定pretrainedTrue时从urls[affnet]加载权重affine_shape.py并自动self.eval()与经典版不同AffNet 默认不保留原始朝向make_candidate_uprightTrue因此文档建议先运行 LAFAffNetShapeEstimator再运行 LAFOrienter 重新估计方向。组合成完整管线KeyNetAffNetHardNet文档指出AffNet 估计出的帧可以直接送入extract_patches_from_pyramid和一个描述子如 HardNet而 Kornia 已经提供了把三者串起来的便捷模块KeyNetAffNetHardNetKeyNetDetector LAFAffNetShapeEstimator HardNet的一体化 LocalFeature 模块。构造时把LAFAffNetShapeEstimator(True, preserve_orientationFalse)作为aff_module注入 KeyNetDetector源码见 keynet.py其中aff_module默认是PassLAF即不做仿射形状估计HesAffNetHardNet用ScaleSpaceDetector(BlobHessian)替代 KeyNet 作为检测器同样接入LAFAffNetShapeEstimator(True, preserve_orientationFalse)还有GFTTAffNetHardNet等同类组合均在 kornia/feature/init.py 中导出。这些组合模块的参数包括num_features默认 8000、uprightTrue 时跳过朝向估计、device、scale_laf、compile_model用torch.compile加速响应函数与 NMS、score_threshold最小响应阈值NMS 会把被抑制位置写为精确 0因此该阈值必须非负见 keynet.py 的说明。论文出处与许可AffNet 的学术出处是 ECCV 2018 论文AffNet: Repeatability Is Not Enough: Learning Affine Regions via Discriminability作者 Dmytro Mishkin、Filip Radenovic、Jiri Matas核心观点是单纯最大化几何可重复性并不能得到可靠的匹配特征需要用描述子判别性discriminability来指导仿射区域学习并提出 hard negative-constant loss 用于训练仿射形状估计器。Kornia 实现基于原论文代码模型权重以MIT 许可发布urls[affnet]同时配置了 HuggingFace 镜像与原作者仓库两个下载源见 affine_shape.py可在图像检索、宽基线立体匹配等场景直接使用。相关资源使用指南原文docs/source/models/affnet.rst核心实现kornia/feature/affine_shape.pyLAF 工具函数kornia/feature/laf.py组合模块kornia/feature/integrated.py检测器接口kornia/feature/keynet.py【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址: https://gitcode.com/gh_mirrors/ko/kornia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表