Windows Caffeインストールメモ

[１年半ほど前](http://qiita.com/SousukeShimoyama/items/88f538735bbcf434816b)に比べて、CaffeのWindows環境が随分と整備されてきたみたいです。
インストール手順は[公式](https://github.com/BVLC/caffe/tree/windows)を読めばわかる通りですが、ちょこちょこつまずく所もあったので自分用メモがてら書いてこうと思います。

※VS、pythonのバージョンごとにバイナリが用意されちゃってるので、これで事足りれば即終了です；

#準備
* Visual Studio 2013 or 2015
* Anaconda Python 2.7 or 3.5 x64
 - caffeのインストールに必要なpythonのパスが通ってるか確認しておく。
* cmake
* git環境(なくても可)

GPU版は以下も用意

* CUDA 7.5 or 8.0
 * 使用するGPUのcompute capabilityから、適したCUDAのバージョンを選ぶ。
 * VS2015の場合は8.0にする。
* cuDNN v5
 * CUDAバージョン、OS等を確認し、適したバージョンをダウンロード、解凍。
 * 後でcaffeのrootフォルダに移す。
 
#Caffeインストール
####1. git clone
 * コマンドラインやgit bash上で作業。C直下で作業する場合は管理者権限を忘れずに。
 * 適当なフォルダ（例：`C:\Projects`）にgit clone
 * cloneされたcaffeフォルダに移動し、`git checkout windows`でwindowsブランチに切り替え

```
C:\Projects> git clone https://github.com/BVLC/caffe.git
C:\Projects> cd caffe
C:\Projects\caffe> git checkout windows
```
※git cloneを利用しない場合はgithubのwindowsブランチから直接ダウンロードして所定のフォルダに置いてください。

####2. scripts/build_win.cmdを編集
* DEFINED APPVEYORの下にあるelseの中を編集
 * VS2013のときは MSVC_VERSION=12
 * CPU版にしたければCPU_ONLY=1

```
) else (
    :: Change the settings here to match your setup
    :: Change MSVC_VERSION to 12 to use VS 2013
    if NOT DEFINED MSVC_VERSION set MSVC_VERSION=14
    :: Change to 1 to use Ninja generator (builds much faster)
    if NOT DEFINED WITH_NINJA set WITH_NINJA=1
    :: Change to 1 to build caffe without CUDA support
    if NOT DEFINED CPU_ONLY set CPU_ONLY=0
    :: Change to Debug to build Debug. This is only relevant for the Ninja generator the Visual Studio generator will generate both Debug and Release configs
    if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
    :: Change to 1 to build a caffe.dll
    if NOT DEFINED CMAKE_BUILD_SHARED_LIBS set CMAKE_BUILD_SHARED_LIBS=0
    :: Change to 3 if using python 3.5 (only 2.7 and 3.5 are supported)
    if NOT DEFINED PYTHON_VERSION set PYTHON_VERSION=2
    :: Change these options for your needs.
    if NOT DEFINED BUILD_PYTHON set BUILD_PYTHON=1
    if NOT DEFINED BUILD_PYTHON_LAYER set BUILD_PYTHON_LAYER=1
    if NOT DEFINED BUILD_MATLAB set BUILD_MATLAB=0
    :: If python is on your path leave this alone
    if NOT DEFINED PYTHON_EXE set PYTHON_EXE=python
    :: Run the tests
    if NOT DEFINED RUN_TESTS set RUN_TESTS=0
    :: Run lint
    if NOT DEFINED RUN_LINT set RUN_LINT=0
    :: Build the install target
    if NOT DEFINED RUN_INSTALL set RUN_INSTALL=0
)
```

* cuDNNの項目をcmakeのオプションに追加(GPU版のみ)
 * -DCUDNN_ROOT=C:\Projects\caffe/cudnn-8.0-windows7-x64-v5.1/cuda ^（各環境に適したバージョンを指定）
 * `C:\Projects\caffe`をcaffe rootとしてます

```
cmake -G"!CMAKE_GENERATOR!" ^
      -DBLAS=Open ^
      -DCMAKE_BUILD_TYPE:STRING=%CMAKE_CONFIG% ^
      -DBUILD_SHARED_LIBS:BOOL=%CMAKE_BUILD_SHARED_LIBS% ^
      -DBUILD_python:BOOL=%BUILD_PYTHON% ^
      -DBUILD_python_layer:BOOL=%BUILD_PYTHON_LAYER% ^
      -DBUILD_matlab:BOOL=%BUILD_MATLAB% ^
      -DCPU_ONLY:BOOL=%CPU_ONLY% ^
      -DCOPY_PREREQUISITES:BOOL=1 ^
      -DINSTALL_PREREQUISITES:BOOL=1 ^
      -DCUDNN_ROOT=C:/Projects/caffe/cudnn-8.0-windows10-x64-v5.1/cuda ^
      "%~dp0\.."
```

####3. scripts/build_win.cmdファイルを走らせる
* コマンドライン上で実行
* ひたすらwarningが出るが、型変換警告がほとんど

####4. パスを追加
* `call build\libraries\prependpath.bat` でサードパーティライブラリのパスが追加される。
* コマンドラインの再起動時に上記の追加パスが消えてしまうので、パスを直に追加しておく。(コマンド上で有効にしたかったのですが、上手くいかなかったのでやむなく手動…)
* GPU版は、cudnnのbinをパスに追加する。
* (caffe root)\build\tools\Releaseをパスに追加する。
 * caffe実行ファイルの参照のためなので、直接exeを叩いてもよい

####5. pycaffeに必要なパッケージをインストール
* `conda install --yes numpy scipy matplotlib scikit-image pip six`
* `conda config --add channels willyd`
* `conda install --yes protobuf==3.1.0.vc12`
 * 環境変数にpythonpath：(caffe root)/pythonを追加


#Mnistによる動作確認
最後に動作確認のためにMnistで動かしてみます。

###データセット作成
* データをダウンロードhttp://yann.lecun.com/exdb/mnist/
 * train-images-idx3-ubyte.gz, train-labels-idx1-ubyte.gz, t10k-images-idx3-ubyte.gz, t10k-labels-idx1-ubyte.gzを全てダウンロード
* (caffe root)/examples/mnistにデータを展開
* `cd (caffe root)/examples/mnist`し、以下バッチを実行しMnistデータをlmdb形式に変換
(※caffe rootのパスに空白があると上手く動きません。)

```create_mnist.bat
SET EXE=%~dp0%\..\..\build\examples\mnist\Release\convert_mnist_data.exe
SET ROOT=%~dp0%

%EXE% %ROOT%\train-images-idx3-ubyte %ROOT%\train-labels-idx1-ubyte %ROOT%\mnist_train_lmdb --backend=lmdb
%EXE% %ROOT%\t10k-images-idx3-ubyte %ROOT%\t10k-labels-idx1-ubyte %ROOT%\mnist_test_lmdb --backend=lmdb
```

###学習
* CPU版は`examples\mnist\solver.prototxt`の solver_mode: CPU に変更
* caffe rootから `caffe train --solver=examples\mnist\solver.prototxt`
 * (caffe root)\build\tools\Releaseへのパスが通ってること前提

学習が走れば、無事インストール完了です。

#エラーが起きた時のTips
ちょっとしたミスでつまずくのは、環境構築でよくあることだと思います。以下、私が経験した凡ミスで必要な確認事項です。（あくまで参考までに）

* 各種パスが通っているか確認
 * パスが間違っていたり、余計な文字が紛れてないか
* CUDAバージョンがGPUに適してるか確認
 * titanXはmaxwellかpascalでバージョンが異なります
* build_win.cmdのcuDNNパスが合っているか確認
 * cuDNNが見つからないと自動的にCPU版になるようです