ML Kit を使用してテキストと顔の特徴を認識する: Android

1. はじめに

ML Kit は、Google の機械学習の機能を Android アプリや iOS アプリとして提供するモバイル SDK です。その強力で使いやすいパッケージは、機械学習の経験の有無を問わず、わずか数行のコードで必要な機能を簡単に実装できます。ニューラル ネットワークやモデルの最適化に関する詳しい知識は必要ありません。

この Codelab で問題(コードのバグ、文法的な誤り、不明確な表現など)が見つかった場合は、Codelab の左下隅にある [誤りを報告] から問題を報告してください。

仕組み

ML Kit を使用すると、Mobile VisionTensorFlow Lite などの Google の ML テクノロジーを 1 つの SDK にまとめることで、ML テクノロジーをアプリに簡単に適用できます。ML Kit は、Mobile Vision のオンデバイス モデルのリアルタイム機能が必要な場合でも、カスタム TensorFlow Lite モデルの柔軟性が必要な場合でも、対応できます。

この Codelab では、画像内のテキストと顔の特徴を自動的に検出できる独自の Android アプリを作成する方法について説明します。

作業内容

この Codelab では、ML Kit を使用して Android アプリを作成します。作成するアプリの機能は次のとおりです。

  • ML Kit Text Recognition API を使用して画像内のテキストを検出する
  • ML Kit Face Contour API を使用して画像内の顔の特徴を識別する

学習内容

  • ML Kit SDK を使用して、テキスト認識や顔の特徴検出などの高度な ML 機能を簡単に追加する方法

必要なもの

  • 最新バージョンの Android Studio(v3.0 以降)
  • Android Studio エミュレータまたは物理 Android デバイス
  • サンプルコード
  • Java での Android 開発に関する基本的な知識
  • ML モデルの基本的な知識

この Codelab では、ML Kit を中心に説明します。関連のない概念やコードブロックについては詳しく触れず、コードはコピーして貼るだけの状態で提供されています。

2. 設定方法

コードをダウンロードする

次のリンクをクリックして、この Codelab のコードをすべてダウンロードします。

ダウンロードした zip ファイルを解凍すると、必要なすべてのリソースを含むルートフォルダ(mlkit-android-master)が展開されます。この Codelab では、vision サブディレクトリ内のリソースのみが必要です。

mlkit-android-master リポジトリの vision サブディレクトリには、次の 2 つのディレクトリが含まれています。

  • android_studio_folder.pngstarter - この Codelab で作成する開始コード。
  • android_studio_folder.pngfinal - 完成したサンプルアプリのコード。

3. ML Kit の依存関係を確認する

ML Kit の依存関係を確認する

次の行は、プロジェクトの app ディレクトリにある build.gradle ファイルの末尾にすでに追加されているはずです(確認してください)。

build.gradle

dependencies {
  // Face features
  implementation 'com.google.mlkit:face-detection:16.0.0'

  // Text features
  implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
}

これらは、この Codelab の機能を実装するために必要な ML Kit の特定の依存関係です。

4. スターター アプリを実行する

Android Studio にプロジェクトをインポートし、ML Kit の依存関係を確認したので、アプリを初めて実行する準備が整いました。Android Studio エミュレータを起動し、Android Studio ツールバーの [実行](execute.png)をクリックします。

エミュレータでアプリが起動するはずです。この時点で、3 つの画像から選択できるプルダウン フィールドを含む基本的なレイアウトが表示されます。次のセクションでは、画像内のテキストを識別するために、アプリにテキスト認識機能を追加します。

5. デバイス上のテキスト認識を追加

このステップでは、画像内のテキストを認識する機能をアプリに追加します。

画像でデバイス上のテキスト認識を設定して実行する

MainActivity クラスの runTextRecognition メソッドに以下を追加します。

MainActivity.java

private void runTextRecognition() {
   InputImage image = InputImage.fromBitmap(mSelectedImage, 0);
   TextRecognizer recognizer = TextRecognition.getClient();
   mTextButton.setEnabled(false);
   recognizer.process(image)
           .addOnSuccessListener(
                   new OnSuccessListener<Text>() {
                       @Override
                       public void onSuccess(Text texts) {
                           mTextButton.setEnabled(true);
                           processTextRecognitionResult(texts);
                       }
                   })
           .addOnFailureListener(
                   new OnFailureListener() {
                       @Override
                       public void onFailure(@NonNull Exception e) {
                           // Task failed with an exception
                           mTextButton.setEnabled(true);
                           e.printStackTrace();
                       }
                   });
}

上記のコードは、テキスト認識検出器を構成し、レスポンスを使用して関数 processTextRecognitionResult を呼び出します。

テキスト認識レスポンスを処理する

