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 задач:
Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Инициализируйте делегата графического процессора с помощью
setEnableGpuDelegateSupport
. Например, вы можете инициализировать делегат GPU дляTfLiteVision
следующим образом:Котлин
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
Ява
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
Включите опцию делегирования графического процессора с помощью
BaseOptions
:Котлин
val baseOptions = BaseOptions.builder().useGpu().build()
Ява
BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
Настройте параметры с помощью
.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 интерпретатора:
Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Включите опцию делегирования графического процессора в инициализации TFlite:
Котлин
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Ява
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Установите делегат 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, ознакомьтесь со следующими дополнительными рекомендациями по обновлению кода проекта вашего приложения:
- Просмотрите раздел « Ограничения » на этой странице, чтобы убедиться, что ваш вариант использования поддерживается.
- Перед обновлением кода проверьте производительность и точность своих моделей, особенно если вы используете версии TensorFlow Lite до версии 2.1, чтобы у вас была база для сравнения с новой реализацией.
- Если вы перенесли весь свой код для использования API сервисов Play для TensorFlow Lite, вам следует удалить существующие зависимости библиотеки времени выполнения TensorFlow Lite (записи с
org.tensorflow: tensorflow-lite :*
) из вашего файла build.gradle, чтобы вы может уменьшить размер вашего приложения. - Определите все случаи создания
new Interpreter
в вашем коде и измените его так, чтобы он использовал вызов InterpreterApi.create(). Этот новый API является асинхронным, что означает, что в большинстве случаев он не является заменой, и вы должны зарегистрировать прослушиватель, когда вызов завершится. См. фрагмент кода в шаге 3 кода. - Добавить
import org.tensorflow.lite.InterpreterApi;
иimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
в любые исходные файлы с помощью классовorg.tensorflow.lite.Interpreter
илиorg.tensorflow.lite.InterpreterApi
. - Если какой-либо из результирующих вызовов
InterpreterApi.create()
имеет только один аргумент, добавьтеnew InterpreterApi.Options()
в список аргументов. - Добавьте
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
к последнему аргументу любых вызововInterpreterApi.create()
. - Замените все остальные вхождения класса
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 .