TensorFlow Lite в сервисах Google Play Java API

Доступ к TensorFlow Lite в сервисах Google Play также можно получить с помощью Java API в дополнение к Native API. В частности, TensorFlow Lite в сервисах Google Play доступен через TensorFlow Lite Task API и TensorFlow Lite Interpreter API . Библиотека задач предоставляет оптимизированные готовые интерфейсы моделей для распространенных задач машинного обучения с использованием визуальных, звуковых и текстовых данных. API-интерфейс интерпретатора TensorFlow Lite, предоставляемый средой выполнения TensorFlow, предоставляет более универсальный интерфейс для создания и запуска моделей машинного обучения.

В следующих разделах представлены инструкции по использованию API-интерфейсов интерпретатора и библиотеки задач с TensorFlow Lite в сервисах Google Play. Хотя приложение может использовать как API-интерфейсы Interpreter, так и API-интерфейсы библиотеки задач, большинство приложений должны использовать только один набор API-интерфейсов.

Использование API библиотеки задач

API задач TensorFlow Lite является оболочкой API-интерфейса Interpreter и предоставляет высокоуровневый программный интерфейс для распространенных задач машинного обучения, в которых используются визуальные, аудио и текстовые данные. Вам следует использовать Task API, если вашему приложению требуется одна из поддерживаемых задач .

1. Добавьте зависимости проекта

Зависимость вашего проекта зависит от вашего варианта использования машинного обучения. API-интерфейсы задач содержат следующие библиотеки:

  • Библиотека Vision: org.tensorflow:tensorflow-lite-task-vision-play-services
  • Аудиобиблиотека: org.tensorflow:tensorflow-lite-task-audio-play-services
  • Текстовая библиотека: org.tensorflow:tensorflow-lite-task-text-play-services

Добавьте одну из зависимостей в код проекта вашего приложения, чтобы получить доступ к API сервисов Play для TensorFlow Lite. Например, для реализации задачи визуализации используйте следующее:

dependencies {
...
    implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}

2. Добавьте инициализацию TensorFlow Lite.

Инициализируйте компонент TensorFlow Lite API сервисов Google Play перед использованием API TensorFlow Lite. В следующем примере инициализируется библиотека Vision:

Котлин

init {
  TfLiteVision.initialize(context)
}

3. Сделайте выводы

После инициализации компонента TensorFlow Lite вызовите метод detect() для генерации выводов. Точный код метода detect() зависит от библиотеки и варианта использования. Ниже приведен простой вариант использования обнаружения объектов с помощью библиотеки TfLiteVision :

Котлин

fun detect(...) {
  if (!TfLiteVision.isInitialized()) {
    Log.e(TAG, "detect: TfLiteVision is not initialized yet")
    return
  }

  if (objectDetector == null) {
    setupObjectDetector()
  }

  ...

}

В зависимости от формата данных вам также может потребоваться предварительная обработка и преобразование данных в методе detect() перед созданием выводов. Например, данные изображения для детектора объектов требуют следующего:

val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)

Использование API-интерфейсов интерпретатора

API-интерфейсы интерпретатора предлагают больше контроля и гибкости, чем API-интерфейсы библиотеки задач. Вам следует использовать API-интерфейсы интерпретатора, если ваша задача машинного обучения не поддерживается библиотекой задач или если вам требуется более универсальный интерфейс для создания и запуска моделей машинного обучения.

1. Добавьте зависимости проекта

Добавьте следующие зависимости в код проекта вашего приложения, чтобы получить доступ к API сервисов Play для TensorFlow Lite:

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. Добавьте инициализацию TensorFlow Lite.

Инициализируйте компонент TensorFlow Lite API сервисов Google Play перед использованием API TensorFlow Lite:

Котлин

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Джава

Task<Void> initializeTask = TfLite.initialize(context);

3. Создайте интерпретатор и установите параметр времени выполнения.

Создайте интерпретатор с помощью InterpreterApi.create() и настройте его для использования среды выполнения сервисов Google Play, вызвав InterpreterApi.Options.setRuntime() , как показано в следующем примере кода:

Котлин

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

Джава

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

Вам следует использовать приведенную выше реализацию, поскольку она позволяет избежать блокировки потока пользовательского интерфейса Android. Если вам нужно более тщательно управлять выполнением потоков, вы можете добавить вызов Tasks.await() для создания интерпретатора:

Котлин

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Джава

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. Сделайте выводы

Используя созданный вами объект interpreter , вызовите метод run() , чтобы сгенерировать вывод.

Котлин

interpreter.run(inputBuffer, outputBuffer)

Джава

interpreter.run(inputBuffer, outputBuffer);

Аппаратное ускорение

TensorFlow Lite позволяет повысить производительность вашей модели с помощью специализированных аппаратных процессоров, таких как графические процессоры (GPU). Вы можете воспользоваться преимуществами этих специализированных процессоров, используя аппаратные драйверы, называемые делегатами . Вы можете использовать следующие делегаты аппаратного ускорения с TensorFlow Lite в сервисах Google Play:

  • Делегат графического процессора (рекомендуется) . Этот делегат предоставляется через службы Google Play и загружается динамически, как и версии Task API и Interpreter API для служб Play.

  • Делегат NNAPI . Этот делегат доступен как включенная зависимость библиотеки в ваш проект разработки Android и входит в состав вашего приложения.

