在Android上使用TensorFlow Lite识别花朵

657431be3173fa86.pngandroid.png

注意:此代码实验室需要物理设备进行测试

TensorFlow是一个多用途机器学习框架。 TensorFlow可以用于从云中跨集群训练大型模型到在手机等嵌入式系统上本地运行模型的任何地方。

该代码实验室使用TensorFlow Lite在Android设备上运行图像识别模型。

安装Android Studio 4.1或更高版本

如果尚未安装TensorFlow Lite模型,请下载并安装AndroidStudio 4.1或更高版本

您将学到什么

  • 如何使用TensorFlow Lite Model Maker训练自己的自定义图像分类器。
  • 如何使用Android Studio导入TensorFlow Lite模型以使用CameraX将自定义模型集成到Android应用中。
  • 如何在手机上使用GPU加速模型。

你会建立什么

一个运行TensorFlow图像识别程序以识别花朵的简单相机应用程序。

f11c2821f2c8311d.png

许可证:免费使用

在开始模型培训之前,请开始下载并安装Android Studio 4.1或更高版本

打开Colab ,其中显示了如何使用TensorFlow Lite转移学习使用Keras训练分类器以识别花朵。

克隆Git存储库

以下命令将克隆包含此代码实验室所需文件的Git存储库:

git clone https://github.com/hoitab/TFLClassify.git

接下来,转到刚克隆存储库的目录。在此代码实验室的其余部分,您将在这里进行工作:

cd TFLClassify

android.png

安装Android Studio 4.1或更高版本

如果尚未安装,请安装AndroidStudio 4.1或更高版本

使用Android Studio打开项目

通过执行以下步骤,使用Android Studio打开一个项目:

  1. 开启Android Studio 7f2480ded53a193b.png 。加载后,从此弹出窗口中选择“打开现有项目”:

f3b8bea7e3b39376.png

  1. 在文件选择器中,从工作目录中选择TFLClassify/build.gradle
  1. 第一次打开项目时,您将获得“ Gradle Sync”弹出窗口,询问有关使用Gradle包装器的问题。点击“确定”。

d68b4d7189e6c1e4.png

  1. 如果尚未启用手机上的开发人员模型和USB调试,请启用它。这是一次性设置。请按照以下说明进行操作
  2. 一旦您的项目和手机都准备就绪,您可以通过选择TFL_Classify.start并按运行按钮,在真实设备上运行它86934b7b01ad7565.png在工具栏上:

60a77ef126c1373d.png

  1. 现在,允许Tensorflow演示访问您的相机:

b63cba02bb36b7e3.png

  1. 您会在手机上看到以下屏幕,其中的随机数字代替了显示实际结果的位置。

82c603596afa35f1.png

  1. 在左侧的项目浏览器中选择start模块:

cede7f2b8b23c1a7.png

  1. 右键单击start模块或单击File ,然后单击New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. 选择您较早下载了自定义训练有素的FlowerModel.tflite的模型位置。

cfee18cc6674a408.png

  1. 点击Finish
  2. 您将在最后看到以下内容。 FlowerModel.tflite已成功导入,它显示了有关模型的高级信息,包括输入/​​输出以及一些入门示例代码。

82840065f0d59def.png

TODO列表使您可以轻松导航到需要更新代码实验室的确切位置。您也可以在Android项目中使用它来提醒自己以后的工作。您可以使用代码注释添加待办事项,然后键入关键字TODO 。要访问待办事项列表,您可以:

  1. 查看我们将要执行的操作的一种好方法是查看TODO列表。为此,请从顶部菜单栏中选择“ View >“ Tool Windows >“ TODO

5de29b413574f25c.png

  1. 默认情况下,它列出了所有模块中的所有TODO,这使它有些混乱。我们可以通过单击TODO面板侧面的group by按钮仅分类开始的TODO,然后选择Modules

5d8fe7b102340208.png

  1. 展开启动模块下的所有项目:

8d0f14a039995b20.png

  1. 单击TODO列表中的TODO 1或打开MainActivity.kt文件并找到TODO 1,通过添加以下行来初始化模型:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. 在CameraX Analyzer的分析方法内部,我们需要将摄像机输入的ImageProxy转换为Bitmap并为推理过程创建TensorImage对象。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. 处理图像并对结果执行以下操作:
  • 首先按照概率最高的属性score对结果进行降序排序。
  • 取常数MAX_RESULT_DISPLAY定义的前k个结果。您可以选择更改此变量的值以获取更多或更少的结果。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. 将排序和过滤后的结果转换为数据对象可以通过数据绑定通过RecyclerView使用的Recognition
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. 注释掉或删除以下几行,以帮助生成我们之前看到的假结果:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. 通过选择TFL_Classify.start在真实设备上运行应用程序,然后按运行按钮86934b7b01ad7565.png在工具栏上:

60a77ef126c1373d.png

  1. 您会在手机上看到以下屏幕,其中的随机数字代替了显示实际结果的位置:

f11c2821f2c8311d.png

TensorFlow Lite支持多种硬件加速器,以加快您的移动设备上的推理速度。 GPU是TensorFlow Lite可以通过委托机制利用的加速器之一,并且非常易于使用。

  1. start模块下打开build.gradle ,或者您可以单击TODO列表下的TODO 5并添加以下依赖项:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. 返回MainActivity.kt文件,或在TODO列表中单击TODO 6。使用以下示例替换flowerModel的简单启动:获取GPU兼容性列表的实例,并根据是否是列出的兼容GPU之一来初始化GPU。否则,请启动4个CPU线程来运行模型:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. 通过在方法输入中添加options ,更改模型初始化程序以使用它:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. 通过选择TFL_Classify.start在真实设备上运行应用程序,然后按运行按钮86934b7b01ad7565.png在工具栏上:

60a77ef126c1373d.png

以下是更多信息的链接: