使用元数据生成模型接口

使用 TensorFlow Lite 元数据,开发人员可以生成包装器代码以启用 Android 集成。对于大多数开发人员来说,Android Studio ML 模型绑定 的图形界面是最易于使用的。如果您需要更多自定义或使用命令行工具,则也可以使用 TensorFlow Lite 代码生成器

使用 Android Studio ML 模型绑定

对于使用 元数据 增强了 TensorFlow Lite 模型的开发人员,可以使用 Android Studio ML 模型绑定自动配置项目的设置并根据模型元数据生成包装器类。包装器代码消除了直接与 ByteBuffer 交互的需要。相反,开发人员可以使用类型化对象(如 BitmapRect)与 TensorFlow Lite 模型进行交互。

在 Android Studio 中导入 TensorFlow Lite 模型

  1. 右键单击您要使用 TFLite 模型的模块,或单击 File,然后单击 New > Other > TensorFlow Lite Model

  2. 选择 TFLite 文件的位置。请注意,该工具将代表您配置模块对 ML 模型绑定的依赖项,并将所有依赖项自动插入到您的 Android 模块的 build.gradle 文件中。

    可选:如果您想使用 GPU 加速,请选择第二个复选框以导入 TensorFlow GPU。

  3. 单击 Finish

  4. 导入成功后,将出现以下屏幕。要开始使用该模型,请选择 Kotlin 或 Java,将 Sample Code 部分下的代码复制并粘贴。您可以通过双击 Android Studio 中 ml 目录下的 TFLite 模型返回到此屏幕。

加速模型推理

ML 模型绑定为开发人员提供了一种通过使用代理和线程数量来加速其代码的方法。

步骤 1. 检查模块 build.gradle 文件,确保它包含以下依赖项

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'org.tensorflow:tensorflow-lite-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
      

使用 TensorFlow Lite 代码生成器生成模型接口

对于使用 元数据 增强的 TensorFlow Lite 模型,开发者可以使用 TensorFlow Lite Android 包装代码生成器来创建特定于平台的包装代码。包装代码消除了直接与 ByteBuffer 交互的需要。相反,开发者可以使用类型化对象(如 BitmapRect)与 TensorFlow Lite 模型进行交互。

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

生成包装代码

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

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

打开您要使用 TensorFlow Lite 模型的 Android Studio 项目,并通过以下方式导入生成的模块:文件 -> 新建 -> 导入模块 -> 选择 SRC_ROOT

使用上面的示例,导入的目录和模块将被称为 classify_wrapper

步骤 2:更新应用程序的 build.gradle 文件

在将使用生成的库模块的应用程序模块中

在 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 或 NNAPIDelegate
  • (可选) numThreads:用于运行模型的线程数量 - 默认值为一个。

例如,要使用 NNAPI 委托和最多三个线程,您可以像这样初始化模型

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

故障排除

如果您收到“java.io.FileNotFoundException: 此文件无法作为文件描述符打开;它可能已压缩”错误,请在将使用库模块的应用程序模块的 android 部分下插入以下行

aaptOptions {
   noCompress "tflite"
}