Hacks on Computer Vision

记录下编译caffe的若干事

2014.10.15

最近一段时间在深度学习框架caffe,看了它官方的文档和一部分代码,结合以前一些基本的神经网络知识,算是有了个大概的认识。在自己本机上ubuntu14.04上很容易配置好caffe的依赖环境,下载了一个训练好的ImageNet分类模型,写了几个python小脚本跑起来做图像分类。目前跑了10W多张,从所分类别的结果看,还不错,但要进一步验证准确性,就需要投入一些人力去辨别了,而辨别前,需要搭建一定的环境进行开发,于是,开始了折腾之旅。

按照caffe官方的installation指南,caffe依赖于一下几个包:

  • CUDA library version 6.5 (recommended), 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*)
  • BLAS (provided via ATLAS, MKL, or OpenBLAS).
  • OpenCV.
  • Boost (>= 1.55, although only 1.55 and 1.56 are tested)
  • glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
  • Python 2.7, numpy (>= 1.7), boost-provided boost.python
  • MATLAB with the mex compiler.

但其实CUDA和MATLAB不是必须的,caffe支持仅用CPU处理。于是就需要安装剩下的几个包。

公司服务器的源里有BLAS包,但也折腾了一下。

OpenCV 2.4.9

先是安装了源里的OpenCV,但看了下头文件,应该是2.0版本之前的,而caffe中用的C++的接口Mat,所以只能自己编译了。

编着编着,Error跳了出来:

No rule to make target `/lib64/libz.so', needed by `lib/libopencv_core.so.2.4.9'

搜了下,是要安装zlib。

然后又是cblas.h找不到,安装blas-devel包。

源里没有gflags-devel glog-devel lmdb-devel这几个包,手动安装如下:

# glog
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make && make install
# gflags
wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install
# lmdb
git clone git://gitorious.org/mdb/mdb.git
cd mdb/libraries/liblmdb
make && make install

其中gflags的时候,cmake版本太低,又手动编译了cmake 2.8。。

接下来就是编译大头了:OpenCV 2.4.9。这个库确实大了些,大概有2.5G左右,编译过程中几次因为空间不足而编译停止,时间基本都花在这上面了。不得不看下编译选项,先把能关的都关了,实在不行就不编译一些包,毕竟也只是用到少数的一部分核心函数而已。下面是编译OpenCV时遇到的问题:

error: unable to find a register to spill in class 'GENERAL_REGS'

用stackoverflow上的这个方法可以解决。

[ 92%] Generating pyopencv_generated_funcs.h, pyopencv_generated_func_tab.h, pyopencv_generated_types.h, pyopencv_generated_type_reg.h, pyopencv_generated_const_reg.h
  File "/usr/home/wanglei23/build/opencv-2.4.9/modules/python/src2/gen2.py", line 815
    cname1=("cv::Algorithm" if classinfo.isalgorithm else classinfo.cname)))
                             ^
SyntaxError: invalid syntax
make[2]: *** [modules/python/pyopencv_generated_funcs.h] Error 1
make[1]: *** [modules/python/CMakeFiles/opencv_python.dir/all] Error 2
make: *** [all] Error 2

想想应该是Python版本问题,默认版本是2.4.3,升级到2.6,在编译时指定Python的一些信息(感谢Stackoverflow),另外为了节省空间,关闭了一些选项,于是生成Makefile的命令就成了:

env CC=/usr/bin/gcc44 CXX=/usr/bin/g++44 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/ -D BUILD_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/usr/bin/python2.6 -D PYTHON_INCLUDE=/usr/include/python2.6/ -D PYTHON_LIBRARY=/usr/lib64/libpython2.6.so -D PYTHON_PACKAGES_PATH=/usr/lib/python2.6/site-packages/ -D PYTHON_NUMPY_INCLUDE_DIR=/usr/lib/python2.6/site-packages/numpy/core/include/ -D BUILD_TESTS=NO -D BUILD_PERF_TESTS=NO ..

折腾了好久,编译到92%时就开始担心会不会再次出现空间不足的问题,我的目录已经都清空了!!如果还有问题,要么找老大多分点空间,要么精简OpenCV,好在最后终于跳出了100%,舒了一口气~~

依赖解决了,最后也就是要编译caffe了。下面是遇到的问题:

./include/caffe/util/io.hpp:9:21: error: hdf5_hl.h: No such file or directory src/caffe/layers/hdf5_data_layer.cpp:14:21: error: hdf5_hl.h: No such file or directory src/caffe/layers/hdf5_output_layer.cpp:4:21: error: hdf5_hl.h: No such file or directory

其间遇到个问题:hdf5.hhdf5_hl.h,一个头文件(忘了是哪个了。。)包含了这两个,但include文件夹只有hdf5.h,看了下hdf5_hl.h就是hdf5.h的精简版,果断注释之,编译安装通过,后续应该不会有什么影响。

有点想不通,为啥会加两个这样的头文件呢?

之后又是boost库版本过低,升级吧,唉。。。

好不容易将caffe编译好,跑了几个自带的测试,终于没问题了,但编译Python接口时又出现了问题,编译是能通过的,但import就出错segmentation fault,查了好久原因,原来是用pip install numpy竟然装到了/usr/lib64目录下的Python中,而/usr/lib下的Python中也有numpy,于是冲突,想了想就把pip安装的卸载了,编译好后终于没问题了,但又陷入了其他依赖库的问题中,egg pain啊!caffe自带的python接口依赖于scikit-image,而scikit-image又依赖于比较高版本的numpy,我是真不想折腾numpy了,于是就先这样吧,至少C/C++编译出来也测试通过了,先用着。

看了下scikit-image在caffe的python接口的作用,貌似就是读入图像并转换成float类型,还用到个resize,看能不能修改下,用Image库来完成,如果可以到时可以提交个PR~~

今天和同事聊这个库,他说网上流传这个库难装,我确实体会到了,在自己的机子上倒没什么问题,但到了比较陈旧的服务器上,问题就来了,简单总结下,就是在服务器上安装时,先把基本的软件升级,比如gcc、python、cmake什么的,然后安装比较基本的库,如boost和OpenCV等其他的一些依赖,最后在编译caffe,编译时尤其要注意Makefile.conf里面的一些配置,改成自己实际安装的位置,我是绕来绕去把自己都绕晕了。。。caffe难装归难装,贵在好用啊,模块结构清晰,只需要写个深度学习的结构配置文件,就可以用了,还是非常方便的继续好好研究研究,不仅是深度学习框架方面的,代码规范方面的也可以多多学习~

__EOF__

本文作者HackCV
版权声明本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本文链接https://hackcv.com/posts/%E8%AE%B0%E5%BD%95%E4%B8%8B%E7%BC%96%E8%AF%91caffe%E7%9A%84%E8%8B%A5%E5%B9%B2%E4%BA%8B/

发表评论