SuperPoint — 自监督关键点检测与描述子
概述
SuperPoint 是一种端到端的自监督 / 半监督学习关键点检测与描述子提取网络,能够同时输出图像中关键点的位置与置信度以及每个关键点的局部描述子,在图像匹配和三维视觉任务中表现优异。
核心特性
| 特性 |
说明 |
| 模型类型 |
关键点检测 + 描述子提取 |
| 关键点输出 |
空间位置 + 置信度分数 |
| 描述子维度 |
256 维浮点向量 |
| 输入尺寸 |
120 × 160 灰度图 |
| 训练方式 |
自监督(Synthetic → Homographic Adaptation) |
模型架构
graph LR
A["输入灰度图<br/>120×160"] --> B["共享编码器"]
B --> C["关键点头"]
B --> D["描述子头"]
C --> E["热力图 20×15×65"]
D --> F["描述子 20×15×256"]
E --> G["Softmax + 像素洗牌"]
G --> H["关键点坐标"]
F --> I["L2 归一化"]
I --> J["256D 描述子"]
- 关键点头(Interest Point Head) — 输出 20×15×65 热力图(64 个网格单元 + 1 个 dustbin)
- 描述子头(Descriptor Head) — 输出 20×15×256 的半稠密描述子
- 共享编码器 — 轻量 VGG 风格网络,降低计算量
目标应用场景
- 视觉 SLAM — 实时定位与地图构建
- 三维重建 — 多视图特征点匹配
- 图像拼接 — 全景图像配准
- 视觉定位 — 查询图像与数据库图像的匹配定位
参考来源
输入 / 输出规格
模型接口
| 方向 |
名称 |
数据类型 |
维度 |
尺寸 |
说明 |
| 输入 |
INPUT:0 |
UINT8 |
4D |
1 × 1 × 120 × 160 |
输入灰度图 (H×W=120×160) |
| 输出 |
OUTPUT:0 |
FP32 |
4D |
1 × 65 × 15 × 20 |
关键点热力图 |
| 输出 |
OUTPUT:1 |
FP32 |
4D |
1 × 256 × 15 × 20 |
描述子特征图 |
输出空间分辨率 20×15 为输入尺寸 160×120 经过 8 倍下采样(1/8 分辨率)。
后处理流程
flowchart TD
subgraph 关键点检测
A["热力图 20×15×65"] --> B["Softmax + Refine"]
B --> C["像素洗牌还原分辨率"]
C --> D["阈值筛选"]
D --> E["NMS 非极大抑制"]
E --> F["稳定关键点坐标"]
end
subgraph 描述子匹配
G["描述子 256D"] --> H["L2 归一化"]
H --> I["最近邻匹配"]
F --> J["匹配对筛选"]
I --> J
J --> K["RANSAC 几何验证"]
K --> L["最终匹配结果"]
end
subgraph 可视化
L --> M["绘制匹配连线"]
F --> N["绘制特征点"]
end
步骤说明
| 步骤 |
操作 |
说明 |
| 1 |
Softmax + Refine |
对 65 通道热力图做 Softmax,去除 dustbin 通道 |
| 2 |
像素洗牌 |
将 20×15×64 还原为 160×120 分辨率 |
| 3 |
阈值筛选 |
保留置信度超过阈值的关键点 |
| 4 |
NMS |
非极大值抑制,确保关键点分布均匀 |
| 5 |
描述子匹配 |
使用最近邻进行跨图像匹配 |
| 6 |
RANSAC |
几何一致性检查,去除外点 |
执行与性能
运行方式
python superpoint.py
性能指标
| 指标 |
数值 |
| 推理平台 |
边缘板卡(NPU) |
| 推理时间 |
~0.946 ms |
| 输出 1 FE 均值误差 |
0.009975 |
| 输出 1 FE 最大误差 |
0.107160 |
| 输出 2 FE 均值误差 |
0.024283 |
| 输出 2 FE 最大误差 |
0.158191 |
SuperPoint 推理速度极快(不到 1ms),非常适合实时特征点提取。
输出示例
特征点检测 & 匹配
| 图像 |
结果 |
| 第1张图 — 特征点 |
 |
| 第2张图 — 特征点 |
 |
| 匹配结果 |
 |
- 特征点图上的圆点表示检测到的关键点位置
- 匹配图中连线表示两图之间的匹配点对
- 结果保存路径:
../resource/superpoint/