目前存在的问题:
$ python
>>import caffe
会报错:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named caffe
查询得到 >> 这可能是因为没有把caffe中的python导入到解释器中
在bashrc中添加 添加:
export PYTHONPATH=/这里更替为你自己caffe目录下的python文件夹的路径/caffe/python:$PYTHONPATH
但是还不行
搞了一天,下次再弄吧。。
我的安装环境:
- OS:Ubuntu 18.04 64 bit
- 显卡:NVidia GTX 1650
- CUDA:10.0
- cuDNN:7.6.0
- python:2.7(默认)/ 3.6
- OpenCV:2.4.11 / 3.2.0 (默认,可通过
pkg-config --modversion opencv
查看 )/ 4.1.2/4.4.0
第一步:下载源码
在所要安装的路径下:
git clone https://github.com/BVLC/caffe.git
直接下载,复制过来也ok…
编译
我的是直接下载的,所以需要解压,然后进入解压之后的目录,进行下面的操作
1. 将Makefile.config.example
文件复制一份并更名为 Makefile.config
:
sudo cp Makefile.config.example Makefile.config
复制一份的原因是编译 caffe 时需要的是 Makefile.config 文件,而Makefile.config.example 只是caffe 给出的配置文件例子,不能用来编译 caffe。
2. 文件修改
2.1 修改Makefile.config文件
(1)应用 cudnn
#USE_CUDNN := 1
修改为
USE_CUDNN := 1
(2)选择opencv (默认使用opencv2,但是我是opencv3的,所以需要修改一下)
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
(3)根据自身cuda版本修改(这里借用一下CAU_Ayao博主的图),文件中都有提示(蓝字部分)
CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \
#-gencode arch=compute_20,code=sm_21
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
(4)打开 python 接口
#WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
(5)修改 python 路径
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 /usr/lib/x86_64-linux-gnu/hdf5/serial
否则编译时会报错,说找不到 hdf5.h
2.2 修改Makefile文件
(1)将:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
(2)将:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
替换为:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
3. 编译
在解压后的这个目录下(有Makefile的目录)
make all -j8
如果一切顺利的话就100%了。
可是,我一般总是碰不到这种情况 -_-
问题1:Makefile:3:***遗漏分隔符。停止 。
原因:我是在进行2.1步中的(3)的时候,胡乱很随便的加了一些空格,于是出现这样的错误。注意Makefile文件Tab键和空格键的区别
问题2:Makefile 命令在第一个目标之前开始. 停止.
原因:在进行2.1步修改 取消注释的时候,仅仅时取消了#,并没有把前面的空格删掉
解决办法:要让不是注释掉的每一行都打头开始,不要留空格
问题3:./include/caffe/util/db_lmdb.hpp:8:10: fatal error: lmdb.h: 没有那个文件或目录
解决办法:sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
可能之后还会碰到类似的问题,安装上就行
sudo apt-get install libleveldb-dev
sudo apt-get install libsnappy-dev
sudo apt-get install libatlas-base-dev
!!!问题4:.build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’未定义的引用
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
CXX/LD -o .build_release/tools/convert_imageset.bin
CXX/LD -o .build_release/tools/caffe.bin
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
.build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::String::allocate(unsigned long)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::String::deallocate()’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)’未定义的引用
collect2: error: ld returned 1 exit status
.....(此处省略好多行)
Makefile:636: recipe for target '.build_release/tools/upgrade_solver_proto_text.bin' failed
make: *** [.build_release/tools/upgrade_solver_proto_text.bin] Error 1
.build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::String::allocate(unsigned long)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::String::deallocate()’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:636: recipe for target '.build_release/tools/extract_features.bin' failed
make: *** [.build_release/tools/extract_features.bin] Error 1
原因:很明显是opencv的问题
解决:首先看Makefile.config,是否取消注释 OPENCV_VERSION := 3,后续博客就有很多答案了,大概如下:
caffe默认使用opencv2.X版本,但是我安装的是opencv 3.1.0。
一改个有效的解决方案是,把opencv需要的lib添加到Makefile文件中,找到LIBRARIES(在PYTHON_LIBRARIES := boost_python python2.7 前一行)并修改为:
LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m opencv_core opencv_highgui opencv_imgp
但是我几乎试了所有的方法,还尝试在Makefile文件中加上opencv的路径,都不对,偶然间看到一博客(突然找不到了),提到caffe编译时opencv版本冲突的问题
,博客中提到,可以先通过cmake命令,显示相关信息,检查一下
。于是:
mkdir build
cd build
cmake ..
果然opencv找错了版本:
-- Dependencies:
-- BLAS : Yes (Atlas)
-- Boost : Yes (ver. 1.65)
-- glog : Yes
-- gflags : Yes
-- protobuf : Yes (ver. 3.0.0)
-- lmdb : Yes (ver. 0.9.21)
-- LevelDB : Yes (ver. 1.20)
-- Snappy : Yes (ver. ..)
-- OpenCV : Yes (ver. 4.1.2)
-- CUDA : Yes (ver. 10.0)
解决:
找到cmake文件夹下的Dependencies.cmake,打开,找到opencv部分
我是在105行指定了opencv 版本,在OpenCV后加了一个 3
find_package(OpenCV 3 QUIET COMPONENTS core highgui imgproc imgcodecs)
保存
可以cmake一下,看看opencv版本有没有调整过来
回到原始目录下,把之前cmake产生的文件删掉,重新编译
cd build
rm -rf * //把这个文件夹下所有的文件包括下层文件都删掉
cmake ..
make all -j8
这次就没什么问题了。。。
最后 执行
make runtest -j8
这一步耗时比较长,耐心等待
[ RUN ] DeconvolutionLayerTest/2.TestGradient
[ OK ] DeconvolutionLayerTest/2.TestGradient (7433 ms)
[----------] 5 tests from DeconvolutionLayerTest/2 (8714 ms total)
[----------] 1 test from SolverTest/1, where TypeParam = caffe::CPUDevice<double>
[ RUN ] SolverTest/1.TestInitTrainTestNets
[ OK ] SolverTest/1.TestInitTrainTestNets (2 ms)
[----------] 1 test from SolverTest/1 (2 ms total)
[----------] Global test environment tear-down
[==========] 2207 tests from 285 test cases ran. (343422 ms total)
[ PASSED ] 2207 tests.
[100%] Built target runtest
出现这样的结果就是ok啦!!~
配置pycaffe
sudo make pycaffe -j8