TensorFlowの物体検出用ライブラリ「Object Detection API」を手軽に使えるソフト「Object Detection Tools」を作ってみた

f:id:karaage:20190525162350p:plain:w640

TensorFlowの「Object Detection API」が凄いけど難しい

 ディープラーニングによる物体検出を色々試しています。

 上記の記事では、SSDという手法だけを試してみたのですが、その他の色々な手法(Faster RNN等)やパラメータを変えて比較してみたくなりますね。

 そんなときに便利なのがGoogleさんが提供している「Object Detection API」です。

 実験的なソフトの位置付けではあるのですが、学習から推論まで可能なソフトが揃っていますし、configファイルを用いてSSDをはじめとした多くの手法や、ハイパーパラメータの変更を試すことが可能です。加えて「Object Detection API」で使用可能な、学習済みのモデルが「Model Zoo(学習モデルの動物園)」で数多く公開されているのも嬉しいですね。とても素晴らしいライブラリです。

 一方、実際に使ってみて「Object Detection API」には、私のようなソフトがあまり得意じゃない人間には、以下のような問題があるなと感じました。

  • 学習のための教師データのファイル変換(tfrecord形式への変換、ラベルファイルの変換)が手軽にできない
  • 学習のためのファイル構成の構築や、configファイルの修正がわかりにくく間違いやすい
  • 学習するソフトと推論(物体検出)するソフトが分離していないため、手軽に試すのが大変(リポジトリが巨大)
  • モバイルデバイス(Android、Raspberry Pi、Jetson Nano等)で動かすためには、デバイスに応じたモデルの変換が必要だが難しい

 そこで上記の問題を解決すべく、「Object Detection API」を手軽に使えるツール「Object Detection Tools」(まんまの名前)を作ってみました。というか、作らざるを得なかったというのが正直なところです…

 特徴は以下です。

  • 手軽にデータ変換できるスクリプトを用意
  • 学習ソフトと推論ソフトを分離し、巨大な「Object Detection API」を使わず手軽に推論(物体検出)が試せるスクリプトを用意
  • 学習が(比較的)楽になるようなファイル構成と、編集済みのconfigファイルの例を用意
  • モバイルデバイスへのモデル変換のスクリプトを用意(現状Jetson Nano向けのみ)

 こんなマニアックなソフトに需要があるのか分かりませんが、とりあえず公開してみます。もし、他にもっと便利な方法があるよ等の情報あれば教えて下さい。むしろそれが目的です。

 ツール作成してから、海外のブログでほとんど同じようなコンセプトでツール作っている人はみつけたので、みんな同じことで悩んでいるような気はしています…「Object Detection API」は多くの人類にとって早すぎるのかもしれません。

「Object Detection Tools」を使った物体検出

 ここから、「Object Detection Tools」の使い方のチュートリアルという名の自分のメモです。動作環境はMac OS/Linuxを想定しています。Windowsでも動くと思いますが未確認です。理屈上はPython環境さえ構築すれば動くはずですので、誰かチャレンジして結果教えてもらえると嬉しいです。

 ディープラーニングによる物体検出は、以下の図のように上の学習と下の推論(物体検出)のような2つのステップに分かれます。

 今回は、手始めに学習は行わず既に学習済みのモデルを用いて、推論(下の図の赤枠部分)のみを実施します。「Object Detection Tools」は、「Object Detection API」から推論部分を分離しているので、巨大な「Object Detection API」を含むTensorFlowのリポジトリをダウンロード無しでOKです。

f:id:karaage:20190525121857j:plain:w640

Python環境構築

 Pyenv + Anacondaを使ってセットアップしていきます。以下記事を参考にPyenvとAnacondaのインストールをしておいて下さい。

 あとは、以下コマンドを実行して物体検出(Object Detection)用の環境を用意します。

$ pyenv global anaconda3-4.4.0
$ conda create -n od anaconda
$ pyenv global anaconda3-4.4.0/envs/od
$ pip install tensorflow==1.13.1
$ pip install opencv-python

 重要なのは、TensorFlowとOpenCVですね。

物体検出のテスト

 「Object Detection Tools」のリポジトリをホームディレクトリにクローンします。学習をする場合は巨大な「Object Detection API」リポジトリも必要ですが、推論だけであれば、以下で「Object Detection Tools」だけダウンロードすればOKです。

$ cd && git clone https://github.com/karaage0703/object_detection_tools

 本来だと、モデルをデータを元に学習する必要がありますが、今回は学習済みのモデルを使用します。

 TensorFlowで使用できる学習モデルのリンク先一覧は「Model Zoo」(モデルの動物園)と呼ばれ「Object Detection API」のリポジトリ内の以下にあります。

 表の性能と速度から良さげな学習済みモデルを選びます。今回はssd_inception_v2_coco_2018を使ってみます。「Object Detection Tools」には、ダウンロードのスクリプトも作成しました。以下2行でssd_inception_v2_coco_2018のラベルcoco-labels-paper.txtとモデルfrozen_inference_graph.pbをダウンロードしてくれます。何をしているか気になる人は、スクリプトを確認してみてください。

