环境
Ubuntu16.04
miniconda3
python3.6
CPU
安装依赖项
# apt-get install libprotobuf-dev
# apt-get install protobuf-compiler
apt-get install libleveldb-dev
apt-get install libsnappy-dev
apt-get install libopencv-dev
apt-get install libhdf5-serial-dev
apt-get install libgflags-dev
apt-get install libgoogle-glog-dev
apt-get install liblmdb-dev
apt-get install aptitude
aptitude install libboost-all-dev
此处不建议使用apt安装protobuf,后续会有很多错误。caffe对应的protobuf版本为2.6.1.建议自己下载编译protobuf2.6.1.
安装protobuf2.6.1
安装过程参考:安装protobuf2.6.1
protobuf下载地址:https://github.com/protocolbuffers/protobuf/releases
在tag中找到protobuf2.6.1并下载,得到protobuf-2.6.1.tar.gz。
安装依赖项
apt-get install autoconf
apt-get install automake
apt-get install libtool
解压缩
tar -xvf protobuf-2.6.1.tar.gz
安装
./autogen.sh
此处会遇到以下信息,从网站下载gtest-1.5.0
Google Test not present. Fetching gtest-1.5.0 from the web...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0
可以从github下载安装包:https://github.com/google/googletest/tree/release-1.5.0,下载后解压得到googletest-release-1.5.0,把这个文件夹拷贝到protobuf-2.6.1文件夹里边,然后重命名为gtest。
然后再执行./autogen.sh这个命令,命令执行生成configure文件。
编译
./configure
make
make check
make install
切换protobuf版本
由于我的环境中本来就安装了protobuf3.5.1,所以编译安装后仍然不能调用新安装的2.6.1版本的protobuf,所以需要更改环境变量。新安装的protobuf位置可以通过find命令查找。
find / -name libprotobuf*
结果如下,其中/usr/local/lib/下的protobuf为新安装的。
/home/hi3559a/protobuf/lib/x86_64-linux-gnu/libprotobuf-lite.so
/home/hi3559a/protobuf/lib/x86_64-linux-gnu/libprotobuf.so
/root/miniconda3/lib/python3.6/site-packages/onnx/.libs/libprotobuf-487875fe.so.9.0.1
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.8
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so
/usr/lib/x86_64-linux-gnu/libprotobuf.so
/usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0
/usr/lib/x86_64-linux-gnu/libprotobuf.so.8
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.8.0.0
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.a
/usr/lib/x86_64-linux-gnu/libprotobuf.a
/usr/local/lib/libprotobuf-lite.so
/usr/local/lib/libprotobuf.so
/usr/local/lib/libprotobuf-lite.so.9.0.1
/usr/local/lib/libprotobuf-lite.la
/usr/local/lib/libprotobuf.la
/usr/local/lib/libprotobuf.so.9.0.1
/usr/local/lib/libprotobuf-lite.so.9
/usr/local/lib/libprotobuf.so.9
/usr/local/lib/libprotobuf-lite.a
/usr/local/lib/libprotobuf.a
/protobuf-2.6.1/vsprojects/libprotobuf.vcproj
/protobuf-2.6.1/vsprojects/libprotobuf-lite.vcproj
/protobuf-2.6.1/src/libprotobuf-lite.la
/protobuf-2.6.1/src/libprotobuf.la
/protobuf-2.6.1/src/.libs/libprotobuf.lai
/protobuf-2.6.1/src/.libs/libprotobuf-lite.lai
/protobuf-2.6.1/src/.libs/libprotobuf-lite.so
/protobuf-2.6.1/src/.libs/libprotobuf.so
/protobuf-2.6.1/src/.libs/libprotobuf-lite.so.9.0.1
/protobuf-2.6.1/src/.libs/libprotobuf-lite.la
/protobuf-2.6.1/src/.libs/libprotobuf.la
/protobuf-2.6.1/src/.libs/libprotobuf.so.9.0.1
/protobuf-2.6.1/src/.libs/libprotobuf-lite.so.9
/protobuf-2.6.1/src/.libs/libprotobuf.so.9
/protobuf-2.6.1/src/.libs/libprotobuf-lite.a
/protobuf-2.6.1/src/.libs/libprotobuf.a
更改环境变量:
vim ~/.bashrc
在~/.bashrc中添加环境变量:
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
source ~/.bashrc
可以通过查看protoc版本和位置确认。
protoc --version #查看protobuf版本
which protoc #查看protoc位置
下载caffe-ssd
建议使用weiliu89caffe-ssd:https://github.com/weiliu89/caffe
git clone https://github.com/weiliu89/caffe.git
cd caffe
编辑Makefile.config
使用vim或者gedit编辑
mv Makefile.config.example Makefile.config
vim Makefile.config
使用CPU
# CPU_ONLY := 1
改为
CPU_ONLY := 1
注释掉python2.7的内容
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
改为
#PYTHON_INCLUDE := /usr/include/python2.7 \
#/usr/lib/python2.7/dist-packages/numpy/core/include
使用miniconda中的python3.6
# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
# $(ANACONDA_HOME)/include/python2.7 \
# $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
改为
ANACONDA_HOME := /root/miniconda3 #更改路径为自己环境中的conda路径
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python3.6m \
$(ANACONDA_HOME)/lib/python3.6/site-packages/numpy/core/include
使用python3.6
#PYTHON_LIBRARIES := boost_python3 python3.5m
改为
PYTHON_LIBRARIES := boost_python3 python3.6m
添加一些库(?)
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:q
编译安装
make all
make runtest -j8
make pycaffe -j8
编译成功后可以在python测试。
错误总结
protobuf版本
make all过程中遇到如下错误,为protobuf版本不对应,需要自行安装protobuf2.6.1
- #error This file was generated by a newer version of protoc which is
libboost_python3
找不到lboost_python3,解决方法参考:https://www.cnblogs.com/skymiao/p/10825223.html
import错误
- ImportError: /caffe/python/caffe/_caffe.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
原因: libboost_python.so的版本不匹配,默认python版本为3.5,而boost_python为2.7。
解决方法:修改make.config文件, 将PYTHON_LIBRARIES := boost_python3 python3.5m注释去掉,并修改为PYTHON_LIBRARIES := boost_python-py35 python3.5m. 重新编译即可。
原文链接:https://blog.youkuaiyun.com/zjchenchujie/article/details/89976153
参考文章:
https://www.cnblogs.com/skymiao/p/10825223.html
https://blog.youkuaiyun.com/outloookcom/article/details/81005490
https://blog.youkuaiyun.com/zjchenchujie/article/details/89976153