Ubuntu 16.04 下安装配置caffe

原文地址:https://blogof33.com/post/5/

很长一段时间没有更新博客了,忙着充电,忙着学习。这次做项目需要使用到caffe,花了一些时间搭好了。本来是懒得写这一篇文章的,但是突然看到Tensorflow那一篇已经有700+的阅读量了,小博客访问量本来就少,大多仰仗校友们帮助,不能就这样荒废下去,辜负大家的一片心意,刚好写一下自己踩的坑,防止重蹈覆辙。

这篇教程参考了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

然后从https://github.com/opencv/opencv/archive/3.3.0.zip下载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

如图所示:

aoGZy.png

说明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

当前路径如图所示:

aoJWp.png

下面分成两个版本分别编译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  

结果如下:

cGyVH.png

测试成功,至此,本教程结束。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容