第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回では以下用いてためしました。
- 学習画像収集: 独自スクリプト by meganehouser 400枚くらい
- Augumentation: imgaug crop, horizontal flip, blur
- アノテーション: VOTT、ラベル一つ(doraemon)
- 学習: Amazon SageMaker, resnet-50
参考URL: https://dev.classmethod.jp/cloud/aws/sagemaker-umaibo-object-detection/
結果としては全然識別できず。敗因としては全身画像をアノテートしたことかと。 ドラえもんの場合、服装、ポーズなどバリエーションがありすぎるため一定した情報をアノテートできていないと考えました。
何を今回やったか
- 学習画像収集: https://github.com/hardikvasa/google-images-download 最終的には50枚くらい
- Augumentation: なし
- アノテーション: VOTT、ラベル一つ(doraemon)
- 学習: TensorFlow Object detection, resnet-50
また今回はColaboratoryを使用しました。
Google Colaboratoryに移行
これまでは会社の研究用アカウントでAmazon SageMakerを使っていましたが、共同作業者が別の会社に所属しており使用できない点がありました。 手軽に共同編集できるGoogle Colaboratoryに今回移行し、Object DetectionもTensorFlow Object Detection APIを利用する形に移行しました。
ColaboratoryはipynbでNotebookを共有でき、かなり参考になる資料が多くそれらを参考に進めていきました。 具体的には以下
寿司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クラスのデータになっています。 いくつかの寿司画像の検出を試してみた際、以下の性質があるように感じられます。
- 単一種の寿司画像は検知できる
- 複数種類の寿司画像が存在する際の検知が難しそう
とりあえず検知はできそうだぞ、ということがわかったのでドラえもん画像で同様のことをしていきます。
ドラえもんDataSetの作成
google-images-downloadを用い画像を収集しました
公式ではjsonを渡せばうまくいくそうですが、うまくいかなかったので以下のようコマンド引数を渡すことで解決
googleimagesdownload --keywords="ドラえもん" --limit=1000 -o="output_directory" --chromedriver="location_of_chrome_driver"
前回と違い、今回はできるだけシンプルなドラえもん画像を利用し、なおかつ枚数は最初は少なくあとから増やしていく戦略にしました。 最終的に50枚程度に落ち着きました。
VoTTを用いアノテーションを粛々と行います。
今回は前述の通り、顔をアノテーションしていきます。
その後.tfrecordを出力します。 以前は単一の巨大な.recordを利用されていたようですが、VOTTから出力すると複数の.tfrecordに分かれて出力されます。
Train&結果
Trainするサンプルでは単一の.recordを受け取ることを想定していますが、 以下を参考にNotebookを修正していきます。
というわけで最終的にできたのが以下。 かなりコードなど汚いので公開していません。興味あるかたはメッセージください。
https://colab.research.google.com/drive/1tH-Uk4wm71LN8XolA80NdIbU96gb5YQi
結果
学習に使用していないデータを用い認識させてみます。
とてもいい感じ。特に最後の画像ではどらえもんが帽子をかぶっているのですが、それでもうまく認識できています。
うまく認識できなかった例
誤認識はおそらくデータセットを増やすことで解決できそうだなとなんとなく感じました。
まとめ
今回以下の良い結果を得られました
アニメのキャラクターのキモとなる部分が顔で、顔をアノテーションすることでかなり認識精度がたかまりそうです。例えばアンパンマンなど他のアニメキャラクターに関してもこの傾向は同じな気がするので、これから別のアニメキャラクターでも試してみたいと思います。今回作業してやはりデータを集めることが大変だなというのは痛感しました。著作権をもつ会社がこういうことするとなんだか色々面白そうだよなと感じました。