YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

Raspberry Pi 3 Model B+にCaffeの環境を構築する方法

f:id:yuji-tanaak:20190501075908p:plain

インストール環境

Raspberry Pi Pi 3 Model B+
SDHCカード 16GB Class10*1
OS Raspbian-2018-10-09(11)

環境構築手順

注意点

  • Makefile.configで三箇所の修正が必要
  • エラーは基本的にライブラリ不足
  • ビルド($ make all -j2)に時間がかかる(15分程度)

インストール手順

1. Caffeのソースコード取得
$ git clone https://github.com/BVLC/caffe.git
2. 必要なパッケージのインストール
$ sudo apt-get install libopenblas-dev
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev
$ sudo apt-get install libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev 
$ sudo apt-get install libgoogle-glog-dev
$ sudo apt-get install liblmdb-dev
$ sudo apt-get install libatlas-base-dev 
$ sudo apt-get install python-protobuf
3. Makefile.configの修正
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config

Makefile.configの修正内容を抜粋して以下に示す。
GPUを演算に使わないため、下記を有効化する。

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

今回はOpenBLASを使っているので、下記のように修正する。

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
# BLAS := atlas
BLAS := open

hdf5のパス設定エラーが出るため、Makefile.configの既存の"INCLUDE_DIRS"と"LIBRARY_DIRS"へパスを追記する。

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial
4. ビルド
# 15分程度かかる
$ make all -j2
# 15分程度かかる
$ make test -j2
# 5分程度かかる
$ make runtest -j2
# Python用の Caffeの作成と distributeでビルド内容を反映
# 5分程度かかる
$ make pycaffe
# すぐ終わる
$ make distribute
# ここまで成功すれば Caffeのビルドは完了

$ make all -j2にてビルドは通るが、note: parameter passing for argument of type X will change in GCC 7.1という警告が発生する。対応はしていない。

5. 動作確認

環境変数 PYTHONPATHを設定する。設定するPATHはインストールしたディレクトリに従う。

export PYTHONPATH=~/caffe/build/caffe/python/:$PYTHONPATH

caffeをimportできることを確認する。

pi@raspberrypi:~/caffe/build/caffe $ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
>>> 

環境構築時に発生したエラー

ビルド時のエラー

libboostのインストール不足
pi@raspberrypi:~/caffe/build/caffe $ make all -j4
PROTOC src/caffe/proto/caffe.proto
CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/syncedmem.cpp
CXX src/caffe/util/cudnn.cpp
CXX src/caffe/solver.cpp
In file included from src/caffe/syncedmem.cpp:1:0:
./include/caffe/common.hpp:4:32: fatal error: boost/shared_ptr.hpp: そのようなファイルやディレクトリはありません
 #include <boost/shared_ptr.hpp>
                                ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/syncedmem.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/syncedmem.o] エラー 1
make: *** 未完了のジョブを待っています....
src/caffe/solver.cpp:6:38: fatal error: boost/algorithm/string.hpp: そのようなファイルやディレクトリはありません
 #include "boost/algorithm/string.hpp"
                                      ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/solver.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/solver.o] エラー 1

対応コマンド

$ sudo apt-get install --no-install-recommends libboost-all-dev

参考Webページ
ubuntu14.04にCaffeもインストールする - Qiita

gflags, glog, lmdbのインストール不足
pi@raspberrypi:~/caffe/build/caffe $ make all -j4
CXX src/caffe/solver.cpp
CXX src/caffe/syncedmem.cpp
CXX src/caffe/util/math_functions.cpp
CXX src/caffe/util/db_lmdb.cpp
In file included from src/caffe/util/db_lmdb.cpp:2:0:
./include/caffe/util/db_lmdb.hpp:8:18: fatal error: lmdb.h: そのようなファイルやディレクトリはありません
 #include "lmdb.h"
                  ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/util/db_lmdb.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/util/db_lmdb.o] エラー 1
