Raspberry PiはDeep Learningの夢を見るか?「DeepDreamでグロ画像生成」

f:id:karaage:20151227165927j:plain:w640

2016年初Raspberry Pi記事

 どうもです、Raspberry Piのわけわからん記事書いてるからあげです。2016年初のRaspberry Pi記事になる予定です。予定ですというのは2015年の年末にこの記事を書いているからです。今年も気が向いたらRaspberry Piのわけわからん記事を量産していこうと思います。よろしくな!
 新年一発めということで、初夢にからめて夢に関する話題です。去年末頃に話題になった人工知能が見る夢「DeepDream」の話題です。

Raspberry Pi 2 Model B

Raspberry Pi 2 Model B

DeepDreamとは

 一時期グロい画像を生成するということで話題になりましたね「Deep Dream」。Deep Dreamの詳細は以下参照ください。

 今更ながらですが、ちょっとやってみたいなと思い立ちました。この前Raspberry Pi2でDeep LearningやったしどうせならRaspberry Pi2でできないかな?検索したら既にRaspberry Pi2にインストールしている偉大なる先人がいるじゃん!楽勝楽勝!

 そう思っていた時期が私にもありました。結論から言うと地獄でした。必要なパッケージのインストールとビルドにめちゃめちゃ時間かかる上、上記サイトと同じようにやっても、エラー多発してそのたびに対処方法検索してトライアンドエラを繰り返す羽目になりました。そして、なんとかできるようになったものの、240x120サイズの画像サイズで1枚画像生成するのに5分かかるという状況。しかも5,6枚画像生成したらsegmentation falutで落ちるし。画像認識が一瞬だったので完全に見誤っていました。
 本当はDeep Learningデジカメ作りたかったのですが、ちょっとRaspberry Pi2での実現は道遠そうです。

Raspberry Pi2でDeep Dream画像

 興味ない方が大半の作り方等は後に回して、とりあえず結果だけ先に載っけておきます。

元画像

f:id:karaage:20151227170235j:plain:w480

 すっかりお馴染みのリファレンス画像。ろんすた (id:lonestartx) さん素材提供ありがとうございます!

Deep Dreamで画像生成

f:id:karaage:20151227170249j:plain:w480

f:id:karaage:20151227170304j:plain:w480

f:id:karaage:20151227170323j:plain:w480

f:id:karaage:20151227170333j:plain:w480

f:id:karaage:20151227170343j:plain:w480

f:id:karaage:20151227170351j:plain:w480

f:id:karaage:20151227165927j:plain:w480

 うわーグロ画像だ!だんだんグロ画像になっていくのがお分かりいただけるでしょうか?一枚生成するに5分以上かかり、6枚ほど生成した後segmentation falutでプログラムが落ちました。Raspberry PiがDeep Learningの夢を見ているのがお分かりいただけただろうか?

 この後は、このしょうもない結果を得るための地獄の宇宙語が続くので興味と覚悟がある方だけご覧ください(といってもこの記事の通りやれば2時間もあればできるはずです、多分、ファイト!)。

Deep Dreamセットアップ

 大きく2つ必要で、Deep LearningのCaffeというライブラリのインストールとDeep Dream自体のインストールです。ほとんどはCaffeとCaffeを動かすためのパッケージのインストールに費やされます。

Caffeインストール準備

 まずは適当な作業用のディレクトリを作って中に入りましょう。

$ cd
$ mkdir DeepDream
$ cd DeepDream

 以下のコマンドでCaffeの最新のソースコードを取得。

$ git clone --depth 1 https://github.com/BVLC/caffe.git

必要なパッケージをapt-getでインストール

 ひたすらインストールします。多分30分くらいかかります。

$ sudo apt-get update
$ 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

pythonのパッケージインストール

 Caffeに必要なpythonのパッケージをインストールします。必要なパッケージは以下のコマンドでコマンドで確認できます。1行目のコマンドはディレクトリの移動。

$ cd ~/DeepDream/caffe
$ less python/requirements.txt

 一気にpipで入れようとすると何故かエラーがでるので、apt-getで入れられるものはapt-getで入れます。具体的には以下のコマンドを地道に打っていきます。

$ sudo apt-get install cython
$ sudo apt-get install python-numpy
$ sudo apt-get install python-scipy
$ sudo apt-get install python-skimage
$ sudo apt-get install python-h5py
$ sudo apt-get install python-networkx
$ sudo apt-get install python-pandas
$ sudo apt-get install python-protobuf

 他のパッケージは、apt-getで入れるとバージョンが合わないらしいので以下のコマンドで必要なパッケージをpipというpythonのライブラリ専用のインストーラでインストールします。

$ cd ~/DeepDream/caffe
$ sudo pip install -r python/requirements.txt

ビルドのための準備

 ビルドのために色々準備が必要です。

