纯CPU版DynaSLAM环境配置与避坑指南

发布时间:2026/10/20 3:30:57
纯CPU版DynaSLAM环境配置与避坑指南 1. 为什么还要折腾 DynaSLAM 这套老框架动态场景下的视觉 SLAM 一直是条硬骨头。ORB-SLAM2 在静态环境里跑得挺稳但一旦画面里出现走动的人、晃动的树叶、开过的车特征点匹配就会被这些动态物体带偏位姿估计直接飘掉。DynaSLAM 就是冲着这个痛点来的——它在 ORB-SLAM2 的基础上叠加了动态物体检测与剔除让系统在有人群走动的场景里也能保持定位精度。这套框架最早是配合 Mask R-CNN 做语义分割来识别动态区域的后来又加入了基于多视图几何的动态检测分支。听起来很美但真正上手配置过的人都知道它的环境依赖相当折腾Python 2.7、TensorFlow 1.x、Keras 2.x、OpenCV 3.x、Pangolin、Eigen、DBoW2、g2o……版本之间互相卡脖子稍有不慎就是一堆编译错误糊脸。我这次配置的目标很明确纯 CPU 版本。原因也简单不是每个人都有能跑 CUDA 的显卡而且 Mask R-CNN 在 CPU 上虽然慢但做离线建图或者小规模测试完全够用。这篇文章就把我从零到跑通的完整过程拆开讲包括依赖版本怎么选、编译报错怎么修、CPU 模式下有哪些坑要提前知道。如果你手里只有一台普通笔记本又想跑通 DynaSLAM 看看效果这篇应该能帮你省下不少查 issue 的时间。2. 环境整体设计与依赖选型思路2.1 为什么版本选择比装什么更重要DynaSLAM 这类论文附带代码的项目最大的特点就是依赖版本锁死。它不像现在的开源项目会给你一个 conda environment.yml 或者 Dockerfile原作者写代码时的环境就是唯一能跑通的环境。你如果自作主张升级某个库大概率会在某个不起眼的编译环节炸掉。所以配置这类项目的核心思路不是装最新版而是复现作者当年的环境。我把它拆成三层来看系统层Ubuntu 版本决定了你能用的库版本上限。DynaSLAM 官方推荐 Ubuntu 16.04 或 18.04我实测 18.04 最省心20.04 也能跑但需要额外处理一些库的兼容问题。C 依赖层OpenCV、Pangolin、Eigen、DBoW2、g2o 这些是 ORB-SLAM2 的骨架版本必须和 ORB-SLAM2 的要求对齐。Python 依赖层Mask R-CNN 相关的 TensorFlow、Keras、pycocotools 等这一层是 CPU 版和 GPU 版差异最大的地方。三层之间的关系是系统层定基调C 层保证 SLAM 主体能编译Python 层保证动态检测能跑。任何一层出问题整个系统都跑不起来。2.2 纯 CPU 版和 GPU 版到底差在哪很多人以为 CPU 版就是把 CUDA 去掉那么简单其实不然。差异主要体现在三个地方第一TensorFlow 的安装方式不同。GPU 版需要装 tensorflow-gpu 并匹配 CUDA/cuDNN 版本CPU 版直接装 tensorflow 就行省掉了一大堆驱动匹配的麻烦。但要注意TensorFlow 1.x 的 CPU 版和 GPU 版在 API 上基本一致代码层面不用改。第二Mask R-CNN 的推理速度差一个数量级。这是最直观的感受。GPU 上一帧分割可能几十毫秒CPU 上要几百毫秒甚至更久。这意味着如果你做实时 SLAMCPU 版基本跟不上但做离线建图或者低帧率测试完全能用。第三显存相关的代码要处理。原代码里可能有tf.config或者 session 配置里写死了 GPU 相关的参数CPU 环境下这些要么报错要么警告需要手动注释或改掉。我个人的建议是如果你只是想把 DynaSLAM 跑起来验证效果、做做实验对比CPU 版完全够用而且配置过程比 GPU 版少踩很多坑。真要上实时应用那还是得想办法搞张显卡。2.3 依赖清单与版本对照下面这张表是我实测能跑通的版本组合直接照着装基本不会出问题依赖项版本说明Ubuntu18.0420.04 也可需额外处理CMake3.10系统自带即可GCC/G7.518.04 默认版本OpenCV3.4.5不要用 4.xAPI 有变动Eigen3.3.7头文件库装完即可Pangolinv0.5注意要装对应版本DBoW2随 ORB-SLAM2源码内置g2o随 ORB-SLAM2源码内置Python2.7是的必须是 2.7TensorFlow1.14.0CPU 版Keras2.2.4和 TF 1.14 匹配pycocotools2.0用于 COCO 数据集接口Mask R-CNN源码内置基于 Matterport 版本提示Python 2.7 是这套框架最让人头疼的地方。现在很多系统默认不带 Python 2需要手动装。别想着用 Python 3 替代Mask R-CNN 那部分代码在 Python 3 下会有一堆兼容问题。3. 核心依赖的编译与配置实操3.1 系统基础环境准备先更新系统并装好编译工具链。这一步看起来简单但很多人跳过之后在编译阶段各种缺库sudo apt update sudo apt install -y build-essential cmake git pkg-config sudo apt install -y libgtk2.0-dev libavcodec-dev libavformat-dev sudo apt install -y libswscale-dev libtbb2 libtbb-dev libjpeg-dev sudo apt install -y libpng-dev libtiff-dev libdc1394-22-dev这些库分别是 OpenCV 编译时需要的图像编解码、视频处理、并行计算支持。少装一个OpenCV 编译时就会报 could not find 之类的错误。Python 2.7 的安装要单独说。Ubuntu 18.04 还自带 python2.7但 pip 需要手动装sudo apt install -y python2.7 python2.7-dev python-pip装完之后确认一下版本python2.7 --version pip2 --version如果 pip2 装不上可以用curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py然后python2.7 get-pip.py手动装。3.2 OpenCV 3.4.5 编译要点OpenCV 是整套系统里编译最耗时的部分也是最容易出问题的。我建议源码编译不要用 apt 装因为 apt 的版本和 DynaSLAM 要求对不上。下载 OpenCV 3.4.5 和对应的 contrib 模块git clone -b 3.4.5 https://github.com/opencv/opencv.git git clone -b 3.4.5 https://github.com/opencv/opencv_contrib.git编译配置cd opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPERelease \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH../../opencv_contrib/modules \ -D WITH_CUDAOFF \ -D BUILD_opencv_python2ON \ -D BUILD_opencv_python3OFF \ -D PYTHON2_EXECUTABLE/usr/bin/python2.7 \ .. make -j4 sudo make install几个关键点解释一下WITH_CUDAOFF是 CPU 版必须的否则 CMake 会去找 CUDA 然后报错。BUILD_opencv_python2ON是因为 Mask R-CNN 那部分代码依赖 cv2 的 Python 2 绑定。-j4根据你 CPU 核心数调整核心多可以-j8但别开太大内存不够会崩。编译过程大概 20 到 40 分钟取决于机器性能。装完之后验证pkg-config --modversion opencv应该输出 3.4.5。注意如果你之前装过其他版本的 OpenCV一定要先卸载干净否则会出现版本冲突。用sudo find / -name opencv*检查残留。3.3 Pangolin v0.5 的坑Pangolin 是 ORB-SLAM2 的可视化依赖版本选 v0.5 比较稳。新版 Pangolin 的 API 有变动会导致 ORB-SLAM2 编译失败。git clone -b v0.5 https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j4 sudo make installPangolin 编译时常见的错误是缺libglew-devsudo apt install -y libglew-dev还有一个坑是 Pangolin v0.5 在较新的 GCC 下会有 warning 被当成 error 处理。如果遇到在 CMake 里加-DCMAKE_CXX_FLAGS-w关掉警告。3.4 Eigen 与 DBoW2、g2oEigen 是纯头文件库装起来最简单sudo apt install -y libeigen3-devDBoW2 和 g2o 通常随 ORB-SLAM2 源码一起提供不需要单独装。但如果你用的是独立版本注意 DBoW2 需要 OpenCV 支持g2o 需要 Eigen 支持编译顺序不能乱。DynaSLAM 的源码结构里Thirdparty目录下应该包含 DBoW2 和 g2o。编译主项目时它们会被一起编译。如果这两个目录缺失需要从 ORB-SLAM2 的仓库里拷过来。4. Python 环境与 Mask R-CNN 配置4.1 TensorFlow 1.14 CPU 版安装这是 CPU 版配置的核心环节。TensorFlow 1.14 是最后一个支持 Python 2.7 的 1.x 版本也是和 Keras 2.2.4 匹配最稳的组合。pip2 install tensorflow1.14.0 pip2 install keras2.2.4 pip2 install numpy1.16.4 pip2 install scipy1.2.1 pip2 install pillow6.2.1 pip2 install cython0.29.14这里 numpy 和 scipy 的版本也要锁死。numpy 1.17 以上会和一些老代码不兼容scipy 1.3 以上也有类似问题。装完之后验证python2.7 -c import tensorflow as tf; print(tf.__version__)如果输出 1.14.0 就对了。如果报 ImportError: libcublas.so 之类的错误说明你装成了 GPU 版卸载重装 CPU 版。提示TensorFlow 1.14 在 CPU 上跑的时候会打印一堆 Your CPU supports instructions that this TensorFlow binary was not compiled to use 的警告。这是正常的不影响运行想关掉可以设置环境变量TF_CPP_MIN_LOG_LEVEL2。4.2 pycocotools 与 Mask R-CNN 依赖pycocotools 是 COCO 数据集的 Python 接口Mask R-CNN 用它来加载和处理标注数据pip2 install pycocotools2.0 pip2 install scikit-image0.14.5 pip2 install imgaug0.2.9imgaug 这个库版本也很敏感0.3 以上 API 变了Mask R-CNN 的代码会报错。0.2.9 是实测能用的版本。Mask R-CNN 的源码通常在 DynaSLAM 的mask_rcnn或者类似目录下。它基于 Matterport 的 Mask_RCNN 实现需要单独编译里面的 Cython 扩展cd mask_rcnn python2.7 setup.py build_ext --inplace如果这一步报 cython 相关的错误确认 cython 装好了并且版本是 0.29.x。4.3 模型权重的准备Mask R-CNN 需要一个预训练权重文件才能跑。DynaSLAM 官方会提供一个下载链接通常是基于 COCO 数据集训练的 mask_rcnn_coco.h5 文件。把权重文件放到指定目录后需要在代码里配置路径。一般是在mask_rcnn.py或者配置文件里改MODEL_PATH /path/to/mask_rcnn_coco.h5CPU 模式下加载这个模型会比较慢大概需要几十秒到一分钟耐心等。加载完之后第一次推理也会慢因为要初始化计算图。注意权重文件比较大几百 MB下载的时候确认文件完整。如果加载时报 Unable to open file 或者 truncated说明文件没下完重新下。5. DynaSLAM 主项目编译与运行5.1 源码结构与编译配置DynaSLAM 的源码目录结构大致是这样DynaSLAM/ ├── Examples/ # 运行示例 ├── include/ # 头文件 ├── src/ # 源文件 ├── Thirdparty/ # DBoW2、g2o 等 ├── mask_rcnn/ # Mask R-CNN 相关 └── CMakeLists.txt编译前先检查CMakeLists.txt里的 OpenCV 路径和 Eigen 路径是否正确。如果 OpenCV 装在/usr/local一般不用改如果装在别的地方需要手动指定。编译cd DynaSLAM mkdir build cd build cmake .. make -j4编译过程中可能遇到的错误错误一找不到 OpenCV。检查CMakeLists.txt里的find_package(OpenCV 3.4 REQUIRED)确认版本号和你装的一致。错误二Pangolin 链接错误。通常是 Pangolin 版本不对确认装的是 v0.5。错误三C11 相关错误。在CMakeLists.txt里加set(CMAKE_CXX_STANDARD 11)。5.2 CPU 模式下的代码调整原代码默认是走 GPU 的CPU 模式下需要改几个地方第一TensorFlow session 配置。在 Mask R-CNN 的推理代码里找到创建 session 的地方把 GPU 相关的配置去掉# 原来可能是这样 config tf.ConfigProto() config.gpu_options.allow_growth True session tf.Session(configconfig) # CPU 版改成 session tf.Session()第二动态检测的阈值调整。CPU 版推理慢如果每帧都做分割帧率会低到没法看。实际使用中可以降低检测频率比如每 5 帧做一次分割中间帧沿用上一次的结果。这个需要在代码里加个计数器逻辑。第三可视化相关。如果 Pangolin 显示有问题可以先用无界面模式跑确认 SLAM 主体正常后再开可视化。5.3 运行示例与参数说明DynaSLAM 通常提供几个示例数据集比如 TUM 数据集或者 KITTI 数据集。以 TUM 为例./Examples/RGB-D/rgbd_tum \ ../../Vocabulary/ORBvoc.txt \ ../../Examples/RGB-D/TUM3.yaml \ /path/to/dataset \ /path/to/associations.txt参数含义第一个是 ORB 词袋文件用于回环检测。第二个是相机参数配置文件不同数据集不一样。第三个是数据集路径。第四个是图像关联文件把 RGB 图和深度图按时间戳对应起来。CPU 模式下跑 TUM 数据集帧率大概在 5 到 10 FPS 之间取决于你的 CPU 性能。如果开了 Mask R-CNN 分割帧率会进一步下降。提示第一次跑的时候建议先用小数据集测试确认整个流程通了再上大数据集。不然跑一半报错前面的时间都白费。6. 常见问题与排查技巧实录6.1 编译阶段高频问题速查问题现象可能原因解决方法找不到 OpenCV版本不匹配或路径不对确认装的是 3.4.5检查 CMakeLists 路径Pangolin 链接失败版本不对重装 v0.5Python 2.7 找不到系统未安装apt 安装 python2.7 和 python2.7-devTensorFlow 导入报错装成了 GPU 版卸载重装 CPU 版pycocotools 编译失败缺 Cython 或版本不对装 cython 0.29.xMask R-CNN 加载权重失败文件不完整重新下载权重文件6.2 运行阶段典型故障故障一跑着跑着突然卡死。CPU 版最常见的问题。原因通常是 Mask R-CNN 推理占满了 CPU导致 SLAM 主线程被饿死。解决办法是限制 TensorFlow 的线程数config tf.ConfigProto( intra_op_parallelism_threads2, inter_op_parallelism_threads2 )把线程数限制在 2 到 4 之间给 SLAM 主线程留出 CPU 资源。故障二位姿估计飘得厉害。如果动态物体剔除没生效位姿就会飘。检查 Mask R-CNN 是否真的在跑可以在代码里加日志输出分割结果。另外确认动态检测的阈值设置合理太高会漏检太低会误删静态特征点。故障三回环检测不触发。检查词袋文件路径是否正确以及数据集是否有回环。TUM 数据集里有些序列本身就没有回环跑不出回环是正常的。故障四内存占用越来越高。长时间运行后内存泄漏。这可能是 OpenCV 或者 TensorFlow 的已知问题。缓解办法是定期重启或者用valgrind排查具体泄漏点。6.3 独家避坑经验经验一编译顺序不能乱。一定要先装 OpenCV再装 Pangolin最后编译 DynaSLAM。顺序错了会出现各种链接错误。经验二Python 2.7 的 pip 源要换。官方源对 Python 2.7 的支持已经停了很多包下不下来。换成国内镜像源会快很多pip2 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow1.14.0经验三CPU 版别追求实时。心态要摆正CPU 版就是用来做离线实验的。想实时跑要么上 GPU要么降低分辨率、降低检测频率。经验四备份能跑通的环境。配置一次不容易跑通之后用pip2 freeze requirements.txt把 Python 依赖导出用dpkg --get-selections把系统包导出。下次重装直接照着来省时间。经验五多看 issue 区。DynaSLAM 的 GitHub issue 区里有大量踩坑记录你遇到的问题大概率别人也遇到过。搜关键词比瞎试快得多。7. 性能调优与后续扩展方向7.1 CPU 模式下的性能优化纯 CPU 跑 DynaSLAM性能优化主要从三个方向入手降低图像分辨率。把输入图像缩放到原来的一半Mask R-CNN 的推理时间能减少到四分之一左右。SLAM 主体的特征提取也会快很多。代价是精度会有所下降但做实验对比够用了。减少分割频率。不是每帧都需要做动态检测。可以每 N 帧做一次中间帧用光流或者简单的运动一致性检查来近似。这样能把 Mask R-CNN 的开销摊薄。关闭不必要的可视化。Pangolin 的可视化会占用不少 CPU。做批量实验的时候可以关掉只输出轨迹文件最后统一分析。7.2 从 CPU 到 GPU 的迁移思路如果后面搞到了显卡从 CPU 版迁移到 GPU 版其实不难主要改三个地方把 tensorflow 换成 tensorflow-gpu版本还是 1.14.0。装对应版本的 CUDA 和 cuDNN。TF 1.14 对应 CUDA 10.0 和 cuDNN 7.4。把之前注释掉的 GPU 配置代码恢复。代码层面基本不用大改因为 TensorFlow 的 API 在 CPU 和 GPU 上是一致的。7.3 这套框架还能怎么用DynaSLAM 跑通之后可以基于它做不少扩展换动态检测方法。把 Mask R-CNN 换成更轻量的分割网络比如 MobileNet backbone 的版本能显著提升 CPU 上的速度。结合语义信息做地图构建。动态物体剔除之后剩下的静态特征点可以构建更干净的点云地图。做多传感器融合。在 RGB-D 基础上加入 IMU 数据提升动态场景下的鲁棒性。我在实际配置过程中最大的体会是这类老框架的配置耐心比技术更重要。版本问题、路径问题、编译问题一个个解决下来最后跑通的那一刻还是挺有成就感的。如果你也在折腾 DynaSLAM希望这篇能帮你少走点弯路。遇到卡住的地方先把错误信息完整读一遍大部分答案就在里面。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询