make: *** 未完了のジョブを待っています....
In file included from src/caffe/syncedmem.cpp:1:0:
./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: そのようなファイルやディレクトリはありません
 #include <gflags/gflags.h>
                           ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/syncedmem.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/syncedmem.o] エラー 1
In file included from src/caffe/util/math_functions.cpp:6:0:
./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: そのようなファイルやディレクトリはありません
 #include <gflags/gflags.h>
                           ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/util/math_functions.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/util/math_functions.o] エラー 1
In file included from ./include/caffe/blob.hpp:8:0,
                 from ./include/caffe/net.hpp:10,
                 from ./include/caffe/solver.hpp:7,
                 from src/caffe/solver.cpp:7:
./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: そのようなファイルやディレクトリはありません
 #include <gflags/gflags.h>
                           ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/solver.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/solver.o] エラー 1

対応コマンド

$ sudo apt-get install libgflags-dev 
$ sudo apt-get install libgoogle-glog-dev
$ sudo apt-get install liblmdb-dev

参考Webページ
ubuntu14.04にCaffeもインストールする - Qiita

hdf5.hのパス設定不足
pi@raspberrypi:~/caffe/build/caffe $ make all -j4
CXX src/caffe/solver.cpp
CXX src/caffe/syncedmem.cpp
CXX src/caffe/util/math_functions.cpp
CXX src/caffe/util/db_lmdb.cpp
CXX src/caffe/util/insert_splits.cpp
In file included from src/caffe/solver.cpp:9:0:
./include/caffe/util/hdf5.hpp:7:18: fatal error: hdf5.h: そのようなファイルやディレクトリはありません
 #include "hdf5.h"
                  ^
compilation terminated.
Makefile:591: ターゲット '.build_release/src/caffe/solver.o' のレシピで失敗しました
make: *** [.build_release/src/caffe/solver.o] エラー 1
make: *** 未完了のジョブを待っています....

対応方法
Makefile.configの既存の"INCLUDE_DIRS"と"LIBRARY_DIRS"へパスを追記する。

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial

参考Webページ
【ビルド版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning Framework (ラズパイで Caffe Deep Learning Frameworkをビルドして Deep Dreamを動かしてキモイ絵を生成する)

CXX src/caffe/solvers/adam_solver.cppでビルドが進まなくなる

6時間ほど放置したが、ビルドが進まなくなる現象に遭遇、原因不明。ソースコードを再取得し、hdf5のパス設定方法など、参考ページをいろいろ見てやり直したら解決した。

動作確認時のエラー

caffeのパスが未設定
pi@raspberrypi:~/caffe/build/caffe $ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named caffe

対応方法
環境変数 PYTHONPATHを設定する。設定するPATHはインストールしたディレクトリに従う。

export PYTHONPATH=~/caffe/build/caffe/python/:$PYTHONPATH

参考Webページ
【ビルド版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning Framework (ラズパイで Caffe Deep Learning Frameworkをビルドして Deep Dreamを動かしてキモイ絵を生成する)

protobufのインストール不足
>>> import caffe
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/caffe/build/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/pi/caffe/build/caffe/python/caffe/pycaffe.py", line 15, in <module>
    import caffe.io
  File "/home/pi/caffe/build/caffe/python/caffe/io.py", line 8, in <module>
    from caffe.proto import caffe_pb2
  File "/home/pi/caffe/build/caffe/python/caffe/proto/caffe_pb2.py", line 6, in <module>
    from google.protobuf.internal import enum_type_wrapper
ImportError: No module named google.protobuf.internal

対応コマンド

$ sudo apt-get install python-protobuf

参考Webページ
ElCapitan(OSX10.11), Parallels11, Ubuntu, Caffe « こざくらラボ

まとめ

5時間程度かかり、大変だった。しかし、ネット上にたくさんの情報があり対応しやすかった。この後は、VGG16を動かしていく計画。


tips

Raspberry PiのVer確認方法

pi@raspberrypi:~/caffe/build/caffe $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch

*1:8GBだとギリギリ