ヘッダーなどの位置合わせ

 修正が必要とのこと、自動で修正するスクリプトgistにアップしました。以下のコマンドをコピペすれば修正してくれます。

$ cd ~/DeepDream/caffe
$ git clone https://gist.github.com/karaage0703/955324396cf60e1dc839 optimize
$ mv optimize/OptimizeBuildCaffe.sh ./
$ bash OptimizeBuildCaffe.sh
DB周りの調整

 ソースファイルの定数を変更する必要あります。以下コマンドでファイルを編集しましょう。

$ vi src/caffe/util/db_lmdb.cpp

 変更内容は以下

変更前
const size_t LMDB_MAP_SIZE = 1099511627776; // 1 TB

変更後
const size_t LMDB_MAP_SIZE = 536870912;
Makefile修正

 ビルドする前に、Makefileを修正する必要あります。まずは以下コマンドでMakefile準備して編集

$ cd ~/DeepDream/caffe
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config

 変更内容は以下です。理由は参考サイトを参照してください。あと参考サイトのままではhdf5が無いというエラが出てきたビルド通らなかったので、ひっしにググってLIBRARYにパスを追加すればビルドが通ることがわかりました。

変更前

7行目付近
# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1

42行目付近
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas

86行目付近
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

変更後

7行目付近
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

42行目付近
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := open

86行目付近
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial/

足りないパッケージのインストール

 この後はmakeしてはエラー発生、エラーメッセージでググる、再度makeの繰り返し。最終的に必要だったのは以下でしたのでビルドする前に入れちゃいましょう。一部不要なやつも入れちゃっているかも。エラーメッセージで出てくると大抵解決方法が出てきました。偉大なる先人に感謝感謝。すでにインストールされているものがあるかもしれませんが、気にせずどんどん進んでいってください。

apt-getでインストール
$ sudo apt-get install libboost1.55-all
$ sudo apt-get install cmake
gflagインストール
$ cd
$ 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 
$ sudo make install
glogインストール
$ cd
$ 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
$ sudo make install
mdbインストール
$ cd
$ git clone https://github.com/wizawu/lmdb.git
$ cd lmdb/libraries/liblmdb
$ make
$ sudo make install

 本家のgit://gitorious.org/mdb/mdb.gitが死んでいたのでミラーサイトを探し出しました。

Caffeビルド

 いよいよビルドです。ここまでの準備がうまくいっていたらビルドが一発で通るはずです。うまくいかなかったら…残念でしたね。エラーをググっては対処方を調べるという地獄へようこそ!(Welcome to underground!)

$ cd ~/DeepDream/caffe
$ make all -j4
$ make test -j4
$ make runtest
$ make pycaffe
$ make distribute
$ mkdir ~/pycaffe
$ mv distribute/python/caffe ~/pycaffe

 あとは以下コマンドでcaffeへのパスを通します。ここらへんもよくわからなくてググって解決しました。exportは起動のたびに実行必要になります。毎回面倒くさいという人は.bashrcにでもコピペしてね。

$ export PYTHONPATH=/home/pi/pycaffe:$PYTHONPATH
$ export LD_LIBRARY_PATH=/home/pi/DeepDream/caffe/distribute/lib:$LD_LIBRARY_PATH

モデルダウンロード

 ダウンロードしましょう。

$ cd ~/DeepDream/caffe/models/bvlc_googlenet/
$ wget http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel

DeepDreamインストール

 いよいよインストール!なのですが、ipythonで動かす本家のDeepDreamは何故かうまく動きませんでした(多分ipythonのバージョン関係)。単純にpythonで動かしたいけど、うまくいかず四苦八苦していたら、こちらにも偉大な先人が。

 プログラムコピペして、モデルのパスだけ書き換えたら一発で動きました。凄い!超感謝!パス書き換えたコードをgistにアップさせていただいたいので、以下のコマンドでコピー(clone)できます。

$ cd ~/DeepDream
$ git clone https://gist.github.com/d9ad7556fa624ccce303.git dd

DeepDream実行

 好きな画像をv.jpgという名前で保存して、スクリプトと同じディレクトリ~/DeepDream/ddに配置してから、以下コマンドを実行してください。画像のサイズは160x120くらいじゃないと1枚も生成できずsegmentation falutで落ちます。

$ cd ~/DeepDream/dd
$ python deepdream_sample.py

 同じディレクトリにframesというディレクトリが生成されて、約5分毎に画像が1枚生成されます。すでにframesが生成されているとエラになるので$ rm -rf framesでディレクトリ削除してね。

まとめ

 というわけでDeep Dreamやってみましたがかなり大変でした。そしてRaspberry Pi2でも重すぎて実用的じゃないですね。もっと軽ければ色々使い道ありそうなのですが…残念です。

参考リンク

関連記事