DeepDreamを動かすまで

# DeepDream
http://japanese.engadget.com/2015/06/21/google-dream/
> Googleの研究者が、画像認識に使われる人工神経ネットワークが見た『夢』と称する画像を公開しました。

画像を入力すると、その画像を解釈し、画像として出力し、さらにそれを解釈し、という伝言ゲームを繰り返すことでとんでもない「夢」を見るニューラルネット。

大変面白そうなので自分のMac で試してみました。

ボルダリングの壁から次々と犬が生えてきます。
![boulder_dream.jpeg](https://qiita-image-store.s3.amazonaws.com/0/61079/15490325-a2ae-0ad9-3691-59fad1f7c748.jpeg)

そんな DeepDream を動かすまでの流れをメモしました。
環境によってハマりどころは違うとは思いますが DeepDream を動かしたい人の参考になれば幸いです。

追記：[Deep Dream のアルゴリズムについて自分なりに解釈したもの](http://www.slideshare.net/HarumitsuNobuta/deep-dream) を SlideShare に Upload しました。

# 対象読者
- コマンドラインはとりあえず使える
- とりあえず自分の環境で DeepDream を使ってみたい。いじってみたい。
- CUDAとかつかってガチな環境構築までは目指さない

ちなみに Web から DeepDream するサービスもあるようですので、とりあえず何か自分の画像で試してみたい人はそちらを使ってみるのもおすすめです。
[グーグルの人工知能を利用できるWebインターフェースが登場](http://www.atmarkit.co.jp/ait/articles/1507/08/news069.html)

# 注意
コマンドの実行は自己責任でお願いします

# 環境
- MacBook Pro (Retina, 15-inch, Mid 2014)
- グラフィック：Intel Iris Pro 1536 MB (CUDA無し)
- OS：OS X Yosemite 10.10.3

# 手順概要
## これから入れていくもの。

- brew: Mac にいろいろなソフトをコマンドラインから簡単に入れられるやつ
- pip: python のライブラリをコマンドラインから簡単に入れられるやつ
- caffe: DeepDream で使われる「 DeepLearning 」というニューラルネットの学習モデルを扱うプログラム
    - ニューラルネット：人間の脳の神経細胞（ニューロン）網を模して作られた学習モデル
- deepdream: DeepDream 本体

# インストール手順
## brew をインストール
brew をまだインストールしていない人は
http://brew.sh/index_ja.html
を見てインストールしてください。
```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
とコマンドラインで打てばいいはずです。

## caffeに必要なもののインストール
参考：http://caffe.berkeleyvision.org/install_osx.html

### brew 周りの更新
```
brew update
brew upgrade
```

### brew で必要な物を入れる
```
brew install --fresh -vd snappy leveldb gflags glog szip lmdb python wget
brew tap homebrew/science
brew install hdf5 opencv
brew install --build-from-source --with-python -vd protobuf
brew install --build-from-source -vd boost boost-python
brew install protobuf boost
```

### pip をインストール
```
/usr/local/bin/easy_install pip
```
（コマンドが見つかりません、と出る場合 `where easy_install` 等として探しましょう。）

## caffe 本体のインストール
参考： http://qiita.com/Saqoosha/items/d1a10accdef197a9de68

### ソースをダウンロードしてくる
```
git clone --depth 1 https://github.com/BVLC/caffe.git
```

### caffe のディレクトリに移動
```
cd caffe
```

### pip で必要なライブラリを入れる
python/requirements.txt に必要なライブラリが書かれているので、それを以下のコマンドで入れる。
```
sudo pip install --upgrade -r python/requirements.txt
```

### Makefile.config をいじる
サンプルファイルをコピー
```
cp Makefile.config.example Makefile.config
```

Makefile.config をテキストエディタで開いて、以下を修正していきましょう。

- `# CPU_ONLY := 1` の # を取る。
    - `CPU_ONLY := 1` になるはず
- `PYTHON_INCLUDE` の `/usr/lib/python2.7/dist-packages/numpy/core/include` となっている行を適宜修正
    - 私の場合 `/usr/local/Cellar/numpy/1.9.2_1/lib/python2.7/site-packages/numpy/core/include` にしました。
- `PYTHON_LIB` を適宜修正
    - 私の場合 `/usr/local/Cellar/python/2.7.10_1/Frameworks/Python.framework/Versions/2.7/lib` にしました

保存。

### おまじない
`ls /usr/local/lib/libjpeg.8.dylib` してみて、
`/usr/local/lib/libjpeg.8.dylib` がもし無いようだったら、
`sudo ln -s /usr/local/Cellar/jpeg/8d/lib/libjpeg.8.dylib /usr/local/lib/` 等としてシンボリックリンクを貼るといいと思います。

### コンパイル
いよいよ caffe をコンパイルしていきます。

```
make all
make pycaffe
make test
make runtest
```
runtest の後全部OKが出るか見ましょう。

### ディレクトリから出る
```
cd ..
```

## DeepDream のインストール
お疲れ様でした。あとは DeepDream を入れましょう。

### ソースのダウンロード
```
git clone --depth 1 https://github.com/google/deepdream.git
```

### ディレクトリに移動
```
cd deepdream
```

### おまじない
```
brew unlink jpeg
brew link jpeg
sudo pip uninstall pil
```
最後のはエラーが出ても問題ありません。

### 必要な python のライブラリをインストール
```
sudo pip install pyzmq jinja2 protobuf "ipython[notebook]" functools32
sudo pip install pil --allow-external pil --allow-unverified pil
```
私の環境では素直にPILが入らなかったので、 --allow-external, --allow-unverified をつけてインストールしました。

### path を通す
bash を使っている方は ~/.bashrc に、zshを使っている方は ~/.zshrc に以下を追記します。
どちらを使っているかわからない人は `echo $SHELL` と打つとどっちか分かります。

```
export PYTHONPATH=~/git/caffe/python/:$PYTHONPATH
```

上記を適用します。コマンドラインで以下を打ちます。( bash の人は .bashrc に変えてください。)
```
source ~/.zshrc
```

### DeepDream の実行に必要なニューラルネットのモデルをダウンロード
```
wget http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel -P ../caffe/models/bvlc_googlenet/
```

お疲れ様でした！これで完了です。

# 実行
deepdream 内で以下を打ちます。

```
ipython notebook
```

ブラウザが立ち上がります。
**dream.ipynb** というリンクをクリックします。

何やら説明とコードが表示されたページが表示されます。
上から順に、コードをクリックした後、上部の再生ボタンを押すと、そのコードが実行されます。
順番に実行していくとDeepDreamできます。

自分の画像を使いたい場合、 `img = np.float32(PIL.Image.open('******'))` となっている部分の ****** をいじりましょう。

エラーが表示される場合、がんばって直してください←


関連：[Deep Dream のアルゴリズムについて自分なりに解釈したもの](http://www.slideshare.net/HarumitsuNobuta/deep-dream)