使用元数据生成模型接口

利用 LiteRT 元数据,开发者可以生成 用于在 Android 上启用集成的封装容器代码。对于大多数开发者来说, Android Studio ML Model Binding 的图形界面 使用起来最简单。如果您需要进行更多自定义操作或使用命令行 工具,也可以使用 LiteRT Codegen

使用 Android Studio 机器学习模型绑定

对于使用元数据增强的 LiteRT 模型, 开发者可以使用 Android Studio ML Model Binding 自动配置 项目设置,并根据模型生成封装容器类 元数据。使用封装容器代码,无需直接与 ByteBuffer。作为替代,开发者可以与 LiteRT 模型 类型化对象,例如 BitmapRect

在 Android Studio 中导入 LiteRT 模型

  1. 右键点击要使用 TFLite 模型的模块,或点击 File,之后价格为 New >Other >LiteRT Model

  2. 选择 TFLite 文件的位置。请注意,该工具将 通过机器学习模型绑定代表您配置模块的依赖项, 所有依赖项都会自动插入 build.gradle 文件。

    可选:如果您希望导入 TensorFlow GPU, 想要使用 GPU 加速功能

  3. 点击 Finish

  4. 导入成功后会出现以下屏幕。开始 选择“Kotlin 或 Java”,复制代码并将其粘贴到 Sample Code 部分。双击即可返回此屏幕 TFLite 模型位于 Android Studio 中的 ml 目录下。

加速模型推断

机器学习模型绑定为开发者提供了一种通过 委托的使用和线程数。

第 1 步:检查模块 build.gradle 文件是否包含以下内容 依赖项:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
    }

第 2 步:检测设备上运行的 GPU 是否与 TensorFlow GPU 兼容 委托,如果不使用多个 CPU 线程运行模型:

Kotlin

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice) {
        // if the device has a supported GPU, add the GPU delegate
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        // if the GPU is not supported, run on 4 threads
        Model.Options.Builder().setNumThreads(4).build()
    }

    // Initialize the model as usual feeding in the options object
    val myModel = MyModel.newInstance(context, options)

    // Run inference per sample code
      

Java

    import org.tensorflow.lite.support.model.Model
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Model.Options options;
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        options = Model.Options.Builder().setDevice(Model.Device.GPU).build();
    } else {
        // if the GPU is not supported, run on 4 threads
        options = Model.Options.Builder().setNumThreads(4).build();
    }

    MyModel myModel = new MyModel.newInstance(context, options);

    // Run inference per sample code
      

使用 LiteRT 代码生成器生成模型接口

对于使用元数据增强的 LiteRT 模型: 开发者可以使用 LiteRT Android 封装容器代码生成器 针对具体平台的封装容器代码封装容器代码不需要 ByteBuffer。作为替代,开发者可以与 TensorFlow 交互, 包含类型化对象的精简版模型,例如 BitmapRect

代码生成器的实用性取决于 LiteRT 模型的元数据条目。请参阅 <Codegen usage> 部分 中的相关字段下 metadata_schema.fbs、 代码生成工具如何解析每个字段。

生成封装容器代码

您需要在终端中安装以下工具:

pip install tflite-support

完成后,可通过以下语法使用代码生成器:

tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --package_name=org.tensorflow.lite.classify \
    --model_class_name=MyClassifierModel \
    --destination=./classify_wrapper

生成的代码将位于目标目录中。如果您 使用 Google Colab 或其他遥控器 将结果压缩为 zip 归档文件并下载 添加到您的 Android Studio 项目中:

# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/

# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')

使用生成的代码

第 1 步:导入生成的代码

如有必要,将生成的代码解压缩到目录结构中。求根 假设生成的代码为 SRC_ROOT

打开要在其中使用 LiteRT 的 Android Studio 项目 并通过以下方式导入生成的模块:和 File ->新建 ->导入模块 -> 选择SRC_ROOT

在上面的示例中,导入的目录和模块将调用 classify_wrapper

第 2 步:更新应用的 build.gradle 文件

在将使用生成的库模块的 app 模块中:

在 Android 部分下,添加以下内容:

aaptOptions {
   noCompress "tflite"
}

在“dependencies”部分下,添加以下内容:

implementation project(":classify_wrapper")

第 3 步:使用模型

// 1. Initialize the model
MyClassifierModel myImageClassifier = null;

try {
    myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
    // Error reading the model
}

if(null != myImageClassifier) {

    // 2. Set the input with a Bitmap called inputBitmap
    MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
    inputs.loadImage(inputBitmap));

    // 3. Run the model
    MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);

    // 4. Retrieve the result
    Map<String, Float> labeledProbability = outputs.getProbability();
}

加速模型推断

生成的代码为开发者提供了一种加快其代码运行速度的方法 通过使用受托人和 线程。可以在初始化模型对象时设置这些参数,因为它需要三个 参数:

  • Context:来自 Android activity 或服务的上下文
  • (可选)Device:TFLite 加速委托。例如: GPUDelegate
  • (可选)numThreads:用于运行模型的线程数 - 默认值为 1。

例如,要使用一个 GPU 委托和最多三个线程,您可以初始化 如下所示:

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
    // Error reading the model
}

问题排查

如果遇到“java.io.FileNotFoundException:无法以 文件描述符;“它可能已经过压缩”错误,请插入以下行 在将使用库模块的 app 模块的 android 部分下:

aaptOptions {
   noCompress "tflite"
}