使用机器学习套件识别文本和面部特征:Android

1. 简介

机器学习套件是一个移动 SDK,它通过强大且易用的软件包将 Google 的机器学习专业知识融入到 Android 和 iOS 应用中。无论您是刚开始接触机器学习,还是拥有丰富的相关经验,都只需几行代码就能轻松实现所需的功能。您无需具备丰富的神经网络或模型优化知识即可开始使用。

如果在此 Codelab 操作期间遇到任何问题(代码错误、语法错误、措辞含义不明等),都可以通过 Codelab 左下角的报告错误链接报告相应问题。

运作方式

借助机器学习套件,您可以将 Google 的机器学习技术(例如 Mobile VisionTensorFlow Lite)整合到一个 SDK 中,从而轻松地在应用中运用机器学习技术。无论您需要 Mobile Vision 的设备端模型的实时功能,还是自定义 TensorFlow Lite 模型的灵活性,机器学习套件都能让您满意。

此 Codelab 将引导您创建自己的 Android 应用,该应用可以自动检测图片中的文本和面部特征。

构建内容

在此 Codelab 中,您将使用机器学习套件构建一个 Android 应用。您的应用将:

  • 使用机器学习套件文本识别 API 检测图片中的文本
  • 使用机器学习套件 Face Contour API 识别图片中的面部特征

学习内容

  • 如何使用机器学习套件 SDK 轻松添加高级机器学习功能,例如文本识别和面部特征检测

所需条件

  • 最新版本的 Android Studio (v3.0+)
  • Android Studio 模拟器或实体 Android 设备
  • 示例代码
  • 具备使用 Java 进行 Android 开发的基础知识
  • 对机器学习模型有基本的了解

此 Codelab 重点介绍机器学习套件。对于不相关的概念,我们仅会略作介绍,但是会提供相应代码块供您复制和粘贴。

2. 准备工作

下载代码

点击下面的链接可下载本 Codelab 的所有代码:

解压下载的 ZIP 文件。此操作会解压缩一个根文件夹 (mlkit-android-master),其中包含您需要的所有资源。在此 Codelab 中,您只需要 vision 子目录中的资源。

mlkit-android-master 代码库中的 vision 子目录包含两个目录:

  • android_studio_folder.pngstarter - 在此 Codelab 中帮助您开始构建的起始代码。
  • android_studio_folder.pngfinal - 已完成的示例应用的完整代码。

3. 检查机器学习套件的依赖项

验证机器学习套件的依赖项

您应将以下代码行添加到您项目的 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 中的功能所需的特定机器学习套件依赖项。

4. 运行起始应用

现在,您已将项目导入 Android Studio 并检查了机器学习套件的依赖项,接下来可以首次运行应用了。启动 Android Studio 模拟器,然后点击 Android Studio 工具栏中的 Run ( 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 工具栏中的 Run ( execute.png)。应用加载后,请确保在下拉字段中选择 Test Image 1(Text),然后点击 FIND TEXT 按钮。

现在,您的应用应如下图所示,显示文本识别结果和叠加在原始图片上的边界框。

10b12d0e8822eaf5

照片:Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0

恭喜,您刚刚使用机器学习套件将设备端文本识别功能添加到您的应用中!设备端文本识别非常适合许多使用场景,即使您的应用没有互联网连接并且速度足够快,可以用于静态图像和实时视频帧,它也能正常运行。

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 工具栏中的 Run ( execute.png)。应用加载后,请确保在下拉字段中选择 Test Image 2 (Face),然后点击 FIND FACE CONTOUR 按钮。

现在,您的应用应如下图所示,显示了面部轮廓检测结果,并以叠加在原始图片上的点的形式呈现面部轮廓。

f9ff2fcbf63f0f3b.png

恭喜,您刚刚使用机器学习套件为您的应用添加了设备端面部轮廓检测功能!设备端面部轮廓检测非常适合许多用例,因为即使您的应用没有互联网连接,它也能正常运行,并且运行速度足够快,可以用于静态图像以及实时视频帧。

7. 恭喜!

您已成功使用机器学习套件轻松为您的应用添加高级机器学习功能。

所学内容

  • 如何将机器学习套件添加到您的 Android 应用中
  • 如何使用机器学习套件中的设备端文本识别功能查找图片中的文本
  • 如何使用机器学习套件中的设备端人脸轮廓识别图片中的人脸特征

后续步骤

  • 在您自己的 Android 应用中使用机器学习套件!

了解详情