利用 LiteRT 元数据,开发者可以生成 用于在 Android 上启用集成的封装容器代码。对于大多数开发者来说, Android Studio ML Model Binding 的图形界面 使用起来最简单。如果您需要进行更多自定义操作或使用命令行 工具,也可以使用 LiteRT Codegen。
使用 Android Studio 机器学习模型绑定
对于使用元数据增强的 LiteRT 模型,
开发者可以使用 Android Studio ML Model Binding 自动配置
项目设置,并根据模型生成封装容器类
元数据。使用封装容器代码,无需直接与
ByteBuffer
。作为替代,开发者可以与 LiteRT 模型
类型化对象,例如 Bitmap
和 Rect
。
在 Android Studio 中导入 LiteRT 模型
右键点击要使用 TFLite 模型的模块,或点击
File
,之后价格为New
>Other
>LiteRT Model
选择 TFLite 文件的位置。请注意,该工具将 通过机器学习模型绑定代表您配置模块的依赖项, 所有依赖项都会自动插入
build.gradle
文件。可选:如果您希望导入 TensorFlow GPU, 想要使用 GPU 加速功能
点击
Finish
。导入成功后会出现以下屏幕。开始 选择“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 交互,
包含类型化对象的精简版模型,例如 Bitmap
和 Rect
。
代码生成器的实用性取决于
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"
}