AutoML Visionで雲の識別をした話

きっかけ

公開しているこちらのアプリ、「おまかせ撮影」と言う機能があります。撮った雲の種類を判別すると言うものです。ただ、これまでは単に画像の類似度を見て判定していただけなので精度はイマイチどころかそれ以下でした。

CloudWatcher

CloudWatcher

  • icot
  • 教育
  • ¥250

apps.apple.comそこで、GCPのAutoMLで雲を識別できないかと思い立ちました。調べたら、すでに取り組み事例がありました。

www.publickey1.jpハンズオンもありますね。

www.qwiklabs.comただ、こちらのデータセット、3種類の雲しかなくて私のアプリではそのまま使えませんでした。

データセット作成

アプリでカバーしている24種類の雲の画像を集めなくてはと言うことで。Google画像検索を使いました。手作業で取るのはしんどいのでこちらのスクリプトを利用させてもらいました。

hacknote.jp単に雲の名称で検索するとノイズが入ったり、「サンプル画像」の注釈が入ったものがヒットします。こちらはAutoMLにインポートしてから目検で除外しました。後者は検索時にサイト除外してもいいかもしれません。

結果的に1種類あたり100画像程度準備しました。

学習

データセットのインポート、ラベル修正を行ったのち学習を実行。無料枠を使いました。私の場合3時間程度で学習を完了。雲種によっては精度は変わります。正直人間の目で見ても判別が難しいものもあるので仕方ない部分もあるかと。

f:id:yayoi-taka:20200111075503j:plain

アプリへの組み込み

ここで少しつまづきました。CoreMLでモデルをエクスポートしてアプリに組み込んだのですが、予測した際に参照するVNClassificationObservationのidentiferがデータセットの雲ラベルではなく独自に振られたランダム文字列になってしまいました。試行錯誤したのですが解決できず…。

結局、CoreMLをそのまま使うのは諦めて、FirebaseのML Kit経由で組み込みました。

firebase.google.comただ、上記リンク先の説明、日本語と英語とで若干記述が異なります。英語の方に従って実装しないとエラーとなります。

エッジ側で画像認識できるのは性能面でも嬉しいですね。