服务器的环境
Ubuntu18.04,
python3.6
CUDA 10.0,
cuDNN 7.6.3
opencv3.4.6
查看cuda和cudnn版本
nvcc -V
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
基本上都是在普通用户(caffe)目录下安装的,服务器中的CUDA10和CUDNN已经安装好了(都在正常的位置),python也已经在根目录下安装好了,opencv3.4.6我是直接在自己的用户目录下(caffe)安装完成了,具体可以看我的博客
linux下无权限安装opencv3.4.6
1、源码下载
到Github直接下载Caffe
unzip caffe-master.zip
mv caffe-master caffe
需要的依赖环境安装
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
2、配置文件修改
在caffe目录下
cd caffe
Makefile.config文件的修改
cp Makefile.config.example Makefile.config
vim Makefile.config
对Makefile.config的下面几处进行修改
将:
#USE_CUDNN := 1
改为:
USE_CUDNN := 1
将:
# USE_OPENCV := 0
改为:
USE_OPENCV := 1
将:
#OPENCV_VERSION := 3
改为:
OPENCV_VERSION := 3
将:
#WITH_PYTHON_LAYER := 1
改为:
WITH_PYTHON_LAYER := 1
在CUDA_ARCH := 后前两行即有*_20和*_21的两行前面添加#,不过我是直接 删除了:
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \
#-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
对于python路径也是要修改了(我使用的是根目录下的opencv3.6),还有就是python解释器下的numpy路径也要添加进去。
将python2.7的注释掉
#PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
下面添加python3.6的路径
PYTHON_INCLUDE := /usr/include/python3.6 \
/usr/local/lib/python3.6/dist-packages/numpy/core/include
将下面的注释掉,
#INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
#LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
然后添加
INCLUDE_DIRS := /home/caffe/opencv34/include/ $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := /home/caffe/opencv34/lib/ $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
注意
我将include和lib中的opencv的安装路径放在了最前面,让编译器最先寻找这个路径才可以找到,我试过,放在后面就失败了。因为编译器比较笨,多个opencv版本容易犯冲突。总是报下面的错误
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::allocate(unsigned long)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::deallocate()'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
修改Makefile文件
vim Makefile
如下图()
将下面注释
#NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
添加
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
将下面注释
#LIBRARIES += glog gflags protobuf boost_system boost_filesystem m
添加
LIBRARIES += glog gflags protobuf leveldb snappy \
lmdb boost_system boost_filesystem hdf5_hl hdf5 m \
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
3、编译安装
在caffe目录下,make clean主要作用是清理上次编译(第一次编译可以不用执行)。
make clean
make all -j16
成功了
测试
make test -j16
make runtest -j16
出现错误
主要原因是/usr/local/lib没有这个libcudart.so.10.0,现在只需将/usr/local/cuda/lib64文件下的libcudart.so.10.0拷贝一份给/usr/local/lib文件夹下。执行下面的命令就可以了。
sudo cp /usr/local/cuda/lib64/libcudart.so.10.0 /usr/local/lib/ && sudo ldconfig
如果/usr/local/lib文件缺少 libcudart.so.10.0,那估计也缺少libcublas.so.10.0,libcurand.so.10.0,libcudnn.so.7 文件。
sudo cp /usr/local/cuda/lib64/libcublas.so.10.0 /usr/local/lib/ && sudo ldconfig
sudo cp /usr/local/cuda/lib64/libcurand.so.10.0 /usr/local/lib/ && sudo ldconfig
sudo cp /usr/local/cuda/lib64/libcudnn.so.7 /usr/local/lib/ && sudo ldconfig
各种环境ok的话,在caffe目录下
make runtest -j16
下面配置安装pycaffe
make pycaffe -j16
基本上caffe编译安装就基本完成了
注意
在caffe目录下输出python,无法使用pycaffe
但是在caffe用户目录下确是可以使用的
4、MNIST 模型训练和测试
训练
在caffe目录下,下载mnist数据集
./data/mnist/get_mnist.sh
转换数据格式
./examples/mnist/create_mnist.sh
训练
./examples/mnist/train_lenet.sh
测试
在caffe目录下
touch test_lenet.sh
vim test_lenet.sh
在文件中添加
./build/tools/caffe.bin test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -iterations 100
chmod +x test_lenet.sh
./test_lenet.sh
测试成功说明caffe的整个环境是ok的。