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

1. はじめに

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

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

仕組み

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

この 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 Emulator または物理的な 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 を使用して、高度な ML 機能をアプリに簡単に追加できました。

学習した内容

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

次のステップ

  • 独自の Android アプリで ML Kit を使用してみましょう。

詳細