每次装caffe都是一次痛苦的经历。
这种连安装都如此不友好的库,弃之如敝屣都来不及,然而还总是有人用, 我又不得不历经千辛万苦把它装好,这里记录一下,希望我永远都不会再用得到~~

1. Dependencies

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

具体啥是啥我也搞不清楚,反正照着copy就是~~

2. CUDA and cuDnn

网上也有很多关于CUDA和cuDnn的安装教程,感觉都太繁琐。 强烈建议各位按照下面这两个链接操作,轻松愉快。

3. OpenCV

这个没啥难度,自助随便百度一下跟着安装就行了。

4. Caffe

终于,过关斩将之后,我们来到了最终的大boss面前。
恶龙固然可怕,但勇士也必将战胜胆怯奋然前行!

4.1 Python dependencies

找一个你要下载caffe代码的路径,cd到该路径下,然后:

git clone https://github.com/BVLC/caffe
cd caffe/python

# 安装python依赖。
for req in $(cat requirements.txt); do sudo pip install $req; done

注意到这些python依赖有点蛋疼,有版本要求,但太高也不行~~
为了方便各位看官,我把自己的依赖版本列一下:

package version
Cython 0.29
numpy 1.15.3
scipy 1.1.0
scikit-image 0.14.1
matplotlib 2.2.3
ipython 5.8.0
h5py 2.8.0
leveldb 0.194
networkx 2.2
nose 1.3.7
pandas 0.23.4
python-dateutil 2.7.3
protobuf 3.6.1
python-gflags 3.1.2
pyyaml 3.13
Pillow 5.3.0
six 1.11.0

4.2 The Caffe!

安装完了python依赖项,然后是caffe了:

# 由于我们还在caffe/python路径下,所以切换回上一目录:
cd ..
cp Makefile.config.example Makefile.config

然后打开Makefile.config,将下面这些行改成:

1. line4:   USE_CUDNN := 1
2. line12:  USE_LEVELDB := 1
3. line13:  USE_LMDB := 1
4. line23:  OPENCV_VERSION := 3 # 如果你装的是opencv2.x版本的话,当我没说
5. line35:  仔细阅读这一段的说明,注释掉对应的某几行
6. line94:  WITH_PYTHON_LAYER := 1
7. line97:  INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
8. line98:  LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial 
"""
 看这篇文章的标题,注意到我用的是python2.7,这是为了减少不必要的麻烦。
 我也衷心劝各位,如果没有特殊的必要,还是用python2装caffe吧。
 虽然python核心团队计划在2020年就要停止支持Python2了。
 但是,你都决定装caffe了,还谈这些支持不支持有啥意义呢?
 所以,为免不必要的麻烦,奉劝看官还是用python2装caffe吧。
 当然,如果你用python3的话,记得修改Makefile.config里对应的行数,具体百度。
"""

现在我们的命令行还是在刚刚下载的caffe目录下,然后:

mkdir build
cd build
cmake ..
sudo make all -j8
sudo make install -j8
sudo make runtest -j8 # 这一步可能会报错,不用管,反正这里只是测试而已,前一步已经安装好了。至少我是没管的。
sudo make pycaffe -j8

到了这里,如果幸运的话,你运行:

python -c "import caffe;print(caffe.__path__)"

应该会出现类似下面这样的输出:

['/usr/local/lib/python2.7/dist-packages/caffe']

那么恭喜你,你成功了!

5. A vast expanse of ocean

如果你没那么幸运,那么恭喜你,和我一样掉入了安装caffe的汪洋大海里。

这片海,浮浮沉沉着无数和我们一样苦逼兮兮的人~~

但你比我又幸运一点,我这里恰好有几个解决错误的小手段,你可能用得上!

Error 1:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/data/Downloads/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/data/Downloads/caffe/python/caffe/pycaffe.py", line 13, in <module>
    from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ImportError: libcaffe.so.1.0.0: cannot open shared object file: No such file or directory

solution:
找到你的刚刚下载的caffe根目录,libcaffe.so.1.0.0应该在”/build/install/lib/“文件夹下, 把这个路径添加到系统路径下:

sudo vim ~/.bashrc

# 然后找到下面这一行:
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

# 然后把刚刚找到的libcaffe.so.1.0.0添加进去,比如我的变成:
export LD_LIBRARY_PATH=/home/data/Downloads/softwares/caffe/build/install/lib/:/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

# 然后使该改变生效:
source ldconfig

Error 2:

ImportError: xxx/caffe/_caffe.so: undefined symbol: _ZN5caffe3NetIfE21CopyTrainedLayersFromENSt7__cxx1112basic_stringIcSt11

solution:
这个错误也是非常蛋疼的。
我百度了超级多,一看就是互相复制粘贴的,都说要把Makefile.config里的

# Uncomment to support layers written in Python (will link against Python libs)
# WITH_PYTHON_LAYER := 1

这行给取消注释掉。 但其实我在4.2中已经设置了,却依然出现这个错误!
那我是怎么解决的呢?
说实话我不清楚。。。
应该是因为我重复安装了一遍?
或者,是幸运女神的眷顾?
反正这个问题我不知道如何解决掉的。。。
想起了那张经典图:
but why?
这里就有点对不起各位看官了,为做补偿,贴出一个官方issue
有心的看官应该注意到了,这几行的奇数行都押韵!(卖个小萌)

6. The end

综上,就是我如何与caffe斗智斗勇的过程。
完结,撒花!
justice!

regards.

oukohou.