Ubuntu 18.04.3 LTS上调试LIFT: Learned Invariant Feature Points

本人电脑配置:
处理器:Intel® Core™ i7-4770 CPU @ 3.40GHz × 8
显卡驱动:NVIDIA 430
CUDA:10.0 和 8.0(8.0是后来安的)
cuDNN:7.4.2 和 5.1.10(5.1.10是后来安的)
论文:Kwang Moo Yi, Eduard Trulls, Vincent Lepetit, Pascal Fua, ” LIFT: Learned Invariant Feature Transform”, in ECCV 2016
代码:https://github.com/cvlab-epfl/LIFT
这里主要记录一下配置环境的辛酸史

相关环境的配置

所需软件及其正确版本: CUDA (8.0), cuDNN (5.1), python (2.7), theano (0.90), Lasagne (0.2.dev1), flufl.lock (2.4.1), 剩下的numpy, scipy, parse, h5py 版本没有具体要求。同时需要强调的是,有要求的版本必须严格匹配。

CUDA8.0+cuDNN5.1.10

因为之前安装过CUDA10.0和cuDNN7.4.2 ,想能不能在我这个版本上跑,结果运行测试代码发现不行,还得严格按照CUDA (8.0), cuDNN (5.1)的配置,但是以前没弄过Ubuntu 18.04上多版本的CUDA,主要参考了下面的博客:

  • https://blog.csdn.net/ksws0292756/article/details/80120561
  • https://blog.csdn.net/qq_23996885/article/details/90205937

要按照上面第二篇博客的2.1和2.2解决依赖,再往下安装CUDA8.0+cuDNN5.1.10

