第41回 Pythonもくもく会 TensorFlow Object Detection API メモ

第39回参加時の「Object Detection APIドラえもんをDetectしたい」というテーマの続きを@meganehouser氏と一緒に取り組みました。2019年7月21日に行われた第41回Pythonもくもく会でのはなし。開催していただいたSQUEEZEさんいつもありがとうございます!

3行で:

  • Amazon SageMakerからGoogle Colaboratoryに移行
  • 寿司DataSetをつかってTrainしてみるとそこそこ
  • ドラえもんDataSetをつくってTrainしてみたらいい感じ

何がしたいか

ドラえもんのObject Detection

著作物を著作者の許諾を得ず無断で利用していることがあります。 自分の関わっている会社の場合、人力でそのようなケースを検知しているのですが、 一定の有名な著作物を自動検知することで効率化できないかなと考え試しています。

何をしていたか

第39回では以下用いてためしました。

  1. 学習画像収集: 独自スクリプト by meganehouser 400枚くらい
  2. Augumentation: imgaug crop, horizontal flip, blur
  3. アノテーション: VOTT、ラベル一つ(doraemon)
  4. 学習: Amazon SageMaker, resnet-50

アノテーション方法:ドラえもんの全身画像

参考URL: https://dev.classmethod.jp/cloud/aws/sagemaker-umaibo-object-detection/

結果としては全然識別できず。敗因としては全身画像をアノテートしたことかと。

f:id:koyamay:20191023151128j:plain
全身画像のアノテーション
ドラえもんの場合、服装、ポーズなどバリエーションがありすぎるため一定した情報をアノテートできていないと考えました。

何を今回やったか

  1. 学習画像収集: https://github.com/hardikvasa/google-images-download 最終的には50枚くらい
  2. Augumentation: なし
  3. アノテーション: VOTT、ラベル一つ(doraemon)
  4. 学習: TensorFlow Object detection, resnet-50

アノテーション方法:ドラえもんの顔画像

また今回はColaboratoryを使用しました。

Google Colaboratoryに移行

これまでは会社の研究用アカウントでAmazon SageMakerを使っていましたが、共同作業者が別の会社に所属しており使用できない点がありました。 手軽に共同編集できるGoogle Colaboratoryに今回移行し、Object DetectionもTensorFlow Object Detection APIを利用する形に移行しました。

ColaboratoryはipynbでNotebookを共有でき、かなり参考になる資料が多くそれらを参考に進めていきました。 具体的には以下

www.dlology.com

寿司DataSetをつかってTrainしてみる

有志が寿司のDataSetを公開してくださっているので、先程述べたTrainするサンプルにDataSet中のTFRecordを指定しTrainしてみました。

https://qiita.com/watanabe0621/items/0b1cfa2d89c8321767e2 https://github.com/Jwata/sushi_detector_dataset

大体1分/100ステップくらいの学習速度で1000ステップほど学習。

学習したモデルの評価

寿司DataSetは1.中トロ、2.サーモン、3.いわしの3クラスのデータになっています。 いくつかの寿司画像の検出を試してみた際、以下の性質があるように感じられます。

  1. 単一種の寿司画像は検知できる
  2. 複数種類の寿司画像が存在する際の検知が難しそう

f:id:koyamay:20191023151403p:plain
sushi1
f:id:koyamay:20191023151509p:plain
sushi2

とりあえず検知はできそうだぞ、ということがわかったのでドラえもん画像で同様のことをしていきます。

ドラえもんDataSetの作成

google-images-downloadを用い画像を収集しました

github.com

公式ではjsonを渡せばうまくいくそうですが、うまくいかなかったので以下のようコマンド引数を渡すことで解決

googleimagesdownload --keywords="ドラえもん"  --limit=1000 -o="output_directory" --chromedriver="location_of_chrome_driver"

前回と違い、今回はできるだけシンプルなドラえもん画像を利用し、なおかつ枚数は最初は少なくあとから増やしていく戦略にしました。 最終的に50枚程度に落ち着きました。

VoTTを用いアノテーションを粛々と行います。

github.com

今回は前述の通り、顔をアノテーションしていきます。

f:id:koyamay:20191023152130j:plain
ドラえもんの顔をアノテーションする

その後.tfrecordを出力します。 以前は単一の巨大な.recordを利用されていたようですが、VOTTから出力すると複数の.tfrecordに分かれて出力されます。

Train&結果

Trainするサンプルでは単一の.recordを受け取ることを想定していますが、 以下を参考にNotebookを修正していきます。

Training object detection model with multiple training sets · Issue #3031 · tensorflow/models · GitHub

というわけで最終的にできたのが以下。 かなりコードなど汚いので公開していません。興味あるかたはメッセージください。

https://colab.research.google.com/drive/1tH-Uk4wm71LN8XolA80NdIbU96gb5YQi

結果

学習に使用していないデータを用い認識させてみます。f:id:koyamay:20191023152324j:plain

f:id:koyamay:20191023152349j:plain

f:id:koyamay:20191023152400j:plain

とてもいい感じ。特に最後の画像ではどらえもんが帽子をかぶっているのですが、それでもうまく認識できています。

うまく認識できなかった例

f:id:koyamay:20191023152622p:plain
ビルをドラえもんを誤認識

f:id:koyamay:20191023152712p:plain
ジャイアンをどらえもんと誤認識

誤認識はおそらくデータセットを増やすことで解決できそうだなとなんとなく感じました。

まとめ

今回以下の良い結果を得られました

  1. 顔をアノテーションすることで認識精度が高まりそう
  2. Colabolatoryを使うことで無料でGPUがつかえ複数人と共同作業ができる

アニメのキャラクターのキモとなる部分が顔で、顔をアノテーションすることでかなり認識精度がたかまりそうです。例えばアンパンマンなど他のアニメキャラクターに関してもこの傾向は同じな気がするので、これから別のアニメキャラクターでも試してみたいと思います。今回作業してやはりデータを集めることが大変だなというのは痛感しました。著作権をもつ会社がこういうことするとなんだか色々面白そうだよなと感じました。