Ubuntu16.04 编译运行Kintinuous算法

来源:互联网 发布:营销软件知乎 编辑:程序博客网 时间:2024/05/22 09:40

编译运行Kintinuous算法:

 

系统信息:

ubuntu16.04

i7 GTX860m

 

过程:

 

首先从网上找到一份实现Kintinuous代码:

https://github.com/mp3guy/Kintinuous

 

阅读readme 可知运行Kintinuous需要依赖:

             Cmake #允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件

OpenGL#图形库

CUDA>= 7.0#gpu加速运算库

OpenNI2#OpenNatural Interaction搭建视觉和音频传感器与视觉和音频感知中间件通信的桥梁。

SuiteSparse#稀疏矩阵处理工程,是一组C、Fortran和MATLAB函数集

Eigen#C++矩阵运算库

Boost#可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一

zlib#提供数据压缩用的函式库

libjpeg#处理JPEG图像数据格式的自由函式庫

OpenCV

DLib @330bdc10576f6bcb55e0bd85cd5296f39ba8811a#机器学习库,有c++和python两个版本,这里用的是c++版本 注意@后面是版本号,装错版本让编译过程收到极大的阻碍

DBoW2 @4a6eed2b3ae35ed6837c8ba226b55b30faaf419d#Bags of binary wordsfor fast place recognition in image sequence,使用的特征检测算法为Fast,描述子使用的是brief描述子,是一个视觉词袋库,它提供了生成和使用词典的接口

,DLoopDetector @84bfc56320371bed97cab8aad3aa9561ca931d3f#基于DBoW2构建和使用视觉词典,并且添加了回环检测算法模块和验证模块,是一个完整的回环检测/拓扑制图系统。

iSAM#IncrementalSmoothing and Mapping递增平滑与地图构建算法

PCL#点云库,实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

Pangolin#处理opengl 显示 交互和提取视频输入的库

 

通过apt-getinstall 可以安装大部分的依赖:

sudo apt-get install g++ cmake cmake-gui doxygen mpi-default-devopenmpi-bin openmpi-common libflann-dev libeigen3-dev libboost-all-devlibvtk5-qt4-dev libvtk6.2 libvtk5-dev libqhull* libusb-dev libgtest-dev git-core freeglut3-dev pkg-config build-essentiallibxmu-dev libxi-dev libusb-1.0-0-dev graphviz mono-complete qt-sdk

 

本机之前装了oracle的java,具体装法可以参考这里,故这里没有安装openjdk-7-jdkopenjdk-7-jre

 

 

其余不能通过apt-get安装的库:

cuda:

参考文章https://gist.github.com/dangbiao1991/7825db1d17df9231f4101f034ecd5a2b

首先需要装显卡驱动:

去官网查适合自己计算机的显卡驱动

http://www.nvidia.cn/Download/index.aspx?lang=cn


查询对应显卡对应的驱动 替代命令中的版本号

sudo apt install nvidia-375 nvidia-settings nvidia-prime#prime是为了解决可能出现装了驱动后无法登陆ubuntu的问题

 

安装完成后重启:


证明驱动已装。

接下来装cuda

参考网址:

http://www.52nlp.cn/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%BB%E6%9C%BA%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE-ubuntu-16-04-nvidia-gtx-1080-cuda-8#comments

 

cuda官网下驱动。适合ubuntu16.04的为cuda8.0

sudo sh cuda_8.0.27_linux.run

下载安装完,跑例子:


证明cuda成功。

安装pcl

 

github下载下载源码编译。

 

git clonehttps://github.com/PointCloudLibrary/pcl.git

cd pcl

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE=Release-DBUILD_GPU=OFF -DBUILD_apps=OFF -DBUILD_examples=OFF ..

make -j4#取决于你的cpu的核的数量

sudo make install

sudo ldconfig#动态链接库管理命令。,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。在运行这个命令时报了一个错,解决方案可以在stackoverflow上找到详细解答

 

OpenNI2

 

$ git clonehttps://github.com/occipital/OpenNI2

$ cdOpenNI2

