День сообщества ML - 9 ноября! Присоединяйтесь к нам для обновления от TensorFlow, JAX, и многое другое Подробнее

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

Используя метаданные 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

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

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

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

  3. Щелкните Finish .

  4. После успешного импорта появится следующий экран. Чтобы начать использовать модель, выберите Kotlin или Java, скопируйте и вставьте код в разделе Sample Code . Вы можете вернуться к этому экрану, дважды щелкнув модель TFLite в каталоге ml в Android Studio. Страница сведений о модели в Android Studio

Ускорение вывода модели

Привязка модели ML предоставляет разработчикам возможность ускорить свой код за счет использования делегатов и количества потоков.

Шаг 1. Убедитесь, что файл build.gradle модуля содержит следующую зависимость:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
    }

Шаг 2. Определите, совместим ли GPU, работающий на устройстве, с делегатом TensorFlow GPU, если нет, запустите модель с использованием нескольких потоков CPU:

Котлин

    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, дополненной метаданными , разработчики могут использовать генератор кода оболочки Android TensorFlow Lite для создания кода оболочки для конкретной платформы. Код оболочки устраняет необходимость прямого взаимодействия с ByteBuffer . Вместо этого разработчики могут взаимодействовать с моделью TensorFlow Lite с типизированными объектами, такими как Bitmap и Rect .

Полезность генератора кода зависит от полноты записи метаданных модели TensorFlow Lite. Обратитесь к <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, в котором вы хотите использовать модель TensorFlow lite, и импортируйте сгенерированный модуль: И Файл -> Создать -> Модуль импорта -> выберите 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"
}