Ubuntu on Windows10へのCaffeの導入とSingle Shot MultiBox Detectorの実行

#概要
 以前は、Ubuntu on Windows10でCaffeはLMDBの動作に問題がありましたが、現状動作する状態となっているようです。バークレー大学のCaffeですが、IntelのForkを導入してみたいと思います。
 Intelは自社のCPU上で高速に計算を実行するためのコンパイラやソフトウエアのライブラリを販売しています。そのうちMath Kernel Library（MKL)がオープンソース化されています。またディープラーニングのためのライブラリとしてMKL-DNNを同じくオープンソースで提供しています。MKL-DNNについては以下を参考にしてください。
https://analyticsai.wordpress.com/2017/04/18/mkl-dnn%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/

ディープラーニングはGPU頼みのところがありますが、MKLでは、CPUでの実行をが最適化されます。Ubuntu on Windows10では当然GPUが使えないため、高速計算のための選択肢として導入してみようと思います。
#作業
```
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 python-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
git clone https://github.com/intel/caffe
```

MKLのソースも同期されますが、mkldnn用のものであり別のTreeです。将来的には、本来のMKLとマージ予定とのことです。
Buildはcmakeを使います。また、ドキュメント生成用のdoxygenも導入します。

````
sudo apt-get install cmake doxygen
mkdir build
cd build && cmake ..
make all
make doc
make install 
make runtest

````

問題なくbuildできましたが、ただ、make runtestの途中でCore Dumpしてしまいます。
スレッドのライブラリとしてOpenMPを使っていますが、どうも通常のLinuxではないため、問題が発生するようです。下記環境変数で動作は可能になりますが、MKLのメリットが発揮できない形になり残念です。手動でパラメータ調整をトライしてみましたがうまくいっておりません。
`export KMP_AFFINITY=disabled`
Intel/caffeを導入しようと思った理由は、MKLが使用されていることもありますが、物体検出のためのSingle Shot Multibox Detector(SSD)マージされているからです。
#Single Shot Multibox Detector
 物体検出のアルゴリズムはいくつか提示されていますが、現状その中で最も高速な動作が可能な手法になります。物体検出のためのssd_detectというコマンドが作成されています。モデルですが、自分でPascal VOCデータセットやCOCOから、学習させることもできます。（大変時間がかかります。）コマンドを使用するためのトレーニング済み、モデルは下記からダウンロード可能です。

https://drive.google.com/open?id=0BzKzrI_SkD1_WVVTSmQxU0dVRzA

````
export LD_LIBRARY_PATH=~/caffe/external/mkl/mklml_lnx_2017.0.2.20170110/lib:~/caffe/external/mkldnn/install/lib

````

下記のコマンドを実行します。GPU抜きでも、2秒程度で結果がでます。

```
./build/install/bin/ssd_detect ./models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_120000.caffemodel images.txt -out_file detected.txt
```

実行結果になります。
![fish-bike.jpg.png](https://qiita-image-store.s3.amazonaws.com/0/177932/79ba2e8f-65ae-a96c-5216-c0df93d9d1de.png)
detected.txtの一部です。

```
examples/images/fish-bike.jpg 1 0.078266 5 6 40 26
examples/images/fish-bike.jpg 1 0.0164381 17 10 36 23
examples/images/fish-bike.jpg 1 0.0146594 19 6 54 21
examples/images/fish-bike.jpg 1 0.0139414 12 5 31 22
examples/images/fish-bike.jpg 1 0.0134924 452 42 477 60
examples/images/fish-bike.jpg 1 0.0128136 444 39 467 53
examples/images/fish-bike.jpg 1 0.0123987 2 -1 70 27
examples/images/fish-bike.jpg 1 0.0109627 417 20 484 61
examples/images/fish-bike.jpg 1 0.0108868 453 39 474 53
examples/images/fish-bike.jpg 1 0.0104954 25 9 43 22
examples/images/fish-bike.jpg 2 0.717551 52 81 448 307
examples/images/fish-bike.jpg 2 0.015517 54 242 172 294
examples/images/fish-bike.jpg 2 0.0149374 85 259 201 306
....
```

可視化のための画像を作成するのは、下記のコマンドになります。実行前にはcaffeのpythonモジュールを利用できるようにしないといけません。ただ、直接インストールしてしまうと問題があるようですので、PATHを通して使います。

``export PYTHONPATH=~/caffe/python``

scikit-imageが入っていない場合や、なぜか私はgoogle.protobufがimportできないという状況にもなりましたので、その場合は下記を実行します

```
sudo pip install protobuf scikit-image
python ./tools/extra/plot_detections.py --labelmap-file ./data/VOC0712/labelmap_voc.prototxt ./detected.txt  --save-dir . --visualize-threshold 0.2
```

物体検出はRCNNから始まり、Fast-RCNN、Faster-RCNNと進んできましたが、SSDで実用レベルのパフォーマンスになってきているようです。