• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

开始使用适用于Android的Firebase ML套件

借助Tensor flow Mobile 和 TensorFlow Lite,在 android应用程序中嵌入和使用深度模型变得非常容易。然而,设计和训练模型仍然需要大量的技能、时间和精力,更不用说计算能力了。出于这个原因,大多数休闲开发人员对于将mac机器学习功能添加到他们的应用程序中并不热心。借助firebase ML Kit,谷歌希望改变这一点。

Firebase ML Kit 是一个库,可让您以最少的代码轻松地在您的 Android 应用程序中使用各种高度准确、预训练的深度模型。它提供的大多数模型都可以在本地和 Google Cloud 上使用。

目前,这些模型仅限于与计算机视觉相关的任务,例如光学字符识别、条形码扫描和物体检测。

在本教程中,我将向您展示如何将 Firebase ML Kit 添加到 Android Studio 项目并使用它的一些基本api

先决条件

在继续之前,请确保您有权访问以下内容:

  • 最新版本的Android Studio

  • 运行 Android API 级别 21 或更高级别的设备或模拟器

  • Firebase帐户_

  • 谷歌云帐户

1.创建一个 Firebase 项目

要为您的应用启用 Firebase服务,您必须为其创建一个 Firebase 项目。因此,登录Firebase 控制台 ,然后在欢迎屏幕上按添加项目 按钮。

开始使用适用于Android的Firebase ML套件  第1张

在弹出的对话框中,给项目起一个易于记忆的名称,然后按创建项目 按钮。

开始使用适用于Android的Firebase ML套件  第2张

几秒钟后,您应该会看到一条通知,告诉您新项目已准备就绪。按继续 按钮继续。

在下一个屏幕中,转到“开发 ”部分并单击ML Kit 链接以查看 ML Kit 提供的所有服务。

开始使用适用于Android的Firebase ML套件  第3张

在本教程中,我们将使用三个服务:文本识别、人脸检测和图像标记。如果您打算仅使用 ML Kit 随附的本地模型,则无需采取任何步骤来显式启用它们。不过,在本教程中,我们将同时使用本地和基于云的模型。因此,接下来单击Cloud API 使用 链接。

您现在将被带到 Google Cloud 控制台,您只需按下 Cloud Vision API 部分中显示的启用 按钮即可激活基于云的模型。但是请注意,这仅在您为 Google Cloud 帐户启用结算功能时才有效。

开始使用适用于Android的Firebase ML套件  第4张

2. 配置你的 Android Studio 项目

在开始使用 Firebase ML Kit API 之前,您必须在 Android Studio 项目和您在上一步中创建的 Firebase 项目之间建立连接。为此,请转到Tools > Firebase打开 Firebase Assistant 面板。

Firebase 助手目前不支持 ML Kit。尽管如此,通过使用它来添加 Firebase Analytics,您仍然可以避免手动建立连接。因此,展开Analytics 部分,单击Log an Analytics event 链接,然后按Connect to Firebase 按钮。

在弹出的对话框中,确保选择选择现有 Firebase 或 Google 项目 选项并选择您创建的 Firebase 项目。

开始使用适用于Android的Firebase ML套件  第5张

接下来按连接到 Firebase 按钮。此时,助手会自动下载一个google-services.json 文件,其中包含 API 密钥和项目 ID,并将其添加到app 模块中。

成功建立连接后,请确保按下Add Analytics to your app 按钮,将各种核心 Firebase 依赖项添加到 app 模块的build.gradle 文件中。

接下来,要实际添加 ML Kit 库,请打开build.gradle 文件并输入以下 implementation 依赖项:

implementation 'com.google.firebase:firebase-ml-vision:16.0.0'
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:15.0.0'

为了简化从 Internet 下载图像并在您的应用程序中显示它们的过程,我建议您还为Picasso库添加一个依赖项。

implementation 'com.squareup.picasso:picasso:2.5.2'

此外,将Anko添加为依赖项,以确保您的 kotlin 代码既简洁又直观。

implementation 'org.jetbrains.anko:anko-commons:0.10.5'

默认情况下,Firebase ML Kit 的本地模型仅在需要时才会自动下载到您用户的设备上。但是,如果您希望在安装应用后立即下载它们,请将以下代码添加到AndroidManifest.xml 文件中:

<meta-data
    android:name="com.google.firebase.ml.vision.DEPENDENCIES"
    android:value="text,face,label" />

3.定义布局

