Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ML Kit (Auto ML Vison Edge)で写真から家族を検出する

Avatar for tsutou tsutou
April 27, 2020

ML Kit (Auto ML Vison Edge)で写真から家族を検出する

Avatar for tsutou

tsutou

April 27, 2020

Other Decks in Programming

Transcript

  1. 運用方法を決める(ローカル/リモート/両刀)
 ローカル
 ❏ メリット 
 ❏ アプリをダウンロードするだけで使える
 ❏ デメリット 
 ❏ アプリサイズ増


    ❏ モデルの更新にリリースが必要
 リモート
 ❏ メリット 
 ❏ アプリサイズ変わらない 
 ❏ リリースせずにモデルを更新可能
 ❏ リモートコンフィグなどと組み合わせて、ABテストなどもコントロールできる
 ❏ デメリット
 ❏ モデルがダウンロードできるまで機能は使えない
 ❏ 通信が行われる前提なので、コード量が増える

  2. 依存関係の追加
 
 難読化回避(ローカルモデル使用時のみ) 
 aaptOptions {
 noCompress "tflite"
 }
 


    
 
 build.gradle
 
 implementation 'com.google.firebase:firebase-ml-vision:24.0.2'
 implementation 'com.google.firebase:firebase-ml-vision-automl:18.0.4'

  3. ローカルのモデル
 assetsディレクトリを用意し、コンソールからダウンロードしたモデルを配置します。 
 
 ❏ /assets/automl/dict.txt 
 ❏ /assets/automl/manifest.json 


    ❏ /assets/automl/model.tflite 
 
 val localModel = FirebaseAutoMLLocalModel 
 .Builder()
 .setAssetFilePath( "automl/manifest.json" )
 .build()

  4. リモートのモデル
 コンソールから、モデルを公開し、モデル名をアプリ側で指定します。 
 ダウンロードや、フラグの取得は Tasks APIになっているので、ハンドリングが必要になります。 
 val remoteModel =

    FirebaseAutoMLRemoteModel
 .Builder(BuildConfig.AUTO_ML_MODEL_NAME)
 .build()
 
 val conditions = FirebaseModelDownloadConditions.Builder().build()
 val downloadTask = FirebaseModelManager
 .getInstance()
 .download(remoteModel, conditions)
 .addOnSuccessListener {
 //ダウンロード成功時にしたい処理 
 }
 
 fun isModelDownloaded() = Tasks.await(
 FirebaseModelManager.getInstance().isModelDownloaded(
 remoteModel
 )
 )

  5. 画像を認識させる
 設定したラベルを用意します。 
 const val CATS = "cats"
 const val

    KIDS = "kids"
 const val ADULT = "adults"
 const val DOGS = "dogs"
 const val OTHERS = "others"
 
 モデルを用意し、オプションを設定して、画像のラベラーを用意します 
 (FirebaseVisionOnDeviceAutoMLImageLabelerOptions では、信頼度が調整できます。デフォルトは50%) 
 val mlModel = if (isModelDownloaded()) {
 remoteModel
 } else {
 localModel
 }
 
 val labeler = FirebaseVision.getInstance().getOnDeviceAutoMLImageLabeler(
 FirebaseVisionOnDeviceAutoMLImageLabelerOptions
 .Builder(mlModel)
 .setConfidenceThreshold(0.7f)
 .build()
 )

  6. 画像からラベルを検出する
 画像から取得できるラベルのテキストを元に、子供、大人、犬、猫、その他を判別していきます。FirebaseVisionImage は、アプリ によって画像の取り扱いを変えていくのがいいと思います。 
 val targetBitmap = getTargetBitmap(context, uri)

    
 
 val image = try {
 FirebaseVisionImage.fromBitmap(targetBitmap) 
 } catch (e: IOException) { 
 Timber.e("$e")
 }
 
 try {
 val labels = synchronized( this) {
 Tasks.await(labeler.processImage(image)) 
 }
 labels.forEach { 
 when (it.text) {
 ADULT, OTHERS -> return false
 CATS, KIDS, DOGS -> return true
 }
 }
 } catch (e: ExecutionException) { 
 Timber.e( "$e")
 } catch (e: InterruptedException) { 
 Timber.e( "$e")
 }