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-интерфейсы 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 и загружается динамически, как и версии API задач и 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-интерфейсами задач:
Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Инициализируйте делегат графического процессора с помощью
setEnableGpuDelegateSupport
. Например, вы можете инициализировать делегат графического процессора для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
. Например, вы можете настроить графический процессор вObjectDetector
следующим образом:Котлин
val options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build()
Джава
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build();
Графический процессор с 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());
Установите делегата графического процессора в параметрах интерпретатора для использования
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 доступны только API-интерфейсы Java 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 .