在本教程中,我们将创建一个应用程序,允许用户输入图像的 URL 并对它们执行文本识别、人脸检测和图像标记操作。因此,应用程序的布局必须有一个EditText 小部件,用户可以在其中键入 URL,以及三个Button小部件,让他们选择他们想要执行的操作。 

或者,您可以包含一个ImageView 小部件来显示图像。

如果您使用小部件定位RelativeLayout上述所有小 部件,则您的布局 XML 文件应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Image URL"
        android:id="@+id/image_url_field"
        android:imeOptions="actionDone"
        android:inputType="textUri"/>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/image_holder"
        android:layout_below="@+id/image_url_field"
        android:layout_marginTop="10dp"
        android:scaleType="centerInside"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true">
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.33"
            android:text="Text"
            android:onClick="recognizeText"/>
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.33"
            android:text="Faces"
            android:onClick="detectFaces"/>
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.33"
            android:text="Labels"
            android:onClick="generateLabels"/>
    </LinearLayout>

</RelativeLayout>

这是布局的更直观表示:

开始使用适用于Android的Firebase ML套件  第6张

在上面的 XML 中,您可能已经注意到每个按钮都有一个onClick 指向单击事件处理方法的属性。这些方法还不存在,所以现在在你的活动中创建它们。

fun recognizeText(v: View) {
    // To do   
}

fun detectFaces(v: View) {
    // To do
}

fun generateLabels(v: View) {
    // To do
}

4.加载图像

当用户在小部件中 输入图像的 URL 后按下完成EditText键时 ,我们的应用程序必须下载图像并将其显示在 ImageView 小部件中。

要检测在用户虚拟键盘上执行的操作,请将 OnEditorActionListener 对象与EditText 小部件相关联。在监听器内部,确认动作IME_ACTION_DONE 已经执行后,你可以简单地调用 Picasso 的load() 和into() 方法来分别加载和显示图像。

onCreate() 因此,在您的活动方法中添加以下代码:

image_url_field.setOnEditorActionListener { _, action, _ ->
    if (action == EditorInfo.IME_ACTION_DONE) {
        Picasso.with(ctx).load(image_url_field.text.toString())
                .into(image_holder)
        true
    }
    false
}

5.识别文本

Firebase ML Kit 为其提供的所有各种图像识别操作提供了单独的检测器类。要识别文本,您必须要么使用 FirebaseVisionTextDetector 依赖于本地模型的 FirebaseVisionCloudTextDetector 类,要么使用依赖于基于云的模型的类。现在,让我们使用前者。它要快得多,但它只能处理用拉丁字母书写的文本。

ML Kit 检测器期望其输入是FirebaseVisionImage 对象的形式。要创建这样一个对象,您需要做的就是调用该类的fromBitmap() 实用方法 FirebaseVisionImage 并将位图传递给它。以下代码必须添加到recognizeText() 我们之前创建的事件处理程序中,它向您展示了如何将布局ImageView 小部件中显示的图像转换为位图,然后从中创建一个FirebaseVisionImage 对象:

val textImage = FirebaseVisionImage.fromBitmap(
        (image_holder.drawable as BitmapDrawable).bitmap
)

接下来,要获得对FirebaseVisionTextDetector 对象的引用,您必须使用 FirebaseVision 实例。

val detector = FirebaseVision.getInstance().visionTextDetector

您现在可以通过调用该detectInImage() 方法并将FirebaseVisionImage 对象传递给它来启动文本识别过程。因为该方法异步运行,所以它返回一个Task 对象。因此,为了能够在结果可用时对其进行处理,您必须将OnCompleteListener 实例附加到它。就是这样:

detector.detectInImage(textImage)
        .addOnCompleteListener {
            // More code here
        }

在***器内部,您将可以访问Block 对象列表。通常,可以将每个块视为在图像中检测到的单独段落。通过查看 text 所有对象的属性Block ,您可以确定已检测到的所有文本。以下代码向您展示了如何执行此操作:

var detectedText = ""
it.result.blocks.forEach {
    detectedText += it.text + "\n"
}

您如何使用检测到的文本当然取决于您。现在,让我们使用警告对话框来显示它。感谢 Anko 的alert() 功能,这样做只需要很少的代码。

runOnUiThread {
    alert(detectedText, "Text").show()
}

在上面的代码中,该runOnUiThread() 方法确保alert() 函数在应用程序的主线程上运行。

最后,一旦你使用完检测器,你必须记得调用它的 close() 方法来释放它持有的所有资源。

detector.close()

如果您现在运行该应用程序,输入包含大量文本的图像的 URL,然后按“文本” 按钮,您应该能够看到 ML Kit 的文本识别服务正在运行。