MainActivity クラスの processTextRecognitionResult に次のコードを追加して、結果を解析し、アプリに表示します。

MainActivity.java

private void processTextRecognitionResult(Text texts) {
   List<Text.TextBlock> blocks = texts.getTextBlocks();
   if (blocks.size() == 0) {
       showToast("No text found");
       return;
   }
   mGraphicOverlay.clear();
   for (int i = 0; i < blocks.size(); i++) {
       List<Text.Line> lines = blocks.get(i).getLines();
       for (int j = 0; j < lines.size(); j++) {
           List<Text.Element> elements = lines.get(j).getElements();
           for (int k = 0; k < elements.size(); k++) {
               Graphic textGraphic = new TextGraphic(mGraphicOverlay, elements.get(k));
               mGraphicOverlay.add(textGraphic);

           }
       }
   }
}

エミュレータでアプリを実行する

Android Studio のツールバーで [実行](execute.png)をクリックします。アプリが読み込まれたら、プルダウン フィールドで Test Image 1(Text) が選択されていることを確認し、FIND TEXT ボタンをクリックします。

アプリは次の画像のようになり、元の画像の上にテキスト認識の結果とバウンディング ボックスが重ねて表示されます。

10b12d0e8822eaf5.png

写真: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0

おめでとうございます。ML Kit を使用して、アプリにオンデバイス テキスト認識を追加しました。オンデバイス テキスト認識は、アプリがインターネットに接続されていない場合でも動作し、静止画像やライブ動画フレームでも使用できるほど高速であるため、多くのユースケースで役立ちます。

6. デバイスでの顔輪郭検出を追加

このステップでは、画像内の顔の輪郭を認識する機能をアプリに追加します。

画像でオンデバイスの顔の輪郭検出を設定して実行する

MainActivity クラスの runFaceContourDetection メソッドに以下を追加します。

MainActivity.java

private void runFaceContourDetection() {
   InputImage image = InputImage.fromBitmap(mSelectedImage, 0);
   FaceDetectorOptions options =
           new FaceDetectorOptions.Builder()
                   .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_FAST)
                   .setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
                   .build();

   mFaceButton.setEnabled(false);
   FaceDetector detector = FaceDetection.getClient(options);
   detector.process(image)
           .addOnSuccessListener(
                   new OnSuccessListener<List<Face>>() {
                       @Override
                       public void onSuccess(List<Face> faces) {
                           mFaceButton.setEnabled(true);
                           processFaceContourDetectionResult(faces);
                       }
                   })
           .addOnFailureListener(
                   new OnFailureListener() {
                       @Override
                       public void onFailure(@NonNull Exception e) {
                           // Task failed with an exception
                           mFaceButton.setEnabled(true);
                           e.printStackTrace();
                       }
                   });

}

上記のコードは、顔の輪郭検出器を構成し、レスポンスとともに processFaceContourDetectionResult 関数を呼び出します。

顔の輪郭検出レスポンスを処理する

MainActivity クラスの processFaceContourDetectionResult に次のコードを追加して、結果を解析し、アプリに表示します。

MainActivity.java

private void processFaceContourDetectionResult(List<Face> faces) {
   // Task completed successfully
   if (faces.size() == 0) {
       showToast("No face found");
       return;
   }
   mGraphicOverlay.clear();
   for (int i = 0; i < faces.size(); ++i) {
       Face face = faces.get(i);
       FaceContourGraphic faceGraphic = new FaceContourGraphic(mGraphicOverlay);
       mGraphicOverlay.add(faceGraphic);
       faceGraphic.updateFace(face);
   }
}

エミュレータでアプリを実行する

Android Studio のツールバーで [実行](execute.png)をクリックします。アプリが読み込まれたら、プルダウン フィールドで Test Image 2 (Face) が選択されていることを確認し、FIND FACE CONTOUR ボタンをクリックします。

アプリは下の画像のようになり、顔の輪郭検出の結果が表示され、顔の輪郭が元の画像の上に重ねて表示されます。

f9ff2fcbf63f0f3b.png

お疲れさまでした。ML Kit を使用して、アプリにデバイス上の顔の輪郭検出機能を追加しました。オンデバイスの顔の輪郭検出は、アプリがインターネットに接続されていない場合でも動作し、静止画像やライブ動画フレームでも使用できるほど高速であるため、多くのユースケースで役立ちます。

7. 完了

ML Kit を使用して、アプリに高度な機械学習機能を簡単に追加できました。

学習した内容

  • Android アプリに ML Kit を追加する方法
  • ML Kit のオンデバイス テキスト認識を使用して画像内のテキストを見つける方法
  • ML Kit のデバイス上の顔の輪郭を使用して画像内の顔の特徴を識別する方法

次のステップ

  • 独自の Android アプリで ML Kit を使用する

詳細