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

TensorFlow Lite доступен в среде выполнения сервисов Google Play для всех устройств Android, на которых установлена ​​текущая версия сервисов Play. Эта среда выполнения позволяет запускать модели машинного обучения (ML) без статического связывания библиотек TensorFlow Lite с вашим приложением.

С помощью API сервисов Google Play вы можете уменьшить размер своих приложений и повысить производительность за счет последней стабильной версии библиотек. TensorFlow Lite в сервисах Google Play — рекомендуемый способ использования TensorFlow Lite на Android.

Вы можете начать работу со средой выполнения сервисов Play с помощью руководства Quickstart , которое содержит пошаговое руководство по реализации примера приложения. Если вы уже используете автономный TensorFlow Lite в своем приложении, обратитесь к разделу « Миграция из автономного TensorFlow Lite », чтобы обновить существующее приложение для использования среды выполнения сервисов Play. Дополнительные сведения о службах Google Play см. на веб-сайте служб Google Play .

Использование среды выполнения сервисов Play

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

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

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

API-интерфейс задач TensorFlow Lite представляет собой оболочку API-интерфейса интерпретатора и предоставляет высокоуровневый программный интерфейс для общих задач машинного обучения, в которых используются визуальные, звуковые и текстовые данные. Вам следует использовать 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. В следующем примере инициализируется библиотека видения:

Котлин

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 , чтобы проверить, совместимо ли устройство с делегатом GPU.

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

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

С 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;
});
    

GPU с API библиотеки задач

Чтобы использовать делегат GPU с API задач:

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

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

    Котлин

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

    Ява

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

GPU с 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. Установите делегат GPU в параметрах интерпретатора для использования DelegateFactory , вызвав addDelegateFactory() в 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(). Этот новый API является асинхронным, что означает, что в большинстве случаев он не является заменой, и вы должны зарегистрировать прослушиватель, когда вызов завершится. См. фрагмент кода в шаге 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.

Ограничения

TensorFlow Lite в сервисах Google Play имеет следующие ограничения:

  • Поддержка делегатов аппаратного ускорения ограничена делегатами, перечисленными в разделе « Аппаратное ускорение ». Никакие другие делегаты ускорения не поддерживаются.
  • Доступ к TensorFlow Lite через собственные API не поддерживается. Через сервисы Google Play доступны только Java-API TensorFlow Lite.
  • Экспериментальные или устаревшие API-интерфейсы TensorFlow Lite, включая пользовательские операции, не поддерживаются.

Поддержка и обратная связь

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

Условия обслуживания

Использование TensorFlow Lite в API сервисов Google Play регулируется Условиями обслуживания API Google .

Конфиденциальность и сбор данных

Когда вы используете TensorFlow Lite в API сервисов Google Play, обработка входных данных, таких как изображения, видео, текст, полностью происходит на устройстве, а TensorFlow Lite в API сервисов Google Play не отправляет эти данные на серверы Google. В результате вы можете использовать наши API для обработки данных, которые не должны покидать устройство.

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

Вы несете ответственность за информирование пользователей вашего приложения об обработке Google TensorFlow Lite в данных метрик API сервисов Google Play в соответствии с применимым законодательством.

Данные, которые мы собираем, включают следующее:

  • Информация об устройстве (например, производитель, модель, версия ОС и сборка) и доступные аппаратные ускорители машинного обучения (GPU и DSP). Используется для диагностики и анализа использования.
  • Идентификатор устройства, используемый для диагностики и анализа использования.
  • Информация о приложении (имя пакета, версия приложения). Используется для диагностики и анализа использования.
  • Конфигурация API (например, какие делегаты используются). Используется для диагностики и анализа использования.
  • Тип события (например, создание интерпретатора, вывод). Используется для диагностики и анализа использования.
  • Коды ошибок. Используется для диагностики.
  • Показатели эффективности. Используется для диагностики.

Следующие шаги

Дополнительные сведения о реализации машинного обучения в мобильном приложении с помощью TensorFlow Lite см. в Руководстве разработчика TensorFlow Lite . Вы можете найти дополнительные модели TensorFlow Lite для классификации изображений, обнаружения объектов и других приложений на TensorFlow Hub .