Используя метаданные 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. Обратите внимание, что инструмент настроит зависимость модуля от вашего имени с помощью привязки модели ML, и все зависимости будут автоматически вставлены в файл
build.gradle
вашего модуля Android.Необязательно: установите второй флажок для импорта графического процессора TensorFlow, если вы хотите использовать ускорение графического процессора.
Нажмите
Finish
.Следующий экран появится после успешного импорта. Чтобы начать использовать модель, выберите Kotlin или Java, скопируйте и вставьте код в раздел
Sample Code
. Вы можете вернуться к этому экрану, дважды щелкнув модель TFLite в каталогеml
в 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. Определите, совместим ли графический процессор, работающий на устройстве, с делегатом графического процессора TensorFlow, если нет, запустите модель с использованием нескольких потоков ЦП:
Котлин
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
: количество потоков, используемых для запуска модели. По умолчанию — один.
Например, чтобы использовать делегат графического процессора и до трех потоков, вы можете инициализировать модель следующим образом:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
Поиск неисправностей
Если вы получаете исключение «java.io.FileNotFoundException: этот файл невозможно открыть как файловый дескриптор; «вероятно, это сжато», вставьте следующие строки в раздел Android модуля приложения, который будет использовать библиотечный модуль:
aaptOptions {
noCompress "tflite"
}