OpenCV3.2+Tensorflow1.0.1環境構築メモ

久しぶりにPC環境Ryzenを一新したので、画像処理系をやるべく環境構築作業中。
作業振り返りと似たような環境の方への情報になればと思いメモ作成。
あとはRyzen人柱。
(最終ビルド日2016/04/10)

#1.ハードウェア&OS構成
現在の構成を以下に示します。

|要素  |名称 |
|:----|:----|
|CPU  |AMD Ryzen7 1700 (3.3GHz OC)|
|M/B  |MSI X370 GAMING PRO CARBON (BIOS v1.2)|
|Memory|DDR4 2667MHz 8GB x 2 |
|OS |Windows10 Pro 64bit |
|Graphic|Geforce GTX 1060 6GB|
「まだ不安定～」とか言われているRyzenですが、4/9時点では問題なく動いている。
なんというかメモリの相性がキモのような。
自分もBIOS1.0の時はメモリが2400MHzまでしか認識しなかったけどアプデでちゃんと2667MHzまで動くようになりましたし。
メーカーの対応表を見つつ最新BIOSで動かす感じで。
今回はGPU動くようにするのを目標にしています。GTX1060とは言えせっかく載せてるし。

#2.構築目標
今回の構築目標はWindows10環境下で以下の3つを利用可能にすること
・OpenCV3.2
・TensorFlow1.0.1(GPU版)(+Keras2.0.3)
・CUDA8.0
OpenCVは細かい設定をするためCMakeでビルドします。

#3.事前導入ソフトウェア
OpenCVのビルド開始前に導入するソフトウェアを以下に示します。
断りのない限り64bit版を導入しています。

|名称  |バージョン |
|:----|:----|
|Microsoft Visual Studio|Community 2015|
|Cuda Tool Kit|8.0|
|cuDNN|5.1|
|CMake|3.8.0-rc4 64bit|
|Git For Windows|2.12.2.windows.2|
|Anaconda3|**4.2.0**|

CUDAとAnacondaは注意点があります、後述。

#4.CUDA導入注意点
TensorFlow1.0系でサポートしているCUDAは8.0およびcuDNN5.1です。
これらを導入する際は以下に注意してください。

・cuDNNはNVIDIAのページで登録が必要
・GPUはCompute Capability(NVIDIAのページ参照)3.0以上のもの
・CUDA8.0の正式サポートVisualStudioは2015のみ
・NSightの設定が面倒なのでVisualStudioを事前に入れる

NSightは再度インストーラ立ち上げればあとからも差分で入れられます。

#5.Anaconda導入注意点
TensorFlowのサポートするPythonが現在3.5系のみなので、これをAnacondaで入れます。
注意点はこの記事作成時の最新である4.3.1ではなく4.2.0を使用している点です。
インストールはAll User設定で、PATHにも追加し、システムのPythonにPython3.5を登録します。
なんか、このシステムに登録というのがレジストリに設定しているようで(追及未完了)、4.3.1を入れると
これがPython3.6になってしまい、仮に後でPythonを3.5.2にデグレしてもBUILD_opencv_python3の項目が
出ないなどうまくビルドできなくなります。
以上まとめると。

・**インストーラはAnaconda3 4.2.0を使用**
・**conda update はしない**
・面倒なことになりそうなのでroot環境を使う
・インストール後の状態でそのままpipでtensorflow-gpu, kerasを入れる 
・上記作業はAnaconda Promptの管理者権限で(良く忘れる)

仮想環境も3.5なら大丈夫だと思いますが試してません。
導入が完了したらipython等でimport kerasしてちゃんとgpu版のTensorFlowとKerasが入っていることを確認。

#3.事前導入ライブラリ
OpenCVビルド前に以下のライブラリを導入しました。

|名称  |バージョン |
|:----|:----|
|Eigen|3.3.3|
|Intel TBB| 2017 Update5|

Eigenとかヘッダだけだから別にCMakeで入れないでパス通すだけでもいいけど今回は気分でCMakeで入れました。
大体のCMakeプロジェクトは「C:\Program Files」等の書き込みに管理者権限が必要なディレクトリにインストールしようとするため、VisutalStudioは管理者権限で実行するものとします。
TBBは公式から最新のwin向けのzipを落としてきて今回は「D:\workspace\tbb」に入れました。
環境変数に以下のパスを追加
・D:\workspace\tbb\bin
・D:\workspace\tbb\bin\intel64\vc14 (←使用コンパイラに合わせる。)
・D:\workspace\tbb\include
・C:\Program Files\Eigen3

#4. CMakeの時間だ
CMakeの設定で今回デフォルトから変えたところを以下に挙げます。

|パラメータ  |設定値|備考|
|:----|:----|:----|
|CUDA_FAST_MATH|有効|気分で。|
|CUDA_ARCH_BIN|6.1|NvidiaでComputational Capabilityを調べて対応するGPUのみ入力。|
|BUILD_opencv_python3|有効|python3バインドのビルド。|
|BUILD_PERF_TESTS|無効|通らないので除外。|
|TBB_ENV_INCLUDE|D:/workspace/tbb/include|インストール場所に合わせる。|
|TBB_ENV_LIB|D:/workspace/tbb/lib/intel64/vc14/tbb.lib|インストール場所、コンパイラに合わせる。|
|TBB_ENV_LIB_DEBUG|D:/workspace/tbb/lib/intel64/vc14/tbb_debug.lib|インストール場所、コンパイラに合わせる。|
|TBB_VER_FILE|D:/workspace/tbb/include/tbb/tbb_stddef.h|インストール場所に合わせる。|
|WITH_CUDA|有効|CUDA使用|
|WITH_EIGEN|有効|Eigen使用|
|WITH_TBB|有効|TBB使用|


これで、Debug, ReleaseでINSALLビルドすると、ざっくり3時間弱ぐらいで完了して。
Debugビルドのopencv_python3だけが以下エラーになるはず。
```
LINK : fatal error LNK1104: ファイル 'python35_d.lib' を開くことができません。
```
まぁAnacondaにDebug版のlib付いてないし、ビルドするのも面倒なので今回は放置。
Pythonからデバッグしない分には良いし。

#5. 参考
インストール時に参考にした記事等へのリンク

[OpenCV3.2とcontribをWin10に導入してビルドしてサンプル実行。](http://shibafu3.hatenablog.com/entry/2017/02/05/221641)
[Visual Studio 2015によるOpenCV3.2のコンパイル]
(http://qiita.com/fukushima1981/items/980dff52dbdd46d7ed99)
[openCVで犬猫判別をする前の準備](http://d.hatena.ne.jp/dichika/20140126/p1)

#6.総括
はじめはAnaconda3 4.3.1に仮想環境でPython3.5環境作ってそこに入れようとしましたが、そこが嵌りポイントでした。
インストール時に設定されるシステムのPythonを任意に変更できればそれでも行ける気がしますが、とりあえず先の作業をしたいので調べる予定は無しですかね。
当分は3.5環境だと思いますし。

#7.その後(2017/5月現在)
OpenAI gymの拡張分(atariとか)がWindows Nativeでは入らないので、Bash on Ubuntu on Windowsとか試したのですが、現状ではB on U on W上ではGPUが使えないということで、結局Ubuntu16.04とのデュアルブートにしたというオチです。
今はやってる機械学習系はチュートリアルの入ぐらいを除けば基本GPU無いと辛いですからね・・・。
現在のオープンソース環境では最新パーツのドライバ除けば、Linuxの方が対応早いし問題少ないしで良かったという・・・。
まぁそれでもWindowsで使えないの?って言う人いるから役には立つさね、きっと。