Lobeで画像学習を行ってみた ~ お手軽にカスタムモデルを作る
今までOpenCVやTensorflow Liteで画像学習を行ってきました。特にTensorflow Lite Makerを使ってのカスタムモデル作成(分類器)がうまくいっていたのですが、ある時点から動かなくなってしまい、回復できない状態です。原因はGoogle Colabフリー版での容量不足だと思うのですが、確実であるかが分からないので有料版に踏み切れないでいます。
そういう経緯もあり、しばらく画像認識から遠ざかっていましたが、他に方法がないものか探してみると、「Lobe」という機械学習ツールがありました。これは、コマンド画面を使う必要もなく、画像をLobe画面にドロップして登録できる統合開発環境です。まだβ版ですが、これが有効になれば、今までよりずっと作業が簡単になります。
それでは、やってみます。
1.Lobeのダウンロード
Lobeは、以下のサイトからダウンロードできます。
2.Lobeを起動する
それでは、Lobeを起動します。Lobeでは、プロジェクトを作って、その上でカスタムモデルの作成を行います。インストールした直後の起動では、いきなり新規プロジェクトの画面になりますが、次回からは上記の初期画面が出て、プロジェクトを選択することになります。それでは、プロジェクト画面に移動します。プロジェクトが新規の場合は、「New Project」をクリックします。
画像の登録は、カメラから直接行うこともできますが、用意した画像からも利用できます。
まずは、プロジェクト名を指定します。今回は「動物判定」にしました。
それでは、画像を登録します。サムネイル表示領域に画像をドロップします。この時、ラベルの分類が「unlabeled」になります。ドロップしたファイルはunlabeledのフォルダにが入っていますが、画像にラベルを付けると、付けたラベルの分類に区分けされます。
登録を続けていくと、勝手にトレーニングが行われます。Lobe画面を見ると、ラベル分類一つで5画像が登録されるとトレーニングが行われる、と表示されています。また、カスタムモデルでは画像の登録が多ければ多いほど良いイメージがありますが、登録し過ぎても逆効果になるそうです。
登録を進めていくと、認証率が猫の目のように変わります。上記の例だと、ナキウサギとシマリス、ヒグマを登録していますが、1ラベル5画像程度では判定が難しそうです。
認識に失敗した画像を、再設定させることもできます。この再設定を繰り返して、認識率が最も高くなるように操作します。
再設定により、認識率が100%になりました。これなら認証がうまくできそうです。(実際は、そうはいかない)
3.出来たモデルのエクスポート
出来上がったカスタムモデルをLobe上で画像認識させることもできますが(images/cameraを選ぶ)、やはりスマートフォン上で行いたいです。そこで、Tensorflow Liteの形式でエクスポートします。そうすれば、今まで作ったAndroidアプリケーションに読み込ませれば良いだけのはずです。
エクスポート処理の際、ファイル名を指定した後に、最適化をするかどうかのポップアップが表示されます。ここで最適化すると、再びトレーニングすることで認識率が下がることもあります。
エクスポートされたカスタムモデルを、以前作成したML Kitを使った画像認識アプリケーションに組み込んでみました。
しかしながら、Lobeで出力するカスタムモデルはObject Detectionに対応していないらしく、実際組み込んでもエラーになってしまいました。これは今後の対応予定になっていますが、新バージョンが一向に登録されていないのが現状のようです。
そこで、Lobeで作ったTensorflow Liteのモデルに対応するサンプルプログラムが用意されているので、こちらを使ってみます。ダウンロードして、Android Studioに組み込みます。
@Override
protected String getModelPath() {
return "20231201.tflite";
// カスタムモデル ファイル名を指定
}
ImageClassifierクラスにモデルファイルを指定する部分があるので、ここを自作のカスタムモデル名に書き換えます。また、assetフォルダに、モデルファイルと「signature.json」ファイルをコピーします。
実際にやってみると、
ラベルが4種類くらいになってから認識が向上してきました。やはり、シマリスとナキウサギの区別は難しいようで、なかなか安定しません。いろいろ試行錯誤しないと、最適の状態を見つけるのが難しそうです。
この後、しばらく登録作業を続けましたが、ラベルが増えて画像も増えてくると学習が行われなくなったり、Lobeが異常動作したので報告してくださいなどの不具合が起こります。まだβ版なので仕方ないというところでしょうか。まだ本格的なカスタムモデルの作成はできないみたいです。
また、Androidアプリケーションの方も、エクスポートしたモデルファイルの処理でバッファ系の例外が発生します。最初は画像のサイズが原因かなと思いましたが、そんな簡単ではないようです。
4.カスタムモデルの精度を向上させていきます
画像認識の作業をやってみましたが、Tensorflow Lite Makerの時よりも認識率が低い状況です。しかしながら、Lobeはまだβ版でありコンセプトがとても良いのですから、動作を安定させてObject Detectionにも対応した新版をぜひ登録して欲しいです。
カスタムモデルは随時作成してテストしようと思います。画像が増えてくれば結果も変わってくると思います。その都度、報告します。
背景ありとなしで違いがあるか
画像学習に使う画像の背景は消した方が認識率が上がりそうですが、今のところ効果が認められません。
アライグマを入れたら案の定大混乱
当然と言えばそうですが、アライグマを加えたところ、判定が大混乱に陥りました。上は追加直後ですが、アライグマがエゾタヌキに判定されています。これは、ある意味正解とも言えます。それは、アライグマとエゾタヌキは、人間でも判定を間違えるくらいですから。入れるべきではなかったかも。