Дополнительную информацию об аппаратном ускорении с помощью TensorFlow Lite см. на странице делегатов TensorFlow Lite .

Проверка совместимости устройства

Не все устройства поддерживают аппаратное ускорение графического процессора с помощью TFLite. Чтобы уменьшить количество ошибок и потенциальных сбоев, используйте метод TfLiteGpu.isGpuDelegateAvailable , чтобы проверить, совместимо ли устройство с делегатом графического процессора.

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

Если у вас есть такая переменная, как useGpuTask , вы можете использовать ее, чтобы определить, используют ли устройства делегат графического процессора. В следующих примерах показано, как это можно сделать с помощью API-интерфейсов библиотеки задач и интерпретатора.

С помощью Task API

Котлин

lateinit val optionsTask = useGpuTask.continueWith { task ->
  val baseOptionsBuilder = BaseOptions.builder()
  if (task.result) {
    baseOptionsBuilder.useGpu()
  }
 ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
}
    

Джава

Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task ->
  BaseOptions baseOptionsBuilder = BaseOptions.builder();
  if (task.getResult()) {
    baseOptionsBuilder.useGpu();
  }
  return ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
});
    

С помощью API-интерпретатора

Котлин

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

Джава

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

Графический процессор с API библиотеки задач

Чтобы использовать делегат GPU с API-интерфейсами задач:

  1. Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Инициализируйте делегат графического процессора с помощью setEnableGpuDelegateSupport . Например, вы можете инициализировать делегат графического процессора для TfLiteVision следующим образом:

    Котлин

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    Джава

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. Включите опцию делегирования графического процессора с помощью BaseOptions :

    Котлин

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    Джава

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. Настройте параметры с помощью .setBaseOptions . Например, вы можете настроить графический процессор в ObjectDetector следующим образом:

    Котлин

        val options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build()
        

    Джава

        ObjectDetectorOptions options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build();
        

Графический процессор с API-интерфейсами интерпретатора

Чтобы использовать делегат GPU с API-интерфейсами интерпретатора:

  1. Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Включите опцию делегирования графического процессора при инициализации TFlite:

    Котлин

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build())
        

    Джава

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. Включите делегат графического процессора в параметрах интерпретатора: установите фабрику делегата на GpuDelegateFactory, вызвав addDelegateFactory() within InterpreterApi.Options()`:

    Котлин

        val interpreterOption = InterpreterApi.Options()
         .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
         .addDelegateFactory(GpuDelegateFactory())
        

    Джава

        Options interpreterOption = InterpreterApi.Options()
          .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
          .addDelegateFactory(new GpuDelegateFactory());
        

Миграция с автономного TensorFlow Lite

Если вы планируете перенести свое приложение из автономного TensorFlow Lite в API сервисов Play, ознакомьтесь со следующими дополнительными рекомендациями по обновлению кода проекта вашего приложения:

  1. Просмотрите раздел «Ограничения» на этой странице, чтобы убедиться, что ваш вариант использования поддерживается.
  2. Прежде чем обновлять код, выполните проверку производительности и точности ваших моделей, особенно если вы используете версии TensorFlow Lite до версии 2.1, чтобы у вас была базовая линия для сравнения с новой реализацией.
  3. Если вы перенесли весь свой код для использования API сервисов Play для TensorFlow Lite, вам следует удалить существующие зависимости библиотеки времени выполнения TensorFlow Lite (записи с org.tensorflow: tensorflow-lite :* ) из вашего файла build.gradle, чтобы вы могли может уменьшить размер вашего приложения.
  4. Определите все случаи создания new Interpreter в вашем коде и измените каждый из них так, чтобы он использовал вызов InterpreterApi.create(). Новый TfLite.initialize является асинхронным, что означает, что в большинстве случаев это не замена: вы должны зарегистрировать прослушиватель на момент завершения вызова. Обратитесь к фрагменту кода в коде шага 3 .
  5. Добавьте import org.tensorflow.lite.InterpreterApi; и import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; в любые исходные файлы с помощью классов org.tensorflow.lite.Interpreter или org.tensorflow.lite.InterpreterApi .
  6. Если какой-либо из результирующих вызовов InterpreterApi.create() имеет только один аргумент, добавьте new InterpreterApi.Options() в список аргументов.
  7. Добавьте .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) к последнему аргументу любых вызовов InterpreterApi.create() .
  8. Замените все остальные вхождения класса org.tensorflow.lite.Interpreter на org.tensorflow.lite.InterpreterApi .

Если вы хотите использовать автономный TensorFlow Lite и API сервисов Play одновременно, вам необходимо использовать TensorFlow Lite 2.9 (или более позднюю версию). TensorFlow Lite 2.8 и более ранние версии несовместимы с версией API сервисов Play.