Create MLで物体検出モデルを作成してみたメモ
Create MLでObject Detection(物体検出)のCore MLモデルを作成してみた。手順としては細かくいろいろ学びがあったのでメモしておく。
データセットの枚数
Create MLのImage Classification(画像分類)は転移学習ベースで各クラス10枚ぐらいでそれなりの精度が出ていたので、Object Detectionもそれぐらいでいけるかなと思い、最初は適当に各クラス7〜8枚の写真をiPhoneで撮って用意した。
が、学習させてできたモデルを動かしていると全く認識しない。
ここでWWDC19のセッションのスライドをみると、各クラス30枚以上は用意しろと書かれている。
というわけで30枚ぐらいでモデルをつくりなおしてみたが、それでも全く認識しない。前回と違うのは、対象物体が全然存在しないところのバウンディングボックス(つまり全く間違っている)を結果としてたまに返してくるようにはなった。(前回モデルは一切結果を返してこなかった)
で、100枚以上にしてみたところ、やっとそれっぽく動いた。
学習データはBOSSのペットボトルコーヒー100枚ぐらい。1クラスのみ。冒頭に書いた通り、それっぽい動きはしている(ボトルがフレーム内に入っているときだけバウンディングボックスが返ってくる)が、バウンディングボックスの位置が全然違うところを示している。
座標計算が間違っているのかと疑っていたが、他の物体検出モデルでは同じ実装で正確な位置を示す(imageCropAndScaleOptionを変えても)ので、やはりモデルがなにかおかしい。
(その後うまくいきました。何を修正したかは記事末尾に追記しています)
アノテーションツール
先日の記事に書いたとおり、
枚数が少ないときはLabelImgが使いやすかったが、100枚以上とかになってくると静止画をパシャパシャ撮ってられないので、動画へのアノテーションをサポートしているVoTTを使うことになった。
iPhoneとVoTT
ちなみにVoTTでは.movはサポートされてないので、iPhoneで撮った動画はVoTTで編集する前に.mp4に変換する必要があった。
VoTTが切り出すフレーム画像がCreate MLでエラーに
もう一点、VoTTが切り出したフレーム画像をそのままCreate MLで学習データとして使おうとするとトレーニング実行時にデコード失敗的なエラーが出る。
Preview.appでエクスポートしなおすと使えたので、Automatorで画像をduplicate -> pngに変換 -> jpegに変換するQuick Actionを作成した。(これで画像を全選択して右クリックメニューからエクスポートしなおせる)ちなみにQuick Actionでpngに一度変換している理由は、「jpegに変換」だけだと元のjpegファイルから再エンコーディングが発生せず、Create MLのエラーがなおらないため。
VoTT CSVからCreate MLのJSONフォーマットへの変換
アノテーションデータを、VoTTのCSV形式からCreate MLのJSON形式に変換するツールをMac Catalystで書いた。
https://github.com/shu223/iOS-Experiments-Contents
imageCropAndScaleOption
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/