$ make -j4

 

由于没有生成cmake_install.cmake文件,所以不能/usr/lib中找到此库,在编译Kintinuous时需要手动把此库的liblibOpenNI2.so地址加入。

 

Opencv

opencv官网下载2.4.9版本,到目录下

mkdir build

cd build

cd cmake ..

make

sudo makeinstall

 

DLibDBoW2DLoopDetectoriSAM and Pangolin的安装方法也类似,下载对应源码后输一次上述命令即可。

需要注意的是,我在下载dlib时,github上有两个版本,一个星数高的没有提供install文件,需要自己更改Kintinuous的makelist文件。另外一个即是本文提供的超链接,提供了install省了不少事,但是卸载的时候就比较头疼。诸位自己取舍。

还有一点是Dlib,DBoW2,DLoopDetector在下载是要选择旧版本(点击tag可以选),不然编译时会出很多错。

 

装完依赖库后,最后就是编译Kintinuous了。

Kintinuous:

 

github下载Kintinuous

cmake 编译,可以选用gui版本方便选择参数。

第一次编译过程出现找不到opencv_dep_cudart,在编译kintinuous的时候加入-D CUDA_USE_STATIC_CUDA_RUNTIME=OFF;

在编译


此时把对应地址补上。编译即可成功。

去到生成的文件夹中,运行make

生成 Kintinuous。从here  下载数据loop.klg

 

运行例子

./Kintinuous -s 7 -v ../vocab.yml.gz -l loop.klg -ri -fl -od#vocab.yml.gzmaster目录下

第一次出现

Segmentation fault (core dumped)

第一反应是完了还要去检查源码,心情绝望。

后面看项目的issue


看到有人在跑例子时也遇到问题,虽然他有报具体的错误,不过还是按照里面的该法试了一下。具体做法:

改Kintinuous/src/CMakeLists.txt,

把61 加到set(CUDA_ARCH_BIN "20 30 35 50 52 " CACHE。。这句

改成:set(CUDA_ARCH_BIN "20 30 35 50 52 61" CACHE STRING

再次编译build,\

例子成功运行。





 

 

以上编译完成。

下面记录自己遇到的坑。

第一次没有按教程跑代码,采取直接编译Kintinuous,遇到问题直接解决的思路。

遇到DLib 问题:

去下dlib的库:

https://github.com/davisking/dlib

根据网上资料:

如果要自己建立工程,可以仿照dlib/examples/CMakeLists.txt,直接include(dlib/dlib/cmake)文件即可,如下:

cmake_minimum_required(VERSION 2.8.4)

PROJECT(dlib_test)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11-O2")

IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")

ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall-Wextra")

ENDIF()

INCLUDE(/home/hpc/Michael/dlib/dlib/cmake)

ADD_EXECUTABLE(dlib_test dlib_test.cpp)

TARGET_LINK_LIBRARIES(dlib_test dlib)

 

然而修改了Kintinuouscmake文件依然报错。

尝试编译c++例子:


经查询:

CMakeLists.txt中找到

find_package(OpenCV QUIET)

前面加上set(CUDA_USE_STATIC_CUDA_RUNTIMEOFF)

例子编译执行成功,证明dlib库没问题

cmake依然报错。应该是库没有安装到系统所以Kintinuous找不到dlib的配置文件。

 

换一种思路。

文档上让我们编译例子,因为例子要用到所下载的库,可以通过看例子的CMakeLists.txt来学习如何在外部文件中使用dlib库。


dlib的绝对路劲写死进去,更改cmakelist,修改的比较多,由于时间所限没有继续实行下去,改为按照教程走。

 

总结:

本次实验依赖的大量库都需要自己从网上下载后编译,对cmake的用法有了一定的了解。

但对cmkelist语法不熟悉,不能自主改cmakelist以适应需求。

其次我学会了利用github中的issue。遇到问题直接搜索得到的答案没有针对性。但issue中的问题就很有参考价值。很多问题的表现形式虽然不同,但解决方法相似,要好好利用。

 

 

 

 

 

 

 

原创粉丝点击