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

1. 简介

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

如果在此 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. 检查 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 中的功能所需的特定机器学习套件依赖项。

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.png

照片: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 应用中使用机器学习套件!

了解详情