开始使用适用于Android的Firebase ML套件  第7张

ML Kit 的文本识别本地模型对于大多数类型的印刷文本都相当准确。

6.检测人脸

尽管它们不共享任何通用的高级接口,但大多数检测器类具有相同的方法。这意味着检测图像中的人脸与识别文本没有太大区别。但是请注意,ML Kit 目前仅提供用于人脸检测的本地模型,可以使用FirebaseVisionFaceDetector 该类访问该模型。FirebaseVision 您可以使用该类获取对它的实例的引用。

将以下代码添加到detectFaces() 方法中:

val detector = FirebaseVision.getInstance().visionFaceDetector

通过再次调用该 detectInImage() 方法并将位图传递给它,您可以异步启动人脸检测过程。通过使用OnCompleteListener 附加到 Task 它返回的对象的实例,您可以轻松知道该过程何时完成。

detector.detectInImage(FirebaseVisionImage.fromBitmap(
            (image_holder.drawable as BitmapDrawable).bitmap
        )).addOnCompleteListener {
            // More code here        
        }

在***器中,您可以访问FirebaseVisionFace 对象列表,其中包含检测到的人脸外接矩形的坐标。现在让我们在处理过的原始图像的副本上绘制这些矩形。

要创建原始图像位图的副本,必须使用copy() 如下所示的方法:

var markedBitmap =
    (image_holder.drawable as BitmapDrawable)
            .bitmap
            .copy(Bitmap.Config.ARGB_8888, true)

接下来,为了能够在新位图上绘图,您必须为其创建canvas 对象Paint 。对矩形使用稍微透明的颜色是理想的。

val canvas = Canvas(markedBitmap)
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
paint.color = Color.parseColor("#99003399")
                            // semi-transparent blue

此时,您可以简单地遍历FirebaseVisionFace 对象列表并使用它们的boundingBox 属性在检测到的面部上绘制矩形。

it.result.forEach {
    canvas.drawRect(it.boundingBox, paint)
}

ImageView 最后,一旦准备好,不要忘记将新位图传递给小部件。

runOnUiThread {
    image_holder.setImageBitmap(markedBitmap)}

如果您现在运行该应用程序,您应该能够对任何包含人的图像执行面部检测。

开始使用适用于Android的Firebase ML套件  第8张

我相信您会对 ML Kit 的人脸检测操作的速度和准确性印象深刻。

7.生成标签

要为图像生成标签,您必须使用基于本地模型的 FirebaseVisionLabelDetector 类或基于云模型的 FirebaseVisionCloudLabelDetector 类。因为在本教程中我们一直只使用本地模型,所以现在让我们使用云模型。要获得对FirebaseVisionCloudLabelDetector 类实例的引用,您必须再次使用 FirebaseVision 该类。

将以下代码添加到generateLabels() 方法中:

val detector = 
        FirebaseVision.getInstance().visionCloudLabelDetector

接下来,像往常一样,调用该detectInImage() 方法并将一个 OnCompleteListener 实例分配给它的返回值。

detector.detectInImage(FirebaseVisionImage.fromBitmap(
            (image_holder.drawable as BitmapDrawable).bitmap
        )).addOnCompleteListener {
            // More code here
        }

这一次,在***器中,您将可以访问FirebaseVisionCloudLabel 对象列表,每个对象都有一个label 包含图像潜在标签的属性。每个标签还具有confidence 与之关联的属性,指定 ML Kit 对标签的确定程度。

以下代码向您展示了如何遍历标签列表并生成一个警报对话框,该对话框仅显示置信度分数超过 70% 的标签。

var output = ""
it.result.forEach {
    if(it.confidence > 0.7)
        output += it.label + "\n"
}
runOnUiThread {
    alert(output, "Labels").show()
}

继续并再次运行该应用程序,以查看您的应用程序为您扔给它的图像生成的标签。

开始使用适用于Android的Firebase ML套件  第9张

结论

借助 Firebase ML Kit,Google 希望让机器学习像分析和崩溃报告等更简单的任务一样易于访问和成为主流。在本介绍性教程中,您学习了如何在 Android 应用程序中使用它的一些基本 API。您还学习了如何使用它提供的云和本地模型。


文章目录
  • 先决条件
  • 1.创建一个 Firebase 项目
  • 2. 配置你的 Android Studio 项目
  • 3.定义布局
  • 4.加载图像
  • 5.识别文本
  • 6.检测人脸
  • 7.生成标签
  • 结论