ARTICLE DETAIL

资讯详情

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

openMVG 内置 Ceres Solver:非线性最小二乘优化引擎及其在 BA 中的深度集成

openMVG 内置 Ceres Solver:非线性最小二乘优化引擎及其在 BA 中的深度集成 计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载Ceres Solver 是 openMVG 仓库中内置的核心第三方优化库负责求解大规模非线性最小二乘问题与一般无约束优化问题也是 openMVG 全局/顺序式 SfM 管线中束集调整Bundle Adjustment的实际求解引擎。本文以仓库内 Ceres Solver README 为主线结合 CMake 构建配置 与 openMVG 的 BA 集成源码 展开读完你将掌握 Ceres 的能力边界、openMVG 的定制方式以及它在束集调整中的完整调用链。Ceres Solver 是什么一个求解两类优化问题的 C 库Ceres Solver 是一个开源 C 库用于建模并求解大规模、复杂的优化问题。它是一个功能丰富、成熟且高性能的库自 2010 年起就在 Google 的生产环境中使用。围绕它的完整使用手册存放在ceres-solver.org官网本文档的对应 RST 源为 docs/source/index.rst。Ceres Solver 可以求解两类问题带边界约束的非线性最小二乘问题Non-linear Least Squares problems with bounds constraints——这是 SfM / SLAM 领域最常用的一类重投影误差最小化、位姿图优化、相机标定均属此类一般的无约束优化问题General unconstrained optimization problems——不依赖残差平方和结构的通用目标函数优化。这两类能力分别对应 Ceres 的两套 API 体系面向最小二乘的Problem/Solver残差块 参数块模型与面向一般优化的梯度求解器。openMVG 的束集调整正是建立在第一类能力之上。仓库内版本、许可证与本地定制openMVG 以源码方式内置了 Ceres Solver关键事实记录在 README.openMVG 中上游版本1.13.0对应提交为19333b0f55c8462381038e70d42af43b52941128见 VERSION许可证BSD License完整版权与再分发条款见 CMakeLists.txt 头部及 docs 下的 license 章节本地修改Local modifications使用 minilog 替代 glogCeres 原生依赖 Google Logglog做日志输出openMVG 通过启用MINIGLOG选项编译内置的精简日志实现避免引入额外外部依赖详见 internal/ceres/miniglog移除自动头文件搜索将搜索范围限制在 openMVG 库范围内避免构建时误用系统安装的其他版本头文件保证与 openMVG 的 Eigen 等依赖版本严格一致。这一随包携带 本地定制的做法意味着构建 openMVG 时不需要预先安装 Ceres只要在 CMake 配置阶段启用内部 CeresOpenMVG_USE_INTERNAL_CERESsrc/third_party/CMakeLists.txt 就会通过add_subdirectory(ceres-solver)将其编译为openMVG_ceres目标。构建与配置CMake 选项全景Ceres 的构建完全由 CMakeLists.txt 驱动其中定义了数十个可裁剪的编译选项。理解这些选项有助于在 openMVG 构建时按需开启/关闭能力CMake 选项默认值作用说明MINIGLOGON使用内置精简版 glog 替代外部 Google LogopenMVG 本地定制的核心选项GFLAGSOFF启用 Google Flags命令行参数解析关闭则不会构建测试与工具SUITESPARSEOFF启用 SuiteSparse 稀疏线性代数库性能最优的稀疏求解路径CXSPARSEOFF启用 CXSparse在 openMVG 内会直接复用../cxsparse/Include并链接openMVG_cxsparse库LAPACKON启用 LAPACK/BLAS未找到两者时会自动关闭并追加CERES_NO_LAPACK编译定义EIGENSPARSEON以 Eigen 作为稀疏线性代数库启用后结果受 LGPL 约束因为用到 Eigen 的 Simplicial CholeskyOPENMPON启用 OpenMP 多线程求解失败时退化为CERES_NO_THREADS单线程SCHUR_SPECIALIZATIONSON启用 Schur 补求解器的固定尺寸模板特化可加快求解、增大二进制体积CUSTOM_BLASON使用手写 BLAS 例程通常比 Eigen 默认更快CXX11OFF强制使用 C11 版本的shared_ptr/unordered_map要求客户端也使用 C11BUILD_TESTING/BUILD_DOCUMENTATION/BUILD_EXAMPLESOFF是否构建测试、Sphinx 文档与示例openMVG 集成中均默认关闭需要特别留意两处联动逻辑若SUITESPARSE开启但LAPACK被关闭CMake 会强制把 SuiteSparse 一并关闭LAPACK 是 SuiteSparse 的直接/间接依赖若三个稀疏库SuiteSparse、CXSparse、Eigen Sparse全部不可用Ceres 将无法提供SPARSE_NORMAL_CHOLESKY与SPARSE_SCHUR稀疏线性求解器只能退回到稠密求解路径。此外Release 构建在 GCC/Linux 上会自动追加-marchnative -mtunenative未指定构建类型时默认采用Release见 CMakeLists.txt。openMVG 的第三方库汇总配置见 src/third_party/CMakeLists.txt。在 openMVG 中的实战束集调整的完整调用链Ceres 在 openMVG 中最核心的应用是束集调整Bundle Adjustment封装位于 src/openMVG/sfm/sfm_data_BA_ceres.hpp 与 src/openMVG/sfm/sfm_data_BA_ceres.cpp。残差建模IntrinsicsToCostFunction 工厂Bundle_Adjustment_Ceres::Adjust为每条观测observation构建一个 2 维重投影残差块残差由相机内参、位姿[R|t]与 3D 路标点共同决定。关键入口是工厂函数IntrinsicsToCostFunctionsfm_data_BA_ceres.cpp它根据相机模型类型分派到对应的残差 functorPINHOLE_CAMERA→ResidualErrorFunctor_Pinhole_IntrinsicPINHOLE_CAMERA_RADIAL1/RADIAL3→ 径向畸变 K1 / K3 模型PINHOLE_CAMERA_BROWN→ Brown 模型含切向畸变 T2PINHOLE_CAMERA_FISHEYE→ 鱼眼模型CAMERA_SPHERICAL→ 球面相机模型直接持有 intrinsic 指针残差 functor 的具体实现位于 sfm_data_BA_ceres_camera_functor.hpp所有相机模型类定义见 src/openMVG/cameras。该函数支持可选的残差权重参数默认 0.0 表示不加权用于控制点GCP场景。参数块与子参数化控制哪些量参与优化Adjust中通过problem.AddParameterBlock注册两类参数块位姿参数块将旋转矩阵经ceres::RotationMatrixToAngleAxis转为轴角3 维 平移3 维共 6 个参数内参参数块直接使用各相机模型的getParams()向量。随后根据Optimize_Options决定冻结哪些维度sfm_data_BA_ceres.cppextrinsics_opt NONE整块位姿参数设为常量SetParameterBlockConstantADJUST_TRANSLATION用SubsetManifold/SubsetParameterization冻结轴角 3 维ADJUST_ROTATION冻结平移 3 维。内参参数块同理subsetParameterization由各相机模型自身实现。代码中通过OPENMVG_CERES_HAS_MANIFOLDCERES_VERSION_MAJOR * 100 CERES_VERSION_MINOR 201自动适配新老版本 APICeres 2.1 使用SetManifold/SubsetManifold旧版本使用SetParameterization/SubsetParameterization。稳健代价Huber Loss 与运动先验为降低错误匹配对优化的影响默认启用ceres::HuberLoss(Square(4.0))损失函数bUse_loss_function_默认 true见 sfm_data_BA_ceres.cpp。此外还支持两类特殊约束地面控制点GCPcontrol_point_opt.bUse_control_points开启后带权重的 GCP 观测被加入问题其 3D 点坐标被固定为常量位姿中心先验GPS 先验通过PoseCenterConstraintCostFunctionsfm_data_BA_ceres.cpp构造 3 维残差用ceres::AngleAxisRotatePoint计算相机中心与先验中心之差并配以HuberLoss稳健化优化前还会用Similarity3_Kernel做 LMeds 稳健配准把整个场景搬到先验坐标系改善数值条件。求解器配置BA_Ceres_options 的默认值与降级逻辑BA_Ceres_optionssfm_data_BA_ceres.hpp暴露了全部 Ceres 求解参数其默认值见 sfm_data_BA_ceres.cpp配置项默认值说明nb_threads_1OpenMP 可用时为omp_get_max_threads()求解线程数bmultithreadedfalse强制单线程parameter_tolerance_1e-8参数变化收敛阈值gradient_tolerance_1e-10梯度收敛阈值bUse_loss_function_true是否启用 Huber 损失max_num_iterations_50最大迭代次数max_linear_solver_iterations_500线性求解器最大迭代bCeres_summary_false是否打印summary.FullReport()线性求解器按效率降序自动选择优先SUITE_SPARSESPARSE_SCHUR其次EIGEN_SPARSESPARSE_SCHUR否则退回DENSE_SCHURJACOBI预条件。收敛后通过summary.IsSolutionUsable()判定解是否可用并用AngleAxisToRotationMatrix把轴角转回旋转矩阵写回sfm_dataverbose 模式下还会输出视图数、轨迹数、残差数与初始/最终 RMSE 统计sfm_data_BA_ceres.cpp。生产调用示例openMVG 的可执行程序中main_ComputeStructureFromKnownPoses.cpp 展示了最小调用方式构造Bundle_Adjustment_Ceres::BA_Ceres_options options创建Bundle_Adjustment_Ceres bundle_adjustment_obj(options)再对SfM_Data调用Adjust。在顺序式 SfM 管线sequential_SfM.cpp、全局管线sfm_global_engine_relative_motions.cpp、恒星式管线stellar_solver.cpp以及定位器SfM_Localizer.cpp中均以相同模式使用。开发模式与引用方式开发与代码评审Ceres 的开发发生在 Gerrit 平台含代码托管与评审上游 Gerrit 仓库为ceres-solver.googlesource.com下的 ceres-solverGitHub 上的仓库是持续更新的镜像主要用于issue 跟踪。因此官方 README 明确警告不要在 GitHub 仓库提交 Pull Request详见 README.md。引用规范若在论文中使用了 Ceres Solver官方建议按以下 BibTeX 引用misc{ceres-solver, author Sameer Agarwal and Keir Mierle and Others, title Ceres Solver, howpublished Ceres Solver 官方文档, }小结从 README.md 的概述出发可以清晰地看到 Ceres Solver 在 openMVG 中的完整定位它既是一个独立成熟的开源优化库BSD 许可、Google 生产验证、支持带边界约束的非线性最小二乘与一般无约束优化又是 openMVG 束集调整的发动机——通过Bundle_Adjustment_Ceres完成残差建模、子参数化、稳健损失、先验约束与稀疏/稠密求解器的自动选择。理解其构建选项与集成源码是深入 openMVG SfM 管线和二次开发的基础。赞分享计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载相关推荐openMVG 中的 Ceres Solver 非线性最小二乘求解实战指南openMVG 中的 Ceres Solver 非线性最小二乘求解实战指南 导读 本教程源自 Ceres Solver 官方文档 nnls_tutorial.r计算机视觉科研x64dbg 调试控制命令详解run/go/r/g 释放锁并运行程序x64dbg 调试控制命令详解run/go/r/g 释放锁并运行程序 run/go/r/g 是 x64dbg 中最常用的调试控制命令其核心作用是 释放调试器计算机视觉科研Ceres Solver中的非线性最小二乘问题求解技术详解Ceres Solver中的非线性最小二乘问题求解技术详解 引言非线性最小二乘问题的挑战 在科学计算和工程应用中非线性最小二乘问题Non linear L科学计算高性能计算上一篇Webamp 窗口初始布局配置实战深入解析 windowLayout 选项下一篇如何实现微信聊天记录的永久保存与智能分析WeChatMsg完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表