首先,这篇文章还挺有意思的,Learning Less is More – 6D Camera Localization via 3D Surface Regression,过几天会整理一下论文笔记,作者放出了源码和训练好的模型,当然就忍不住赶紧上手一下啦,不过他的深度学习也是c++写的,torch+lua,安装的时候不免出各种意外...尤其是本人是在服务器上运行的,实验室服务器上用户很多,也有一些不该遇见的小毛病,现在一并解决,和大家分享一下。
本博客编辑逻辑:不想大家和我一起淌坑了,所以会按照改正后的顺利的方法把所有的步骤贴出来,并且在每一步的最后,和大家来讲讲我遇到的坑和如何解决的。对此,如果你从没有安装过,只要跟着步骤走就行,不用关心坑;如果你已经执行了某些步骤,然后在某一个环节卡壳了,请根据目录到对应的环节里查看解决方案。当然,可能你的问题不在我的解决方案解决的范畴内,请google请google请google,我的经验就是百度解决不了:)。开头的资源是几个依赖的压缩包,如果后续下载网址失效了,可以下载这个压缩包,现在不用下载。
1)下载源码
2)libpng和PNG++安装
坑1:recipe for target ‘test’ falied
3)lua安装
4)torch安装
5)luajit-rocks安装
坑2:usr/bin/ld: cannot find -lluajit
6)CMakeLists.txt修改&源码编译
坑3 /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.9: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'
7)运行问题-找不到libcudnn.so.5
关于如何解决core dumped问题
源码地址,Readme以及DSAC文章的documentation好好读读,都会更快地上手代码。
Readme中指出PNG++是必须的,然后libpng作为PNG++的依赖也是必须的。先安装libpng
下载libpng-1.2.50版本(为什么是这个版本,先别问,马上揭晓),下载地址
解压后执行如下指令进行安装
cd libpng-1.2.50
./configure
make check
sudo make install
make check
sudo ldconfig
安装好之后安装PNG++
下载PNG++0.2.7(为什么是这个版本,同上), 下载地址,解压后安装
cd PNG++0.2.7
make
make test
make install
ok,这一路下来都很顺利对吧?因为 PNG++0.2.7 与 libpng-1.2.50适配,有的不按这个版本安装的,会在安装PNG++的 make test这一步报错
坑1:recipe for target ‘test’ falied
查看test.log发现
/convert colorspace: error while loading shared libraries: libpng16.so.16: cannot open shared object file: No such file or directory
或者是
out/pngsuite/basi2c16.png.GRAY.8.out cmp/pngsuite/basi2c16.png.GRAY.8.out differ: byte 53, line 3
究其原因,都是因为libpng的版本与PNG++的版本不适配,所以!如果想运行lessmore程序,或者自己的PNG++安装失败,请下载安装PNG++0.2.7 与 libpng-1.2.50,请认准PNG++0.2.7 与 libpng-1.2.50!
lua我使用的版本是5.3,安装很简单,应该不会有什么问题
cd lua-5.3.0
make linux
make install
如果想验证自己是否安装ok,输入如下指令,看看是否会打印hey,然后退出。
lua
print("hey")
为什么这里不装luajit而是装torch,这是一个坑...我们先来讲讲torch的安装。
Torch是一个基于Lua语言的深度学习框架,官网,官方文档,ok,我们照着官方文档安装,依次输入如下指令:
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch
bash install-deps
./install.sh
source ~/.bashrc
source ~/.profile
为了验证torch是否装好,输入指令th验证
出现如下画面即为安装成功。
输入如下指令进行luajit的安装,要注意倒数第二行的/your/prefix,是你自己指定的安装路径,这个路径后面很重要。
git clone https://github.com/torch/luajit-rocks.git
cd luajit-rocks
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/your/prefix
make install
ok,这样luajit也就安装好了,可以查看luajit的版本,输入 luajit -v 如下页面即为安装成功。
坑2:usr/bin/ld: cannot find -lluajit
由于我是直接下载的luajit安装包,然后安装的luajit,看似luajit安装成功,但是在编译论文源码时一直无法完成,报错usr/bin/ld: cannot find -lluajit,说的是找不到luajit的依赖项。为此也是谷歌了一大堆,给的都是如何解决usr/bin/ld: cannot find -lxxlib的问题,包括新建软链接等,做出种种尝试无果之后,我又换到服务器上去进行编译,在用解决usr/bin/ld: cannot find -l的指令locate libluajit.so时,发现其他同学的libluajit都在torch文件夹下,所以决定安装torch,果然就解决了这个问题,torch是自带luajit的。
所以如果有同学也碰见了usr/bin/ld: cannot find -lluajit的问题,请先安装torch
如果安装了torch还是报错,请修改CMakeLists.txt,怎么修改?见下面的步骤六
hey朋友,不要以为安装好这些依赖就可以直接上手了,环境都不一样要先修改CMakeLists.txt,其实别的改动也不多,主要是link一下luajit,还记得上一步我们说的luajit安装到你指定的/your/prefix路径吗?把它链接进来,同时,作者在源码添加的头文件目录include_directories(/usr/include/lua5.3)对我们已经无效了,注释掉(如果你的lua的确在这个文件夹下你也可以不注释,总之要对应上)。
最后修改后的CMakeLists.txt为:
hey,/your/prefix路径是代指,不要原模原样写进去呀!此时,CMakeLists.txt搞定!
--------------------------------------
好了终于可以编译源码了,惯例操作
mkdir build
cd build
cmake ..
make
然后它可能又报错了....是因为libtiff的问题
坑3 /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.9: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'
如果你安装了anaconda,那么你引起问题的原因可能和我一样,请查看这篇帖子,下面是我贴出的中文解释
解决的办法很简单,把
/.bashrc里面的export anaconda3/bin路径注释掉
source ~/.bashrc更新一下,然后重新编译。
至此,编译就不会有什么问题了。
你以为编译没问题就ok了吗?太年轻,作者的代码用的是libcudnn.5,而现在的cuda-9.0用的一般是7.5/7.0,运行报错,找不到cudnn5,这是最后一个坑。如果你有cuda-8.0,请直接用cuda-8.0,且cuda-8.0/iib64里有libcudnn.so.5,可以直接在运行代码前,手动指定cuda路径
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
如果没有,下载cudnn5
sudo tar -zxvf ./cudnn-8.0-linux-x64-v5.1.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64
sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h /usr/local/cuda-9.0/lib64/libcudnn*
同样的,运行前手动指定cuda路径/在cmakelists里面写好cuda路径。
ok,终于顺利完成了。现在开始训练,测试代码吧!
最后的界面大概是这样
我选了office的seq-02进行测试(数据集会给出测试和训练的划分),最终得到的结果 1.3deg 和 0.2m和论文的结果差距不大。
over! Wish u good luck!
参考链接:
解决libtiff的问题 https://github.com/lagadic/visp/issues/109
torch安装 http://torch.ch/docs/getting-started.html#_
论文源码 https://github.com/vislearn/LessMore
ps:最后补一个小点
关于如何定位core dumped的错误
一开始我下载了作者的data_structure之后我以为里面是有数据的,运行代码报错,core dumped
这里使用的指令如下:
dmesg
addr2line -e ../../test_ransac 000000000044e275 -f
首先dmesg会报出你这个程序运行错误的地址,见下图:
error 4 一般是用户内存错误,ip后的第一个长串数字代表出错的地址。
第二行代码,就是把这个出错的地址的函数找到:-e代表的是你指定的那个程序的位置(我的程序是test_ransac) -f是输出错误的函数(输出函数设置) 然后得到我错在main函数...再去正常输出调试,就能发现问题!我的问题就是我根本没输入,那里面竟然没有数据集>~<,所以大家记得去下载数据集 7scenes/12scenes....
关于core dumped的解决,我参考的下面两篇博客有更详细的介绍:
https://www.cnblogs.com/qhbk/p/7666324.html
https://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html
2019.11.28