一、SuperPoint简介
1.1 项目简介
在计算机视觉领域,SuperPoint预训练网络是一个开源项目,由Magic Leap Research团队开发。此项目提供了一种高效且准确的关键点检测和描述子提取算法,旨在改进各种视觉任务的性能,如图像配准、3D重建和物体识别等。
SuperPoint应该是一个可以与ORB特征提取器相媲美的算法,很值得仔细琢磨。
1.2 原理分析
1. 网络架构:SuperPoint网络基于深度学习,采用全卷积神经网络(FCN)设计,能够对输入图像进行像素级别的预测。它包括两个主要部分:关键点检测器和描述子生成器。
- 检测器部分是一个双向递归神经网络(Bi-GRU),用于生成密集的关键点概率图;
- 描述子生成器则是在每个检测到的关键点周围提取特征,确保了各个关键点的独立性。
2. 自监督学习:该项目的独特之处在于其自监督的训练策略。通过将一对视图不同的相同场景图像作为输入,网络需要学会找到对应的匹配点。这种方法不仅避免了依赖于人工标注的数据,还使得模型具有很好的泛化能力。
3. 冗余去除与规范化:为了提高关键点的质量,SuperPoint引入了非最大抑制(NMS)以去除冗余的关键点,并应用L2规范化来保证描述子具有单位范数,从而提高匹配稳定性。
1.3 应用场景
SuperPoint网络可以在以下几个方面发挥作用:
- 图像匹配与拼接:为全景图像创建、虚拟现实或增强现实应用提供支持。
- 结构光三维重建:帮助精确地估计物体表面的几何形状。
- 机器人定位与导航:结合SLAM算法,实现在未知环境中的自主导航。
- 视频稳定:通过跟踪关键点来平滑视频序列,减少抖动。
1.4 特点与优势
- 无需标注数据:自监督学习使得模型能在大规模无标注数据上训练。
- 高精度:在标准基准测试中表现出色,尤其是在低光照和极端视角条件下。
- 可扩展性:可以与其他视觉任务的框架集成,如单目深度估计和目标检测。
二、项目介绍
这个代码库包含了由原作者实现的预训练的SuperPoint网络。SuperPoint是Magic Leap的一个研究项目。SuperPoint网络是一个完全卷积的深度神经网络,用于检测兴趣点并计算它们的描述符。因此,检测到的点和描述符可以用于各种图像匹配任务。
项目地址:GitHub - magicleap/SuperPointPretrainedNetwork: PyTorch pre-trained model for real-time interest point detection, description, and sparse tracking (https://arxiv.org/abs/1712.07629)PyTorch pre-trained model for real-time interest point detection, description, and sparse tracking (https://arxiv.org/abs/1712.07629) - magicleap/SuperPointPretrainedNetworkhttps://github.com/magicleap/SuperPointPretrainedNetwork?tab=readme-ov-file
详细信息请参考:
-
Full paper PDF: SuperPoint: Self-Supervised Interest Point Detection and Description
-
Presentation PDF: Talk at CVPR Deep Learning for Visual SLAM Workshop 2018
-
Authors: Daniel DeTone, Tomasz Malisiewicz, Andrew Rabinovich
2.1 演示效果
这个演示展示了一个简单的稀疏光流点跟踪器,它使用SuperPoint来检测点并在视频序列中进行匹配。该代码库包含两个核心文件:
(1)一个PyTorch权重文件(superpoint_v1.pth)
(2)一个Python部署脚本(demo_superpoint.py),定义了网络,加载图像并在它们上运行PyTorch权重文件,从而创建稀疏光流可视化。
以下是演示在各种公开可用数据集上运行的视频(原文自带):
| | |
Freiburg RGBD | Microsoft 7 Scenes | MonoVO |
| ||
KITTI |
2.2 环境依赖
- OpenCV python >= 3.4
- PyTorch >= 0.4
这个演示项目依赖于一些标准的Python模块,以及OpenCV和PyTorch。
通常,以下命令可用于安装这两个库(在Mac和Ubuntu上测试通过):
pip install opencv-python pip install torch
2.3 Running the Demo
本演示将在图像序列上运行SuperPoint network,并使用名为 SuperPointFrontend 的辅助类计算图像中的点和描述符。轨迹由 PointTracker 类形成,该类通过点描述符的双向匹配找到顺序成对的近邻。
演示脚本使用了一个名为 VideoStreamer 的辅助类,它可以处理来自三种不同输入流的输入:
- A directory of images, such as .png or .jpg
- A video file, such as .mp4 or .avi
- A USB Webcam
(1)以 CPU 模式在提供的图像目录中运行演示程序:
./demo_superpoint.py assets/icl_snippet/
您将看到 ICL-NUIM 序列片段的以下输出结果(原文自带):
(2)在 GPU 模式下运行提供的 .mp4 文件演示
./demo_superpoint.py assets/nyu_snippet.mp4 --cuda
nyu_snippet视频序列的输出结果如下(原文自带):
(3)在 CPU 模式下通过网络摄像头(id #1)运行实时演示
./demo_superpoint.py assets/icl_snippet/ --W=640 --H=480 --no_display --write --write_dir=myoutput/
在远程 GPU(无显示屏)上运行 640x480 图像的演示,并将输出写入 myoutput/(自己运行结果)。
| | |
| |
2.4 额外的参数
- 使用 --H 更改输入图像高度(默认值:120)。
- 使用 --W 更改输入图像宽度(默认值:160)。
- 使用 --display_scale 来缩放输出可视化图像的高度和宽度(默认值:2)。
- 使用 --cuda 标志启用 GPU。
- 使用 --img_glob 更改图像文件扩展名(默认值:*.png)。
- 使用 --min_length 更改最小轨迹长度(默认值:2)。
- 使用 --max_length 更改最大轨迹长度(默认值:5)。
- 使用 --conf_thresh 更改点置信度阈值(默认值:0.015)。
- 使用 --nn_thresh 更改描述符匹配距离阈值(默认值:0.7)。
- 使用 --show_extra 来显示更多计算机视觉输出。
- 按 q 键退出。
2.5 写在最后
- 作者不打算发布 SuperPoint 训练或评估代码,所以不要通过电子邮件向作者索取(徒劳)。
- 作者不打算公开用于引导 SuperPoint 训练的合成形状数据集,所以不要通过电子邮件向作者索取(徒劳)。
- 作者使用双线性插值法而非论文中描述的双立方插值法对描述符进行采样,因为这种方法更快,而且结果相似。
三、BibTeX Citation
尊重作者的贡献,请在使用superpoint的时候记得引用:
@inproceedings{detone18superpoint,author = {Daniel DeTone andTomasz Malisiewicz andAndrew Rabinovich},title = {SuperPoint: Self-Supervised Interest Point Detection and Description},booktitle = {CVPR Deep Learning for Visual SLAM Workshop},year = {2018},url = {http://arxiv.org/abs/1712.07629} }