Hierarchical-Localization
Hierarchical-Localization(简称 hloc)是一个专为高精度 6 自由度视觉定位打造的模块化工具箱。它旨在解决如何在复杂室内外环境中,快速、准确地将二维图像映射到三维空间的核心难题。通过结合图像检索与特征匹配技术,hloc 能够高效复现业界领先的定位成果,并支持用户利用自有数据构建三维地图。
这款工具特别适合计算机视觉领域的研究人员、算法开发者以及需要验证自定义定位方案的工程师。其独特之处在于采用了“分层定位”策略:先通过图像检索快速筛选候选参考图,再利用 SuperGlue 或 LightGlue 等先进算法进行精细特征匹配,最后结合 COLMAP 完成三维重建与定位。这种流程不仅显著提升了计算效率,还保证了在大规模场景下的可扩展性。
此外,hloc 提供了极高的灵活性,允许用户轻松替换特征提取器或匹配器,以评估新算法的性能。项目不仅包含完整的示例管道(如 Aachen、InLoc 数据集),还支持在 Google Colab 上免费运行,让使用者无需配置本地环境即可体验从三维建图到实时定位的全流程。无论是学术研究还是工程落地,Hierarchical-Localization 都是探索视觉定位技术的得力助手。
使用场景
某自动驾驶团队正在开发城市复杂路况下的高精度定位系统,需要将车载摄像头实时画面与预先构建的 3D 地图进行匹配,以确定车辆的精确位置。
没有 Hierarchical-Localization 时
- 定位流程割裂:工程师需手动串联图像检索、特征提取、特征匹配及 SfM 重建等多个独立工具,代码耦合度低且调试极其困难。
- 环境适应性差:在光照剧烈变化或视角差异大的户外场景(如 Aachen 数据集模拟环境),传统单一特征匹配方法极易失效,导致定位丢失。
- 复现门槛高:想要复现学术界最先进的 6-DoF 定位算法,需要耗费数周时间整合不同论文的代码库,难以快速验证新想法。
- 计算效率低下:缺乏分层处理机制,系统被迫对全图进行密集匹配,无法满足实时性要求且资源消耗巨大。
使用 Hierarchical-Localization 后
- 流水线一体化:Hierarchical-Localization 提供了模块化工具箱,一键集成 SuperPoint 特征提取与 SuperGlue/LightGlue 匹配,将原本分散的步骤整合为标准化流程。
- 鲁棒性显著提升:通过“先图像检索缩小范围,再精细特征匹配”的分层策略,即使在昼夜交替或大角度视角变化下,也能稳定输出高精度位姿。
- 快速实验迭代:内置了针对 Aachen 等标准基准的完整脚本,团队可在几小时内复现 SOTA 结果,并能轻松替换组件以评估自研算法。
- 部署灵活高效:支持直接在 Google Colab 云端运行或利用 Docker 容器化部署,无需繁琐配置 COLMAP 依赖,大幅降低了从研发到落地的成本。
Hierarchical-Localization 通过分层架构将复杂的视觉定位难题转化为可模块化组装的工程任务,让高精度 6-DoF 定位变得简单、快速且可扩展。
运行环境要求
- Linux
- 可选但推荐(用于加速特征提取和匹配,如 SuperPoint/SuperGlue)
- Docker 运行需 NVIDIA GPU 及 `--runtime=nvidia` 参数
- 具体显存和 CUDA 版本未说明
未说明

