caffe编译过程


目前存在的问题:

$ 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

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值