Создание интерфейсов модели с использованием метаданных

Используя метаданные LiteRT , разработчики могут генерировать код-обёртку для интеграции с Android. Большинству разработчиков удобнее всего использовать графический интерфейс Android Studio ML Model Binding . Если вам требуется более глубокая настройка или вы используете инструменты командной строки, также доступен LiteRT Codegen .

Использовать привязку модели Android Studio ML

Для моделей LiteRT, улучшенных с помощью метаданных , разработчики могут использовать привязку моделей Android Studio ML для автоматической настройки параметров проекта и генерации классов-обёрток на основе метаданных модели. Код-обёртка устраняет необходимость прямого взаимодействия с ByteBuffer . Вместо этого разработчики могут взаимодействовать с моделью LiteRT с помощью типизированных объектов, таких как Bitmap и Rect .

Импортируйте модель LiteRT в Android Studio.

  1. Щелкните правой кнопкой мыши по модулю, для которого вы хотите использовать модель TFLite, или нажмите File , затем New > Other > LiteRT Model

  2. Выберите расположение файла TFLite. Обратите внимание, что инструментарий автоматически настроит зависимости модуля с помощью привязки к модели машинного обучения, и все зависимости будут автоматически добавлены в файл build.gradle вашего модуля Android.

    Необязательно: установите второй флажок для импорта TensorFlow GPU, если вы хотите использовать ускорение GPU.

  3. Нажмите кнопку Finish .

  4. После успешного импорта появится следующий экран. Чтобы начать использовать модель, выберите 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"
}