Tensorflowでライオンとネコを検出する with GPU 2/2

AI

はじめに

前回、AIでライオンとネコを検出する!と題してTensorflowを使ってObject Detectionをやってみました。うまく識別はできたのですが、CPUで学習を行ったため大変時間がかかってしまいました。今回はGPUを使ってやってみようと思います。

ちょっと長くなるので2回に分けます。今回は2回目。1回目はこちら

前提

前回までにGCPでのGPUインスタンスの立ち上げは終わっているものとします。

環境構築

前回選択したVMのOSにはいろいろとソフトウェアがプリインストールされています。以下、自前のサーバで必要だった設定と比較して作業を記載していきます。

python3とライブラリの導入

このインスタンスにはすでにPython3(python3.5)が入っています。また、その他必要なライブラリも導入済みです。このため、python関連の設定は不要となります。

Protocol Bufferコンパイラの導入

Protocol Bufferのコンパイラも導入済みです。バージョンも3系なので、前回罠となっていたバグはないと思います。

 

学習データの準備

学習データについては、こちらの記事を参考に準備してください。

モデル生成

モデルの作成を行います。
ここは自前サーバの時と同じく、各種モデル作成ツールをgitから持ってきてセットアップします。cocoapiはすでに入っているようなので不要です。

ProtoclBufferのビルド

ここは自前サーバの時と同じです。cloneしたmodelの下に使用するプロトコルバッファの定義があるのでこれをコンパイルしておきます。

cocoapiのビルド

cocoapiはすでに入っているようなのでビルドは不要です。

データ変換ツールの準備

ここは自前サーバの時と同じです。上記のObject Detectionのチュートリアルページのツールが便利なので、cloneしたmodelsのresearch/object_detectionフォルダにコピーしておきます。

モデルの取得

ここも同じです。今回はssd_mobilenet_v2_cocoを使用します。
下記の通り、research/object_detection/にモデルを展開します。

学習データの振り分け

ここも同じです。画像データとラベルデータを’images/train’と’images/test’に振り分けます。対応するxmlとjpgはimages/testかimages/trainのいずれかの同じフォルダに入れてください。

tfrecordの作成

ここも同じです。チュートリアルのツールを使ってtfrecordを作成します。まずはcsvを作成してから、tfrecordを作成するという流れになります。ただし、tfrecord生成ツール(generate_tfrecord.py)はチュートリアル用に作成されているので、一部改変が必要です。具体的にはclass_text_to_int:の部分を検出したいものに変更する必要があります。ライオンと猫の場合は次のような感じ。

 

コマンドは次のように実行します。

トレーニングの設定

ここも同じです。トレーニングの設定をします。設定ファイルはtrainingフォルダに置くことにします。
ひな形のconfigをコピーして編集してください。labelmap.pbtxtはtfrecordに記載した情報に合わせて記載してください。ssd_mobilenet_v2_coco.configは後述します。

 

labelmap.pbtxtは次のようになります。

 

ssd_mobilenet_v2_coco.configの設定

ここも同じです。基本はクラス数と”PATH_TO_BE_CONFIGURED”書き換えを指示されているところを書き直せばいいです。
  • num_classes: 識別するクラス数。今回は2
  • fine_tune_checkpoint: 今回使うモデルのチェックポイント。今回は/home/xxx/models/research/object_detection/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt
  • train_input_reader->input_path: トレーニング用のtfrecord。今回は/home/xxx/models/research/object_detection/train.record
  • train_input_reader->label_map_path: ラベルへのパス。今回は/home/xxx/models/research/object_detection/training/labelmap.pbtxt
  • eval_input_reader->input_path: エバリュエーション用のtfrecord. 今回は/home/xxx/models/research/object_detection/test.record
  • eval_input_reader->label_map_path: ラベルへのパス。今回は/home/xxx/models/research/object_detection/training/labelmap.pbtxt
以上で大丈夫だと思うが、eval_configはデータ数に応じて変えたほうがいいかもしれない。また、num_stepsも。あとはデータ拡張当たりの設定もできるようだが必須じゃないので、ここでは言及しない。

トレーニング実施

下記のコマンドでトレーニングを実施してください。
・・え、やばい激速。自前サーバの時には1ステップあたり10秒くらいかかっていたのに、0.6秒。15倍くらい速い。
と、ここで、前回紹介したnvidia-smiでGPUの状況を見てみましょう。-lで監視のインターバルを指定できます。下記のように、どうもGPUが一つしか使われていないようです。ということは、8個使うともっと高速になる・・・?

 

どうやらGPUを何並列使うかを指定できるオプションがあるようです。--num_clonesです。これを8にして実行してみましょう。・・・おおおぉおぉ、、すげー速い。

 

nvidia-smiでも8個動いていることが見て取れますね。各GPUの使用率が70%くらいになるといいらしいのですが、実はCPUやディスクがネックになってそこまで出すがの難しいです。なのでGPUの性能を使い切りたいのであれば、CPUのコア数を増やしたり、ディスクをSSDにしたりとかが必要です。あるいは学習のバッチ数を増やすとかでもできるみたいです。GPUを使いこなすには、いろいろチューニングが必要なようです。


以上で、モデルの作成は終了です。

あとは、前回と同じようにネコとライオンを検出できるか確認してみてください。

まとめ

今回は、GoogleのGPUインスタンスを使って、Tensorflowを使って「ライオン」と「ネコ」の検出できるようにしてみました。いや、めちゃめちゃ速くてびっくりしましたね。ただ、お金もかかるので、せっかく複数のGPUを搭載したのであれば使いきれるように工夫をすることも大切ですので、そのあたりは注意が必要です。皆様もGPU使用を考慮してみてはいかがでしょうか。

次は、セグメンテーションでもやろうかな。

 

コメント