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

Используя метаданные 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. Обратите внимание, что инструмент настроит зависимость модуля от вашего имени с помощью привязки модели ML, и все зависимости будут автоматически вставлены в файл build.gradle вашего модуля Android.

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

  3. Нажмите Finish .

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