WindowsでTensorFlow Object Detection API の環境構築(備忘録)

#Abstract
某大学院でDeep Learningによる物体検出をしています。

その際、**TensorFlow Object Detection API**の環境構築で

ハマってしまったので備忘録として記しておきたいと思います。

**【TensorFlow Object Detection APIとは】**
**Deep Learning、物体検出...というと、ハードルが高く感じるかもしれませんが、
その実装をサポートしてくれるフレームワークがあります。（TensorFlow,Pytorch,Chainer,Kerasなどが王道）
Tensorflow Object Detection APIでは学習済みのモデルが用意されており、
気軽に物体検出を試すことができます。**


質問、コメント、不備などがありましたらコメントにて受け付けています。

#環境
- Windows10 
- Visual Studio 2017
- NVIDIA GeForce RTX 2080 Ti
- CUDA 10.1
- cuDNN 7.6.5
- TensorFlow 1.15.0
- TensorFlow-gpu 1.15.0
- Anaconda3
- Python 3.6.10

#環境構築
Windows10でTensorFlow Object Detection APIを試すのに必要な環境構築を行なっていきます。

## Ⅰ．CUDA,cuDNNのインストール
[TensorFlowの公式サイト](https://www.tensorflow.org/install/source_windows?hl=ja)に
CUDA、cuDNNのバージョン関係の早見表があるのでそちらを参考にしたほうがいいと思います。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481407/846506d5-4f51-298a-e9a7-740f89a382f0.jpeg)


今回私は上記（環境に記載）のバージョンをインストールしています。

###1.CUDAのインストール
・下記サイトから**CUDA Toolkit 10.1**をインストール 
　https://developer.nvidia.com/cuda-toolkit-archive

・PATHの追加
　Windowsのコントロールパネルから**環境変数の設定**を開き、
　先ほどインストールしたCUDA Toolkit 10.1のPATHを通す。
　![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481407/8744a798-62a6-c02f-2754-fb487bff75ef.jpeg)

・コマンドプロンプトにてCUDAがインストールされPATHが通っているか確認

```コマンドプロンプト
C:\> where nvcc
```

　ちゃんとPATHの変数が問題なく表示されたら大丈夫だと思います。

###2.cuDNNのインストール
・下記サイトからcuDNNをインストール
　https://developer.nvidia.com/rdp/cudnn-download
　※インストールにはNVIDIA Developerへの登録が必要になります。

・登録が完了したら、CUDAのバージョンに合わせてcuDNNをインストールします。
　今回はCUDA==10.1をインストールしているので、cuDNN==7.6.5をインストールします。

・環境変数に**CUDA_PATH**と**CUDA_PATH_V10.1**が設定されているはずです。（自動的に追加されている）
　![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481407/56962376-6767-f7bf-bd0a-c73398db2fcc.jpeg)

・展開してできたディレクトリcuda の下にあるすべてのファイルとディレクトリを，
　**CUDA Toolkitをインストールしたディレクトリ**にコピー

・CUDNN_PATHを追加
　![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481407/edcc36c1-70e2-521f-8d22-aacbf764f1fa.png)

```コマンドプロンプト
C:\> Where cudnn64_7.dll
```

　問題なければ次に行きましょう。


##Ⅱ．TensorFlowのインストール
・Anaconda3にTensorflowの仮想環境を作成します。
　[【初心者向け】Anacondaで仮想環境を作ってみる](https://qiita.com/ozaki_physics/items/985188feb92570e5b82d)

```
C:\> pip install Tensorflow==1.15.0
C:\> pip install Tensorflow-gpu==1.15.0
```


・TensorFlowがしっかりインストールされているか確認
　Pythonで下記のように入力し、

```python

Python> import tensorflow as tf; print(tf.__version__)
```

```python

>>> "1.15.0"
```

　**"1.15.0"**とインストールしたバージョンの数字が返ってきたらOKです。

###TensorFlow Object detection APIの環境構築
基本的には公式【[TensorFlow Object Detection - Installation](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md)】通りにやれば大丈夫でした。

###ライブラリのインストール
```
pip install --user Cython
pip install --user contextlib2
pip install --user pillow
pip install --user lxml
pip install --user jupyter
pip install --user matplotlib
pip install --user tf_slim
```
自分の場合**numpy**が最新のバージョンだと後々うまくいかなかったので
**numpy==1.16**にダウングレードしました。

###TensorFlow / modelsリポジトリをダウンロード

```コマンドプロンプト
C:\> git clone https://github.com/tensorflow/models.git
```

###COCO APIのインストール

```コマンドプロンプト
C:\> git clone https://github.com/cocodataset/cocoapi.git
C:\>cd cocoapi/PythonAPI
C:\cocoapi/PythonAPI>make
C:\cocoapi/PythonAPI>cp -r pycocotools <path_to_tensorflow>/models/research/
```

**※または、pipを使用してインストール（こちらのほうがWindowsではうまくいく）**

```
C:\>pip install git+https://github.com/philferriere/cocoapi.git#egg=pycocotools^&subdirectory=PythonAPI
```


・tensorflow/models/researchで下記コマンドを実行

```
C:~/models/research/>protoc object_detection/protos/*.proto --python_out=.
```

・PYTHONPATHの設定
　Windowsでは下記のようにコマンドを実行してPATHを通す

```
C:\>set PYTHONPATH= <C:\~\models\research>;<C:\~\models\research\slim>
```

##Ⅲ．テスト
　これまでやってきた環境構築がうまくいったかどうかテストします。

・tensorflow/models/researchで下記コマンドを実行

```
C:~/models/research>python object_detection/builders/model_builder_tf1_test.py
```
　実行結果

```
[ RUN      ] ModelBuilderTF1Test.test_create_context_rcnn_from_config_with_params(True)
[       OK ] ModelBuilderTF1Test.test_create_context_rcnn_from_config_with_params(True)
.
.
.
.
.

[ RUN      ] ModelBuilderTF1Test.test_unknown_ssd_feature_extractor
[       OK ] ModelBuilderTF1Test.test_unknown_ssd_feature_extractor
----------------------------------------------------------------------
Ran 21 tests in 0.209s

OK (skipped=1)
```

上記のような結果が出力されれば問題ありません。
**(skipped=1)**となっているのはよくわかりませんが問題なく学習できているので大丈夫？？

私の場合はこれで問題なく学習できています。

##Ⅳ．参考
- [TensorFlow公式](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md)
- [【初心者向け】Tensorflow Object Detection API を使ってみた](https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b) @IchiLab
- [TensorFlow Object Detection APIをWindowsで使ってみた](https://qiita.com/x-lab/items/224e63565ecf1c3109cf)@x-lab