ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

COLMAP 实用 FAQ 全指南:从特征与相机模型选择到稠密重建调优

COLMAP 实用 FAQ 全指南:从特征与相机模型选择到稠密重建调优 COLMAP 实用 FAQ 全指南从特征与相机模型选择到稠密重建调优【免费下载链接】colmapCOLMAP - Structure-from-Motion and Multi-View Stereo项目地址: https://gitcode.com/GitHub_Trending/co/colmap导读本文是 COLMAP 官方 FAQdoc/faq.rst的完整技术解读与实践扩充覆盖了 COLMAP 使用中最常遇到的问题如何针对不同重建场景和输出质量调整选项、如何选择 SIFT/ALIKED/LoMa 特征提取器、如何选择相机模型、如何复用 OpenCV/Kalibr 的标定结果、如何在增量式/全局式/层次式 SfM 管线之间取舍、如何用 GPS 位姿先验重建、如何从已知位姿重建稀疏/稠密模型、以及如何对稠密重建和光束法平差Bundle Adjustment进行加速与内存调优。读完本文你将能根据自身数据特点快速定位 COLMAP 的最优配置并理解每个关键选项在源码中的实现依据从而获得更高质量、更高效的重建结果。一、针对不同重建场景与输出质量调整选项COLMAP 提供了大量可调选项用于适配不同的重建场景并在精度与完整性和运行效率之间做权衡。默认选项面向中等偏高质量的非结构化输入数据重建而设置。1.1 使用 GUI 预设快速切换质量档位COLMAP 内置了多套针对不同场景与质量级别的选项预设在 GUI 中通过Extras Set options for ...选择。这套预设机制在源码中由 automatic_reconstruction.cc 体现自动重建流程会根据质量档位调用ModifyForLowQuality()、ModifyForMediumQuality()、ModifyForHighQuality()、ModifyForExtremeQuality()等方法来整体调整参数其中核心手段之一是按预设档位缩放max_image_size最大图像尺寸。1.2 在命令行中复现预设配置要在命令行下使用同样的预设操作路径是在 GUI 中选好预设后通过File Save project保存当前选项集用文本编辑器打开生成的.ini项目文件即可查看被预设改动的所有选项后续可直接用该项目文件驱动命令行流程。也可以在命令行直接生成项目文件colmap project_generator \ --project_path $PROJECT_PATH/project.ini \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images生成的项目文件与 GUI 保存的项目文件格式一致便于在团队中共享一套经过验证的参数。二、扩展 COLMAPpycolmap 与自定义 C 程序2.1 用 pycolmap 分析稀疏/稠密重建结果如果你只是需要分析COLMAP 产出的稀疏或稠密重建结果最轻量的方式是使用 Python 绑定 pycolmap 直接加载稀疏模型import pycolmap reconstruction pycolmap.Reconstruction(path/to/sparse/model) print(reconstruction.num_reg_images()) print(reconstruction.num_points3D())pycolmap 的绑定源码位于 src/pycolmap覆盖场景读写、相机模型、估计器、管线等多个子模块可用于结果统计、模型转换与二次处理。2.2 编写基于 COLMAP 库的 C/C 程序如果需要编写构建在 COLMAP 之上的 C/C 可执行程序有两条推荐路径链接 COLMAP 库COLMAP 的公共头文件和库默认安装到CMAKE_INSTALL_PREFIX可按安装文档doc/install.rst中“作为库编译”一节配置你的项目参考示例工程 doc/sample-project/CMakeLists.txt。以example.cc为模板新增内置二进制仓库提供了最小可用的代码模板 src/colmap/tools/example.cc它演示了完整的骨架——初始化 glog、用OptionManager声明必需参数input_path/output_path、解析命令行然后调用Reconstruction::Read/Reconstruction::Write完成一次模型读写。你可以在此基础上直接实现自己的功能并作为 COLMAP 的一个新二进制编译。#include colmap/controllers/option_manager.h #include colmap/scene/reconstruction.h #include colmap/util/logging.h int main(int argc, char** argv) { InitializeGlog(argv); std::filesystem::path input_path; std::filesystem::path output_path; OptionManager options; options.AddRequiredOption(input_path, input_path); options.AddRequiredOption(output_path, output_path); if (!options.Parse(argc, argv)) { return EXIT_FAILURE; } Reconstruction reconstruction; reconstruction.Read(input_path); reconstruction.Write(output_path); return EXIT_SUCCESS; }OptionManager是 COLMAP 所有命令行选项的统一注册与解析入口见 option_manager.cc新增二进制时同样通过它声明参数即可获得与官方工具一致的命令行体验。三、选择特征提取算法SIFT / ALIKED / LoMaCOLMAP 支持三种特征提取算法SIFT默认、ALIKED、LoMa后两者需要 ONNX 支持构建时需开启-DONNX_ENABLEDON。选择指南如下算法适用场景匹配方式依赖SIFT中高视差重叠、纹理充足、光照相近的常规场景GPU/CPU 均可暴力匹配、LightGlue无ALIKED视差重叠有限、纹理稀少、光照剧烈变化的困难场景暴力匹配、LightGlueONNX RuntimeLoMa与 ALIKED 相同的困难场景但搭配专用匹配器用推理成本换取匹配质量暴力匹配或专用 LoMa 匹配器ONNX Runtime要点SIFT是测试最充分、最稳健的选择同时支持 GPU 与 CPU 提取。ALIKED是学习型特征提取器在部分场景下可产出重复性更高的特征尤其适合视差重叠有限、纹理稀少、光照剧烈变化的场景。LoMa同样面向上述困难场景其专用匹配器以更高的推理代价换取更高的匹配质量。LightGlue是基于神经网络的匹配器通常能带来更高的内点率尤其对视角或光照变化较大的图像对SIFT 与 ALIKED 描述子都支持 LightGlue但需要 ONNX 支持。LoMa 描述子则用暴力匹配或专用 LoMa 匹配器。完整选项参见特征提取与匹配文档。切勿在同一数据库中混用不同类型的特征例如 SIFT 与 ALIKED因为描述子互不兼容。从源码看特征类型在自动重建中被映射为具体的提取/匹配类型automatic_reconstruction.cc例如 ALIKED 映射到ALIKED_N16ROT提取器与ALIKED_BRUTEFORCE匹配器LoMa 映射到LOMA_B/LOMA_B128系列。此外ALIKED/LoMa 不支持引导匹配guided matching自动重建会强制将其关闭。四、选择正确的相机模型COLMAP 支持多种参数数量各异的相机模型完整列表见 doc/cameras.rst选择取决于镜头类型与重建需求模型参数适用场景SIMPLE_RADIAL默认1 焦距、1 主点、1 径向畸变参数大多数标准相机的良好起点PINHOLE2 焦距 主点无畸变畸变可忽略的图像如已去畸变图像、高质量工业镜头OPENCV2 焦距、主点、4 个畸变参数2 径向 2 切向中等畸变的广角镜头SIMPLE_RADIAL_FISHEYE/OPENCV_FISHEYE鱼眼模型视场角显著大于 120° 的鱼眼镜头FULL_OPENCV12 参数含 k3–k6仅当大量图像共享内参且需建模复杂畸变时参数多需要大量观测才能可靠收敛经验法则使用能恰当描述镜头的“最简单”模型。参数过多的复杂模型容易导致退化或过拟合的标定尤其在只有少数图像共享内参时。拿不准就从SIMPLE_RADIAL开始并在模型统计信息中检查重投影误差。源码中的模型定义可以佐证参数约定例如 opencv.h 中OPENCV模型明确定义参数串为fx, fy, cx, cy, k1, k2, p1, p2FULL_OPENCV在其基础上扩展k3, k4, k5, k6PINHOLE与SIMPLE_RADIAL分别定义于 pinhole.h 与 radial.h鱼眼模型见 fisheye_radial.h。五、复用 OpenCV / Kalibr 等工具的标定结果如果你已用 OpenCV、Kalibr 等外部工具标定过相机可以将这些内参导入 COLMAP 复用配合“固定内参”一节可在重建期间保持内参不变。但需要先对齐两个约定5.1 像素坐标约定COLMAP 将原点放在图像左上角像素的角点上因此左上角像素中心位于(0.5, 0.5)居中主点为(width / 2, height / 2)。而 OpenCV 和 Kalibr 将整数坐标放在像素中心其居中主点为((width - 1) / 2, (height - 1) / 2)。转换公式为cx_colmap cx_opencv 0.5 cy_colmap cy_opencv 0.5例如一张 800×600 图像在 OpenCV 中的居中主点(399.5, 299.5)转换到 COLMAP 后为(400.0, 300.0)。焦距fx、fy与畸变系数不受此偏移影响。5.2 畸变参数顺序COLMAP 的OPENCV模型与 OpenCV 使用相同的k1, k2, p1, p2畸变参数FULL_OPENCV额外按序使用k3, k4, k5, k6见 doc/cameras.rst。上例在cameras.txt中对应的相机行如下1 OPENCV 800 600 fx fy 400.0 300.0 k1 k2 p1 p2六、选择 SfM 管线增量式 / 全局式 / 层次式COLMAP 提供三条 SfM 管线增量式 mappermapper默认逐张递增地加入图像完成重建。这是最稳健、测试最充分的管线但在大图像集上可能较慢反复的光束法平差常成为瓶颈可用 GPU 版 Caspar 后端大幅加速见“加速光束法平差”一节。全局式 mapperglobal_mapper通过旋转平均与全局定位同时求解所有相机位姿。在匹配图良好的大数据集上更快但对匹配中的外点可能不够稳健。全局 mapper 依赖良好的焦距先验若没有可靠内参建议在运行global_mapper之前先运行view_graph_calibrator从视图图估计内参可选但推荐可提升全局 SfM 质量。注意view_graph_calibrator会就地修改数据库建议在副本上操作。层次式 mapperhierarchical_mapper将场景划分为重叠的子模型分别重建后再合并。适用于增量式过慢的超大规模数据集但通常不如另外两条管线稳健。三者均可通过automatic_reconstructor选择--mapper INCREMENTAL、--mapper GLOBAL或--mapper HIERARCHICAL。全局 mapper 的大量选项如GlobalMapper.min_num_matches、GlobalMapper.mapper.global_positioning.*、GlobalMapper.mapper.bundle_adjustment.*等在 option_manager.cc 中注册。七、带位姿先验GPS的重建如果图像 EXIF 中含有 GPS 信息COLMAP 会在特征提取阶段自动将其提取并存为数据库中的位姿先验。之后可用pose_prior_mapper在重建中使用这些先验colmap feature_extractor \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images colmap exhaustive_matcher \ --database_path $PROJECT_PATH/database.db colmap pose_prior_mapper \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --output_path $PROJECT_PATH/sparsepose_prior_mapper本质上是开启位姿位置约束的增量式 mapper。可用--overwrite_priors_covariance覆盖先验的协方差不确定性新协方差由--prior_position_std_x、--prior_position_std_y、--prior_position_std_z构建默认各 1.0 米。如需对已经重建完成的模型做地理配准不依赖重建期间使用先验见下文“地理配准”一节。八、内参共享与设置已知内参8.1 共享内参COLMAP 支持为任意图像组与相机模型共享内参只要图像在数据库中引用了相同的camera_id它们就共享同一套内参。可在数据库管理工具中添加新相机并设置共享内参详见数据库管理文档。8.2 设置已知内参若相机标定已知推荐在特征提取阶段通过ImageReader选项提供colmap feature_extractor \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --ImageReader.single_camera 1 \ --ImageReader.camera_model OPENCV \ --ImageReader.camera_params fx,fy,cx,cy,k1,k2,p1,p2参数必须按所选相机模型定义的顺序以逗号分隔提供见 doc/cameras.rst。GUI 中对应设置位于Processing Feature extraction Custom parameters。若所有图像由同一物理相机以相同设置拍摄使用--ImageReader.single_camera 1使它们共享数据库中的一个相机参见“共享内参”。8.3 修改已有数据库的内参不要手工编辑 SQLite 表——相机参数以双精度二进制 blob 存储。应使用 pycolmap 的数据库 APIimport pycolmap with pycolmap.Database.open(path/to/database.db) as db: camera db.read_camera(1) camera.params [fx, fy, cx, cy, k1, k2, p1, p2] camera.has_prior_focal_length True db.update_camera(camera)注意默认情况下这些参数在光束法平差中仍会被精化。要在重建期间保持固定见下一节。九、固定内参与主点精化9.1 固定内参默认情况下COLMAP 会在重建中自动精化相机内参主点除外。通常当数据集图像足够多且多张图像共享内参时SfM 估计出的内参反而优于手动标定板的结果。但自标定偶尔会收敛到退化参数——尤其是含较多畸变参数的复杂相机模型。如果你已知标定参数可在重建期间固定不同的参数组在 GUI 中进入Reconstruction Reconstruction options Bundle Adj. refine_*勾选决定哪些参数组参与精化、哪些保持恒定。即便重建期间保持参数恒定仍可在最终全局光束法平差中精化它们设置Reconstruction Bundle adj. options refine_*后运行Reconstruction Bundle adjustment。9.2 主点精化默认情况下 COLMAP 在重建中保持主点恒定因为主点估计通常是一个不适定问题。当所有图像重建完成、且多张图像共享内参时问题通常已足够受约束可以尝试在全局光束法平差中精化主点。十、增加匹配数量与稀疏 3D 点数量要增加匹配数量建议使用判别力更强的DSP-SIFT特征替代普通 SIFT并估计仿射特征形状--SiftExtraction.estimate_affine_shapetrue --SiftExtraction.domain_size_poolingtrue这两个选项在 sift.h 中定义开启后会改变特征提取路径sift.cc 与 extractor.cc。开启引导匹配--FeatureMatching.guided_matchingtrue关于稀疏 3D 点数量默认情况下 COLMAP 在三角化时忽略两视图特征轨迹导致 3D 点少于理论可能值。在稀疏图像集中三角化两视图轨迹有时能通过提供额外约束改善稳定性。取消勾选Reconstruction Reconstruction options Triangulation ignore_two_view_tracks即可启用。若图像相对场景拍摄距离很远可尝试降低最小三角化角。十一、从已知相机位姿重建稀疏/稠密模型若相机位姿已知想重建场景的稀疏或稠密模型需先手动构造一个稀疏模型新建文件夹放入cameras.txt、images.txt、points3D.txt三个文件── path/to/manually/created/sparse/model │ ── cameras.txt │ ── images.txt │ ── points3D.txtpoints3D.txt应保持为空images.txt的隔行也留空稀疏特征将由后续步骤计算。稀疏模型文件结构详见输出格式文档。images.txt示例1 0.695104 0.718385 -0.024566 0.012285 -0.046895 0.005253 -0.199664 1 image0001.png # 确保隔行留空 2 0.696445 0.717090 -0.023185 0.014441 -0.041213 0.001928 -0.134851 2 image0002.png 3 0.697457 0.715925 -0.025383 0.018967 -0.054056 0.008579 -0.378221 1 image0003.png 4 0.698777 0.714625 -0.023996 0.021129 -0.048184 0.004529 -0.313427 2 image0004.png每张图像的image_id第一列必须与数据库中一致下一步用到。可在 GUI 的Database management Processing中查看数据库或用 colmap 重建后导出文本查看它生成的images.txt以核对 id 对应关系。11.1 重建稀疏模型首先从已知位姿的图像重新计算特征colmap feature_extractor \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images如果已知内参畸变系数较大建议先把cameras.txt中的参数手动复制到数据库可用 pycolmap 数据库 API 修改使匹配器能利用内参否则可跳过该步继续colmap exhaustive_matcher \ # 或其他任意匹配器 --database_path $PROJECT_PATH/database.db colmap point_triangulator \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --input_path path/to/manually/created/sparse/model \ --output_path path/to/triangulated/sparse/model11.2 从已知位姿计算稠密模型计算稠密模型并不必须先做稀疏重建。假设已得到三角化后的稀疏模型稠密重建流程为colmap image_undistorter \ --image_path $PROJECT_PATH/images \ --input_path path/to/triangulated/sparse/model \ --output_path path/to/dense/workspace colmap patch_match_stereo \ --workspace_path path/to/dense/workspace colmap stereo_fusion \ --workspace_path path/to/dense/workspace \ --output_path path/to/dense/workspace/fused.ply也可以完全不用稀疏模型colmap image_undistorter \ --image_path $PROJECT_PATH/images \ --input_path path/to/manually/created/sparse/model \ --output_path path/to/dense/workspace由于稠密立体阶段依赖稀疏点云自动选择相邻图像此时必须手动指定源图像见下文“手动指定稠密重建源图像”并手动指定深度范围。此外这种场景下stereo_fusion若保持min_num_pixels默认值大于 1将无法成功匹配点因此需要显式设置colmap patch_match_stereo \ --workspace_path path/to/dense/workspace \ --PatchMatchStereo.depth_min $MIN_DEPTH \ --PatchMatchStereo.depth_max $MAX_DEPTH colmap stereo_fusion \ --workspace_path path/to/dense/workspace \ --StereoFusion.min_num_pixels 1 \ --output_path path/to/dense/workspace/fused.ply十二、合并断开的模型有时 COLMAP 无法把全部图像重建进同一个模型产出多个子模型。若这些子模型存在共同的已注册图像可在后处理阶段合并colmap model_merger \ --input_path1 /path/to/sub-model1 \ --input_path2 /path/to/sub-model2 \ --output_path /path/to/merged-model为提升两个子模型间的对齐质量建议合并后再运行一次全局光束法平差colmap bundle_adjuster \ --input_path /path/to/merged-model \ --output_path /path/to/refined-merged-model十三、地理配准与 Manhattan 世界对齐13.1 地理配准Geo-registration为模型提供部分或全部已注册图像的相机中心 3D 位置即可进行地理配准系统根据这些对应关系估计重建模型与目标坐标框架之间的3D 相似变换。配准坐标可来自数据库tvec_prior字段或用户指定的文本文件。文本文件格式如下image_name1.jpg X1 Y1 Z1 image_name2.jpg X2 Y2 Z2 image_name3.jpg X3 Y3 Z3 ...坐标可以是 GPSlat/lon/alt或笛卡尔x/y/z。GPS 坐标会被转换为笛卡尔坐标可转换为ECEF地心地固或ENU东-北-上坐标使用 ENU 时第一张图像的 GPS 坐标定义 ENU 原点也可先用 ECEF 对齐再将重建结果旋转到 ENU 平面。注意至少需要指定3 张图像才能估计 3D 相似变换。然后执行colmap model_aligner \ --input_path /path/to/model \ --output_path /path/to/geo-registered-model \ --ref_images_path /path/to/text-file (或 --database_path /path/to/database.db) \ --ref_is_gps 1 \ --alignment_type ecef \ --alignment_max_error 3.0 (3.0 为 RANSAC 中使用的误差阈值)3D 相似变换用RANSAC估计以抵抗数据中的外点因此必须提供 RANSAC 误差阈值。13.2 Manhattan 世界对齐COLMAP 支持基于 Manhattan 世界假设对齐重建的坐标轴通过图像中的消失点检测自动确定重力轴与 Manhattan 世界的主水平轴。详见model_orientation_aligner命令。十四、掩膜图像区域与图像方向 EXIF14.1 掩膜图像区域COLMAP 支持在特征提取期间以两种方式掩膜关键点按图掩膜mask_path指向掩膜文件夹。给定图像image_path/abc/012.jpg其掩膜路径必须为mask_path/abc/012.jpg.png——即相对根目录的子路径保持一致文件名相同仅追加.png扩展名。单图掩膜camera_mask_path指向一张掩膜图应用于所有图像。两种方式下掩膜图像中黑色区域灰度像素强度为 0不会提取任何特征。14.2 图像方向与 EXIFCOLMAP 在特征提取时自动读取图像的 EXIF 方向标签将其转换为传感器坐标系中的重力方向向量作为位姿先验的一部分存入数据库。该重力信息在特征提取与匹配阶段用于提升对图像旋转的鲁棒性——这对方向不变性有限的特征提取器/匹配器如 ALIKED、LightGlue、LoMa至关重要。十五、将新图像注册/定位到现有重建若已有一个重建模型想把新图像注册/定位进去可按以下步骤colmap feature_extractor \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --image_list_path /path/to/image-list.txt colmap vocab_tree_matcher \ --database_path $PROJECT_PATH/database.db \ --VocabTreeMatching.match_list_path /path/to/image-list.txt colmap image_registrator \ --database_path $PROJECT_PATH/database.db \ --input_path /path/to/existing-model \ --output_path /path/to/model-with-new-images colmap bundle_adjuster \ --input_path /path/to/model-with-new-images \ --output_path /path/to/model-with-new-images流程为先为新图像提取特征再与数据库中的现有图像匹配最后注册进模型。image-list.txt每行一个图像文件名用于限定要提取与匹配的图像最后的光束法平差可选。15.1 需要三角化的更精确注册如果希望注册更精确带三角化应重启或继续重建流程而非仅注册图像。用mapper替代image_registrator从现有模型继续colmap mapper \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --input_path /path/to/existing-model \ --output_path /path/to/model-with-new-images或从零开始重建colmap mapper \ --database_path $PROJECT_PATH/database.db \ --image_path $PROJECT_PATH/images \ --output_path /path/to/model-with-new-images注意运行mapper或bundle_adjuster后模型的坐标框架可能发生变化稠密重建必须从头重新运行。十六、无 GPU 环境与多 GPU 并行16.1 无 CUDA GPU 时的可用功能若没有 CUDA 显卡但有其他 GPU除稠密重建外所有功能均可使用稠密重建可改用外部软件替代见教程。若 GPU 算力较低或需要在无显示器、无 CUDA 的机器上运行可全部在 CPU 上执行--FeatureExtraction.use_gpufalse注意 CPU 执行可能显著拖慢重建管线且 CPU 特征提取在默认设置下对大图像可能消耗过多 RAM建议手动降低最大图像尺寸--FeatureExtraction.max_image_size --SiftExtraction.first_octave 0 --FeatureExtraction.num_threads16.2 特征提取/匹配的多 GPU 支持可通过指定多个 CUDA GPU 索引并行运行--FeatureExtraction.gpu_index0,1,2,3 --FeatureMatching.gpu_index0,1,2,3即同时在 4 块 GPU 上并行执行特征提取/匹配。注意每块 GPU 只能运行一个线程这通常也是性能最优配置。默认情况下 COLMAP 每块 CUDA GPU 运行一个特征提取/匹配线程通常优于同一 GPU 上跑多线程。十七、特征匹配失败非法内存访问若匹配时出现如下错误MultiplyDescriptor: an illegal memory access was encountered或ERROR: Feature matching failed. This probably caused by insufficient GPU memory. Consider reducing the maximum number of features.说明 GPU 显存不足。尝试调小--FeatureMatching.max_num_matches直到错误消失。注意这可能导致匹配质量下降低尺度输入特征会被截断以适配显存。替代方案是改用 CPU 匹配可能很慢或换更大显存的 GPU。最大 GPU 显存需求可用公式近似估算SIFT4 * num_matches * num_matches 4 * num_matches * 256例如--FeatureMatching.max_num_matches 10000时最大显存需求约为 400MB——且仅当某张图像确实拥有这么多特征时才会分配。十八、加速光束法平差BA以下是减少 BA 运行时的实用手段。18.1 减小问题规模让 BA 求解更小的问题减少特征调小--SiftExtraction.max_image_size和/或--SiftExtraction.max_num_features。减少匹配对尽量不用exhaustive_matcher调小--SequentialMatching.overlap、--SpatialMatching.max_num_neighbors或--VocabTreeMatching.num_images。减少匹配数调小--FeatureMatching.max_num_matches。启用实验性的地标剪枝剔除冗余 3D 点--Mapper.ba_global_ignore_redundant_points3D 1。18.2 利用 GPU 加速开启基于 GPU 的 Ceres 求解器mapper用--Mapper.ba_use_gpu 1独立bundle_adjuster用--BundleAdjustmentCeres.use_gpu 1。相关控制参数仅当图像数超过--BundleAdjustmentCeres.min_num_images_gpu_solver时才激活 GPU 求解器。用--BundleAdjustmentCeres.max_num_images_direct_dense_gpu_solver和--BundleAdjustmentCeres.max_num_images_direct_sparse_gpu_solver在稠密直接、稀疏直接、迭代稀疏三种 GPU 求解器间切换。注意在 Ceres 2.3 正式发布前COLMAP 官方带 CUDA 的二进制不附带 ceres[cuda]要使用 GPU 求解器必须自行编译带 CUDA/cuDSS 支持的 Ceres 并链接到 COLMAP。提示当 Schur 补矩阵稀疏度下降fill-in 增多时基于 Schur 的稀疏求解器cuDSS可能出现 GPU 利用率偏低常见诱因包括高图像共视性和共享相机内参。18.3 使用 Caspar GPU BA 后端COLMAP 内置Caspar——实验性的 GPU 加速 BA 后端对中大规模问题可比 Ceres CUDA 求解器快一至两个数量级对增量式 mapper 尤其显著。Caspar 需要 CUDA默认关闭构建时需配置-DCASPAR_ENABLEDON。通过 BA 的backend选项选择接受CERES默认或CASPAR独立bundle_adjuster--BundleAdjustment.backend CASPAR。增量式mapper--Mapper.ba_local_backend CASPAR和/或--Mapper.ba_global_backend CASPARGPU 设备用--Mapper.ba_gpu_index选择。独立后端的求解行为与 GPU 设备可用--BundleAdjustmentCaspar.*选项调优例如--BundleAdjustmentCaspar.gpu_index默认-1自动选择最佳 CUDA 设备。注意Caspar 目前为实验性仅支持SIMPLE_RADIAL和PINHOLE两种相机模型使用其他模型的观测会被跳过不支持位姿先验不支持为非参考 rig 传感器精化sensor_from_rig并要求refine_focal_length与refine_extra_params取值一致。global_mapper不提供 Caspar 后端选择器。18.4 其他实用技巧改善初始条件调优观测过滤参数让 BA 收到更多内点、更少外点或提供准确先验内参、位姿。尽量固定或限制参数精化例如内参已知时保持固定减少优化变量数。减少 LM 迭代次数或放宽收敛容差用少量精度换运行时--Mapper.ba_global_max_num_iterations、--Mapper.ba_global_function_tolerance。降低昂贵全局 BA 的执行频率--Mapper.ba_global_frames_freq、--Mapper.ba_global_points_freq、--Mapper.ba_global_frames_ratio、--Mapper.ba_global_points_ratio。十九、稠密重建的完整性与精度权衡若稠密点云外点和噪声过多尝试增大--StereoFusion.min_num_pixels。Poisson 重建的网格没有表面或外点表面过多时调小--PoissonMeshing.trim以减少表面积反之调大。同时可考虑按上文减少外点或提升融合阶段的完整性。Delaunay 重建的网格表面过噪或不完整时增大--DelaunayMeshing.quality_regularization以获得更平滑的表面网格分辨率过粗时将--DelaunayMeshing.max_proj_dist调小。二十、弱纹理表面的稠密重建改进对弱纹理表面以下设置可能有帮助提高输入图像分辨率--PatchMatchStereo.max_image_size。增大补丁窗口半径--PatchMatchStereo.window_radius。降低光度一致性代价的滤波阈值--PatchMatchStereo.filter_min_ncc。二十一、表面网格重建算法选择COLMAP 支持三种表面重建算法Poisson 表面重建通常要求输入点云几乎无外点存在外点或大空洞时易产生劣质表面。Delaunay 三角化网格对外点更稳健、对大数据集通常更可扩展但表面一般不如 Poisson 平滑可同时用于稀疏与稠密重建结果。推进前沿表面重建Advancing front从输入点的 Delaunay 三角化逐步生长表面网格支持基于可见性的过滤以剔除违反自由空间约束的面片并支持大规模场景的分块并行处理使用 float32 CGAL 内核以节省内存。作为后处理可用 Laplacian 平滑例如 Meshlab 中的实现提升表面平滑度。组合用法可先运行 Delaunay 网格化稳健地过滤稀疏/稠密点云中的外点再用 Poisson 表面重建获得平滑表面。网格化后可用mesh_texturer生成带纹理图集的纹理网格根据投影面积与视角为每个网格面分配最优视角的相机图像并将纹理烘焙到带逐面 UV 坐标的图集中。该命令要求输入image_undistorter产生的去畸变工作空间。二十二、加速稠密重建多种方式可加速稠密重建增加 GPU 数量立体重建阶段可利用多 GPU增加内存并尽量调大--PatchMatchStereo.cache_size、--StereoFusion.cache_size以加速融合步骤。关闭几何一致性立体重建--PatchMatchStereo.geom_consistency false此时务必开启--PatchMatchStereo.filter true。调小--PatchMatchStereo.max_image_size、--StereoFusion.max_image_size在较低的最大图像分辨率上执行稠密重建。减少每张参考图像考虑的源图像数量见下文“手动指定稠密重建源图像”。将补丁窗口步长--PatchMatchStereo.window_step增到 2。调小补丁窗口半径--PatchMatchStereo.window_radius。减少补丁匹配迭代次数--PatchMatchStereo.num_iterations。减少采样视图数--PatchMatchStereo.num_samples。对超大规模重建可用 CMVS 将场景划分为多个簇并剪除冗余图像见下文“减少稠密重建内存占用”。注意除升级硬件外上述改动可能降低稠密重建质量。取消立体重建进程后重启不会丢失进度已处理的视图会被跳过。二十三、减少稠密重建内存占用23.1 GPU 显存不足patch match stereo 显存不足时可调小--PatchMatchStereo.max_image_size或将stereo/patch-match.cfg中的源图像数从__auto__, 30改为__auto__, 10。注意开启geom_consistency会增加 GPU 显存需求。23.2 CPU 内存不足立体或融合阶段 CPU 内存不足时可调小以 GB 计的--PatchMatchStereo.cache_size或--StereoFusion.cache_size或调小--PatchMatchStereo.max_image_size、--StereoFusion.max_image_size。注意值过小会导致处理极慢并加重硬盘负载。23.3 大规模场景用 CMVS 分簇对数千张图像的大规模重建建议用 CMVS 将稀疏重建拆分为更易管理的图像簇同时可剪除观测同一场景元素的冗余图像。此场景下 COLMAP 稠密重建管线在命令行执行时也支持 PMVS/CMVS 目录结构参见工作空间中的示例 shell 脚本只有输出类型设为 PMVS 时才会生成这些脚本。由于 CMVS 产生的簇重叠度高建议把默认的每簇 100 张图像按系统资源与速度需求尽量调大——例如cmvs pmvs/ 500将每簇限制为 500 张图像。若只想用 CMVS 剪除冗余图像而不分簇将该数字设为一个非常大的值即可。二十四、手动指定稠密重建源图像在stereo/patch-match.cfg文件中可将源图像数从__auto__, 30改为__auto__, 10——此时会自动选择视觉重叠最大的图像作为源图像也可用__all__使用所有其他图像。还可按图像名手动指定例如image1.jpg image2.jpg, image3.jpg image2.jpg image1.jpg, image3.jpg image3.jpg image1.jpg, image2.jpg这里image2.jpg和image3.jpg被用作image1.jpg的源图像依此类推。二十五、稠密重建的多 GPU 支持可通过指定多个 CUDA GPU 索引并行运行稠密重建--PatchMatchStereo.gpu_index0,1,2,3即在 4 块 GPU 上并行执行稠密重建。也可在同一 GPU 上运行多个稠密重建线程重复指定同一索引--PatchMatchStereo.gpu_index0,0,1,1,2,3默认情况下 COLMAP 每块 CUDA GPU 运行一个稠密重建线程。二十六、修复稠密重建中的 GPU 冻结与超时立体重建管线基于 CUDA 在 GPU 上运行会让 GPU 处于高负载状态可能出现显示冻结甚至程序崩溃。解决方案使用副 GPU让副 GPU 不连接显示器并显式指定 GPU 索引通常索引 0 对应连接显示器的显卡。增大系统 GPU 超时详见下文。Windows 下增大 TDR 超时默认 Windows 会检测 GPU 响应问题通过重置显卡恢复桌面并中止立体重建。解决方法是调大“Timeout Detection Recovery”TDR延迟参考 NVIDIA Nsight 与 Microsoft 文档。可用以下注册表项[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers] TdrLeveldword:00000001 TdrDelaydword:00000120以管理员身份在cmd.exe或powershell.exe中执行reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrLevel /t REG_DWORD /d 00000001 reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrDelay /t REG_DWORD /d 00000120之后重启机器使改动生效。Linux/Unix 下X window 系统也会检测 GPU 响应问题最简方案是关闭 X 并从命令行运行立体重建。Ubuntu 下sudo service lightdm stop然后从命令行运行colmap patch_match_stereo ...完成后重启桌面环境sudo service lightdm start若改动后稠密重建仍然崩溃原因很可能是 GPU 显存不足见前文相关条目。结语COLMAP 的选项体系庞大但逻辑清晰特征与匹配决定输入质量相机模型决定标定自由度的合理性SfM 管线决定鲁棒性与扩展性的取舍而BA 与稠密重建的各类开关则直接决定最终模型的精度、完整性与资源开销。建议从默认配置出发结合本文各节的诊断线索重投影误差、匹配数量、显存/内存占用、GPU 超时等逐项调优所有关键选项的底层实现都可以在本仓库源码如 option_manager.cc、automatic_reconstruction.cc、sift.h、sensor/models中进一步查证做到知其然亦知其所以然。【免费下载链接】colmapCOLMAP - Structure-from-Motion and Multi-View Stereo项目地址: https://gitcode.com/GitHub_Trending/co/colmap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表