$ cd ~/object_detection_tools/models
$ ./get_ssd_inception_v2_coco_model.sh

 物体検出のテストをします。PCにカメラがついている場合(Mac Book/iMac等)は、以下のコマンドを実行して下さい。もしカメラがなければ、適当なWebカメラつけても大丈夫と思います。

$ cd ~/object_detection_tools
$ python scripts/object_detection.py -l='models/coco-labels-paper.txt' -m='models/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb'

 上記のプログラムは-lのオプションでラベル、-mのオプションで使用するモデルを指定しています。実行するとカメラが起動して、リアルタイムに物体検出の結果が表示されると思います(速度はPCに依存します)。

 もしPCがない環境でしたら、以下コマンドでフリー素材をダウンロードしましょう。フリー素材は、有名ブログ「変デジ研究所」のロンスタさんの撮り下ろしです!いつもお世話になっています。

$ wget https://raw.githubusercontent.com/karaage0703/ssd_keras/master/free_data/lonestartx_free.mp4

 動画の場合のコマンドは以下です。

$ python scripts/object_detection.py -l='models/coco-labels-paper.txt' -m='models/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb' -d='video' --filename='./lonestartx_free.mp4'

 -dオプションでvideoを指定して、--filenameオプションでファイル名を指定できます。以下のようなやばい映像が表示されたらOKです。

f:id:karaage:20190525165632g:plain:w640
 やばい映像

 おまけ機能として、ウィンドウ上でmMを押すと検出した物体がモザイクになります。元に戻したいときはbBを教えて下さい。以前作成した「ディープモザイク」機能ですね。学習したものを何でもリアルタイムでモザイクかけれるので、某セクシー業界での利用が期待されます。「ディープモザイク」に関しては、以下記事参照下さい。

 左上の数字は、物体検出にかかる時間です。Mac Book Pro(2012 Core i7)で0.2秒以下です。中々の速度ですね。

 次にモデルを変更してみましょう。mobilenetという軽い学習モデルを使用してみます。以下4行でダウンロードして学習モデルのテストまでができます。-mオプションで指定するモデルファイルが変更されているのが分かりますね。

$ cd ~/object_detection_tools/models
$ ./get_ssd_mobilenet_v1_coco_model.sh
$ cd ~/object_detection_tools
$ python scripts/object_detection.py -l='models/coco-labels-paper.txt' -m='models/ssd_mobilenet_v1_coco_2018_01_28/frozen_inference_graph.pb' -d='video' --filename='./lonestartx_free.mp4'

 実行結果は、私の環境だと0.1秒以下と、検出時間が半分近くになりました。

f:id:karaage:20190525171022p:plain:w640
 ヤバい画像

モバイルデバイス(Raspberry Pi / Jetson Nano)での物体検出

 モバイルデバイスでも同じ要領で物体検出は可能なはず…ですが、基本的にそのままでは重くて使い物になりません。なので、それぞれのモバイルデバイスに応じて、モデルの最適化をしてやる必要があります(Object Detection APIのQuantization使えば全部OKなのかと思っていましたが、少なくとも自分の環境では全然うまくいきませんでした…)。

 マニアックになってくるのと、まだJetson Nanoでしか成功していないので、Qiitaにそれぞれ個別に記事を書き、ここからリンクを貼っていきます。

 このようにPCとモバイルデバイスと同じソフトで学習、推論ができるのは嬉しいですね。当たり前のようですが、実は今までできなかったことなので。Intel Movidiusとか、専用のソフトを書く必要があったりして大変でした。

まとめ

 TensorFlowの物体検出用ライブラリ「Object Detection API」を手軽に使えるソフト「Object Detection Tools」を作って、その使い方を簡単に紹介してみました。「Object Detection API」が自分には難しく、なかなか大変でしたが、少しだけTensorFlowと仲良くなれたかなという気がします(TensorFlow 2.0になるとどうなるのかという話は一旦忘れます)。

 自前データの学習に関しては、以下記事を参照下さい。

 また、環境構築を簡易にしたDockerイメージも用意しています。Dockerイメージはkaraage0703/object_detection_toolsからダウンロードできます。

参考リンク

TensorFlow Object Detection API tutorial — TensorFlow Object Detection API tutorial documentation

models/installation.md at master · tensorflow/models · GitHub

Object Detection APIで簡単に物体検知を行ってみる(トレーニングまで) - Qiita

Jupyter Notebook in Jetson Nano

今更ですが、VATICによる動画の自動追尾アノテーションを使用してTFRecord形式への変換まで実施してみました[Docker編] - Qiita

Edge TPU Accelaratorの動作を少しでも高速化したかったのでMobileNetv2-SSD/MobileNetv1-SSD+MS-COCOをPascal VOCで転移学習して.tfliteを生成した_Docker編_その2 - Qiita

Edge TPU Accelaratorの動作を少しでも高速化したかったのでMS-COCOをPascal VOCで転移学習して.tfliteを生成した_GoogleColaboratory[GPU]編_その3 - Qiita

NVIDIA Jetson Nano 開発者キットで TF-TRT を利用した物体検出を試す - Qiita

TensorFlowのsess.run()が遅かった - Qiita

How to Automate Surveillance Easily with Deep Learning

How to easily Detect Objects with Deep Learning on Raspberry Pi

Build a DIY security camera with neural compute stick (part 1)

関連記事