こんにちは、Androidエンジニアのあいばです。
そろそろ夏休みも終わる頃でしょうか?
記事のテーマ的に夏休み中に書きたかったのですが…間に合っていることを願います。
今回は少し前に公開した記事の続編です。
「ウルトラマンを区別せずに検出した後、検出したエリアで分類すれば精度が上がるのではないか?」を試してみました。
やりたいこと
- スマホのカメラでウルトラ族を検出する。
- ウルトラ族が検出されたエリアを切り出しラベリングする。
- ウルトラマン、ゾフィー、ウルトラマンジャックを分類できたらうれしい。
使うもの
- 前回と同様
手順
細かい違いはありますが、おおまかな流れは前回と同じです。
始める前に
Firebase プロジェクトまたは Google Cloud プロジェクトを用意していない場合は、まずFirebase コンソールでプロジェクトを作成しましょう。
1.トレーニングデータを収集
- オブジェクト検出に利用した写真をラベリング用に再度GoogleCloudにインポート
- ラベルの名前をつけたディレクトリに各画像を格納し、zip に圧縮してアップロードすることができます。
- ラベルの名前をつけたディレクトリに各画像を格納し、zip に圧縮してアップロードすることができます。
2. モデルをトレーニングする
- Google Cloud Consoleで新しいデータセットを作成
今回はオブジェクト検出ではなく「単一ラベル分類」を選択 - トレーニング画像の zip をアップロード
- インポート タスクが完了したらトレーニング データを確認し、必要だったらラベルを修正します。
- オプションを選択しトレーニングを開始
- トレーニングが完了したら [評価] タブでモデルに最適な信頼度のしきい値を確認
3. モデルをダウンロードしアプリにバンドル
- モデルをダウンロードするには、データセットの [テストと使用] ページで [TF Lite] をクリックします。
- ML Kit Android ライブラリの依存関係を追加
- ダウンロードしたモデルを assets フォルダにコピー
ImageLabeler
オブジェクトを作成
val localModel = LocalModel.Builder() .setAssetFilePath("model.tflite") .build() val customImageLabelerOptions = CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.0f) // Evaluate your model in the Cloud console // to determine an appropriate value. .build() val labeler = ImageLabeling.getClient(customImageLabelerOptions)
4. 入力画像の用意
せっかくなので前回実装したオブジェクト検出の実装も使います! カメラプレビューに枠線を表示し、枠線内にウルトラ族が検出されたらラベリングを実行します。
- オブジェクト検出を実行する(前回と同様)
- 検出結果にウルトラ族が検出されたエリアのRectFが返却される
- カメラプレビューの画像から検出されたエリアを切り出す
5. 画像ラベラーを実行する
labeler.process(image) .addOnSuccessListener { labels -> // Task completed successfully // ... } .addOnFailureListener { e -> // Task failed with an exception // ... }
デモ
ウルトラマンとジャックはかなり安定しましたが、ゾフィーがうまくラベリングできていません。
ですが、何度か試すうちに良い角度を発見しました。やはりスターマークが重要なのでしょうか(笑)
まとめ
- ウルトラマン、ジャックもフローリングやテーブルの上など照明が反射する場所で撮影すると良い結果が出なかった。
- 撮影条件に左右されるが、前回と比べて精度が上がった。
- トレーニングデータに異なる背景の画像を追加したところ結果が改善されたため、撮影条件による影響はトレーニングデータの追加で軽減されそう。
おまけ
後ろ姿でも試してみました。みなさん見分けつくでしょうか。
ユニファで一緒に働く仲間を募集しています!