一、简介
Caffe,全称Convolutional Architecture for Fast Feature Embedding。
Caffe是一个深度学习框架。
查看项目网站了解所有详细信息:http://caffe.berkeleyvision.org/
二、编译
Caffe依赖protobuf
注:如果Caffe要和tensorflow一起使用,需要调整依赖项版本:要基于protobuf-3.6.0版本来编译Caffe才行。
1.protobuf 编译
protobuf依赖boost
注:如果Caffe要和tensorflow一起使用,则要基于boost1.58版本来编译protobuf才行。
# 使用apt安装boost1.58
$ sudo apt install libboost1.58-dev
GitHub地址:https://github.com/protocolbuffers/protobuf
我下载的3.6.0版本:https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.0.tar.gz
解压并进入protobuf-3.6.0:
# 依赖项
$ sudo apt-get install autoconf automake libtool curl make g++ unzip
# 编译
$ cd protobuf-3.6.0
$ ./autogen.sh
$ ./configure
$ make -j12
$ make check # 如果“make check”失败,您仍然可以安装,但该库的某些功能可能无法在您的系统上正常运行。
# 安装
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
默认情况下,程序包将安装到/usr/local
。
但是,在许多平台上,/usr/local/lib
不是LD_LIBRARY_PATH
的一部分。您可以添加它,但可能更容易安装到/usr
。为此,请按如下方式调用configure:
./configure --prefix=/usr
如果您已经使用不同的前缀构建了包,请确保在再次构建之前运行make clean
。
有关configure和make的高级用法信息,请参阅autoconf文档:
http://www.gnu.org/software/autoconf/manual/autoconf.html#Running-configure-Scripts
2.caffe 编译
GitHub地址:https://github.com/BVLC/caffe
在Ubuntu 16.04系统中,Caffe所有的依赖包均可通过apt搞定。
下面编译的是GPU版本:
$ cd caffe
# 依赖项(根据上述步骤,我们会已经安装好需要的依赖了)
#$ sudo apt-get install
# 修改选项 # 修改Makefile.config,例如我们可以打开CPU_ONLY选项。
$ cp Makefile.config.example Makefile.config
# 我是打开了USE_CUDNN选项,关闭CPU_ONLY
$ gedit Makefile.config
USE_CUDNN := 1
# CPU_ONLY := 1
CUDA_DIR := /usr/local/cuda
# 编译
$ make clean # 如果编译有奇怪问题,干脆直接clean一下。
$ make all -j12
# make runtest -j16
# make pycaffe
下面编译的是CPU版本:
# 修改选项 # 需要关闭USE_CUDNN选项,打开CPU_ONLY选项:
$ gedit Makefile.config
# USE_CUDNN := 1
CPU_ONLY := 1
# 因为我系统里是openCV4,include目录和opencv3有些不同,所以手动设置了路径:
INCLUDE_DIRS += /usr/local/include/opencv4
# 编译
$ make clean # 如果编译有奇怪问题,干脆直接clean一下。
$ make all -j12
# 编译问题1:
src/caffe/layers/window_data_layer.cpp:293:42: error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope
cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR);
^
# opencv4里的 CV_LOAD_IMAGE_COLOR 应该使用 cv::IMREAD_COLOR 来代替:
cv::imread(image.first, cv::IMREAD_COLOR);
# 好几个这样的问题,都需要这样去改源码。
# 例:CV_LOAD_IMAGE_GRAYSCALE 换成 cv::IMREAD_GRAYSCALE 等等。。。
# 问题2:
src/caffe/layers/hdf5_output_layer.cpp:4:18: fatal error: hdf5.h: No such file or directory
# 需要在Makefile.config里添加hdf5的路径:
$ gedit Makefile.config
INCLUDE_DIRS += /usr/include/hdf5/serial/
# 注:修改过宏定义,因为与openVINO冲突。
# 不是我修改的,所以具体改动点不明确。
库调用
对于API调用,可以在CMakeLists.txt中使用include_directories()写入指定调用路径。
我是把这些文件拷贝到了另一个文件夹下:
新建shell脚本auto_include_caffe.sh文件,写入以下内容,然后根据自己的目录运行脚本:
#!/bin/bash
if [ "$1" == "-h" ];then
echo "执行的文件名:$0";
echo "功能:拷贝caffe目录中的链接库文件,到目标目录中。"
echo "用法:$ bash 文件名 [源目录] [目标目录]"
echo "例子:$ bash auto_include_caffe.sh /home/toson/soft/caffes/caffe /home/toson/compile_libs/caffe"
exit 0;
fi
if [ "$1" == "" ];then
echo "请输入源目录!"
exit 0;
fi
if [ "$2" == "" ];then
echo "请输入目标目录!"
exit 0;
fi
mkdir -p "$2"
cp -r "$1""/include" "$2"
cp -r "$1""/.build_release/src" "$2"
cp -r "$1""/.build_release/lib" "$2"
echo "end."
这样在CMakeLists.txt中这样进行链接:
include_directories(
/home/toson/compile_libs/caffe/include
/home/toson/compile_libs/caffe/src)
link_directories(
/home/toson/compile_libs/caffe/lib)