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之前的注释#去掉,以及之后两行前的#也去掉
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之类的文件创建新的链接
\首先执行下面两句话:
执行
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目录:
报错
添加环境变量即可: 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:
报错:
(参考 )源码编译升级安装了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对应的库(结果忘了截图了),于是就如下操作:
发现了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/目录查找:
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 10月 11 22:33 libopencv_imgproc.so -> libopencv_imgproc.so.3.1 lrwxrwxrwx 1 root root 26 10月 11 22:33 libopencv_imgproc.so.3.1 -> libopencv_imgproc.so.3.1.0 -rw-r--r-- 1 root root 26370776 10月 11 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
首先加入环境变量:
注意后面没有caffe。
import caffe时:
ImportError: No module named _caffe我直接make pycaffe就解决了。
然后报错:
以下是之前试过的解决方法,没有用。
//============================================================
/*********************************************************************************
*还是这样靠谱:
*我装的是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”
发现
发现目前存在两个 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, 具体如下:
结果:
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,所以我们找下这个库在哪里:
有用的就是这两个:
/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 cvimport numpy的时候出现:
AttributeError: ‘module’ object has no attribute ‘bool_’
这个问题是把PYTHONPATH配置到了caffe-master/python/caffe底下,应该配置到caffe-master/python里就好了。一定要谨慎配置PYTHONPATH,否则容易导致其他的问题。