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),仅供参考
企业数字化 ERP 产品动态
相关推荐
从零手写.NET内存缓存:过期策略与并发控制实战 在 .NET 服务端开发里,内存缓存几乎是一个绕不开的话题。很多项目一上来就直接引Microsoft.Extensions.Caching.Memory或者上 Redis,倒也没错,但有时候你只是需要给某个热点数据加一层本地缓存,引入一整套缓存框架反而显得笨重。我… · 2026/9/24 19:08:12
Windows核心服务与账户体系排查指南:从SID到登录报错一次讲透 前阵子给一台Windows工作站做巡检,刚打开事件查看器头就大了:系统日志里躺着一堆服务启动失败的记录,安全日志里全是登录失败的审计,磁盘权限列表里冒出一个看不懂的“未知账户s-1-15-3-65536”,还有个服务因为账户密码… · 2026/9/24 19:08:12
151、MLIR的Systolic Array(脉动阵列)映射与优化 MLIR的Systolic Array映射与优化:一次硬件调试的血泪史
去年做AI加速器项目,在FPGA上跑一个8x8的脉动阵列,MLIR生成的代码死活跑不对。波形抓出来一看,数据流时序全乱套了——PE(处理单元)之间的数据传递总是差一拍,有些PE甚至吞掉了本该传递的激活值。当时盯着Vivado的… · 2026/9/24 19:08:12
OpenSandbox实战:轻量级进程隔离沙箱的部署与配置指南 我最近在几个开发环境里反复折腾应用隔离的方案,最后被一个叫 OpenSandbox 的命令行工具给留住了。这东西说白了就是一个开源的应用级沙箱运行环境,能把不太可信的脚本、二进制程序、甚至整组服务进程关进一个受限的运行空间里,让它在里面折腾… · 2026/9/24 20:25:20
OpenSandbox极简部署与实践:让不可信代码在隔离沙盒中安全运行 1. OpenSandbox到底解决什么问题:从一次重装系统的教训说起1.1 一个让人崩溃的开发场景先说我自己的经历。去年有段时间,我在研究一个第三方提供的自动化测试脚本,对方打包了一堆二进制文件和一个安装入口,文档里写着“建议在干净… · 2026/9/24 20:25:20
B站直播API实战指南:WebSocket弹幕协议、wbi签名与20+功能实现全解析 不夸张地说,B站直播API 是中文互联网里最“香”但也最容易被劝退的接口之一。香在哪里?免费、实时性高、事件类型丰富,一个 WebSocket 连上之后,直播间里的弹幕、礼物、SC、入场、关注、舰长开通全都能推到你的服务器上。劝退在哪… · 2026/9/24 20:25:20
ComfyUI抠图全攻略:语义分割、SAM2交互式与BiRefNet自动抠像实战 玩ComfyUI的人,十个有九个迟早都会碰到一个问题:怎么把图里的人物或者物体干干净净地抠出来。修图要抠、训练LoRA要抠、做电商图要抠、给视频换背景也要抠。我最早在SD WebUI里习惯了用插件一键搞定,刚转到ComfyUI那会儿还真有点不习惯&#… · 2026/9/24 20:25:20
RabbitMQ在大数据场景下的高级特性与实践:仲裁队列、延迟队列与高可用集群搭建 在大数据这个圈子里,只要一提到消息中间件,大家的第一反应基本都是Kafka,接着就是一顿吞吐量对比、分区副本讨论。RabbitMQ在很多人眼里好像只是给传统业务系统做异步解耦用的“小玩意儿”,跟大数据场景搭不上边。但实际情况是&am… · 2026/9/24 20:25:20
Dopamine 中的 DQN 与 Rainbow 智能体:从三大核心组件到可复现的 Atari 基准实验 强化学习机器学习深度学习 【免费下载链接】dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. 项目地址: https://gitcode.com/gh_mirrors/dopami/dopamine 点击查看 免费下载 本文以仓库文档 docs/agents… · 2026/9/24 20:25:07
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44