摘要:本系列文章主要講解caffe的整個(gè)使用流程薪前,適合初級(jí)入門(mén)caffe奏篙,通過(guò)學(xué)習(xí)本篇文章柴淘,理清項(xiàng)目訓(xùn)練、測(cè)試流程。初級(jí)教程为严,高手請(qǐng)繞道敛熬。
目錄
深度學(xué)習(xí)框架之caffe(一) —編譯安裝
深度學(xué)習(xí)框架之caffe(二) —模型訓(xùn)練和使用
深度學(xué)習(xí)框架之caffe(三) —通過(guò)NetSpec自定義網(wǎng)絡(luò)
深度學(xué)習(xí)框架之caffe(四) —可視化與參數(shù)提取
深度學(xué)習(xí)框架之caffe(五) —模型轉(zhuǎn)換至其他框架
caffe 主要特點(diǎn)
與其他框架的性能對(duì)比
caffe使用
以u(píng)buntu16操作系統(tǒng)為例,windows等操作系統(tǒng)上的使用自行閱讀
文檔
官方文檔
[windows 下配置] (http://blog.csdn.net/happynear/article/details/45372231)
下載源碼
- 最原始版本:伯克利BVLC版【2月內(nèi)有更新】
- for windows: 基礎(chǔ)版, happynear【1月內(nèi)有更新】
- 其他:賈楊清自己的版本【近3年沒(méi)有維護(hù)】
- 最新版本:caffe2【一周內(nèi)有更新】
編譯
此后如無(wú)特殊聲明第股,默認(rèn)使用ubuntu16系統(tǒng)+BVLC版caffe源碼荸型,以CAFFE_ROOT表示caffe根目錄
下載源碼
打開(kāi)BVLC版github項(xiàng)目主頁(yè),可使用下載或 git clone 將源碼下載本地炸茧,推薦使用后者,這樣如果后期你對(duì)caffe源碼進(jìn)行了較好的修改稿静,可在修改過(guò)程中進(jìn)行版本管理梭冠,甚至可以使用git merge request 向源碼維護(hù)者發(fā)出請(qǐng)求,將你所做的改進(jìn)合并到源碼中改备,便于大家對(duì)開(kāi)源代碼的共同維護(hù)和升級(jí)控漠。git clone 命令如下:
git clone https://github.com/BVLC/caffe.git
安裝依賴(lài)庫(kù)
caffe需要很多依賴(lài)庫(kù):詳細(xì)參見(jiàn)官方安裝說(shuō)明文檔
cuda: gpu模式必須
BLAS: 科學(xué)計(jì)算工具,可使用ATLAS, MKL或OpenBLAS
Boost:
protobuf, glog, gflags,hdf5等
其他可選: opencv, lmdb, leveldb, cudnn
python接口及其依賴(lài)庫(kù):python2.7 或python3.3+悬钳, numpy盐捷,boost.python
matlab接口: MATLAB環(huán)境及mex編譯器
依賴(lài)庫(kù)安裝步驟如下:
$ sudo apt-get update
$ 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 libatlas-base-dev
編譯源碼
- caffe默認(rèn)編譯方式(Makefile.config)
Caffe 開(kāi)發(fā)者提供了比較簡(jiǎn)單的編譯方式,使得用戶(hù)即使不清楚通用的編譯方式默勾,也能很快地完成對(duì)源碼的編譯碉渡,只需用戶(hù)根據(jù)本機(jī)軟硬件的環(huán)境,通過(guò)修改Makefile.config文件母剥,對(duì)編譯環(huán)境進(jìn)行簡(jiǎn)單的配置即可滞诺。
注:初次使用源碼時(shí),根目錄下提供了一個(gè)配置樣例文件(Makefile.config.example)环疼,用戶(hù)需要進(jìn)行一次文件拷貝才能產(chǎn)生Makefile.config文件习霹,其部分內(nèi)容如下,用戶(hù)可根據(jù)本機(jī)環(huán)境進(jìn)行適當(dāng)?shù)男薷模?/li>
## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!
# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1(caffe默認(rèn)不使用cuda的cudnn模塊炫隶,需要手動(dòng)開(kāi)啟)
# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1(默認(rèn)gpu模式淋叶,無(wú)gpu時(shí)開(kāi)啟)
# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0
# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
# You should not set this flag if you will be reading LMDBs with any
# possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3 #(采用opencv3)
# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++
# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda # cuda目錄
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr
具體的編譯過(guò)程如下:
cd $CAFFE_ROOT
cp Makefile.config.example Makefile.config
# 根據(jù)本機(jī)環(huán)境修改 Makefile.config
make all -j8
make test -j8
make runtest
- cmake 通用編譯方式
大部分有開(kāi)發(fā)經(jīng)驗(yàn)的用戶(hù),都會(huì)對(duì)cmake編譯方式有一定的了解伪阶,caffe也支持cmake的編譯方式煞檩,該方式下,配置環(huán)境的設(shè)置可利用圖形化工具cmake-gui進(jìn)行相關(guān)參數(shù)(參數(shù)命名與Makefile.config中的命名基本一致)的配置望门,cmake經(jīng)驗(yàn)豐富的形娇,可直接修改根目錄下的CMakeLists.txt文件,部分內(nèi)容如下:
cmake_minimum_required(VERSION 2.8.7)
if(POLICY CMP0046)
cmake_policy(SET CMP0046 NEW)
endif()
if(POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif()
# ---[ Caffe project
project(Caffe C CXX)
# ---[ Caffe version【caffe版本號(hào)】
set(CAFFE_TARGET_VERSION "1.0.0" CACHE STRING "Caffe logical version")
set(CAFFE_TARGET_SOVERSION "1.0.0" CACHE STRING "Caffe soname version")
add_definitions(-DCAFFE_VERSION=${CAFFE_TARGET_VERSION})
# ---[ Using cmake scripts and modules
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
include(ExternalProject)
include(GNUInstallDirs)
include(cmake/Utils.cmake)
include(cmake/Targets.cmake)
include(cmake/Misc.cmake)
include(cmake/Summary.cmake)
include(cmake/ConfigGen.cmake)
# ---[ Options 【參數(shù)配置筹误,與Makefile.config類(lèi)似】
caffe_option(CPU_ONLY "Build Caffe without CUDA support" OFF) # TODO: rename to USE_CUDA
caffe_option(USE_CUDNN "Build Caffe with cuDNN library support" ON IF NOT CPU_ONLY)
caffe_option(USE_NCCL "Build Caffe with NCCL library support" OFF)
caffe_option(BUILD_SHARED_LIBS "Build shared libraries" ON)
caffe_option(BUILD_python "Build Python wrapper" ON)
set(python_version "2" CACHE STRING "Specify which Python version to use")
caffe_option(BUILD_matlab "Build Matlab wrapper" OFF IF UNIX OR APPLE)
caffe_option(BUILD_docs "Build documentation" ON IF UNIX OR APPLE)
caffe_option(BUILD_python_layer "Build the Caffe Python layer" ON)
caffe_option(USE_OPENCV "Build with OpenCV support" ON)
caffe_option(USE_LEVELDB "Build with levelDB" ON)
caffe_option(USE_LMDB "Build with lmdb" ON)
caffe_option(ALLOW_LMDB_NOLOCK "Allow MDB_NOLOCK when reading LMDB files (only if necessary)" OFF)
caffe_option(USE_OPENMP "Link with OpenMP (when your BLAS wants OpenMP and you get linker errors)" OFF)
# ---[ Dependencies
include(cmake/Dependencies.cmake)
具體編譯步驟:
cd $CAFFE_ROOT
mkdir build
cd build
# 編譯
cmake .. # 按默認(rèn)配置編譯
# or 設(shè)置部分參數(shù)
cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_python=OFF \
-DBUILD_python_layer=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/local \
..
# note:編譯工程桐早,可有需求地執(zhí)行
make all -j8 # 編譯所有
make caffe -j8 # 只編譯caffe的C++庫(kù),生成libcaffe.so
make pycaffe -j8 #編譯python接口
-
編譯結(jié)果
編譯成功后,在build目錄下可以看到如下圖所示的子目錄結(jié)構(gòu):
image.png- lib 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)目錄哄酝,存放libcaffeproto.a libcaffe.so libcaffe.so.1.0.0等庫(kù)文件
- tools 可執(zhí)行程序友存,包括訓(xùn)練,計(jì)算均值陶衅,提取特征屡立,數(shù)據(jù)轉(zhuǎn)換等可執(zhí)行程序
- examples 部分使用樣例程序
踩過(guò)的坑
編譯caffe源碼失敗的主要原因在于操作系統(tǒng)在不同的版本下某些庫(kù)的路徑會(huì)發(fā)生一定的變動(dòng)。最初的caffe 源碼中提供的Makefile.config.example是支持ubuntu12-14系統(tǒng)的搀军,因此Makefile.config中對(duì)依賴(lài)庫(kù)的路徑設(shè)置(主要是python頭文件和hdf5)都是在ubuntu12-14系統(tǒng)可行膨俐,而對(duì)于ubuntu16,python的包含目錄和apt源提供的hdf5庫(kù)有一定的改動(dòng)罩句,直接采用原來(lái)的Makefile.config編譯會(huì)報(bào)錯(cuò)焚刺,需要進(jìn)行相應(yīng)的路徑修改。但最新版本的caffe源碼已經(jīng)能夠支持ubuntu16门烂,仍需根據(jù)實(shí)際的ubuntu版本進(jìn)行相應(yīng)的修改乳愉。
- caffe.pb.h丟失問(wèn)題:
/home/ubuntu/caffe/include/caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: No such file or directory
問(wèn)題分析: caffe使用protobuf進(jìn)行數(shù)據(jù)傳輸(類(lèi)似json數(shù)據(jù)格式),用戶(hù)通過(guò)編輯 .proto文件確定數(shù)據(jù)協(xié)議屯远,數(shù)據(jù)結(jié)構(gòu)中存在哪些數(shù)據(jù)蔓姚,數(shù)據(jù)類(lèi)型是怎么樣的,給C++調(diào)用時(shí)慨丐,需通過(guò)protoc命令將改文件轉(zhuǎn)換成c++所需的頭文件(.pb.h)坡脐,caffe下.proto文件在src/caffe/proto/caffe.proto
解決方法: 用protoc從caffe/src/caffe/proto/caffe.proto生成caffe.pb.h和caffe.pb.cc
cd CAFFE_ROOT
protoc ./src/caffe/proto/caffe.proto --cpp_out=./include/caffe/
- ubuntu16下 python路徑引起的問(wèn)題:
fatal error: numpy/arrayobject.h沒(méi)有那個(gè)文件或目錄
問(wèn)題分析: caffe的python接口需要python.h 和numpy支持,需要添加兩種頭文件的路徑(Makefile.config Line66-67)
ubuntu14下自帶的python頭文件在/usr/include/python2.7(python3.4)下房揭,通過(guò)pip install numpy 命令安裝的numpy頭文件在/usr/local/lib/python2.7/dist-packages/numpy/core/include挨措,Makefile.config中默認(rèn)按該路徑添加相關(guān)頭文件路徑
而ubuntu16下通過(guò)pip安裝的python的numpy庫(kù)頭文件在/usr/lib/python2.7/dist-packages/numpy/core/include,若不修改崩溪,頭文件路徑引用錯(cuò)誤浅役,依舊找不到相關(guān)頭文件,因此報(bào)錯(cuò)伶唯。
解決方法: 修改為正確的python頭文件目錄觉既。若不熟悉ubuntu路徑,可先通過(guò)find命令找到這兩個(gè)頭文件所在的路徑(約Line66-67):
sudo find / -name Python.h
sudo find / -name arrayobject.h
然后在Makefile.config 中修改為正確的路徑:
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
- ubuntu16下HDF5安裝路徑引起的問(wèn)題:
“fatal error: hdf5.h: 沒(méi)有那個(gè)文件或目錄”
問(wèn)題分析: 首先確定是否正確安裝hdf5庫(kù)乳幸,防患未然瞪讼,執(zhí)行命令sudo apt-get install libhdf5-serial-dev
安裝hdf5,若提示已經(jīng)安裝粹断,則有可能是hdf5庫(kù)版本不同(有l(wèi)ibhdf5-dev和libhdf5-serial-dev兩種) hdf5-serial, 的頭文件路徑是/usr/include/hdf5/serial/符欠,庫(kù)文件名是hdf5_serial, 因此需要對(duì)Makefile.config進(jìn)行相應(yīng)的修改,將以下兩行(約Line 94-95):
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/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/hdf5/serial
即在末尾添加hdf5頭文件和庫(kù)文件名瓶埋,每臺(tái)計(jì)算機(jī)的默認(rèn)安裝路徑也可能不完全相同希柿,可根據(jù)具體情況添加诊沪。
- ubuntu16下python3.5路徑引起的問(wèn)題:
忘了,找到時(shí)再更新 - 使用anaconda python接口時(shí)anaconda自帶的protobuf引起的問(wèn)題:
通過(guò)sudo apt install libprotobuf-dev
安裝的protobuf版本一般相對(duì)較低曾撤,而anaconda自帶的也有protobuf端姚,所以在用anaconda中的python編譯pycaffe的過(guò)程中,解決問(wèn)題1時(shí)可能因?yàn)閮蓚€(gè)protobuf - python下import caffe 出現(xiàn)的問(wèn)題:
ImportError: libcublas.so.8.0: cannot open shared object file: No such file or directory
GPU版的_caffe.so 依賴(lài)libcublas.so.8.0庫(kù)文件(so文件相當(dāng)于Windows下的dll文件)挤悉,ubuntu系統(tǒng)對(duì)依賴(lài)庫(kù)文件的搜索路徑是/usr/lib和環(huán)境變量$LD_LIBRARY_PATH渐裸,cuda安裝默認(rèn)路徑是/usr/local, 安裝完成后需進(jìn)行環(huán)境變量的配置装悲,以便其他依賴(lài)cuda的應(yīng)用能夠正常訪(fǎng)問(wèn)共享庫(kù)文件(環(huán)境變量的配置詳細(xì)參考帖子):
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
ImportError: No module named google.protobuf.internal
未安裝python下的protobuf庫(kù)昏鹃。caffe依賴(lài)protobuf,python接口下調(diào)用caffe也需要protobuf第三方庫(kù)诀诊。安裝命令為:sudo pip install protobuf
注意事項(xiàng)
熟悉編譯原理和可執(zhí)行程序依賴(lài)庫(kù)調(diào)用的人盆顾,可以不局限于本文提供的流程和方式,比如畏梆,
- 將caffe編譯后的目錄添加到環(huán)境變量中,以供所有程序默認(rèn)可訪(fǎng)問(wèn):
# 讓C++等程序默認(rèn)可訪(fǎng)問(wèn)
export LD_LIBRARY_PATH=$CAFFE_ROOT/build/lib:LD_LIBRARY_PATH
# 讓python默認(rèn)訪(fǎng)問(wèn)
export PYTHONPATH=$CAFFE_ROOT/python:PYTHONPATH
# 可在任意目錄下執(zhí)行caffe訓(xùn)練命令
export PATH=$CAFFE_ROOT/build/tools:$PATH
- 同一臺(tái)主機(jī)上多個(gè)caffe庫(kù)共存
caffe默認(rèn)編譯目錄是build奈懒,生成一些so文件(動(dòng)態(tài)依賴(lài)庫(kù)奠涌,類(lèi)似Windows下的dll)。反復(fù)執(zhí)行make all/pycaffe 時(shí)會(huì)覆蓋上一次的編譯結(jié)果磷杏。當(dāng)python2和python3的接口都需要溜畅,或者同時(shí)需要cpu和gpu兩個(gè)版本時(shí),可以將第一次配置下生成的相關(guān)文件(build/lib下的so文件极祸,build/tools下的可執(zhí)行程序慈格,python/caffe目錄)拷貝到其他路徑,這樣修改配置參數(shù)后遥金,可編譯生成另一種配置下的caffe庫(kù)浴捆,同時(shí)可進(jìn)一步講這些生成文件拷貝到一個(gè)新的路徑下,或者添加到環(huán)境變量稿械。如我的計(jì)算機(jī)可以有不同功用选泻,版本的caffe庫(kù):
/home/ubuntu/caffe_py2 (python2接口庫(kù))
/home/ubuntu/caffe_py3 (python3 接口庫(kù))
/home/ubuntu/caffe_fastrcnn_py2(python2下支持faster rcnn的 caffe庫(kù))
有了這些不同版本,不同配置的caffe庫(kù)美莫,即使把CAFFE_ROOT下的源碼刪除页眯,也一樣能調(diào)用caffe相關(guān)庫(kù)和命令
注: 采用cmake編譯方式時(shí)也可直接通過(guò)參數(shù)-D-DCMAKE_INSTALL_PREFIX=path_to_install
設(shè)置caffe的安裝路徑
- 基于caffe的項(xiàng)目程序發(fā)布時(shí)對(duì)依賴(lài)庫(kù)的整理
通過(guò)命令ldd libcaffe.so
可查看caffe的依賴(lài)庫(kù),如下圖(圖中所列依賴(lài)庫(kù)不完整厢呵,僅截取部分)窝撵,
image.png
當(dāng)基于caffe的項(xiàng)目編譯成可執(zhí)行程序,并拷貝到其他電腦上時(shí)襟铭,只需將caffe的依賴(lài)庫(kù)文件拷貝過(guò)去碌奉,同時(shí)將庫(kù)文件所在的目錄添加到環(huán)境變量$LD_LIBRARY_PATH中即可運(yùn)行短曾,而無(wú)需在目標(biāo)主機(jī)上執(zhí)行一遍編譯過(guò)程。