TensorFlow Lite jest dostępny w środowisku uruchomieniowym usług Google Play dla wszystkich urządzeń z systemem Android z obecną wersją usług Play. To środowisko wykonawcze umożliwia uruchamianie modeli uczenia maszynowego (ML) bez statycznego łączenia bibliotek TensorFlow Lite z aplikacją.
Dzięki interfejsowi API usług Google Play możesz zmniejszyć rozmiar swoich aplikacji i uzyskać lepszą wydajność dzięki najnowszej stabilnej wersji bibliotek. TensorFlow Lite w usługach Google Play to zalecany sposób korzystania z TensorFlow Lite na Androidzie.
Możesz rozpocząć korzystanie ze środowiska uruchomieniowego usług Play, korzystając z przewodnika Szybki start , który zawiera przewodnik krok po kroku dotyczący implementacji przykładowej aplikacji. Jeśli używasz już samodzielnego TensorFlow Lite w swojej aplikacji, zapoznaj się z sekcją Migracja z samodzielnego TensorFlow Lite , aby zaktualizować istniejącą aplikację, aby korzystała ze środowiska wykonawczego usług Play. Więcej informacji o usługach Google Play można znaleźć w witrynie usług Google Play .
Korzystanie ze środowiska uruchomieniowego usług Play
TensorFlow Lite w usługach Google Play jest dostępny za pośrednictwem TensorFlow Lite Task API i TensorFlow Lite Interpreter API . Biblioteka zadań zapewnia zoptymalizowane, gotowe do użycia interfejsy modeli dla typowych zadań uczenia maszynowego przy użyciu danych wizualnych, dźwiękowych i tekstowych. TensorFlow Lite Interpreter API, dostarczany przez środowisko uruchomieniowe i biblioteki pomocnicze TensorFlow, zapewnia bardziej uniwersalny interfejs do budowania i uruchamiania modeli ML.
Poniższe sekcje zawierają instrukcje dotyczące implementacji interfejsów API interpretera i biblioteki zadań w usługach Google Play. Chociaż aplikacja może używać zarówno interfejsów API interpretera, jak i interfejsów API biblioteki zadań, większość aplikacji powinna używać tylko jednego zestawu interfejsów API.
Korzystanie z interfejsów API biblioteki zadań
Interfejs API zadań TensorFlow Lite obejmuje interfejs API interpretera i zapewnia interfejs programowania wysokiego poziomu dla typowych zadań uczenia maszynowego, które wykorzystują dane wizualne, dźwiękowe i tekstowe. Jeśli aplikacja wymaga jednego z obsługiwanych zadań, należy użyć interfejsu API zadań .
1. Dodaj zależności projektu
Twoja zależność projektu zależy od przypadku użycia uczenia maszynowego. Interfejsy API zadań zawierają następujące biblioteki:
- Biblioteka Vision:
org.tensorflow:tensorflow-lite-task-vision-play-services
- Biblioteka audio:
org.tensorflow:tensorflow-lite-task-audio-play-services
- Biblioteka tekstowa:
org.tensorflow:tensorflow-lite-task-text-play-services
Dodaj jedną z zależności do kodu projektu aplikacji, aby uzyskać dostęp do interfejsu API usług Play dla TensorFlow Lite. Na przykład użyj poniższego, aby zaimplementować zadanie wizji:
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}
2. Dodaj inicjalizację TensorFlow Lite
Zainicjuj komponent TensorFlow Lite interfejsu API usług Google Play przed użyciem interfejsów API TensorFlow Lite. Poniższy przykład inicjuje bibliotekę wizyjną:
Kotlin
init { TfLiteVision.initialize(context) } }
3. Uruchom wnioskowanie
Po zainicjowaniu komponentu TensorFlow Lite wywołaj metodę detect()
, aby wygenerować wnioski. Dokładny kod w metodzie detect()
różni się w zależności od biblioteki i przypadku użycia. Poniżej przedstawiono prosty przypadek użycia wykrywania obiektów za pomocą biblioteki TfLiteVision
:
Kotlin
fun detect(...) { if (!TfLiteVision.isInitialized()) { Log.e(TAG, "detect: TfLiteVision is not initialized yet") return } if (objectDetector == null) { setupObjectDetector() } ... }
W zależności od formatu danych może być również konieczne wstępne przetworzenie i przekonwertowanie danych w ramach metody detect()
przed wygenerowaniem wniosków. Na przykład dane obrazu dla detektora obiektów wymagają spełnienia następujących warunków:
val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)
Korzystanie z interfejsów API interpretera
Interfejsy API interpretera oferują większą kontrolę i elastyczność niż interfejsy API biblioteki zadań. Należy używać interfejsów API interpretera, jeśli zadanie uczenia maszynowego nie jest obsługiwane przez bibliotekę zadań lub jeśli potrzebujesz bardziej ogólnego interfejsu do kompilowania i uruchamiania modeli ML.
1. Dodaj zależności projektu
Dodaj następujące zależności do kodu projektu aplikacji, aby uzyskać dostęp do interfejsu API usług Play dla 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. Dodaj inicjalizację TensorFlow Lite
Zainicjuj komponent TensorFlow Lite interfejsu API usług Google Play przed użyciem interfejsów API TensorFlow Lite:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Jawa
Task<Void> initializeTask = TfLite.initialize(context);
3. Utwórz interpreter i ustaw opcję czasu działania
Utwórz interpreter za pomocą InterpreterApi.create()
i skonfiguruj go do korzystania ze środowiska uruchomieniowego usług Google Play, wywołując funkcję InterpreterApi.Options.setRuntime()
, jak pokazano w poniższym przykładowym kodzie:
Kotlin
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) }
Jawa
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())); });
Powinieneś użyć powyższej implementacji, ponieważ pozwala uniknąć blokowania wątku interfejsu użytkownika Androida. Jeśli potrzebujesz dokładniej zarządzać wykonywaniem wątków, możesz dodać Tasks.await()
do tworzenia interpretera:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Jawa
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Uruchom wnioskowanie
Korzystając z utworzonego obiektu interpreter
, wywołaj metodę run()
, aby wygenerować wnioskowanie.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Jawa
interpreter.run(inputBuffer, outputBuffer);
Przyspieszenie sprzętowe
TensorFlow Lite umożliwia zwiększenie wydajności modelu przy użyciu wyspecjalizowanych procesorów sprzętowych, takich jak procesory graficzne (GPU). Możesz skorzystać z tych wyspecjalizowanych procesorów, korzystając ze sterowników sprzętowych zwanych delegatami . Możesz użyć następujących delegatów akceleracji sprzętowej z TensorFlow Lite w usługach Google Play:
Delegat GPU (zalecane) — ten delegat jest udostępniany za pośrednictwem usług Google Play i jest ładowany dynamicznie, podobnie jak wersje usług Play w interfejsach Task API i Interpreter API.
Delegat NNAPI — ten delegat jest dostępny jako dołączona zależność biblioteki w projekcie deweloperskim systemu Android i jest dołączany do aplikacji.
Aby uzyskać więcej informacji na temat akceleracji sprzętowej za pomocą TensorFlow Lite, zobacz stronę Delegaci TensorFlow Lite .
Sprawdzanie zgodności urządzenia
Nie wszystkie urządzenia obsługują akcelerację sprzętową GPU za pomocą TFLite. Aby złagodzić błędy i potencjalne awarie, użyj metody TfLiteGpu.isGpuDelegateAvailable
, aby sprawdzić, czy urządzenie jest zgodne z delegatem GPU.
Użyj tej metody, aby potwierdzić, czy urządzenie jest zgodne z procesorem GPU, i użyj procesora CPU lub delegata NNAPI jako rozwiązania awaryjnego, gdy procesor GPU nie jest obsługiwany.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Gdy masz zmienną taką jak useGpuTask
, możesz jej użyć do określenia, czy urządzenia używają delegata GPU. Poniższe przykłady pokazują, jak można to zrobić za pomocą zarówno biblioteki zadań, jak i interfejsów API interpretera.
Z interfejsem zadań
Kotlin
lateinit val optionsTask = useGpuTask.continueWith { task -> val baseOptionsBuilder = BaseOptions.builder() if (task.result) { baseOptionsBuilder.useGpu() } ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() }
Jawa
Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task -> BaseOptions baseOptionsBuilder = BaseOptions.builder(); if (task.getResult()) { baseOptionsBuilder.useGpu(); } return ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() });
Z tłumaczem API
Kotlin
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) }
Jawa
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 z interfejsami API biblioteki zadań
Aby użyć delegata GPU z interfejsami API zadań:
Zaktualizuj zależności projektu, aby użyć delegata GPU z usług Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Zainicjuj delegata GPU za pomocą
setEnableGpuDelegateSupport
. Na przykład możesz zainicjować delegata GPU dlaTfLiteVision
w następujący sposób:Kotlin
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
Jawa
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
Włącz opcję delegata GPU za pomocą opcji
BaseOptions
:Kotlin
val baseOptions = BaseOptions.builder().useGpu().build()
Jawa
BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
Skonfiguruj opcje przy użyciu
.setBaseOptions
. Na przykład możesz skonfigurować GPU wObjectDetector
w następujący sposób:Kotlin
val options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build()
Jawa
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build();
GPU z interfejsami API interpretera
Aby użyć delegata GPU z interfejsami API interpretera:
Zaktualizuj zależności projektu, aby użyć delegata GPU z usług Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Włącz opcję delegata GPU w inicjalizacji TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Jawa
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Ustaw delegata GPU w opcjach interpretera, aby używać
DelegateFactory
, wywołującaddDelegateFactory()
wInterpreterApi.Options()
:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Jawa
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
Migracja z samodzielnego TensorFlow Lite
Jeśli planujesz migrację aplikacji z autonomicznej TensorFlow Lite do interfejsu API usług Play, zapoznaj się z następującymi dodatkowymi wskazówkami dotyczącymi aktualizowania kodu projektu aplikacji:
- Zapoznaj się z sekcją Ograniczenia na tej stronie, aby upewnić się, że Twój przypadek użycia jest obsługiwany.
- Przed aktualizacją kodu przeprowadź kontrolę wydajności i dokładności modeli, szczególnie jeśli używasz wersji TensorFlow Lite wcześniejszych niż 2.1, aby uzyskać punkt odniesienia do porównania z nową implementacją.
- Jeśli przeprowadziłeś migrację całego kodu, aby korzystać z interfejsu API usług Play dla TensorFlow Lite, powinieneś usunąć istniejące zależności biblioteki wykonawczej TensorFlow Lite (wpisy z
org.tensorflow: tensorflow-lite :*
) z pliku build.gradle, aby może zmniejszyć rozmiar aplikacji. - Zidentyfikuj wszystkie wystąpienia
new Interpreter
w kodzie i zmodyfikuj go tak, aby używał wywołania InterpreterApi.create(). Ten nowy interfejs API jest asynchroniczny, co oznacza, że w większości przypadków nie jest to zamiennik typu drop-in i musisz zarejestrować odbiornik po zakończeniu wywołania. Zapoznaj się z fragmentem kodu w kodzie kroku 3 . - Dodaj
import org.tensorflow.lite.InterpreterApi;
iimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
do dowolnych plików źródłowych przy użyciu klasorg.tensorflow.lite.Interpreter
luborg.tensorflow.lite.InterpreterApi
. - Jeśli którekolwiek z wynikowych wywołań
InterpreterApi.create()
ma tylko jeden argument, dołącznew InterpreterApi.Options()
do listy argumentów. - Dołącz
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
do ostatniego argumentu wszystkich wywołań funkcjiInterpreterApi.create()
. - Zamień wszystkie inne wystąpienia klasy
org.tensorflow.lite.Interpreter
naorg.tensorflow.lite.InterpreterApi
.
Jeśli chcesz używać niezależnego TensorFlow Lite i interfejsu API usług Play obok siebie, musisz użyć TensorFlow Lite 2.9 (lub nowszego). TensorFlow Lite 2.8 i wcześniejsze wersje nie są kompatybilne z wersją API usług Play.
Ograniczenia
TensorFlow Lite w usługach Google Play ma następujące ograniczenia:
- Obsługa delegatów przyspieszenia sprzętowego jest ograniczona do delegatów wymienionych w sekcji Przyspieszenie sprzętowe . Nie są obsługiwane żadne inne delegacje przyspieszenia.
- Dostęp do TensorFlow Lite za pośrednictwem natywnych interfejsów API nie jest obsługiwany. Tylko interfejsy API Java TensorFlow Lite są dostępne w usługach Google Play.
- Eksperymentalne lub przestarzałe interfejsy API TensorFlow Lite, w tym niestandardowe operacje, nie są obsługiwane.
Wsparcie i opinie
Możesz przekazać opinię i uzyskać wsparcie za pomocą narzędzia TensorFlow Issue Tracker. Zgłaszaj problemy i prośby o pomoc, korzystając z szablonu problemu dla TensorFlow Lite w usługach Google Play.
Warunki usługi
Korzystanie z TensorFlow Lite w interfejsach API usług Google Play podlega Warunkom korzystania z usług Google API .
Prywatność i zbieranie danych
Gdy używasz TensorFlow Lite w interfejsach API usług Google Play, przetwarzanie danych wejściowych, takich jak obrazy, wideo, tekst, odbywa się w pełni na urządzeniu, a TensorFlow Lite w interfejsach API usług Google Play nie wysyła tych danych na serwery Google. Dzięki temu możesz wykorzystać nasze API do przetwarzania danych, które nie powinny opuszczać urządzenia.
Interfejsy API usług TensorFlow Lite w usługach Google Play mogą od czasu do czasu kontaktować się z serwerami Google w celu otrzymywania informacji takich jak poprawki błędów, zaktualizowane modele i informacje o zgodności akceleratorów sprzętowych. TensorFlow Lite w interfejsach API usług Google Play wysyła również do Google dane dotyczące wydajności i wykorzystania interfejsów API w Twojej aplikacji. Google wykorzystuje te dane do mierzenia wydajności, debugowania, utrzymywania i ulepszania interfejsów API oraz wykrywania nadużyć lub nadużyć, zgodnie z dalszym opisem w naszej Polityce prywatności .
Ponosisz odpowiedzialność za informowanie użytkowników swojej aplikacji o przetwarzaniu przez Google danych metrycznych TensorFlow Lite w usługach Google Play zgodnie z obowiązującym prawem.
Gromadzone przez nas dane obejmują:
- Informacje o urządzeniu (takie jak producent, model, wersja i kompilacja systemu operacyjnego) oraz dostępne akceleratory sprzętowe ML (GPU i DSP). Służy do diagnostyki i analizy użytkowania.
- Identyfikator urządzenia używany do diagnostyki i analizy użytkowania.
- Informacje o aplikacji (nazwa pakietu, wersja aplikacji). Służy do diagnostyki i analizy użytkowania.
- Konfiguracja interfejsu API (na przykład używanych delegatów). Służy do diagnostyki i analizy użytkowania.
- Typ zdarzenia (np. tworzenie interpretera, wnioskowanie). Służy do diagnostyki i analizy użytkowania.
- Kody błędów. Używany do diagnostyki.
- Wskaźniki wydajności. Używany do diagnostyki.
Następne kroki
Aby uzyskać więcej informacji na temat wdrażania uczenia maszynowego w aplikacji mobilnej za pomocą TensorFlow Lite, zapoznaj się z Przewodnikiem programisty TensorFlow Lite . Możesz znaleźć dodatkowe modele TensorFlow Lite do klasyfikacji obrazów, wykrywania obiektów i innych aplikacji na TensorFlow Hub .