AutoML Visionで雲の識別をした話 - Idea, COncept, and Technology.の転載です。
きっかけ
公開しているこちらのアプリ、「おまかせ撮影」と言う機能があります。撮った雲の種類を判別すると言うものです。ただ、これまでは単に画像の類似度を見て判定していただけなので精度はイマイチどころかそれ以下でした。
「CloudWatcher」をApp Storeで
そこで、GCPのAutoMLで雲を識別できないかと思い立ちました。調べたところ、すでに取り組み事例がありました。
Googleの画像認識APIを基に、好きな画像を学習させて認識機能を簡単にカスタマイズできる「Cloud AutoML Vision」発表 - Publickey
ハンズオンもあります。
AutoML Vision でクラウド内の雲の画像を分類する | Qwiklabs
ただ、こちらのデータセット、3種類の雲しかなくて私のアプリではそのまま使えませんでした。
データセット作成
アプリでカバーしている24種類の雲の画像を集めなくてはと言うことで。Google画像検索を使いました。手作業で取るのはしんどいのでこちらのスクリプトを利用させてもらいました。
Google 画像検索結果のサムネイル画像を一括保存するスクリプト | AWS構築ハックノート
単に雲の名称で検索するとノイズが入ったり、「サンプル画像」の注釈が入ったものがヒットします。こちらはAutoMLにインポートしてから目検で除外しました。後者は検索時にサイト除外してもいいかもしれません。
結果的に1種類あたり100画像程度準備しました。
学習
データセットのインポート、ラベル修正を行ったのち学習を実行。無料枠を使いました。私の場合3時間程度で学習を完了。雲種によっては精度は変わります。正直人間の目で見ても判別が難しいものもあるので、仕方ない部分もあるかと。
アプリへの組み込み
ここで少しつまづきました。CoreMLでモデルをエクスポートしてアプリに組み込んだのですが、予測した際に参照するVNClassificationObservationのidentiferがデータセットの雲ラベルではなく独自に振られたランダム文字列になってしまいました。試行錯誤したのですが解決できず…。
結局、CoreMLをそのまま使うのは諦めて、FirebaseのML Kit経由で組み込みました。
AutoML でトレーニングされたモデルを使用して画像にラベルを付ける(iOS) | Firebase
ただ、上記リンク先の説明、日本語と英語とで若干記述が異なります。英語の方に従って実装しないとエラーとなります。
エッジ側で画像認識できるのは性能面でも嬉しいですね。