Используя метаданные TensorFlow Lite , разработчики могут генерировать код-оболочку для обеспечения интеграции на Android. Для большинства разработчиков графический интерфейс Android Studio ML Model Binding является самым простым в использовании. Если вам требуется дополнительная настройка или вы используете инструменты командной строки, также доступен TensorFlow Lite Codegen .
Используйте привязку модели Android Studio ML
Для моделей TensorFlow Lite, дополненных метаданными , разработчики могут использовать привязку модели Android Studio ML для автоматической настройки параметров проекта и создания классов-оболочек на основе метаданных модели. Код-оболочка избавляет от необходимости напрямую взаимодействовать с ByteBuffer
. Вместо этого разработчики могут взаимодействовать с моделью TensorFlow Lite с типизированными объектами, такими как Bitmap
и Rect
.
Импорт модели TensorFlow Lite в Android Studio
Щелкните правой кнопкой мыши модуль, в котором вы хотите использовать модель TFLite, или нажмите «
File
», затем «New
» > «Other
» > «TensorFlow Lite Model
».Выберите расположение вашего файла TFLite. Обратите внимание, что инструментарий настроит зависимость модуля от вашего имени с привязкой модели ML, и все зависимости будут автоматически вставлены в файл
build.gradle
вашего модуля Android.Необязательно: установите второй флажок для импорта графического процессора TensorFlow, если вы хотите использовать ускорение графического процессора.
Нажмите
Finish
.Следующий экран появится после успешного импорта. Чтобы начать использовать модель, выберите Kotlin или Java, скопируйте и вставьте код в раздел
Sample Code
. Вы можете вернуться к этому экрану, дважды щелкнув модель TFLite в каталогеml
в Android Studio.
Ускорение вывода модели
Привязка модели машинного обучения позволяет разработчикам ускорить свой код за счет использования делегатов и количества потоков.
Шаг 1. Проверьте файл build.gradle
модуля на наличие следующей зависимости:
dependencies {
...
// TFLite GPU delegate 2.3.0 or above is required.
implementation 'org.tensorflow:tensorflow-lite-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
Создавайте интерфейсы моделей с помощью генератора кода TensorFlow Lite.
Для модели TensorFlow Lite, дополненной метаданными , разработчики могут использовать генератор кода оболочки TensorFlow Lite Android для создания кода оболочки для конкретной платформы. Код-оболочка избавляет от необходимости напрямую взаимодействовать с ByteBuffer
. Вместо этого разработчики могут взаимодействовать с моделью TensorFlow Lite с типизированными объектами, такими как Bitmap
и Rect
.
Полезность генератора кода зависит от полноты записи метаданных модели TensorFlow Lite. Обратитесь к <Codegen usage>
в соответствующих полях в metadata_schema.fbs , чтобы увидеть, как инструмент codegen анализирует каждое поле.
Сгенерировать код оболочки
Вам нужно будет установить следующие инструменты в вашем терминале:
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, в котором вы хотите использовать облегченную модель TensorFlow, и импортируйте сгенерированный модуль: И Файл -> Создать -> Модуль импорта -> выберите 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 или 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"
}