Ubuntu 16.04安装CUDA8.0 + cuDNN8.0 + OpenCV3.1.0 + Python2.(3)

10. caffe的安装和配置

安装各种依赖包

sudo apt-get update sudo apt-get upgrade sudo apt-get install -y build-essential cmake git pkg-config sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install -y libatlas-base-dev sudo apt-get install -y --no-install-recommends libboost-all-dev sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev sudo apt-get install -y python-pip sudo apt-get install -y python-dev sudo apt-get install -y python-numpy python-scipy sudo apt-get install -y libopencv-dev

下载caffe:

cd ~ git clone https://github.com/BVLC/caffe.git //从github上git caffe

安装配置caffe:

cd caffe cp Makefile.config.example Makefile.config sudo gedit Makefile.config

配置文件修改(看英文提示根据具体修改):
OPENCV_VERSION := 3 #取消注释符号#,应用opencv3
BLAS := mkl #BLAS库应用英特尔的mkl
注释第66行自带的python
ANACONDA_HOME := /home/huhui/anaconda2 #将具体anaconda2路径写入

PYTHON_INCLUDE := $(ANACONDA_HOME)/include $(ANACONDA_HOME)/include/python2.7 $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \

#PYTHON_INCLUDE之前的注释#去掉,以及之后两行前的#也去掉

PYTHON_LIB := $(ANACONDA_HOME)/lib INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

为了之后编译matlab,这里提前在配置文件中修改matlab路劲,改完后保存退出:

MATLAB_DIR := /usr/local/MATLAB/R2014b

为hdf5之类的文件创建新的链接
\首先执行下面两句话:

cd /usr/lib/x86_64-linux-gnu/ find . -type f -exec sed -i -e 's^"hdf5/serial/hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5/serial/hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;

执行

ls -al | grep libhdf

结果为


然后根据情况执行下面两句:
sudo ln -s libhdf5_serial.so.10.1.0 libhdf5_.so
sudo ln -s libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so
注意:这里的10.1.0和10.0.2根据不同的系统可能对应的数字会不同,比如在Ubuntu16.04中其数字就是10.1.0.
具体的数字可以在输入命令时候使用tab键补全查看
打开makefile文件搜索并替换

NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

在命令行输入:
source ~/.bashrc #编译立即生效
然后进入caffe目录:

make all -j4

报错

这里写图片描述


添加环境变量即可:

sudo vim ~/.bashrc export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH source ~/.bashrc

出现错误的原因是执行convert_cifar_data.bin时会链接/usr/local/lib/libopencv_imgcodecs.so,而这个库需要调到TIFFxx的函数,所以需要找到这些函数在哪个库里。然后执行

find / -name "*libtiff*"

发现libtiff.so在/usr/lib/x86_64-linux-gnu目录下。然后查看环境变量

echo $LD_LIBRARY_PATH

发现没有该目录。于是添加进环境变量:

sudo vim ~/.bashrc export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH source ~/.bashrc

即可编译成功。
编译matlab:

make matcaffe make mattest

报错:

这里写图片描述

(参考 )源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

将/usr/local/MATLAB/R2014b/sys/os/glnxa64下的libstdc++.so.6 更改名称为libstd++.so.6_back:

cd /usr/local/MATLAB/R2014b/sys/os/glnxa64/ sudo mv libstdc++.so.6 libstdc++.so.6_back sudo ldconfig 11. 编译自己的例子

至此caffe环境算是配好了。但是自己的例子还是跑不了。编译我的extract_features_v0.0.6得到结果:
第一次是是找不到ippicv对应的库(结果忘了截图了),于是就如下操作:

find / -name "libippicv*"

发现了libippicv.a文件在/usr/local/share/OpenCV/3rdparty/lib/目录下,由于好像平常没用到这个库,我就把这个路径加到了g++编译项后面:

LDFLAGS = -L /usr/local/share/OpenCV/3rdparty/lib/ `pkg-config --cflags --libs opencv` -lm

