WindowsにTensorflow1.15のObject Detection 環境を作ってみた。

Tensorflow の Object Detection API を今更ながら、Windows10 で試したので、構築からAPIのデモまでのメモです。
他の人もいっぱい書いているので需要があるか分からないけど、 Qiita 初投稿の練習も兼ねて書いてみた。

# インストール環境
・OS：Windows 10 Home バージョン 1909
・CPU:Intel core i5-2450M
・メモリ:8G
・HDD:SSD 500GByte
# Windowsのアップデート
・先ずは、Windows Update で更新プログラムの更新を行う。
<font color="Red"> 注意：20H2 への機能更新はしないでください。(2020/12/12時点)
numpyが対応していないようで、Object Detection APIのセットアップでエラーを吐きます。
間違えて更新してしまった場合、10日間は戻せますので、「設定」→「更新とセキュリティ」→「回復」から更新を戻す。
</font>
#Pythonのインストール
WindowsのPythonをダウンロードして、インストールする。
Python japan の下記URL を参照し、パッケージのダウンロードを参考に Python のパッケージ(python-3.7.9-amd64.exe)をダウンロードしてインストーラーを実行
https://www.python.jp/install/windows/install.html
注)Tensorflow 1.15 が対応している Python のバージョンが 3.7 なので、バージョンを間違えないよう注意

#Python virtualenv のインストール・仮想環境の作成
今後、色々なバージョンの Python や Tensorflow を利用する可能性を考え、virtualenv を導入しておく。
Anaconda でも良かったのですが、有償化の規約がちょっとアレだったので、virtualenv を利用

コマンドプロンプトを実行して、下記のコマンドで virtualenv をインストール

```console
> pip install virtualenv
```

Python のインストールフォルダを確認

```
> where python
C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python37\python.exe
C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps\python.exe
```

<B>仮想環境の作成時に \AppData\Local\Programs\ の方のPython を指定

仮想環境を作成
仮想環境名には利用する Tensorflow のバージョンを指定することにした。

```
> python -m virtualenv --python=C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python37\python.exe tf-1153
```

仮想環境に入るとコマンドプロンプトに仮想環境名が表示される。

```
> tf-1153\Scripts\activate
(tf-1153) C:\Users\[ユーザ名]>
```

#Git をインストール
下記のGitのサイトからインストーラーをダウンロードし、インストーラーを実行します。
https://gitforwindows.org/

基本的には、設定の変更を行わず「Next >」ボタン進み、「Install」ボタンでそのままインストールしてOKです。

#Tensorflow をインストール
Tensorflow のバージョン 1.15.3 をインストール
パソコンに NVIDIA の GPU がついている場合は、CUDA や cuDNN など　必要なモジュールをインストールしたうえで「tensorflow」を「tensorflow-gpu」に変更して GPU 対応版の Tensorflow をインストール

```
>　pip install tensorflow==1.15.3
```

#OpenCV をインストール
何かと画像処理が必要になることもあるので、OpenCV をインストール

```
>　pip install opencv-python
```

#Object Detection API のモジュールを取得
作業用のフォルダを作成

```console
> mkdir wtf1153
> cd wtf1153
(tf-1153) C:\Users\[ユーザ名]\wtf1153>
```

github から Object Detection API を取得

```console
>　git clone https://github.com/tensorflow/models
```

#protocol buffers をインストール
Tensorflow で利用するモジュールをインストール
・github から Windows 用のバイナリ(protoc-3.14.0-win64.zip)をダウンロードする。
　https://github.com/protocolbuffers/protobuf/releases/
・ダウンロードしたバイナリを適当なフォルダに展開
・`C:\Program Files\`フォルダの下にフォルダ「protoc」を作成
・展開した protocol buffers を作成した「protoc」フォルダに移動
　`C:\Program Files\protoc\protoc-3.14.0-win64`
・protoc フォルダに path を通す
 ①[スタート]を右クリック → [システム]の「システム情報」をクリック → [システム]の「システムの詳細設定」をクリック → [システムのプロパティ]を表示
 ②[詳細設定]タブ下の[環境変数(N)…]ボタンをクリック
 ③[ユーザ名]のユーザー環境変数(U) `Path` を選択し、[編集(E)…]ボタンをクリック
 ④環境変数名の編集で[新規(N)]ボタンをクリックし、`C:\Program Files\protoc\protoc-3.14.0-win64\bin\`を入力
 ⑤[OK]ボタンをクリックして「環境変数名の編集」「環境変数」「システムのプロパティ」を閉じる
 ⑥新しいコマンドプロンプトを実行し、protocのバージョンを確認

```console
> protoc --version
libprotoc 3.14.0
```

バージョンが表示されれば、protocol buffers のインストールは完了

#Object Detection で利用する protocol buffers のモジュールをコンパイル
```
> tf-1153\Scripts\activate
(tf-1153)> cd wtf1153\modules\research
(tf-1153)> protoc object_detection\protos\*.proto --python_out=.
```

`object_detection\protos` に拡張子が `.py` のファイルが出来ていれば完了 

#C++ ランタイムライブラリのインストール
Object Detection のセットアップで使用する、VC++ のランタイムを下記のURLからダウンロードして、インストーラーを実行
https://support.microsoft.com/ja-jp/topic/%E6%9C%80%E6%96%B0%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B-visual-c-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-2647da03-1eea-4433-9aff-95f26a218cc0


#C++ コンパイラのインストール
Object Detection のセットアップで使用する、Visual Studio Build tools を下記のURLからダウンロードして、インストーラーを実行
https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16

build Tools が起動したら、`C++ Build Tools`を選択してインストールを実行

#Object Detection のセットアップ
Object Detection のセットアップファイルをコピーして、セットアップを実行

```
(tf-1153)> copy object_detection/packages/tf1/setup.py .
(tf-1153)> python -m pip install .
```

#Object Detection のセットアップ結果を確認
セットアップ結果の確認を行うツールを実行し、セットアップが正常に行えていることを確認

```
(tf-1153)> python object_detection/builders/model_builder_tf1_test.py
  ～
　～
----------------------------------------------------------------------
Ran 21 tests in 0.290s

OK (skipped=1)
```

最後に`OK (skipped=1)`と表示されていれば、Object Detection 環境の構築は完了

#Jupyter notebook のインストール、起動
動作確認のチュートリアルを実行するため、Jupyter notebookをインストール

```
(tf-1153)> pip install notebook
```

#Object Detectopn のチュートリアル実行
チュートリアルを実行するための、`.ipynb`　を取得

```
(tf-1153)> cd %homepath%\wtf1153
(tf-1153)> git clone https://github.com/Mogtan3939/tf115-od-tutorial.git
(tf-1153)> cd tf115-od-tutorial
(tf-1153)> jupyter notebook
```

ブラウザが起動し Jupyter notebook の起動フォルダのファイル一覧が表示される。
チュートリアルファイル`OD-tf1153-test01.ipynb`をクリック
チュートリアルが新規タブで表示れるので [▶Run] ボタンをクリックして上から順番に実行していく

最後に Object Detecton 画像が表示される（ハズ）
![OD-tutrial.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277155/ab9a8060-7669-f9d2-d987-4246771eae9f.jpeg)
何だか認識精度が低いけど・・・気にしない。