Google I/O — это обертка! Наверстать упущенное в сеансах TensorFlow Просмотреть сеансы

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

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

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

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

Шаг 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"
}