另一种解决方法:
调opencv的时候找不到ippicv的库(
从opencv.pc中可以看出,pkg-config加载库的路径是/usr/local/lib,我们去这这个路径下看看,发现没有-lippicv对应的库,别的选项都有对应的库,然后我们把-lsudo make installsudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’sudo ldconfigippicv对应的库(libippicv.a)放到这个路径下就好啦了。
我的libippicv.a在/usr/local/share/OpenCV/3rdparty/lib/这个路径下。你的也在你自己opencv文件夹的对应路径下。
先cd 到上面这个路径下,然后cp liboppicv.a /usr/local/lib 将这个库文件复制到/usr/local/lib下就好了。

再次编译报下一个错:

这里写图片描述

/usr/local/lib/libopencv_imgproc.so.3.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:140: recipe for target 'myprogram' failed make: *** [myprogram] Error 1

进/usr/local/lib/目录查找:

ls -al | grep libopencv_imgproc.so.3.1

结果如下:

huhui@huhui-ubuntu1604:/usr/local/lib$ ls -al | grep libopencv_imgproc.so.3.1 lrwxrwxrwx 1 root root 24 1011 22:33 libopencv_imgproc.so -> libopencv_imgproc.so.3.1 lrwxrwxrwx 1 root root 26 1011 22:33 libopencv_imgproc.so.3.1 -> libopencv_imgproc.so.3.1.0 -rw-r--r-- 1 root root 26370776 1011 22:32 libopencv_imgproc.so.3.1.0

查看是否加进了环境变量:

echo $LD_LIBRARY_PATH

结果

/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu:/home/huhui/anaconda2/lib:

没有/usr/local/lib目录,于是跟之前方法一样加上。注意要在同一个窗口操作,我之前在另一个窗口操作的,结果没有添加成功。

sudo vim ~/.bashrc export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH source ~/.bashrc

再次编译这个错误没有了,是另外的错误:

这里写图片描述


找不到google的库。
原来是makefile里写链接的时候把-lglog写成了-glog(好傻)。改过来之后,还差blas的库找不到,于是一样的方法,发现它在/usr/lib/里,所以加到环境变量里。发现还有错,就在g++编译选项中加一条-lblas就可以了。终于编译成功!

12. 运行自己写的python代码

代码在./caffe/python/generate_my_models.py
首先加入环境变量:

sudo vim ~/.bashrc export PYTHONPATH=/home/huhui/caffe/python

注意后面没有caffe。

import caffe时:

ImportError: No module named _caffe

我直接make pycaffe就解决了。
然后报错:

ImportError: No module named google.protobuf.internal

以下是之前试过的解决方法,没有用。

//============================================================
/*********************************************************************************
*还是这样靠谱:
*我装的是anaconda2, 解决方法是在其中安装protobuf最新版本
*
*
*sudo chmod 777 -R anaconda2
*conda install protobuf
*
*
*这样就解决了
*原来是没有装python版本的protobuf。
*
*
*
*
*
*sudo pip install --upgrade protobuf
*pip install -U scikit-image
*
*现在import caffe时报错Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or *libmkl_def.so.。参考https://github.com/BVLC/caffe/issues/3884:
*(Are you using Anaconda? The problem might not be related with caffe. Try
*
*python -c ‘import sklearn.linear_model.tests.test_randomized_l1’
*
*If you can reproduce the error, that means the problem is not related with caffe but anaconda.
*The latest version of numpy and scipy uses mkl by default. If you want to disable that, you can *execute
*
*conda install nomkl
*
*that solves my problem. Hope that can solve yours, too.
*More details:
*scikit-learn/scikit-learn#5046
*https://www.continuum.io/blog/developer-blog/anaconda-25-release-now-mkl-optimizations
*)
*
*
*python -c 'import sklearn.linear_model.tests.test_randomized_l1'
*conda install nomkl
*
*重新进入caffe文件夹下编译,发现编不过了:
*
*
*In file included from src/caffe/util/signal_handler.cpp:7:0:
*./include/caffe/util/signal_handler.h:4:34: fatal error: caffe/proto/caffe.pb.h: No such file or *directory
*compilation terminated.
*Makefile:576: recipe for target '.build_debug/src/caffe/util/signal_handler.o' failed
*make: *** [.build_debug/src/caffe/util/signal_handler.o] Error 1
*make: *** Waiting for unfinished jobs....
*In file included from ./include/caffe/util/hdf5.hpp:9:0,
* from src/caffe/util/hdf5.cpp:1:
*./include/caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: No such file or directory
*compilation terminated.
*Makefile:576: recipe for target '.build_debug/src/caffe/util/hdf5.o' failed
*make: *** [.build_debug/src/caffe/util/hdf5.o] Error 1
*
*
*看来是protobuf的版本没安装对。
*执行
*
*
* sudo apt-get remove libprotobuf-dev
*
*卸载旧版本,再重试。
******************************************************************************/
//=================================================================================

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
以下是该问题的正确解决方法:

第一个碰到的问题就是旧版本和新版本都卸载不干净,编译的时候完全通不过,报错如下:
proto/caffe.pb.h:17:2: error: #error This file was generated by an older version of protoc
解决方法:
1. 先查找libprotobuf
find / -name “libprotobuf”
发现

huhui@huhui-ubuntu1604:~/Downloads/protobuf-2.6.1$ la -al /usr/lib/x86_64-linux-gnu/ | grep proto -rw-r--r-- 1 root root 395968 330 2016 libmirprotobuf.so.3 -rw-r--r-- 1 root root 2362284 1024 2015 libprotobuf.a -rw-r--r-- 1 root root 395748 1024 2015 libprotobuf-lite.a lrwxrwxrwx 1 root root 25 1024 2015 libprotobuf-lite.so -> libprotobuf-lite.so.9.0.1 lrwxrwxrwx 1 root root 25 1011 15:46 libprotobuf-lite.so.9 -> libprotobuf-lite.so.9.0.1 -rw-r--r-- 1 root root 199176 1024 2015 libprotobuf-lite.so.9.0.1 lrwxrwxrwx 1 root root 20 1024 2015 libprotobuf.so -> libprotobuf.so.9.0.1 lrwxrwxrwx 1 root root 20 1011 15:46 libprotobuf.so.9 -> libprotobuf.so.9.0.1 -rw-r--r-- 1 root root 1170328 1024 2015 libprotobuf.so.9.0.1 lrwxrwxrwx 1 root root 18 1024 2015 libprotoc.so.9 -> libprotoc.so.9.0.1 -rw-r--r-- 1 root root 1036544 1024 2015 libprotoc.so.9.0.1 huhui@huhui-ubuntu1604:~/Downloads/protobuf-2.6.1$ huhui@huhui-ubuntu1604:~/Downloads/protobuf-2.6.1$ huhui@huhui-ubuntu1604:~/Downloads/protobuf-2.6.1$ la -al /home/huhui/anaconda2/lib/ | grep proto -rw-r--r-- 1 huhui huhui 15062152 731 04:07 libprotobuf.a -rwxr-xr-x 1 huhui huhui 983 1012 19:12 libprotobuf.la -rw-r--r-- 1 huhui huhui 1277358 731 04:07 libprotobuf-lite.a -rwxr-xr-x 1 huhui huhui 1018 1012 19:12 libprotobuf-lite.la lrwxrwxrwx 1 huhui huhui 26 1012 19:12 libprotobuf-lite.so -> libprotobuf-lite.so.10.0.0 lrwxrwxrwx 1 huhui huhui 26 1012 19:12 libprotobuf-lite.so.10 -> libprotobuf-lite.so.10.0.0 -rwxr-xr-x 1 huhui huhui 753692 731 04:07 libprotobuf-lite.so.10.0.0 lrwxrwxrwx 1 huhui huhui 21 1012 19:12 libprotobuf.so -> libprotobuf.so.10.0.0 lrwxrwxrwx 1 huhui huhui 21 1012 19:12 libprotobuf.so.10 -> libprotobuf.so.10.0.0 -rwxr-xr-x 1 huhui huhui 7313964 731 04:07 libprotobuf.so.10.0.0 -rw-r--r-- 1 huhui huhui 13617312 731 04:07 libprotoc.a -rwxr-xr-x 1 huhui huhui 1010 1012 19:12 libprotoc.la lrwxrwxrwx 1 huhui huhui 19 1012 19:12 libprotoc.so -> libprotoc.so.10.0.0 lrwxrwxrwx 1 huhui huhui 19 1012 19:12 libprotoc.so.10 -> libprotoc.so.10.0.0 -rwxr-xr-x 1 huhui huhui 4591133 731 04:07 libprotoc.so.10.0.0

发现目前存在两个 protobuf 版本,分别是 /home/huhui/anaconda2/lib/libprotoc.so.10 与 /usr/lib/x86_64-linux-gnu/libprotoc.so.9。
因此需要删除新版本的 /home/huhui/anaconda2/lib/libprotoc.so.10
sudo rm -rf /home/huhui/anaconda2
然后按照前面步骤,重装 python,问题解决;

现在是第二个问题,就是回到了开始的状态,caffe内部编译都可以通过,但运行python会报protobuf版本不一样的错。(其实如果不是之前按照错误的方法解决问题,全部搞乱了,前面一步是不需要的。)以下是正确解决方法:
(1)执行protoc --version查看原始protobuf版本,发现是2.6.1。
(2)从https://github.com/google/protobuf/tree/v2.6.1上下载protobuf-2.6.1.zip,解压并进入protobuf-2.6.1/python目录。(如果是刚开始就遇到这个问题可能是不需要下载的,可以找找看,当然我不确定,因为没试过。)
(2)按照 README.txt 中步骤执行以下操作,安装python 版本的 protobuf, 具体如下:

python setup.py build python setup.py google_test python setup.py install

结果:

这里写图片描述


Finished processing dependencies for protobuf==2.6.1
python版本的protobuf与C++版本的版本号相同,都为2.6.1。

再回去编译,就可以通过了!

还有问题,就是opencv的库cv2调不了。
原因是没装python-opencv package.
sudo apt-get install python-opencv
现在再运行,发现还是找不到cv2,所以我们找下这个库在哪里:

find / -name "*cv2*so"

有用的就是这两个:

/usr/lib/python2.7/dist-packages/cv2.x86_64-linux-gnu.so /usr/local/lib/python2.7/dist-packages/cv2.so

但是我不知道是哪个。我就先把这两个路径先加到PYTHON文件中去:

sys.path.append('/usr/lib/python2.7/dist-packages/') sys.path.append('/usr/local/lib/python2.7/dist-packages/')

发现可以找到了。然后分别注释掉这两句发现起作用的是后面一个路径,即

sys.path.append('/usr/local/lib/python2.7/dist-packages/')

所以只需要保留这一句就好了。(当然一眼就能看出来的同学就不用这么试啦)

现在再运行python的程序,发现调不了cv。

ImportError: No module named cv

import numpy的时候出现:
AttributeError: ‘module’ object has no attribute ‘bool_’

这个问题是把PYTHONPATH配置到了caffe-master/python/caffe底下,应该配置到caffe-master/python里就好了。一定要谨慎配置PYTHONPATH,否则容易导致其他的问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13360.html