原文地址:blogof33.com/post/5/
這次做專案需要使用到caffe,花了一些時間搭好了。剛好寫一下自己踩的坑,防止重蹈覆轍。
這篇教程參考了caffe官方文件,分成兩個版本,CPU版本和GPU版本,其實本質上只是配置不同罷了。
首先需要檢視預設python(針對Python2與Python3並存的情況):
python --version
如果是python2.7,則以下請遵循python2.7的配置,如果是python3.5以上,則遵循python3.5的配置(最好使用python2.7,因為教程只在2.7環境下編譯通過,不保證3.5以上不會出現問題)。
初始配置:
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 libatlas-base-dev libboost-all-dev libgflags-dev libgoogle-glog-dev liblmdb-dev
#下載包管理器pip,如果有可以跳過
sudo apt-get install -y python-pip
#如果預設python是Python2.7
sudo apt-get install -y python-dev
sudo apt-get install -y python-numpy python-scipy
#如果預設python是Python3.5及以上
sudo apt-get install -y python3-dev
sudo apt-get install -y python3-numpy python3-scipy
#如果opencv版本為2.4
sudo apt-get install -y libopencv-dev
複製程式碼
安裝CUDA 8以及Cudnn(可選)
如果你的顯示卡是英偉達(NVIDA)的,並且你想使用GPU版本的caffe,那麼可以安裝Cuda Toolkit 8和CUDNN庫,詳情請見博主的另一篇文章。
在Ubuntu16.04上安裝opencv3.3
如果未安裝opencv則可以通過以下方式安裝opencv3.3(目前最新版)。
構建opencv 3.3
首先安裝依賴關係:
sudo apt-get install --assume-yes build-essential cmake git
sudo apt-get install --assume-yes pkg-config unzip ffmpeg qtbase5-dev python-dev python3-dev python-numpy python3-numpy
sudo apt-get install --assume-yes libopencv-dev libgtk-3-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
sudo apt-get install --assume-yes libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install --assume-yes libv4l-dev libtbb-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev
sudo apt-get install --assume-yes libvorbis-dev libxvidcore-dev v4l-utils vtk6
sudo apt-get install --assume-yes liblapacke-dev libopenblas-dev libgdal-dev checkinstall
複製程式碼
然後從github.com/opencv/open…下載OpenCV 3.3的最新原始碼,解壓以後進入解壓後的目錄(一般為opencv-3.3.0),執行:
mkdir build
cd build/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D FORCE_VTK=ON -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_CUBLAS=ON -D
#如果是CUDA 8.0,則執行以下命令
CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D WITH_GDAL=ON -D WITH_XINE=ON -D BUILD_EXAMPLES=ON ..
#如果是CUDA 9.0,則執行以下命令
CUDA_NVCC_FLAGS="-D_FORCE_INLINES --expt-relaxed-constexpr"
#最後make
make -j $(($(nproc) + 1))
複製程式碼
注意:Java 9會導致編譯失敗。
安裝Opencv 3.3
使用make:
sudo make install
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
sudo apt-get update
#以上完成以後重啟
reboot
複製程式碼
測試opencv 3.3
進入opencv 3.3目錄,執行以下程式碼:
cd samples/cpp
g++ edge.cpp `pkg-config opencv --cflags --libs` -o test
./test
複製程式碼
如圖所示:
說明opencv安裝成功。
修改gcc和g++版本
在編譯caffe之前,先要檢視ubuntu下的gcc和g++預設版本,如果是5.0以下(比如4.8),則需要修改。檢視:
gcc -v
g++ -v
複製程式碼
如果都是5.0以下,則輸入以下命令:
sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
sudo ln -s /usr/bin/g++-5 /usr/bin/g++
sudo ldconfig
複製程式碼
然後再次檢查gcc和g++版本:
gcc -v
g++ -v
複製程式碼
如果都是5.0以上則修改成功。
然後如果進行了修改,則再編輯**/usr/local/cuda-8.0/targets/x86_64-linux/include/host_config.h**檔案,將119行的
error -- unsupported GNU version! gcc versions later than 5 are not supported!
註釋掉:
//#error -- unsupported GNU version! gcc versions later than 5 are not supported!
編譯caffe
從github上面clone caffe:
cd
git clone https://github.com/BVLC/caffe.git
複製程式碼
進入caffe目錄下,將Makefile.config.example複製到Makefile.config中:
cd caffe
cp Makefile.config.example Makefile.config
複製程式碼
當前路徑如圖所示:
下面分成兩個版本分別編譯caffe,請各位讀者根據需要選擇CPU或者GPU版本。
CPU版本
編輯Makefile.config:
vi Makefile.config
將配置檔案裡面的#CPU_ONLY:= 1
改為CPU_ONLY:= 1
,即取消註釋。
同理將# WITH_PYTHON_LAYER := 1
修改為 WITH_PYTHON_LAYER:=1
,#USE_OPENCV := 0
修改成USE_OPENCV :=1
,#USE_LEVELDB := 0
修改為 USE_LEVELDB:=1
,將#USE_LMDB := 0
修改成 USE_LMDB :=1
。
然後修改以下幾行(路徑根據自己的情況來定):
PYTHON_INCLUDE := /usr/include/python2.7 /usr/local/lib/python2.7/dist-packages/numpy/core/include
WITH_PYTHON_LAYER := 1
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
如果opencv為3以上(本文為3.3),則將OPENCV_VERSION := 3取消註釋,然後修改下面一行(opencv中的3rdparty/lib路徑根據自己的情況來定):
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial /usr/local/share/OpenCV/3rdparty/lib/
然後進入Python目錄安裝依賴關係:
cd python
#預設Python版本為Python2
for req in $(cat requirements.txt); do sudo -H pip2 install $req --upgrade; done
複製程式碼
然後返回caffe目錄,修改Makefile.config:
cd ..
vi Makefile.config
複製程式碼
將這一行:
NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
替換為:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
然後開啟CMakeLists.txt,加入下面一行:
# ---[ Includes
set(${CMAKE_CXX_FLAGS} "-D_FORCE_INLINES ${CMAKE_CXX_FLAGS}")
複製程式碼
最後編譯caffe(在caffe目錄下):
mkdir build
cd build
cmake ..
make all -j $(($(nproc) + 1))
make test -j $(($(nproc) + 1))
make runtest -j $(($(nproc) + 1))
make pycaffe -j $(($(nproc) + 1))
#看看是否在caffe目錄下,不是就切換到該目錄下再執行
make distribute -j $(($(nproc) + 1))
複製程式碼
最後為了讓Python與Caffe一起工作,編輯檔案~/.bashrc:
vi ~/.bashrc
在檔案末尾加入這一行:
export PYTHONPATH=/path/to/caffe-master/python:$PYTHONPATH
最後為了使配置立即生效:
source ~/.bashrc
複製程式碼
CPU版本至此編譯完成。
GPU版本
和CPU版本很像,只是有些許不同。編譯該版本前請保證已經安裝CUDA 8和Cudnn。
編輯Makefile.config:
vi Makefile.config
將配置檔案裡面的# USE_CUDNN := 1
修改成: USE_CUDNN := 1
,即取消註釋。
同理將# WITH_PYTHON_LAYER := 1
修改為 WITH_PYTHON_LAYER:=1
,#USE_OPENCV := 0
修改成USE_OPENCV :=1
,#USE_LEVELDB := 0
修改為 USE_LEVELDB:=1
,將#USE_LMDB := 0
修改成 USE_LMDB :=1
。
然後修改以下幾行(路徑根據自己的情況來定):
PYTHON_INCLUDE := /usr/include/python2.7 /usr/local/lib/python2.7/dist-packages/numpy/core/include
WITH_PYTHON_LAYER := 1
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
CUDA_DIR := /usr/local/cuda-8.0
如果opencv為3以上(本文為3.3),則將OPENCV_VERSION := 3取消註釋,然後修改下面一行(opencv中的3rdparty/lib路徑根據自己的情況來定):
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial /usr/local/share/OpenCV/3rdparty/lib/
然後進入Python目錄安裝依賴關係:
cd python
#預設Python版本為Python2
for req in $(cat requirements.txt); do sudo -H pip2 install $req --upgrade; done
複製程式碼
然後返回caffe目錄,修改Makefile.config:
cd ..
vi Makefile.config
複製程式碼
將這一行:
NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
替換為:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
然後開啟CMakeLists.txt,加入下面一行:
# ---[ Includes
set(${CMAKE_CXX_FLAGS} "-D_FORCE_INLINES ${CMAKE_CXX_FLAGS}")
複製程式碼
最後編譯caffe(在caffe目錄下):
mkdir build
cd build
cmake ..
make all -j $(($(nproc) + 1))
make test -j $(($(nproc) + 1))
make runtest -j $(($(nproc) + 1))
make pycaffe -j $(($(nproc) + 1))
#看看是否在caffe目錄下,不是就切換到該目錄下再執行
make distribute -j $(($(nproc) + 1))
複製程式碼
最後為了讓Python與Caffe一起工作,編輯檔案~/.bashrc:
vi ~/.bashrc
在檔案末尾加入這一行:
export PYTHONPATH=/path/to/caffe-master/python:$PYTHONPATH
最後為了使配置立即生效:
source ~/.bashrc
複製程式碼
至此GPU版本編譯成功。
測試caffe mnist集
進入caffe目錄並測試:
cd ~/caffe
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh
複製程式碼
結果如下:
測試成功,至此,本教程結束。