pixel-perfect-sfm
pixel-perfect-sfm 是一款专为提升三维重建精度而设计的开源框架,曾荣获 ICCV 2021 最佳学生论文奖。它主要解决了传统运动恢复结构(SfM)和视觉定位中,因特征点提取不够精准而导致重建模型存在误差的问题。
该工具的核心亮点在于引入了“特征度量细化”技术。它利用预训练的深度学习网络提取密集图像特征,通过两个关键步骤优化结果:首先在重建前联合调整匹配的二维关键点,随后在重建后进一步优化三维点云和相机姿态。这种方法能显著减少重投影误差,即使在光照变化大或纹理重复等挑战性场景下,也能实现像素级的高精度重建与定位。
pixel-perfect-sfm 非常适合计算机视觉研究人员、三维重建开发者以及需要高精度地图数据的工程师使用。它并非面向普通大众的消费级软件,而是作为强大的底层算法库,能够无缝集成到主流的 COLMAP 流程和 hloc 工具箱中。用户既可以用来从头构建高精度的新场景模型,也能对现有的 COLMAP 模型进行二次优化,或在大规模场景中实现鲁棒的视觉定位。虽然其核心优化基于 C++ 以保证效率,但提供了便捷的 Python 接口,支持在 GPU 加速下进行特征提取,是追求极致重建质量的专业首选方案。
使用场景
某自动驾驶团队正在利用车载摄像头采集的城市街道数据,构建用于高精度定位的三维地图模型。
没有 pixel-perfect-sfm 时
- 特征点定位粗糙:传统 SIFT 算法仅能精确到像素级别,导致关键路口或纹理重复区域的匹配点存在亚像素级偏差。
- 重建轨迹漂移:在长距离行驶或弱纹理墙面场景中,累积误差致使相机轨迹发生明显漂移,3D 点云出现重影或分层。
- 定位精度受限:由于地图本身不够精准,车辆在进行视觉重定位时,位姿估计误差往往超过安全阈值,难以满足自动泊车需求。
- 细节丢失严重:精细的道路标线、路沿石等几何结构在重建过程中变得模糊,无法支撑厘米级的导航任务。
使用 pixel-perfect-sfm 后
- 亚像素级特征优化:利用深度特征的度量一致性,将关键点坐标细化至亚像素精度,显著提升了匹配质量。
- 消除轨迹漂移:通过特征度量的光束法平差(Bundle Adjustment),有效修正了相机姿态和 3D 点位置,即使在挑战性光照下也能保持轨迹平滑稳定。
- 定位鲁棒性增强:基于更精准的地图模型,车辆在复杂城市场景中的重定位误差大幅降低,成功实现了厘米级定位。
- 几何结构清晰还原:道路标线和建筑边缘等细微结构被锐利重构,生成的稠密点云可直接用于高精地图生产。
pixel-perfect-sfm 通过引入深度特征直接对齐技术,将传统的三维重建与视觉定位精度推向了像素级的新高度。
运行环境要求
- Linux
- macOS
强烈建议使用 GPU 进行密集特征提取(其他步骤仅支持 CPU),具体型号、显存大小及 CUDA 版本未说明
未说明(但在处理大场景时建议配置低内存模式或使用缓存文件)
快速开始
像素级精确的运动恢复结构
ICCV 2021 最佳学生论文奖
我们提出了一种框架,通过直接对齐深度特征来精炼关键点、相机位姿和3D点,从而提升运动恢复结构(SfM)和视觉定位的精度。相关工作发表在我们的论文中:
- Pixel-Perfect Structure-from-Motion with Featuremetric Refinement
- 作者:Philipp Lindenberger*, Paul-Edouard Sarlin*, Viktor Larsson 和 Marc Pollefeys
- 官网:psarlin.com/pixsfm(视频、幻灯片、海报)
在此我们提供 pixsfm Python 包,可与 COLMAP 和 我们的工具箱 hloc 配合使用。这使得用户能够轻松地精炼现有的 COLMAP 模型,或利用最先进的图像匹配技术重建新数据集。此外,我们的框架还能在复杂条件下提升视觉定位性能。
该精炼过程分为两个步骤:
- 关键点调整: 在 SfM 之前,联合优化所有相互匹配的 2D 关键点。
- 光束法平差: 在 SfM 之后,精炼 3D 点和相机位姿。
在每一步中,我们通过最小化特征度量代价来优化多视图下密集深度特征的一致性。这些特征预先使用预训练的 CNN 从图像中提取。
借助 pixsfm,您可以:
- 使用 hloc 从头开始或基于给定的相机位姿重建并精炼场景;
- 使用 hloc 对新的查询图像进行定位并精炼;
- 在 COLMAP 数据库或 3D 模型上运行关键点或光束法平差;
- 在 ETH3D 数据集上用新的密集或稀疏特征评估精炼效果。
我们的实现通过精心管理内存,并在可能的情况下利用并行计算和 SIMD 向量化,从而能够扩展到大规模场景。
安装
pixsfm 需要 Python >=3.6、GCC >=6.1 以及从源码编译安装的 COLMAP 3.8。核心优化部分由 C++ 实现,依赖于 Ceres >= 2.1,但我们提供了粒度精细的 Python 绑定。代码专为 UNIX 系统编写,尚未在 Windows 上测试过。其余依赖项列于 requirements.txt 中,包括 PyTorch >=1.7 以及从源码构建的 pycolmap 和 pyceres:
# 按照 colmap.github.io/install.html#build-from-source 编译安装 COLMAP 3.8
sudo apt-get install libhdf5-dev
git clone https://github.com/cvg/pixel-perfect-sfm --recursive
cd pixel-perfect-sfm
pip install -r requirements.txt
若需通过 COLMAP 使用除 SIFT 外的其他局部特征,还需安装 hloc:
git clone --recursive https://github.com/cvg/Hierarchical-Localization/
cd Hierarchical-Localization/
pip install -e .
最后构建并安装 pixsfm 包:
pip install -e . # 以开发模式安装 pixsfm
我们强烈建议在执行密集特征提取时使用 GPU,而其他步骤则仅能在 CPU 上运行。如果遇到编译错误或运行时崩溃?或者希望将代码库作为 C++ 库使用?请查看我们的 FAQ。
教程
Jupyter 笔记本 demo.ipynb 展示了一个最小化的使用示例。它演示了如何运行运动恢复结构及精炼流程、如何对齐和比较不同的 3D 模型,以及如何对额外的查询图像进行定位并精炼。
运动恢复结构
使用 hloc 的端到端 SfM
给定由 hloc 计算并存储在 HDF5 文件中的关键点和匹配关系,我们可以通过 Python 脚本运行像素级精确的 SfM:
from pixsfm.refine_hloc import PixSfM
refiner = PixSfM()
model, debug_outputs = refiner.reconstruction(
工作目录路径,
图像目录路径,
图像对列表路径,
关键点文件路径.h5,
匹配文件路径.h5,
)
# model 是一个 pycolmap.Reconstruction 3D 模型
或者通过命令行:
python -m pixsfm.refine_hloc reconstructor \
--sfm_dir 工作目录路径 \
--image_dir 图像目录路径 \
--pairs_path 图像对列表路径 \
--features_path 关键点文件路径.h5 \
--matches_path 匹配文件路径.h5
请注意:
- 在两种情况下,最终精炼后的 3D 模型都会被写入
工作目录路径。 - 密集特征会自动提取(在可用时使用 GPU),默认使用预训练的 CNN S2DNet。
- 结果
debug_outputs包含密集特征和优化统计信息。
配置
我们通过 OmegaConf 配置对所有超参数进行了细粒度控制,其合理默认值定义在 PixSfM.default_conf 中。有关主要配置项及其默认值的详细说明,请参阅 详细配置。
[点击查看一些示例]
例如,默认情况下密集特征会存储在内存中。如果重建的是大型场景或 RAM 较少,则应将其写入缓存文件,并按需加载。通过 Python API,我们可以传递配置更新:
refiner = PixSfM(conf={"dense_features": {"use_cache": True}})
或者等效地使用命令行,通过 dotlist:
python -m pixsfm.refine_hloc reconstructor [...] dense_features.use_cache=true
我们还在 pixsfm/configs/ 目录中提供了涵盖主要用例的即用型配置模板。例如,pixsfm/configs/low_memory.yaml 可降低内存消耗,以便处理大型场景,使用方法如下:
refiner = PixSfM(conf="low_memory")
# 或
python -m pixsfm.refine_hloc reconstructor [...] --config low_memory
从已知相机位姿进行三角测量
[点击展开]
如果相机位姿已知,我们可以直接从现有的参考 COLMAP 模型中三角测量出 3D 点云,命令如下:
model, _ = refiner.triangulation(..., path_to_reference_model, ...)
或者
python -m pixsfm.refine_hloc triangulator [...] \
--reference_sfm_model path_to_reference_model
默认情况下,相机位姿和内参会通过光束法平差进行优化。若希望保持它们不变,只需覆盖相应的选项即可:
conf = {"BA": {"optimizer": {
"refine_focal_length": False,
"refine_extra_params": False, # 畸变参数
"refine_extrinsics": False, # 相机位姿
}}}
refiner = PixSfM(conf=conf)
refiner.triangulation(...)
或者等价地:
python -m pixsfm.refine_hloc triangulator [...] \
'BA.optimizer={refine_focal_length: false, refine_extra_params: false, refine_extrinsics: false}'
特征点调整
精炼的第一步是特征点调整(KA)。它仅在 SfM 之前对试探性匹配中的特征点进行优化。下面展示如何单独运行这一步骤。
[点击展开]
若要精炼存储在 hloc HDF5 特征文件中的特征点:
from pixsfm.refine_hloc import PixSfM
refiner = PixSfM()
keypoints, _, _ = refiner.refine_keypoints(
path_to_output_keypoints.h5,
path_to_input_keypoints.h5,
path_to_list_of_image_pairs,
path_to_matches.h5,
path_to_image_dir,
)
若要精炼存储在 COLMAP 数据库中的特征点:
from pixsfm.refine_colmap import PixSfM
refiner = PixSfM()
keypoints, _, _ = refiner.refine_keypoints_from_db(
path_to_output_database, # 若为原地精炼,传入 path_to_input_database
path_to_input_database,
path_to_image_dir,
)
无论哪种情况,都有对应的命令行接口。
光束法平差
精炼的第二项贡献是光束法平差(BA)。下面展示如何单独运行它来精炼现有的 COLMAP 3D 模型。
[点击展开]
若要精炼存储在文件中的 3D 模型:
from pixsfm.refine_colmap import PixSfM
refiner = PixSfM()
model, _, _, = refiner.refine_reconstruction(
path_to_input_model,
path_to_output_model,
path_to_image_dir,
)
使用命令行接口:
python -m pixsfm.refine_colmap bundle_adjuster \
--input_path path_to_input_model \
--output_path path_to_output_model \
--image_dir path_to_image_dir
视觉定位
在估计单张图像的相机位姿时,我们也可以在 PnP+RANSAC 之前和之后分别运行特征点调整和光束法平差。这需要为参考模型的每一张观测图像附上参考特征点,这些特征点可以通过多种方式计算。
[点击了解如何定位单张图像]
- 若要从头重新计算参考特征点,需传入参考图像的路径:
from pixsfm.localization import QueryLocalizer
localizer = QueryLocalizer(
reference_model, # pycolmap.Reconstruction 3D 模型
image_dir=path_to_reference_image_dir,
dense_features=cache_path, # 可选:缓存到文件以供后续重用
)
pose_dict = localizer.localize(
pnp_points2D # 具有有效 3D 对应关系的特征点 (N, 2)
pnp_point3D_ids, # 重建中对应 3D 点的 ID
query_camera, # pycolmap.Camera
image_path=path_to_query_image,
)
if pose_dict["success"]:
# 查询图像相对于世界坐标系的四元数和平移向量
qvec, tvec = pose_dict["qvec"], pose_dict["tvec"]
默认的定位配置可通过 QueryLocalizer.default_conf 获取。
- 或者,如果在像素级精度的 SfM 过程中已经计算了密集的参考特征点,则更高效的做法是直接复用这些特征点:
refiner = PixSfM()
model, outputs = refiner.reconstruction(...)
features = outputs["feature_manager"]
# 或者手动加载特征点
features = pixsfm.extract.load_features_from_cache(
refiner.resolve_cache_path(output_dir=path_to_output_sfm)
)
localizer = QueryLocalizer(
reference_model, # pycolmap.Reconstruction 3D 模型
dense_features=features,
)
我们还可以批量定位多个查询,其效果与 hloc.localize_sfm 类似:
pixsfm.localize.main(
dense_features, # FeatureManager 或缓存文件路径
reference_model, # pycolmap.Reconstruction 3D 模型
path_to_query_list,
path_to_image_dir,
path_to_image_pairs,
path_to_keypoints,
path_to_matches,
path_to_output_results,
config=config, # 可选字典
)
示例:建图与定位
下面我们演示如何在 Aachen Day-Night v1.1 数据集上运行 featuremetric 流水线。首先,请按照 此处的说明 下载数据集。然后运行 python examples/sfm+loc_aachen.py,该脚本将使用 SuperPoint+SuperGlue 完成建图和定位。由于场景较大,包含超过 7000 张图像,我们需要缓存密集的特征块,因此大约需要 350GB 的可用磁盘空间。稀疏特征匹配预计在近期的 GPU 上需要数小时。此外,在 examples/refine_sift_aachen.py 中,我们还展示了如何从现有的 COLMAP 数据库开始处理。
评估
我们可以使用 ETH3D 数据集来评估像素级精度的 SfM 以及相机位姿估计的准确性。更多细节请参阅论文。
首先,我们使用 python -m pixsfm.eval.eth3d.download 下载数据集,默认保存到 ./datasets/ETH3D/。
3D三角测量
[点击展开]
我们首先需要安装 ETH3D多视图评估工具:
sudo apt install libpcl-dev # 仅限 Linux
git clone git@github.com:ETH3D/multi-view-evaluation.git
cd multi-view-evaluation && mkdir build && cd build
cmake .. && make -j
然后,我们可以评估使用Pixel-Perfect SfM三角测量得到的稀疏3D点云的精度,例如在带有SuperPoint关键点的庭院场景上:
python -m pixsfm.eval.eth3d.triangulation \
--scenes courtyard \
--methods superpoint \
--tag pixsfm
- 省略
--scenes和--methods可以运行所有场景和所有特征检测器。 - 结果默认会写入
./outputs/ETH3D/ - 使用
--tag some_run_name来区分不同的运行。 - 添加
--config norefine来关闭任何优化,或者使用 dotlistKA.apply=false BA.apply=false - 添加
--config photometric来运行光度BA(不进行关键帧选择)。
为了汇总结果并比较不同运行,例如有无优化的情况,我们运行:
python -m pixsfm.eval.eth3d.plot_triangulation \
--scenes courtyard \
--methods superpoint \
--tags pixsfm raw
在所有场景和所有检测器上运行应该会得到如下结果(±1%):
----场景---- -关键点- -标签-- -X cm处精度- 完整性 @ X cm
1.0 2.0 5.0 1.0 2.0 5.0
----------------------------------------------------------------------
室内 sift raw 75.95 85.50 92.88 0.21 0.88 3.65
pixsfm 83.16 89.94 94.94 0.25 0.96 3.77
superpoint raw 78.96 87.77 94.55 0.64 2.36 9.39
pixsfm 89.93 94.09 97.04 0.76 2.62 9.85
r2d2 raw 67.91 80.25 90.45 0.55 2.12 8.85
pixsfm 81.09 87.78 93.41 0.67 2.32 9.04
----------------------------------------------------------------------
室外 sift raw 57.70 72.90 86.41 0.06 0.34 2.46
pixsfm 68.10 80.57 91.59 0.08 0.42 2.75
superpoint raw 53.63 68.93 83.27 0.11 0.64 4.43
pixsfm 71.83 82.65 92.06 0.18 0.89 5.40
r2d2 raw 49.33 66.21 83.37 0.11 0.55 3.62
pixsfm 67.94 81.02 91.68 0.16 0.71 3.99
本次评估的结果可能与论文中报告的数字有所不同。然而,趋势是相似的,论文中的结论仍然成立。这种差异是由于 pixsfm 代码的改进以及 SuperPoint 实现的变化:我们最初使用的是 PatchFlow 的设置,后来切换到了 hloc,hloc 性能更好且更容易安装。
相机位姿估计
[点击展开]
同样地,我们评估基于从其他视角三角测量得到的稀疏3D模型的相机位姿估计精度:
python -m pixsfm.eval.eth3d.localization --tag pixsfm
再次强调,我们也可以只针对部分场景或关键点检测器进行运行。为了汇总结果并比较不同运行,例如有无关键帧选择和光束法平差的情况,我们运行:
python -m pixsfm.eval.eth3d.plot_localization --tags pixsfm raw
随后我们应该会得到如下表格和图表(±2%):
|
SIFT(黑色)、SuperPoint(红色)、R2D2(绿色) |
对于0.1cm阈值的结果可能会因环境配置不同而有所变化,因此可能与论文中报告的数字存在差异。这可能是由于PyTorch和COLMAP依赖库的更新所致。我们正在调查这个问题,欢迎任何帮助!
高级用法
详细配置
下面我们解释用于映射和定位的主要配置项及其默认值:
[点击展开]
dense_features: # 精细化特征
model: # 提取特征的 CNN
name: s2dnet # 定义在 pixsfm/features/models/ 中的模型名称
num_layers: 1 # 输出层的数量(模型特定参数)
device: auto # CPU、CUDA 或根据 CUDA 是否可用自动选择
max_edge: 1600 # 将图像缩放,使最长边达到此值
resize: LANCZOS # 图像缩放时使用的插值算法
pyr_scales: [1.0] # 在多个尺度上提取的特征进行拼接
fast_image_load: false # 对大图像进行近似缩放
l2_normalize: true # 是否对特征进行归一化,使其具有单位范数
sparse: true # 是否存储稀疏的特征块而非完整的特征图
patch_size: 8 # 如果是稀疏存储,特征块的大小
dtype: half # 存储特征时的数据类型,半精度浮点或双精度
use_cache: false # 是否将特征缓存到文件中,还是保留在内存中
overwrite_cache: false # 如果缓存文件已存在,是否覆盖
cache_format: chunked
interpolation:
nodes: [[0.0, 0.0]] # 用于计算代价的网格,默认为单个点
mode: BICUBIC # 插值算法
l2_normalize: true
ncc_normalize: false # 仅当 nodes 的数量大于 1 时有效,主要用于光度一致性
mapping: # pixsfm.refine_colmap.PixSfM
dense_features: ${..dense_features}
KA: # 特征点调整
apply: true # 是否执行,否则跳过
strategy: featuremetric # 常规策略,或 alternatively topological_reference(速度更快)
interpolation: ${...interpolation} # 可以为 KA 使用不同的插值方法
level_indices: null # 可以优化部分层级,默认为全部
split_in_subproblems: true # 并行化优化过程
max_kps_per_problem: 50 # 并行化参数,数值越小越节省内存,若为 -1 则较为保守
optimizer: # 优化问题及求解
loss:
name: cauchy # 损失函数名称,可选 {huber, soft_l1, ...}
params: [0.25] # 损失函数特定参数
solver:
function_tolerance: 0.0
gradient_tolerance: 0.0
parameter_tolerance: 1.0e-05
minimizer_progress_to_stdout: false # 不显示进度条
max_num_iterations: 100 # 最大优化迭代次数
max_linear_solver_iterations: 200
max_num_consecutive_invalid_steps: 10
max_consecutive_nonmonotonic_steps: 10
use_inner_iterations: false
use_nonmonotonic_steps: false
num_threads: 1
root_regularize_weight: -1 # 通过向根节点添加边来防止漂移,若为 -1 则禁用
print_summary: false # 是否在完成时打印详细摘要
bound: 4.0 # 相对于初始值的距离约束(以像素为单位)
num_threads: -1 # 若分批并行化,则线程数
BA: # Bundle Adjustment
apply: true # 是否执行,否则跳过
strategy: feature_reference # 常规策略,或 alternatively {costmaps, patch_warp}
interpolation: ${...interpolation} # 可以为 BA 使用不同的插值方法
level_indices: null # 可以优化部分层级,默认为全部
max_tracks_per_problem: 10 # 参考点/代价图的并行化,数值越小越节省内存
num_threads: -1
optimizer:
loss: # 配置与 KA.optimizer.loss 相同
solver: # 配置与 KA.optimizer.solver 相同
print_summary: false
refine_focal_length: true # 是否优化焦距
refine_principal_point: false # 是否优化主点
refine_extra_params: true # 是否优化畸变参数
refine_extrinsics: true # 是否优化相机位姿
references: # 若策略为 feature_reference
loss: # 计算鲁棒均值时需要最小化的量
name: cauchy
params: [0.25]
iters: 100 # 计算鲁棒均值的迭代次数
num_threads: -1
repeats: 1
localization: # pixsfm.localization.main.QueryLocalizer
dense_features: ${..dense_features}
target_reference: nearest # 如何选择参考点,可选 {nearest, robust_mean, all_observations}
overwrite_features_sparse: null # 仅在查询定位时覆盖 dense_features.sparse
references: # 如何计算参考点
loss: # 计算鲁棒均值时需要最小化的量,与 BA.references.loss 相同
iters: 100
keep_observations: true # 对于 target_reference 中的 {nearest, all_observations} 是必需的
num_threads: -1
max_tracks_per_problem: 50 # 参考点的并行化,数值越小越节省内存
unique_inliers: min_error # 如何为每个 3D 点选择唯一的匹配点
QKA: # 查询特征点调整
apply: true # 是否执行,否则跳过
interpolation: ${...interpolation}
level_indices: null
feature_inlier_thresh: -1 # 丢弃特征误差较高的点,若为 -1 则禁用
stack_correspondences: False # 将相同特征点的参考堆叠在一起
optimizer:
loss: # 配置与 KA.optimizer.loss 相同
name: trivial # L2 损失,无鲁棒性
params: []
solver: # 配置与 KA.optimizer.solver 相同
print_summary: false
bound: 4.0 # 相对于初始值的距离约束(以像素为单位)
PnP:
estimation: # pycolmap.absolute_pose_estimation
ransac:
max_error: 12 # 内点阈值,以像素为单位的重投影误差
estimate_focal_length: false # 若焦距未知
refinement: # pycolmap.absolute_pose_estimation 中的精炼步骤
refine_focal_length: false
refine_extra_params: false
QBA: # 查询 Bundle Adjuster
apply: true # 是否执行,否则跳过
interpolation: ${...interpolation}
level_indices: null
optimizer:
loss: # 配置与 KA.optimizer.loss 相同
solver: # 配置与 KA.optimizer.solver 相同
print_summary: false
refine_focal_length: false
refine_principal_point: false
refine_extra_params: false
请注意,该配置通过 omegaconf 支持 变量插值。
大规模优化
在处理大型场景或大量图像时,内存通常是瓶颈。配置文件 low_memory 展示了如何通过牺牲一定的精度和速度来降低内存消耗。
[点击展开]
主要改进包括:
dense_features- 以稀疏块形式存储:
sparse=true - 减小块的大小:
patch_size=8(或更小) - 存储到缓存文件中:
use_cache=true
- 以稀疏块形式存储:
KA- 将优化过程分块,每次只加载部分特征:
split_in_subproblems=true - 每个分块最多优化约50个关键点:
max_kps_per_problem=50
- 将优化过程分块,每次只加载部分特征:
BA- 使用代价图近似:
strategy=costmaps(详见论文C节)
- 使用代价图近似:
当运行时间受限时,还可以通过仅针对每条轨迹的拓扑中心优化代价来缩短KA的运行时间,方法是设置 KA.strategy=topological_reference。
噪声较大的关键点
[点击展开]
一些输出分辨率较低的关键点检测器,如D2-Net,预测的关键点定位不够准确。在这种情况下,精炼非常有益,但默认参数并不理想。需要增大补丁尺寸并使用多层特征。示例配置见 pixsfm_eth3d_d2net,用于在ETH3D数据集上评估D2-Net。
扩展pixsfm
- 若要精炼您自己的稀疏关键点或匹配器,请参阅hloc中的使用自定义局部特征或匹配器。
- 若要添加不同的稠密特征,可参考使用自定义稠密特征。
- 关于稠密特征的访问和存储方式的说明,请参阅doc/features.md。
- 关于
pixsfm内部机制的描述,请参阅设计原则。
您对pixsfm仍有疑问吗?文档中的任何内容是否不够清晰?或者不确定它是否适合您的应用场景?请通过提交问题告诉我们!
贡献
我们欢迎外部贡献,尤其是以下方面的改进:
- 使
pixsfm能够在Windows上运行 - 训练并集成更紧凑、维度更少的稠密特征
- 构建
pixsfm和pycolmap的conda包,从而无需从源码安装COLMAP - 添加使用
pyceres构建featuremetric问题的示例
BibTex引用
如果您使用了本仓库中的任何代码或论文中提出的思想,请考虑引用我们的工作:
@inproceedings{lindenberger2021pixsfm,
author = {Philipp Lindenberger and
Paul-Edouard Sarlin and
Viktor Larsson and
Marc Pollefeys},
title = {{Pixel-Perfect Structure-from-Motion with Featuremetric Refinement}},
booktitle = {ICCV},
year = {2021},
}
版本历史
v1.02023/05/16常见问题
相似工具推荐
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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
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 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器