1. Introduction
ML Kit是一款移动SDK,通过功能强大且易于使用的软件包,将Google的机器学习专业知识带入Android和iOS应用程序。 无论您是新手还是机器学习大佬,只需几行代码即可轻松实现所需的功能。 开始时,无需深入了解神经网络或模型优化。
How does it work?
ML Kit通过引入Google的ML技术,例如Google Cloud Vision API,Mobile Vision和TensorFlow Lite一起放在一个SDK中。 无论您是需要基于云的处理能力,Mobile Vision的设备型号的实时功能,还是定制TensorFlow Lite型号的灵活性,ML Kit都可以通过几行代码实现。
此codelab将引导您创建自己的Android应用程序,可以自动检测图像中的文本和面部特征。
What you will build
在此代码库中,您将使用Firebase ML Kit构建一个Android应用程序。 您的应用将:
- 使用ML Kit文本识别API检测图像中的文本
- 使用ML Kit Face Contour API识别图像中的面部特征
- (可选)当设备具有互联网连接时,使用ML Kit云文本识别API扩展文本识别功能(例如非拉丁字母表)
- 了解如何使用Firebase托管自定义预训练的Tensor Flow Lite模型
- 使用ML Kit Custom Model API将预先训练的TensorFlow Lite模型下载到您的应用程序
- 使用下载的模型运行推理和标签图像
What you’ll learn
- 如何使用Firebase ML Kit SDK轻松添加高级机器学习功能,如文本识别,面部特征检测和图像标签到任何Android应用程序
- 何时使用设备上检测API与云API。
- 如何使用Firebase存储自定义预训练的TensorFlow Lite模型,以便在任何Android应用中使用。
- 如何使用Firebase ML Kit SDK轻松下载自定义模型并在Android应用中运行设备上推断。
What you’ll need
- 最新版本的Android Studio(v3.0 +)
- Android Studio模拟器或物理Android设备
- Java中Android开发的基础知识
- 对机器学习模型的基本了解
该codelab专注于ML Kit。 屏蔽了不相关的概念和代码块,并为您提供简单的复制和粘贴。
2. Getting set up
Download the Code
解压缩下载的zip文件。 这将使用您需要的所有资源解压缩根文件夹(mlkit-android)。 对于此codelab,您只需要vision子目录中的资源。
mlkit-android存储库中的vision子目录包含两个目录:
- starter - 在此codelab中构建的启动代码。
- final - 已完成的示例应用程序的已完成代码。
下载Tensor Flow Lite模型
单击以下链接下载我们将在此codelab中使用的预先训练的Tensor Flow Lite模型:
解压缩下载的zip文件。 这将解压缩根文件夹(mobilenet_v1_1.0_224_quant),您将在其中找到我们将在此codelab(mobilenet_v1_1.0_224_quant.tflite)中使用的Tensor Flow Lite自定义模型。
3. Create Firebase console Project
- Go to the Firebase console.
- Select Create New Project, and name your project “ML Kit Codelab”.
4. Set up the Firebase console Project
Connect your Android app
- 从新项目的概览屏幕中,
点击添加Firebase到您的Android应用。 - 输入codelab的软件包名称:com.google.firebase.codelab.mlkit。
- 将其他字段留空,然后单击注册应用程序。
Add google-services.json file to your app
添加软件包名称并选择继续后,浏览器会自动下载包含应用程序所需的所有Firebase元数据的配置文件。 将google-services.json文件复制到项目的app目录中。 跳过有关将Firebase SDK添加到应用的其余说明。 这已经在初学者项目中为您完成了。
Add the dependencies for ML Kit and the google-services plugin to your app
google-services插件使用google-services.json文件配置应用程序以使用Firebase,ML Kit依赖项允许您在应用中集成ML Kit SDK。 应该已经将以下行添加到项目的app目录中build.gradle文件的末尾(检查确认):
build.gradle
dependencies {
// ...
implementation 'com.google.firebase:firebase-ml-vision:19.0.3'
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2'
implementation 'com.google.firebase:firebase-ml-vision-face-model:17.0.2'
implementation 'com.google.firebase:firebase-ml-model-interpreter:18.0.0'
}
apply plugin: 'com.google.gms.google-services'
Sync your project with gradle files
为确保您的应用程序可以使用所有依赖项,您应该在此时将项目与gradle文件同步。 从Android Studio工具栏中选择与Gradle Files同步项目。
5. Run the starter app
现在您已将项目导入Android Studio并使用JSON文件配置了google-services插件,并添加了ML Kit的依赖项,您已准备好第一次运行该应用程序。 启动Android Studio模拟器,然后在Android Studio工具栏中单击运行 (
)
应用程序应该在您的模拟器上启动。 此时,您应该看到一个基本布局,其中包含一个下拉字段,允许您在6个图像之间进行选择。 在下一部分中,您将为文档添加文本识别功能,以识别图像中的文本。
6. Add on-device text recognition
在此步骤中,我们将为您的应用添加功能,以识别图像中的文本。
在图像上设置并运行设备上的文本识别
将以下内容添加到MainActivity类的runTextRecognition方法中:
MainActivity.java
private void runTextRecognition() {
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionTextRecognizer recognizer = FirebaseVision.getInstance()
.getOnDeviceTextRecognizer();
mTextButton.setEnabled(false);
recognizer.processImage(image)
.addOnSuccessListener(
new OnSuccessListener<FirebaseVisionText>() {
@Override
public void onSuccess(FirebaseVisionText 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(FirebaseVisionText texts) {
List<FirebaseVisionText.TextBlock> blocks = texts.getTextBlocks();
if (blocks.size() == 0) {
showToast("No text found");
return;
}
mGraphicOverlay.clear();
for (int i = 0; i < blocks.size(); i++) {
List<FirebaseVisionText.Line> lines = blocks.get(i).getLines();
for (int j = 0; j < lines.size(); j++) {
List<FirebaseVisionText.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);
}
}
}
}
在模拟器上运行应用程序
现在点击 Run(
)
在Android Studio工具栏中。 加载应用程序后,请确保在下拉字段中选择了“测试图像1(文本)”,然后单击“查找文本”按钮。
您的应用现在应该如下图所示,显示文本识别结果和边框覆盖在原始图像的顶部。
Photo: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0
恭喜,您刚刚使用ML Kit for Firebase为您的应用添加了设备上的文本识别功能! 设备上的文本识别非常适用于许多用例,因为即使您的应用程序没有互联网连接且速度足以在静止图像和实时视频帧上使用,它也能正常工作。 但是,它确实有一些局限性。 例如,尝试在模拟器中选择“测试图像2(文本)”,然后单击“查找文本”。 请注意,设备上的文本识别不会为非拉丁字母表中的文本返回有意义的结果。
In a later step, we will use the cloud text recognition functionality in ML Kit to fix this issue.
7. Add on-device face contour detection
在此步骤中,我们将为您的应用添加功能,以识别图像中面部的轮廓。
在图像上设置并运行设备上的面部轮廓检测
将以下内容添加到MainActivity类的runFaceContourDetection方法:
MainActivity.java
private void runFaceContourDetection() {
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionFaceDetectorOptions options =
new FirebaseVisionFaceDetectorOptions.Builder()
.setPerformanceMode(FirebaseVisionFaceDetectorOptions.FAST)
.setContourMode(FirebaseVisionFaceDetectorOptions.ALL_CONTOURS)
.build();
mFaceButton.setEnabled(false);
FirebaseVisionFaceDetector detector = FirebaseVision.getInstance().getVisionFaceDetector(options);
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener<List<FirebaseVisionFace>>() {
@Override
public void onSuccess(List<FirebaseVisionFace> 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<FirebaseVisionFace> faces) {
// Task completed successfully
if (faces.size() == 0) {
showToast("No face found");
return;
}
mGraphicOverlay.clear();
for (int i = 0; i < faces.size(); ++i) {
FirebaseVisionFace face = faces.get(i);
FaceContourGraphic faceGraphic = new FaceContourGraphic(mGraphicOverlay);
mGraphicOverlay.add(faceGraphic);
faceGraphic.updateFace(face);
}
}
Run the app on the emulator
现在单击Android Studio工具栏中的 Run。 加载应用程序后,确保在下拉字段中选择了测试图像3(面部),然后单击“查找面部轮廓”按钮。
您的应用现在应该如下图所示,显示面部轮廓检测结果,并在原始图像顶部重叠点时显示面部轮廓。
恭喜,您刚刚使用ML Kit for Firebase为您的应用添加了设备上的脸部轮廓检测! 设备面部轮廓检测非常适用于许多用例,因为即使您的应用程序没有互联网连接且速度足以在静止图像和实时视频帧上使用,它也能正常工作。
8.使用Firebase托管Tensor Flow Lite自定义模型
我们将在我们的应用程序中使用的预先训练的Tensor Flow Lite模型是MobileNet_v1模型,该模型设计用于低延迟,低功耗环境,并提供模型大小和精度之间的良好折衷。在此步骤中,我们将通过将其上传到Firebase项目来使用Firebase托管此模型。这使得使用ML Kit SDK的应用程序能够自动将模型下载到我们的设备,并允许我们在Firebase控制台中轻松进行模型版本管理。
使用Firebase托管自定义模型
- 转到Firebase控制台。
- 选择您的项目。
- 在左侧导航栏的“开发”部分下选择ML Kit。
- 单击CUSTOM选项卡。
- 单击添加另一个模型并使用“cloud_model_1”作为名称。这是我们稍后用于在Android代码中下载自定义模型的名称。
- 在TensorFlow Lite模型部分中,单击BROWSE并上载先前下载的mobilenet_v1_1.0_224_quant.tflite文件。
- 点击发布。
我们现在准备修改我们的Android代码以使用此托管模型。
9. Configure our app to automatically download the hosted model
从Firebase下载自定义模型
现在我们通过将其上传到我们的Firebase项目来托管预先培训的自定义模型,我们将修改我们的应用程序代码以自动下载并使用此模型。
将以下字段添加到MainActivity类的顶部以定义FirebaseModelInterpreter。
MainActivity.java
/**
* An instance of the driver class to run model inference with Firebase.
*/
private FirebaseModelInterpreter mInterpreter;
/**
* Data configuration of input & output data of model.
*/
private FirebaseModelInputOutputOptions mDataOptions;
然后将以下代码添加到MainActivity类的initCustomModel方法。
MainActivity.java
private void initCustomModel() {
mLabelList = loadLabelList(this);
int[] inputDims = {DIM_BATCH_SIZE, DIM_IMG_SIZE_X, DIM_IMG_SIZE_Y, DIM_PIXEL_SIZE};
int[] outputDims = {DIM_BATCH_SIZE, mLabelList.size()};
try {
mDataOptions =
new FirebaseModelInputOutputOptions.Builder()
.setInputFormat(0, FirebaseModelDataType.BYTE, inputDims)
.setOutputFormat(0, FirebaseModelDataType.BYTE, outputDims)
.build();
FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions
.Builder()
.requireWifi()
.build();
FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder
(HOSTED_MODEL_NAME)
.enableModelUpdates(true)
.setInitialDownloadConditions(conditions)
.setUpdatesDownloadConditions(conditions) // You could also specify
// different conditions
// for updates
.build();
FirebaseLocalModel localModel =
new FirebaseLocalModel.Builder("asset")
.setAssetFilePath(LOCAL_MODEL_ASSET).build();
FirebaseModelManager manager = FirebaseModelManager.getInstance();
manager.registerRemoteModel(remoteModel);
manager.registerLocalModel(localModel);
FirebaseModelOptions modelOptions =
new FirebaseModelOptions.Builder()
.setRemoteModelName(HOSTED_MODEL_NAME)
.setLocalModelName("asset")
.build();
mInterpreter = FirebaseModelInterpreter.getInstance(modelOptions);
} catch (FirebaseMLException e) {
showToast("Error while setting up the model");
e.printStackTrace();
}
}
请注意我们如何在代码中使用FirebaseModelInputOutputOptions来指定自定义模型所期望的输入及其生成的输出。在Mobilenetv1模型的情况下,我们使用224x224像素图像的输入并生成1维输出列表。然后,我们设置应将自定义模型下载到设备并使用FirebaseModelManager注册的条件。
为脱机方案捆绑本地版本的模型
通过Firebase托管模型,您可以对模型进行更新,并自动将其下载到您的用户。但是,在互联网连接较差的情况下,您可能还希望捆绑模型的本地版本。通过在Firebase上托管模型并在本地支持,您可以确保在网络连接可用时使用最新版本的模型,但是当Firebase托管模型不可用时,应用程序的ML功能仍然有效。
我们已经在前面的代码片段中添加了代码来执行此操作。我们首先创建了一个FirebaseLocalModelSource并调用了registerLocalModelSource来向我们的FirebaseModelManager注册它。您所要做的就是将之前下载的mobilenet_v1.0_224_quant.tflite添加到app / src / main中的assets文件夹中。
然后,将以下内容添加到项目的app模块中的build.gradle文件中:
build.gradle
android {
// ...
aaptOptions {
noCompress "tflite"
}
}
.tflite文件现在将包含在应用程序包中,并作为原始资产提供给ML Kit。
10.使用下载的/本地模型标记图像
在此步骤中,我们将定义一个函数,该函数使用我们在上一步中配置的FirebaseModelInterpreter,使用下载的或本地自定义模型运行推理。
添加代码以在您的应用中使用下载的/本地模型
将以下代码复制到MainActivity类的runModelInference方法中。
MainActivity.java
private void runModelInference() {
if (mInterpreter == null) {
Log.e(TAG, "Image classifier has not been initialized; Skipped.");
return;
}
// Create input data.
ByteBuffer imgData = convertBitmapToByteBuffer(mSelectedImage, mSelectedImage.getWidth(),
mSelectedImage.getHeight());
try {
FirebaseModelInputs inputs = new FirebaseModelInputs.Builder().add(imgData).build();
// Here's where the magic happens!!
mInterpreter
.run(inputs, mDataOptions)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
showToast("Error running model inference");
}
})
.continueWith(
new Continuation<FirebaseModelOutputs, List<String>>() {
@Override
public List<String> then(Task<FirebaseModelOutputs> task) {
byte[][] labelProbArray = task.getResult()
.<byte[][]>getOutput(0);
List<String> topLabels = getTopLabels(labelProbArray);
mGraphicOverlay.clear();
GraphicOverlay.Graphic labelGraphic = new LabelGraphic
(mGraphicOverlay, topLabels);
mGraphicOverlay.add(labelGraphic);
return topLabels;
}
});
} catch (FirebaseMLException e) {
e.printStackTrace();
showToast("Error running model inference");
}
}
ML Kit自动处理下载和运行模型(如果无法下载托管模型,则使用本地捆绑版本),并使用task.getResult()提供结果。 然后,我们在应用UI中对这些结果进行排序和显示。
在模拟器上运行应用程序
现在单击Android Studio工具栏中的** Run **。 加载应用程序后,确保在下拉字段中选择了Test Image 4(Object),然后单击FIND OBJECTS按钮。
您的应用现在应该如下图所示,显示模型推断结果和检测到的图像标签及其置信度。
11.添加云文本识别(可选)
在上一步中,您向应用程序添加了设备上的文本识别功能,该应用程序可以快速运行,无需连接互联网,并且是免费的。但是,它确实有一些局限性。例如,尝试在模拟器中选择“测试图像2(文本)”,然后单击“查找文本”。请注意,设备上的文本识别不会为非拉丁字母表中的文本返回有意义的结果。在此步骤中,您将使用ML Kit for Firebase将云文本识别添加到您的应用程序。这将允许您在图像中检测更多类型的文本,例如非拉丁字母。
将Firebase项目切换到Blaze计划
只有Blaze级别的项目才能使用Cloud Vision API。按照以下步骤将项目切换到Blaze计划并启用“即用即付”计费。
- 在Firebase控制台中打开您的项目。
- 单击当前所选Spark计划旁边左下角的MODIFY链接。
- 选择Blaze计划并按照Firebase控制台中的说明添加结算帐户。
注意:云文本识别功能对于每月前1000次使用仍然是免费的。点击此处查看其他定价详情。
启用Cloud Vision API
您需要启用Cloud Vision API才能在MK Kit中使用云文本识别。
- 在Cloud Console API库中打开Cloud Vision API。
- 确保在页面顶部的菜单中选择了Firebase项目。
- 如果尚未启用API,请单击启用。
在图像上设置并运行云文本识别
将以下内容添加到MainActivity类的runCloudTextRecognition方法:
MainActivity.java
private void runCloudTextRecognition() {
mCloudButton.setEnabled(false);
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionDocumentTextRecognizer recognizer = FirebaseVision.getInstance()
.getCloudDocumentTextRecognizer();
recognizer.processImage(image)
.addOnSuccessListener(
new OnSuccessListener<FirebaseVisionDocumentText>() {
@Override
public void onSuccess(FirebaseVisionDocumentText texts) {
mCloudButton.setEnabled(true);
processCloudTextRecognitionResult(texts);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
mCloudButton.setEnabled(true);
e.printStackTrace();
}
});
}
上面的代码配置文本识别检测器并使用响应调用函数processCloudTextRecognitionResult。
处理文本识别响应
将以下代码添加到MainActivity类中的processCloudTextRecognitionResult,以解析结果并在应用程序中显示它们。
MainActivity.java
private void processCloudTextRecognitionResult(FirebaseVisionDocumentText text) {
// Task completed successfully
if (text == null) {
showToast("No text found");
return;
}
mGraphicOverlay.clear();
List<FirebaseVisionDocumentText.Block> blocks = text.getBlocks();
for (int i = 0; i < blocks.size(); i++) {
List<FirebaseVisionDocumentText.Paragraph> paragraphs = blocks.get(i).getParagraphs();
for (int j = 0; j < paragraphs.size(); j++) {
List<FirebaseVisionDocumentText.Word> words = paragraphs.get(j).getWords();
for (int l = 0; l < words.size(); l++) {
CloudTextGraphic cloudDocumentTextGraphic = new CloudTextGraphic(mGraphicOverlay,
words.get(l));
mGraphicOverlay.add(cloudDocumentTextGraphic);
}
}
}
}
Run the app on the emulator
现在单击Android Studio工具栏中的Run。 加载应用程序后,在下拉字段中选择Test Image 2(Text),然后单击FIND TEXT(CLOUD)按钮。 请注意,现在我们已成功识别图像中的非拉丁字符!
ML Kit中的云文本识别非常适合以下情况:
- 您的应用需要高级文本识别功能
- 您的应用程序可以访问互联网
- 您的应用不需要在视频帧中进行实时文本识别
了解有关何时在ML中使用设备与云文本识别的更多详细信息developer docs.
12. Congratulations!
您已经使用ML Kit for Firebase轻松地为您的应用添加了高级机器学习功能。
我们涵盖的内容
- 如何将Fire Kit的ML Kit添加到您的Android应用程序中
- 如何在ML Kit中使用设备上的文本识别来查找图像中的文本
- 如何在ML Kit中使用云文本识别来启用更高级的用例,例如 - 识别非拉丁字母
- 何时适合使用设备上与云文本识别
- 如何使用Firebase托管您的自定义预训练Tensor Flow Lite模型
- 如何使用ML Kit将预先培训的TensorFlow Lite模型下载到您的应用程序
- 如何使用下载的模型运行推理和标签图像
Next Steps
- Use ML Kit for Firebase in your own Android app.