首先致谢本科直博的大神,感谢大神手把手教我安装Dynaslam,大神的知乎链接Dynaslam配置排坑
直接开门见山吧,配置过程如下:(本人的环境 ubunto18.04 、python2.7 、tensorflow-cpu)
首先准备需要的源码文件包:
一:
1.Dynaslam(注意版本务必跟我的一样):
git clone https://github.com/BertaBescos/DynaSLAM.git
2.准备opencv2.4.11
git clone https://github.com/opencv/opencv.git
3.准备coco数据集
git clone https://github.com/waleedka/coco.git
4.准备pangolin(编译dynaslam的orbslam部分需要,避免后期再次下载)
git clone https://github.com/stevenlovegrove/Pangolin.git
5.准备mask_rcnn_coco.h5下载地址mask_rcnn_coco.h5(这玩意下载贼曼,大家可以自己去找资源)
6.准备tensorflow1.12.3版本(对应的keras为2.0.9)(直接复制链接到浏览器进行下载)
https://pypi.tuna.tsinghua.edu.cn/packages/84/db/5ba3fa1dedc0cdf02fc7cb19592a52974cff8cdbbf788c172b68d5371bc3/tensorflow-1.12.3-cp27-cp27mu-manylinux1_x86_64.whl (83.1MB)
然后直接通过pip的方式进行安装,没有pip的先行安装pip
sudo pip install tensorflow-1.12.3-cp27-cp27mu-manylinux1_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/
注意:
上述安装注意你是把tensorflow的包放置在哪个路径下
7.需要源码编译的就准备到这里了,其余相关依赖应该可以直接使用sudo apt-get install 进行安装
二、进行编译安装了
1.在我们进行tensorflow的安装之后首先安装keras命令如下:
sudo pip install keras==2.0.9 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.进行Dynaslam python的检查工作
1)首先进入coco/PythonAPI
cd coco/PythonAPI
执行命令
sudo make install
执行sudo make install 可能会报ImportError: No module named Cython.Build 的错误
解决方案如下:
pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install fasttext -i https://pypi.tuna.tsinghua.edu.cn/simple/
然后重新sudo make install 即可
2)将编译好的pycocotools(在coco/PythonAPI/中)放置到我们下载好的Dynaslam的src/python目录下,然后将数据集mask_rcnn_coco.h5放置在Dynaslam的src/python目录下,这时候src/python目录是这样的
3)打开Check.py 文件将17行的
ROOT_DIR = "src/python"
改为
ROOT_DIR = "./"#测试之后可以重新改过来,改不改问题不大
4)执行
python Check.py #以此检验python部分是否有错误
5)运行第四步的时候必然会报错,原因是缺少依赖,这个时候只需要安装对应的包即可,需要大家有一些调试能力,(不知道如何安装缺失的包,百度或者谷歌均可以)(比如缺失 python-tk package)可以执行以下命令
sudo apt-get install python-tk #(python2),如果安装不成功,自行百度,有解决方案
sudo apt-get install python3-tk #(python3)
6)至此解决完依赖问题,你会看到运行python Check.py 的结果如下:
s@s:~/DynaSLAM-bbescos-feature-carla/src/python$ python Check.py
Using TensorFlow backend.
2020-04-25 15:00:12.757225: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Initializing Mask RCNN network...
./
WARNING:tensorflow:From /home/s/.local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py:1204: calling reduce_max (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.
Instructions for updating:
keep_dims is deprecated, use keepdims instead
WARNING:tensorflow:From /home/s/.local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py:1238: calling reduce_sum (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.
Instructions for updating:
keep_dims is deprecated, use keepdims instead
Initialated Mask RCNN network...
Mask R-CNN is correctly working
说明python相关的问题就解决了
2.进行c++部分的编译工作首先进行是opencv的编译
首先安装相关的依赖代码如下:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libopenexr-dev libdc1394-22-dev
执行第三句代码的时候会报错-------出现错误errorE: unable to locate libjasper-dev(这里你可以自行百度解决,也可以直接忽略,进行接下来的步骤)
cd opencv #cd的路径是你自己的,不要错了
cmake -D WITH_FFMPEG=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF ..
make之前首先进行如下的工作(最好不要用make -j4直接make吧虽然慢点):(或者opencv 视你的文件名而定)
***找到opencv-2.4.9/build/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make删掉-Werror=address
***将OpenCVDetectCXXCompiler.cmake的内容替换为如下
# ----------------------------------------------------------------------------
# Detect Microsoft compiler:
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
if(CMAKE_CL_64)
set(MSVC64 1)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_COMPILER_IS_GNUCXX 1)
set(CMAKE_COMPILER_IS_CLANGCXX 1)
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(CMAKE_COMPILER_IS_GNUCC 1)
set(CMAKE_COMPILER_IS_CLANGCC 1)
endif()
if("${CMAKE_CXX_COMPILER};${CMAKE_C_COMPILER}" MATCHES "ccache")
set(CMAKE_COMPILER_IS_CCACHE 1)
endif()
# ----------------------------------------------------------------------------
# Detect Intel ICC compiler -- for -fPIC in 3rdparty ( UNIX ONLY ):
# see include/opencv/cxtypes.h file for related ICC & CV_ICC defines.
# NOTE: The system needs to determine if the '-fPIC' option needs to be added
# for the 3rdparty static libs being compiled. The CMakeLists.txt files
# in 3rdparty use the CV_ICC definition being set here to determine if
# the -fPIC flag should be used.
# ----------------------------------------------------------------------------
if(UNIX)
if (__ICL)
set(CV_ICC __ICL)
elseif(__ICC)
set(CV_ICC __ICC)
elseif(__ECL)
set(CV_ICC __ECL)
elseif(__ECC)
set(CV_ICC __ECC)
elseif(__INTEL_COMPILER)
set(CV_ICC __INTEL_COMPILER)
elseif(CMAKE_C_COMPILER MATCHES "icc")
set(CV_ICC icc_matches_c_compiler)
endif()
endif()
if(MSVC AND CMAKE_C_COMPILER MATCHES "icc|icl")
set(CV_ICC __INTEL_COMPILER_FOR_WINDOWS)
endif()
# ----------------------------------------------------------------------------
# Detect GNU version:
# ----------------------------------------------------------------------------
if(CMAKE_COMPILER_IS_CLANGCXX)
set(CMAKE_GCC_REGEX_VERSION "4.2.1")
set(CMAKE_OPENCV_GCC_VERSION_MAJOR 4)
set(CMAKE_OPENCV_GCC_VERSION_MINOR 2)
set(CMAKE_OPENCV_GCC_VERSION 42)
set(CMAKE_OPENCV_GCC_VERSION_NUM 402)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -v
ERROR_VARIABLE CMAKE_OPENCV_CLANG_VERSION_FULL
ERROR_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "version.*$" CMAKE_OPENCV_CLANG_VERSION_FULL "${CMAKE_OPENCV_CLANG_VERSION_FULL}")
string(REGEX MATCH "[0-9]+\\.[0-9]+" CMAKE_CLANG_REGEX_VERSION "${CMAKE_OPENCV_CLANG_VERSION_FULL}")
elseif(CMAKE_COMPILER_IS_GNUCXX)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
OUTPUT_VARIABLE CMAKE_OPENCV_GCC_VERSION_FULL
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -v
ERROR_VARIABLE CMAKE_OPENCV_GCC_INFO_FULL
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Typical output in CMAKE_OPENCV_GCC_VERSION_FULL: "c+//0 (whatever) 4.2.3 (...)"
# Look for the version number, major.minor.build
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
if(NOT CMAKE_GCC_REGEX_VERSION)#major.minor
string(REGEX MATCH "[0-9]+\\.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
endif()
if(CMAKE_GCC_REGEX_VERSION)
# Split the parts:
string(REGEX MATCHALL "[0-9]+" CMAKE_OPENCV_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}")
list(GET CMAKE_OPENCV_GCC_VERSIONS 0 CMAKE_OPENCV_GCC_VERSION_MAJOR)
list(GET CMAKE_OPENCV_GCC_VERSIONS 1 CMAKE_OPENCV_GCC_VERSION_MINOR)
else()#compiler returned just the major version number
string(REGEX MATCH "[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
if(NOT CMAKE_GCC_REGEX_VERSION)#compiler did not return anything reasonable
set(CMAKE_GCC_REGEX_VERSION "0")
message(WARNING "GCC version not detected!")
endif()
set(CMAKE_OPENCV_GCC_VERSION_MAJOR ${CMAKE_GCC_REGEX_VERSION})
set(CMAKE_OPENCV_GCC_VERSION_MINOR 0)
endif()
set(CMAKE_OPENCV_GCC_VERSION ${CMAKE_OPENCV_GCC_VERSION_MAJOR}${CMAKE_OPENCV_GCC_VERSION_MINOR})
math(EXPR CMAKE_OPENCV_GCC_VERSION_NUM "${CMAKE_OPENCV_GCC_VERSION_MAJOR}*100 + ${CMAKE_OPENCV_GCC_VERSION_MINOR}")
message(STATUS "Detected version of GNU GCC: ${CMAKE_OPENCV_GCC_VERSION} (${CMAKE_OPENCV_GCC_VERSION_NUM})")
if(WIN32)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
OUTPUT_VARIABLE OPENCV_GCC_TARGET_MACHINE
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(OPENCV_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
set(MINGW64 1)
endif()
endif()
endif()
if(MSVC64 OR MINGW64)
set(X86_64 1)
elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
set(X86 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
set(X86_64 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*")
set(X86 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
set(ARM 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
set(AARCH64 1)
endif()
# Workaround for 32-bit operating systems on 64-bit x86_64 processor
if(X86_64 AND CMAKE_SIZEOF_VOID_P EQUAL 4 AND NOT FORCE_X86_64)
message(STATUS "sizeof(void) = 4 on x86 / x86_64 processor. Assume 32-bit compilation mode (X86=1)")
unset(X86_64)
set(X86 1)
endif()
# Similar code exists in OpenCVConfig.cmake
if(NOT DEFINED OpenCV_STATIC)
# look for global setting
if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
set(OpenCV_STATIC OFF)
else()
set(OpenCV_STATIC ON)
endif()
endif()
if(MSVC)
if(CMAKE_CL_64)
set(OpenCV_ARCH x64)
elseif((CMAKE_GENERATOR MATCHES "ARM") OR ("${arch_hint}" STREQUAL "ARM") OR (CMAKE_VS_EFFECTIVE_PLATFORMS MATCHES "ARM|arm"))
# see Modules/CmakeGenericSystem.cmake
set(OpenCV_ARCH ARM)
else()
set(OpenCV_ARCH x86)
endif()
if(MSVC_VERSION EQUAL 1400)
set(OpenCV_RUNTIME vc8)
elseif(MSVC_VERSION EQUAL 1500)
set(OpenCV_RUNTIME vc9)
elseif(MSVC_VERSION EQUAL 1600)
set(OpenCV_RUNTIME vc10)
elseif(MSVC_VERSION EQUAL 1700)
set(OpenCV_RUNTIME vc11)
elseif(MSVC_VERSION EQUAL 1800)
set(OpenCV_RUNTIME vc12)
elseif(MSVC_VERSION EQUAL 1900)
set(OpenCV_RUNTIME vc14)
elseif(MSVC_VERSION EQUAL 1910)
set(OpenCV_RUNTIME vc15)
endif()
elseif(MINGW)
set(OpenCV_RUNTIME mingw)
if(MINGW64)
set(OpenCV_ARCH x64)
else()
set(OpenCV_ARCH x86)
endif()
endif()
然后就可以愉快的make了:
make #或者make -j2 (不可以j4)
最后:
sudo make install
3.opencv编译完事开始eigen3的安装,一句话搞定:
sudo apt-get install libeigen3-dev
4.然后编译安装pangolin
sudo apt install libgl1-mesa-dev
sudo apt install libglew-dev
sudo apt install cmake #这个你已经安装过了应该
然后:
cd Pangolin
mkdir build
cd build
cmake ..
make -j4
5.安装boot库
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev #这个命令不一定正确,大家可以先忽略这一步,后续根据报错信息进行安装缺失的依赖
sudo apt-get install libboost-all-dev #或者根据这个命令安装boost库
6.修改有错误的文件:
***进入Dynaslam的src中viewer.cc中,按Ctrl+F查找imshow,我们可以看到2个imshow,而且调用之前没有判断,会在某些情况导致程序终止。我们将两句话依次对应替换即可(其实就是先if(!image.empty())判断一下)
//cv::imshow("DynaSLAM: Current Frame",im);//原版的代码
//下面是我自己替换的版本
if(!im.empty())
{
cv::imshow("DynaSLAM: Current Frame",im);
}
cv::Mat im_dyn = mpFrameDrawer->GetDynamicFrame();
//cv::imshow("DynaSLAM: Dynamic Frame", im_dyn);原版的代码
//下面是我自己替换的版本
if(!im_dyn.empty())
{
cv::imshow("DynaSLAM: Dynamic Frame", im_dyn);
}
7.将Dynaslam根目录中的CMakeLists.txt 以及 Thirdparty中DBoW2和g2o中的CMakeLists.txt文件中的 -match native
去掉 (否则会报核心转储的错误)
8.进行最后的编译工作了,进入dynaslam的根目录执行:
bash build.sh
9.等待片刻,即可编译成功,如有错,应该 也是小错误,自行百度即可。。。。
10.将自己的有行人的数据集放置到Dynaslam根目录中新建的data文件夹并且在data文件夹中新建两个文件夹,看图:
三、执行运行指令
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt ./Examples/RGB-D/TUM3.yaml ./data/rgbd_dataset_freiburg3_walking_rpy/ ./data/rgbd_dataset_freiburg3_walking_rpy/associations.txt ./data/mask ./data/output
如果遇到初始化失败的情况,将对应的TUM文件中的特征点个数调大应该就好了。。。。。。
# ORB Extractor: Number of features per image #本来是1000
ORBextractor.nFeatures: 3000
至此,全部完结。。。。。。。。。(如遇不明白的欢迎留言交流)
参考大神的知乎文章!!!
参考