快速开始
hloc - 分层定位工具箱
这是 hloc,一个用于最先进的6自由度视觉定位的模块化工具箱。它实现了分层定位,利用图像检索和特征匹配技术,具有速度快、精度高、可扩展性强的特点。该代码库整合并简化了多年来在图像匹配和运动恢复结构(SfM)领域的研究成果。
使用 hloc,你可以:
- 在多个室内和室外视觉定位基准上复现最先进结果
- 使用 SuperPoint+SuperGlue 运行运动恢复结构(SfM),以自己的数据集进行定位
- 评估自定义局部特征或图像检索在视觉定位中的表现
- 轻松实现并调试新的定位流程 🔥
快速入门 ➡️ 
通过运动恢复结构(SfM)构建3D地图,并直接在浏览器中对任何网络图片进行定位!现在你可以在 Google Colab 中免费使用 GPU 运行 hloc 和 COLMAP。 笔记本 demo.ipynb 展示了如何仅需几步即可完成 SfM 和定位。尝试使用你自己的数据,并告诉我们你的体验!
安装
hloc 需要 Python >=3.7 和 PyTorch >=1.1。本地安装该包会自动拉取其他依赖项:
git clone --recursive https://github.com/cvg/Hierarchical-Localization/
cd Hierarchical-Localization/
python -m pip install -e .
所有依赖项均列于 requirements.txt 文件中。从 hloc-v1.3 开始,不再需要安装 COLMAP。 此仓库包含作为 Git 子模块的外部局部特征提取器——请别忘了使用 git submodule update --init --recursive 拉取子模块。
我们还提供了 Docker 镜像:
docker build -t hloc:latest .
docker run -it --rm -p 8888:8888 hloc:latest # 如需 GPU 支持,请添加 `--runtime=nvidia`
jupyter notebook --ip 0.0.0.0 --port 8888 --no-browser --allow-root
总体流程
该工具箱由一系列脚本组成,大致执行以下步骤:
- 对所有数据库图像和查询图像提取局部特征,例如 SuperPoint 或 DISK
- 构建参考的 3D SfM 模型
- 利用检索技术找出与每个查询图像相关的数据库图像
- 匹配查询图像
- 执行定位
- 可视化并调试
随后,可以将定位结果在 visuallocalization.net 上针对支持的数据集进行评估。当有 3D 激光雷达扫描数据可用时,例如室内数据集 InLoc,步骤 2. 可以被跳过。
工具箱的结构如下:
hloc/*.py:顶层脚本hloc/extractors/:特征提取器接口hloc/matchers/:特征匹配器接口hloc/pipelines/:针对多个数据集的完整定位流程
hloc 可以作为外部包导入,使用 import hloc;也可以通过命令行调用:
python -m hloc.name_of_script --arg1 --arg2
任务
我们提供了逐步指南,教你如何使用 Aachen 和 InLoc 数据集进行定位,以及如何使用 SfM 为自己的数据生成参考位姿。只需下载数据集,即可开始操作!
Aachen – 室外定位
请参阅 pipeline_Aachen.ipynb,其中详细介绍了使用 Aachen 数据集进行定位的步骤。你可以玩转可视化效果,尝试不同的局部特征或匹配器,尽情享受吧!不喜欢笔记本?你也可以直接通过命令行运行所有脚本。
InLoc – 室内定位
笔记本 pipeline_InLoc.ipynb 展示了使用 InLoc 数据集进行定位的步骤。由于无需构建 3D SfM 模型,整个过程更加简单。
从零开始的 SfM 重建
我们在 pipeline_SfM.ipynb 中展示了如何对一组无序图像进行 3D 重建。这将生成参考位姿,以及一个适合与 Aachen 相同流程进行定位的稀疏 3D 模型。
结果
- 支持的局部特征提取器:SuperPoint、DISK、D2-Net、SIFT 和 R2D2。
- 支持的特征匹配器:SuperGlue、其更快的后续版本 LightGlue,以及基于比率测试、距离测试和/或双向检查的最近邻搜索。hloc 还支持使用 LoFTR 进行稠密匹配。
- 支持的图像检索方法:NetVLAD、AP-GeM/DIR、OpenIBL 和 MegaLoc。
使用 NetVLAD 进行检索时,我们获得了以下最佳结果:
| 方法 | 亚琛白天 | 亚琛夜晚 | 检索 |
|---|---|---|---|
| SuperPoint + SuperGlue | 89.6 / 95.4 / 98.8 | 86.7 / 93.9 / 100 | NetVLAD 前50名 |
| SuperPoint + NN | 85.4 / 93.3 / 97.2 | 75.5 / 86.7 / 92.9 | NetVLAD 前30名 |
| D2Net (SS) + NN | 84.6 / 91.4 / 97.1 | 83.7 / 90.8 / 100 | NetVLAD 前30名 |
| 方法 | InLoc DUC1 | InLoc DUC2 | 检索 |
|---|---|---|---|
| SuperPoint + SuperGlue | 46.5 / 65.7 / 78.3 | 52.7 / 72.5 / 79.4 | NetVLAD 前40名 |
| SuperPoint + SuperGlue (时间序列) | 49.0 / 68.7 / 80.8 | 53.4 / 77.1 / 82.4 | NetVLAD 前40名 |
| SuperPoint + NN | 39.9 / 55.6 / 67.2 | 37.4 / 57.3 / 70.2 | NetVLAD 前20名 |
| D2Net (SS) + NN | 39.9 / 57.6 / 67.2 | 36.6 / 53.4 / 61.8 | NetVLAD 前20名 |
更多详细信息和基准数据,请访问 visuallocalization.net/benchmark。
支持的数据集
我们在 hloc/pipelines/ 中提供了脚本,用于在以下数据集上运行重建和定位任务:亚琛昼夜(v1.0 和 v1.1)、InLoc、扩展版 CMU 四季、RobotCar 四季、4Seasons、剑桥地标和 7-Scenes。例如,在按照此处提供的说明下载数据集后,我们可以使用以下命令运行亚琛昼夜数据集的 SuperPoint+SuperGlue 流程:
python -m hloc.pipelines.Aachen.pipeline [--outputs ./outputs/aachen]
BibTex 引用
如果您在论文中报告了上述任何结果,或使用了此处提供的任何工具,请考虑同时引用 Hierarchical Localization 和 SuperGlue 的论文:
@inproceedings{sarlin2019coarse,
title = {从粗到细:大规模下的鲁棒分层定位},
author = {Paul-Edouard Sarlin、Cesar Cadena、Roland Siegwart 和 Marcin Dymczyk},
booktitle = {CVPR},
year = {2019}
}
@inproceedings{sarlin2020superglue,
title = {{SuperGlue}:利用图神经网络学习特征匹配},
author = {Paul-Edouard Sarlin、Daniel DeTone、Tomasz Malisiewicz 和 Andrew Rabinovich},
booktitle = {CVPR},
year = {2020},
}
更进一步
调试与可视化
[点击展开]
每次定位运行都会生成一个 pickle 日志文件。对于每个查询,该文件包含所选的数据库图像、它们的匹配点,以及姿态求解器的相关信息,例如 RANSAC 内点。因此,可以通过解析该文件来收集统计数据,并分析失败模式或困难场景。
我们还在 hloc/visualization.py 中提供了一些可视化工具,用于展示 3D SfM 模型的一些属性,如关键点的可见性、轨迹长度或估计的稀疏深度(如下所示)。
使用您自己的局部特征或匹配器
[点击展开]
如果您的代码基于 PyTorch:只需在 hloc/extractors/ 或 hloc/matchers/ 中添加一个新的接口。该接口需要继承自 hloc.utils.base_model.BaseModel,以数据字典作为输入,并输出预测字典。请参阅 hloc/extractors/superpoint.py 以获取示例。此外,您还可以在 hloc/extract_features.py 或 hloc/match_features.py 中定义标准配置——随后可以直接通过命令行调用。
如果您的代码基于 TensorFlow:您需要修改 hloc/extract_features.py 和 hloc/match_features.py;或者将特征和匹配结果导出为 HDF5 文件,具体说明如下。
在特征文件中,每个键对应于图像相对于数据集根目录的相对路径(例如,亚琛数据集中的 db/1.jpg),并且每个预测都包含一个数据集(如 keypoints 和 descriptors,形状分别为 Nx2 和 DxN)。
在匹配文件中,每个键对应于字符串 path0.replace('/', '-')+'_'+path1.replace('/', '-'),并包含一个名为 matches0 的数据集,形状为 N。它表示第一张图像中的每个关键点在第二张图像中的匹配关键点索引,若未匹配则为 -1。
使用您自己的图像检索方法
[点击展开]
hloc 还提供了一个通过 hloc/extract_features.py 进行图像检索的接口。与之前相同,只需在 hloc/extractors/ 中添加一个新的接口。或者,您也可以将全局描述符导出为 HDF5 文件,其中每个键对应于图像相对于数据集根目录的相对路径,并包含一个大小为 D 的 global_descriptor 数据集。随后,您可以使用 hloc/pairs_from_retrieval.py 导出图像对。
使用已知相机参数进行重建
[点击展开]
如果相机的标定信息已知,例如来自外部标定系统,您可以告知 hloc 使用这些参数,而不是从 EXIF 数据中估计它们。相机模型及其参数的名称由 COLMAP 定义。Python API:
opts = dict(camera_model='SIMPLE_RADIAL', camera_params=','.join(map(str, (f, cx, cy, k))))
model = reconstruction.main(..., image_options=opts)
命令行界面:
python -m hloc.reconstruction [...] --image_options camera_model='"SIMPLE_RADIAL"' camera_params='"256,256,256,0"'
默认情况下,hloc 会在重建过程中优化相机参数。若要禁止此操作,可添加:
reconstruction.main(..., mapper_options=dict(ba_refine_focal_length=False, ba_refine_extra_params=False))
python -m hloc.reconstruction [...] --mapper_options ba_refine_focal_length=False ba_refine_extra_params=False
版本说明
v1.4(2023年7月)
- 新的前端模块
- 全局特征:OpenIBL(https://github.com/cvg/Hierarchical-Localization/pull/164)、CosPlace(https://github.com/cvg/Hierarchical-Localization/pull/257)
- 特征描述子:SOSNet(https://github.com/cvg/Hierarchical-Localization/pull/161)、HardNet(https://github.com/cvg/Hierarchical-Localization/pull/235)
- 检测器与描述子:DISK(https://github.com/cvg/Hierarchical-Localization/pull/233、https://github.com/cvg/Hierarchical-Localization/pull/291)
- 稀疏匹配:AdaLAM(https://github.com/cvg/Hierarchical-Localization/pull/229)、LightGlue(https://github.com/cvg/Hierarchical-Localization/pull/285)
- 密集匹配:LoFTR(https://github.com/cvg/Hierarchical-Localization/pull/173、https://github.com/cvg/Hierarchical-Localization/pull/243、https://github.com/cvg/Hierarchical-Localization/pull/254)
- 三角测量:使用已知相机位姿进行两视图几何验证(https://github.com/cvg/Hierarchical-Localization/pull/178)
- 对 COLMAP 导入和重建选项的控制(https://github.com/cvg/Hierarchical-Localization/pull/210)
- 性能改进
- 更可靠地跳过匹配文件中已存在的点对(https://github.com/cvg/Hierarchical-Localization/pull/159)
- 加快 HDF5 写入速度(https://github.com/cvg/Hierarchical-Localization/pull/194)
- 在 match_features 中实现并行读写(https://github.com/cvg/Hierarchical-Localization/pull/242)
- 为 LaMAR 添加标量检测不确定性(https://github.com/cvg/Hierarchical-Localization/pull/158)
- 文档更新(https://github.com/cvg/Hierarchical-Localization/pull/294)
- 更新依赖项:tqdm>=4.36.0、pycolmap>=0.3.0、kornia>=0.6.11
v1.3(2022年1月)
- Google Colab 中的演示笔记本
- 使用新的 pycolmap Reconstruction 对象和管道 API
- 不再需要安装 COLMAP——仅需 pycolmap 即可
- 更快的模型读取和写入
- 通过
camera_mode参数对相机共享进行细粒度控制 - 支持焦距未知或不准确情况下的定位
- 模块化的定位 API,可控制所有估计器参数
- 使用 plotly 可视化 3D 场景、相机视锥及点云
- hloc 命名空间中的包级日志记录
- 默认将提取的特征存储为 fp16 格式,而非 fp32
- 可选修复 SuperPoint 描述子采样中的长期 bug
- 添加用于计算重建或定位所需穷举点对的脚本
- 需要 pycolmap>=0.1.0 和 Python>=3.7
v1.2(2021年12月)
- 错误修复和易用性改进。
- 支持 PIL 后端进行图像缩放。
- 添加
__version__属性,以便检查未来版本。
v1.1(2021年7月)
- 重大变更:改进了 SfM 文件夹结构(三角测量和重建),详见 #76
- 支持图像检索(NetVLAD、DIR)以及更多局部特征(SIFT、R2D2)
- 支持更多数据集:Aachen v1.1、Extended CMU Seasons、RobotCar Seasons、Cambridge Landmarks、7-Scenes
- 简化了流程和 API
- 空间匹配器
v1.0(2020年7月)
首次公开发布版本。
欢迎贡献!
非常欢迎外部贡献。请遵循 PEP8 编码规范,并使用 flake8 等代码检查工具。以下是一些可能有价值的新增功能列表:
- 支持 GPS(从 EXIF 提取 + 引导式检索)
- InLoc 的共视聚类
- 原始预测结果(特征和匹配)的可视化
- 其他局部特征或图像检索方法
由 Paul-Edouard Sarlin 在众多贡献者的帮助下创建并维护。
版本历史
v1.42023/07/20v1.32022/01/04v1.22022/01/03v1.12021/07/17v1.02021/07/17常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
