見出し画像

Create MLで物体検出モデルを作成してみたメモ

Create MLでObject Detection(物体検出)のCore MLモデルを作成してみた。手順としては細かくいろいろ学びがあったのでメモしておく。

データセットの枚数

Create MLのImage Classification(画像分類)は転移学習ベースで各クラス10枚ぐらいでそれなりの精度が出ていたので、Object Detectionもそれぐらいでいけるかなと思い、最初は適当に各クラス7〜8枚の写真をiPhoneで撮って用意した。

が、学習させてできたモデルを動かしていると全く認識しない。

ここでWWDC19のセッションのスライドをみると、各クラス30枚以上は用意しろと書かれている。

画像1

というわけで30枚ぐらいでモデルをつくりなおしてみたが、それでも全く認識しない。前回と違うのは、対象物体が全然存在しないところのバウンディングボックス(つまり全く間違っている)を結果としてたまに返してくるようにはなった。(前回モデルは一切結果を返してこなかった)

で、100枚以上にしてみたところ、やっとそれっぽく動いた。

画像2

学習データはBOSSのペットボトルコーヒー100枚ぐらい。1クラスのみ。冒頭に書いた通り、それっぽい動きはしている(ボトルがフレーム内に入っているときだけバウンディングボックスが返ってくる)が、バウンディングボックスの位置が全然違うところを示している。

座標計算が間違っているのかと疑っていたが、他の物体検出モデルでは同じ実装で正確な位置を示す(imageCropAndScaleOptionを変えても)ので、やはりモデルがなにかおかしい。

(その後うまくいきました。何を修正したかは記事末尾に追記しています)

画像5

アノテーションツール

先日の記事に書いたとおり、

枚数が少ないときは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

ここから先は

1,503字 / 2画像
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/