Используя метаданные LiteRT , разработчики могут генерировать код-обёртку для интеграции с Android. Большинству разработчиков удобнее всего использовать графический интерфейс Android Studio ML Model Binding . Если вам требуется более глубокая настройка или вы используете инструменты командной строки, также доступен LiteRT Codegen .
Использовать привязку модели Android Studio ML
Для моделей LiteRT, улучшенных с помощью метаданных , разработчики могут использовать привязку моделей Android Studio ML для автоматической настройки параметров проекта и генерации классов-обёрток на основе метаданных модели. Код-обёртка устраняет необходимость прямого взаимодействия с ByteBuffer . Вместо этого разработчики могут взаимодействовать с моделью LiteRT с помощью типизированных объектов, таких как Bitmap и Rect .
Импортируйте модель LiteRT в Android Studio.
Щелкните правой кнопкой мыши по модулю, для которого вы хотите использовать модель TFLite, или нажмите
File, затемNew>Other>LiteRT ModelВыберите расположение файла TFLite. Обратите внимание, что инструментарий автоматически настроит зависимости модуля с помощью привязки к модели машинного обучения, и все зависимости будут автоматически добавлены в файл
build.gradleвашего модуля Android.Необязательно: установите второй флажок для импорта TensorFlow GPU, если вы хотите использовать ускорение GPU.
Нажмите кнопку
Finish.После успешного импорта появится следующий экран. Чтобы начать использовать модель, выберите Kotlin или Java, скопируйте и вставьте код из раздела
Sample Code. Чтобы вернуться на этот экран, дважды щёлкните по модели TFLite в каталогеmlв Android Studio.
Ускорение вывода модели
Связывание моделей машинного обучения позволяет разработчикам ускорить свой код за счет использования делегатов и увеличения количества потоков.
Шаг 1. Проверьте файл модуля build.gradle на наличие в нем следующей зависимости:
dependencies {
...
// For the LiteRT GPU delegate, we need
// 'com.google.ai.edge.litert:litert-gpu' version 1.*.
implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
}
Шаг 2. Определите, совместим ли графический процессор, работающий на устройстве, с делегатом TensorFlow GPU. Если нет, запустите модель, используя несколько потоков центрального процессора:
Котлин
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
Ява
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 Lite с помощью типизированных объектов, таких как 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 .
Откройте проект Android Studio, в котором вы хотите использовать модель LiteRT, и импортируйте сгенерированный модуль следующим образом: Файл -> Новый -> Импорт модуля -> выберите SRC_ROOT
Используя приведенный выше пример, каталог и импортированный модуль будут называться classify_wrapper .
Шаг 2: Обновите файл build.gradle приложения.
В модуле приложения, который будет использовать сгенерированный модуль библиотеки:
В разделе android добавьте следующее:
aaptOptions {
noCompress "tflite"
}
В разделе зависимостей добавьте следующее:
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 - (Необязательно)
Device: делегат ускорения TFLite. Например: GPUDelegate. - (Необязательно)
numThreads: количество потоков, используемых для запуска модели — по умолчанию один.
Например, чтобы использовать делегат GPU и до трех потоков, вы можете инициализировать модель следующим образом:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
Поиск неисправностей
Если вы получили ошибку «java.io.FileNotFoundException: этот файл не может быть открыт как файловый дескриптор; вероятно, он сжат», вставьте следующие строки в раздел android модуля приложения, который будет использовать модуль библиотеки:
aaptOptions {
noCompress "tflite"
}