相关package在该链接可找到 (https://developer.nvidia.com/), 具体操作参考网上教程,因为我的电脑之前安装过10.0的CUDA,所以这里要下载的是runfile类型的文件,但是点进去看竟然没有18.04版本的,刚开始以为不行,但是后来证明16.04那个在我18.04系统上也是可以的,补丁也下下来装上去。cuDNN5.1.10只要找对应的版本就行了。

CUDA8.0下载界面

可以看到我已经软连接上CUDA8.0了:


软连接上CUDA8.0

python (2.7), theano (0.90), Lasagne (0.2.dev1), flufl.lock (2.4.1)

因为Ubuntu 18.04系统不自带python 2.7了,我就用conda创建了一个虚拟环境为python 2.7的,在里面安装的所有配置,安装的时候主要参考了这篇博客:https://blog.csdn.net/xdzhangzhenhao/article/details/79058963,再提醒一下,这些配置的版本一定要严格一致:
theano (0.90):去这里下载下来0.9.0rc1.tar.gz文件,然后用下面命令解压,cd进去再用setup.py安装

tar -zxvf Theano-0.9.0rc1.tar.gz
sudo python setup.py install

Lasagne (0.2.dev1)

git clone https://github.com/Lasagne/Lasagne
# 然后进到文件夹里面
sudo python setup.py install

flufl.lock (2.4.1):去这里下载,压缩包先解压,然后进入解压后的文件夹安装即可:

tar -zxvf flufl.lock-2.4.1.tar.gz
sudo python setup.py install

要用GPU加速的话,还得配置一下,在~路径下新建.theanorc,然后编辑如下内容:

[global]
device=gpu
floatX=float32
root=/usr/local/cuda-8.0
[nvcc]
fastmath = True
[blas]
ldflags = -lopenblas
[cuda]
root = /usr/local/cuda-8.0
[nvcc]
flags=-D_FORCE_INLINES
[lib]
cnmem=0.5

再运行一下这个测试代码看看是不是真的能用GPU了:

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

结果发现不能用GPU,打印出来的是Used the cpu,发现报错里面有一句话是,说是我的gcc版本太高了,Ubuntu 18.04自带的gcc版本是7.4.0的:

/usr/local/cuda/bin/..//include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
error -- unsupported GNU version! gcc versions later than 5 are not supported!

后来主要参考了两篇博客:
https://blog.csdn.net/qq_28660035/article/details/78703095
https://blog.csdn.net/u012925946/article/details/84584830
把我的gcc版本和g++版本降到4.8以后就可以了,如下图所示:

gcc版本和g++版本降到4.8以后能用GPU了

opencv3.2.0

后来更新:感觉后面编译的最终结果也就是出来个cv2.so文件,再把cv2.so拷贝到那个虚拟环境的包路径下,我感觉用命令安装也是可以的,也会出来这种的cv2.so文件,如conda install python-opencv或者pip install python-opencv,再提醒一遍,这都是在python2.7的虚拟环境中装的
---------------------------------------------
这是花了最长时间配置的一个选项,要用编译安装opencv3.2.0,不要用pip install python-opencv的命令安装,我主要参考的是这篇博客:https://www.jianshu.com/p/6478b318cd8f,当然也看了无数其他的博客,花了好久才整成功的,先是安装一些依赖

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 libdc1394-22-dev
# 如果运行上面报错:无法定位软件包 libjasper-dev,就先运行:sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"再运行
sudo apt-get install gtk+-3.0

去官网,选择opencv3.2.0 sources版本,如果也想下opencv_contrib-3.2.0(这个就是cmake的时候多一条指令的事,如果想加opencv_contrib-3.2.0一起编译的话),去我这里下载(因为会缺少东西,我这个已经把缺少的下载好了)
链接: https://pan.baidu.com/s/1P9BwMEgJgxBJ43AH03Y_kA 提取码: a593
后来cmake安装的时候会有ippicv下载不下来,需要自己先下载下来然后放到对应文件夹里就好了,可以去https://github.com/opencv/opencv_3rdparty下载你对应的版本(这个在报错信息里面可以看到,我的是20151201版的)
然后在opencv3.2.0那个目录里面,创建一个build文件夹:

mkdir build
cd build

我先按博客里面的指向anaconda的解释器编译,结果总是出不来cv2..so那个文件,我是这样配置的:

cmake -D PYTHON_DEFAULT_EXECUTABLE=/home/lsm/miniconda3/bin/python3\
 -D BUILD_opencv_python3=ON\
 -D BUILD_opencv_python2=OFF\
 -D PYTHON3_EXCUTABLE=/home/lsm/miniconda3/bin/python3\
 -D PYTHON3_INCLUDE_DIR=/home/lsm/miniconda3/include/python3.6m\
 -D PYTHON3_LIBRARY=/home/lsm/miniconda3/lib/libpython3.6m.a\
 -D CUDA_NVCC_FLAGS=--Wno-deprecated-gpu-targets\
 -D PYTHON_NUMPY_PATH=/home/lsm/miniconda3/lib/python3.6/site-packages ..

想加opencv_contrib-3.2.0一起编译的话,就加一句
-D OPENCV_EXTRA_MODULES_PATH=/home/lsm/Downloads/opencv-3.2.0/opencv_contrib-3.2.0/modules/这个路径要写成自己的,其中-D CUDA_NVCC_FLAGS=--Wno-deprecated-gpu-targets是屏蔽一个警告信息:

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

但是这样不行,我按照上面这个博客试了很多,就是出不来,虽然过程中没有错误,后来我就用:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local  ..

编译,结果出来了cv2..so那个文件,这是编译成功的标志:


cmake编译成功

可以注意到我这里出来了两个cv2..so文件,一个是cv2.cpython-36m-x86_64-linux-gnu.so和cv2.so,可以看到下面一个是opencv_python3,一个是opencv_python2,所以一个适用于python3.6的,一个适用python2的,对于我们之前创建的python2虚拟环境,只要把cv2.so拷贝到那个虚拟环境的包路径下也是可以的,我的是/home/lsm/miniconda3/envs/lift/lib/python2.7/site-packages,这时候在那个虚拟环境下就可以导入cv2(注意,这里可能会出现numpy版本和我们的3.2.0的opencv版本不匹配,numpy版本需要小于等于1.15),下面是我的图(我的虚拟环境名称为lift)

虚拟环境可以导入cv2了

最后别忘了在build/目录下执行命令:

sudo make install

这会在一些路径下创建opencv文件夹,下面是我的结果图

make install结果图

最后一步,按照https://blog.csdn.net/qq_36355662/article/details/80114260里面将

cd LIFT/c-code/
gedit CMakeLists.txt

里面的改一下,路径依据自己的,我的是下面这样的:

set(OpenCV_DIR /usr/local/share/OpenCV)
find_package(OpenCV 3.2 REQUIRED)

至此,opencv3.2.0就算安装完成了,我并没有像有些博客讲的将OpenCV的库添加到路径,不知道后续使用会不会有影响

代码运行

这时候我们环境都配好了,按照之前代码链接里面的README.md文件里面提示的

cd c-code/build
cmake ..
make

然后运行

./run.sh
我的运行过程图

我也没有像https://blog.csdn.net/Hansry/article/details/80714786修改theano中少量代码,也没有像https://blog.csdn.net/qq_36355662/article/details/80114260修改LIFT/python-code/目录下的compute_detector.py文件,就能运行通了,最终的结果是在results文件夹下生成了如下的东西:

运行结果在results文件夹下

匹配特征得到的图片如下 :


img1_kp.txt.jpg结果图

最后附一下上面代码用tensorflow写的版本链接:https://github.com/cvlab-epfl/tf-lift

你可能感兴趣的:(Ubuntu 18.04.3 LTS上调试LIFT: Learned Invariant Feature Points)