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

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

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

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

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). Вы можете воспользоваться преимуществами этих специализированных процессоров, используя аппаратные драйверы, называемые делегатами .

Делегат графического процессора предоставляется через службы Google Play и загружается динамически, как и версии API-интерфейса интерпретатора для служб Play.

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

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

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

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

Котлин

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. Включите опцию делегирования графического процессора при инициализации 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.