TensorFlow Object Detection APIをWindowsで使ってみた

<img width="685" alt="TODA.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/213910/39cf7a1f-ca74-d45b-cb7b-c4588008e731.jpeg">

2017年6月にGoogle社から発表されたTensor Flow Object Detection APIのサンプルコードを動かしてみました。
UbuntuやMacOSで環境構築する方法が[ここ](http://ideahack.net/post-250/)や[ここ](http://robotics4society.com/2017/08/17/tf-object-detection/)や[ここ](https://qiita.com/yyoshiaki/items/058250321dc8ac1ddea6)に詳しく書かれていましたので、参考にさせていただきながらWindows環境で構築してみようと思います。

長々と記事を書いてしまったので、<b>太字</b>と`コードのインライン`だけ入力したら動くように書いているつもりです。

記事は2017/11/14に書き始めていますので、以降はインストールするもののバージョンが新しくなっているかもしれません。

(2018/4/25追記：Anaconda navigator上での操作　⑤Protobufのコンパイル　で入力するコードのハイフンが1つ全角になっていましたので、正しいコードに修正しました。)

<h1>環境構築</h1>
<h5>①ANACONDAのインストール</h5>

[ANACONDA](https://www.anaconda.com/download/#windows)から<img width="184" alt="anaconda.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/213910/d0c65dd4-ddde-7741-2684-c2c922b7a9bb.jpeg">の<b>Downloadをクリック</b>します。自動的に64bit版がインストールされます。
インストールはインストーラの指示通りに行いました。
<br>

<h5>②TensorFlowのモデルをダウンロード</h5>
githubに[TensorFlow Models](https://github.com/tensorflow/models)が置いてありますので、画面右側の<img width="283" alt="model.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/213910/32872059-bde5-0574-8bc2-12c2ceedf8e6.jpeg">から、<b>Download ZIPをクリック</b>します。
ダウンロードした<b>models-master.zipを展開</b>すると、フォルダmodels-masterが解凍されます。
私は、このmodels-masterをWindowsのユーザフォルダの中にフォルダAnacondaProjectsを作成し、その中に移動しました。(C:\Users\xlab_01\AnacondaProjects\models-master)
どこに置いているかを把握できていればどこでもよいと思います。
<br>

<h5>③Protobufのダウンロード</h5>
こちらもgithubに[Protocol Buffers](https://github.com/google/protobuf/releases)が置いてあります。画面を下にスクロールするとDownloadsがありますので、Windowsに対応したものをダウンロードします。今回は<b>protoc-3.4.0-win32.zipをダウンロード</b>しました。
展開したフォルダ内のフォルダbinに入っている<b>ファイルprotoc.exeを、先ほどのmodels-master内のフォルダresearchの中に移動</b>します。
<br>

<h5>④PYTHONPATHの設定</h5>
＜最重要＞
環境変数の設定からPYTHONPATHを通します。Windows10の環境下では、PCのプロパティから、画面左側のシステムの詳細設定に入ります。画面右下の環境変数をクリックすると、環境変数の設定画面に入ります。画面が二段に分かれていますが、上部の<b>ユーザ環境変数で新規をクリック</b>します。変数名および変数値は以下のとおりです。
<b>変数名：PYTHONPATH
変数値：～\models-master\research;～\models-master\research\slim</b>
変数値にはmodels-master内のresearchと、さらにその中のslimの二ヵ所に設定します。
私の環境下では、変数値には以下のように入力しています。C:\Users\xlab_01\AnacondaProjects\models-master\research;C:\Users\xlab_01\AnacondaProjects\models-master\research\slim
環境変数を設定したら、パソコンを一度再起動してください。
<br>
以上が、事前準備になります。
特に、PYTHONPATHの設定ができていないと、後のObject Detection APIの動作確認でエラーが出てしまいます。後の作業でエラーが出てしまったら、ここに戻って確認してみてください。
では、ここからはAnaconda navigatorを起動して操作していきます。

<h1>Anaconda navigator上での操作</h1>
<h5>①Anaconda navigatorの起動</h5>
<img width="1025" alt="ananavi.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/213910/10c8f2b7-cf4a-f63f-f701-9a6cc2ffe43b.jpeg">

Anaconda navigatorを起動したら、画面左側の<b>Environmentsをクリック</b>します。上図のような画面になりますが、まだ何も作成していなければ、真ん中は空っぽだと思います。これからObject Detection APIの実行環境を構築していきます。
<br>

<h5>②実行環境の構築</h5>
さきほどの画面の下部にある、<b>Createをクリック</b>します。実行環境の名前は任意に指定してください。Pythonのバージョンはデフォルトのままでよいのだと思います。私の場合は、名前はobj-detectとし、Pythonのバージョンは3.6としました。
実行環境が追加されたら、<b>名前の右側にある三角ボタン</b>をクリックし<b>Open Tarminalをクリック</b>します。その後、自動的にコマンドプロンプトが起動します。
<br>

<h5>③tensorflowのインストール</h5>
この実行環境にtensorflowをインストールします。
まず、コマンドプロンプトで以下のコマンドを入力します。
`pip install tensorflow`
GPU版のtensorflowをインストールする場合は、先ほどのコマンドの代わりに以下のコマンドを入力します。
`pip install tensorflow-gpu`
<br>

<h5>④ライブラリのインストール</h5>
- Protobuf 2.6
- Pillow 1.0
- lxml
- Jupyter notebook
- Matplotlib

これらをインストールするために、以下のコマンドを入力します。
`pip install Protobuf Pillow lxml`
`pip install Jupyter`
`pip install Matplotlib`
<br>

<h5>⑤Protobufのコンパイル</h5>
コマンドプロンプト上で、フォルダmodels-master内のフォルダresearchの中まで移動します。以下のコマンドで移動しますが、～～の部分は各々の環境に合わせて下さい。
`cd ～～\AnacondaProjects\models-master\research`
私の環境下では、以下のコマンドになります。
`cd C:\Users\xlab_01\AnacondaProjects\models-master\research`

移動できたら、以下のコマンドを入力してProtobufをコンパイルします。
環境構築の③Protobufのダウンロードを事前に終わらせてから実行してください。
`protoc object_detection/protos/*.proto --python_out=.`
問題がなければ下図のように、何事もなく処理が終了します。

![compile.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/559d42d2-c0c6-c36e-eed3-e1802506d4ef.jpeg)
<br>

<h5>⑥テスト</h5>
以上の処理で、環境が構築できているはずなので、テストしてみます。
⑤と同じ場所で以下のコマンドを入力します。
`python object_detection/builders/model_builder_test.py`

実行後に、OKと表示されれば環境構築が正しくできています。
<b>line21にエラーが出てしまった場合</b>は、環境構築の④PYTHONPATHの設定に失敗しています。もう一度やり直してみてください。


<h1>Object Detection APIの実行</h1>
<h5>①jupyter notebookの起動</h5>
さきほどの⑥テストの続きから進めていきます。
まず、cd コマンドでobject_detectionに移動します。
そして、以下のコマンドでjupyter notebookを起動します。
`jupyter notebook`

![juputer.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/5ed2d91b-cd74-f4f9-a92f-c4b726ca0cfc.jpeg)

<h5>②実行</h5>
jupyter notebookが起動したら、<b>object_detection_tutorial.ipynb</b>をクリックします。
そして、下図のようにobject_detection_tutorial.ipynbが開いたら、<b>Cellを押してRun All</b>をクリックします。
![exe.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/c13399e4-11fd-0515-48cc-051b907911fc.jpeg)

以下の写真のように判定結果が表示されます。本サイトのトップに表示していた写真も表示されるはずです。
![dog.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/a4a01206-01ac-7832-73cc-88241200c763.jpeg)
<br>

<h5>③新たな写真を追加し判定させる</h5>
用意されている写真での判定ができましたので、自由な写真を使ってObject Detection APIによる判定をしてみます。
このワンちゃんと海辺の写真は以下のフォルダに格納されています。
<b>～～\models-master\research\object_detection\test_images</b>
私の環境下では、
C:\Users\xlab_01\AnacondaProjects\models\research\object_detection\test_images
です。
ワンちゃんの写真はimage1.jpg、海辺の写真はimage2.jpgです。
ここに、<b>同じ命名規則で写真を保存</b>します。
私は、下図のようにimage3.jpgとimage4.jpgを追加しました。
![pict.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/fcaf69af-5a0e-d37c-f3a9-07c7cdeb24b0.jpeg)


次にjupyter notebook上でソースコードを書き換えます。といっても、for文の繰り返し処理の終了条件を変更するだけです。下図中の赤丸で囲んでいる部分の後ろの数字が終了条件になります。
<b>range(1, 〇)の〇の部分を「保存した画像のナンバー+1」に変更する</b>ことで新たに追加した写真を判定してくれます。もし、ワンちゃんと海辺の写真はもう判定不要であれば、前の数字を3にしてください。

![for.jpg](https://qiita-image-store.s3.amazonaws.com/0/213910/87002687-2989-ccb6-cdf5-28b4d52ea380.jpeg)

<h1>おわりに</h1>
以上で、今回のTensorFlow Object Detection APIをWindowsで使ってみた。のすべてになります。
私はPythonを使ったことがないのに、tensorflow使ってみたい！とはじめてみたのでPYTHONPATHを通すところで何度かつまづいていました。

次は、sentdexさんが以下の動画のシリーズでやっているように、自分で学習させて判定してみたいと思います。（マカロニチーズはもう見たくない。。。（笑））
Intro - TensorFlow Object Detection API Tutorial p.1
https://www.youtube.com/watch?v=COlbP62-B-U