Weź udział w sympozjum Women in ML 7 grudnia Zarejestruj się teraz

TensorFlow Lite w usługach Google Play

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ń:

  1. 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'
    
  2. Zainicjuj delegata GPU za pomocą setEnableGpuDelegateSupport . Na przykład możesz zainicjować delegata GPU dla TfLiteVision w następujący sposób:

    Kotlin

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    Jawa

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. Włącz opcję delegata GPU za pomocą opcji BaseOptions :

    Kotlin

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    Jawa

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. Skonfiguruj opcje przy użyciu .setBaseOptions . Na przykład możesz skonfigurować GPU w ObjectDetector 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:

  1. 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'
    
  2. 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());
        
  3. Ustaw delegata GPU w opcjach interpretera, aby używać DelegateFactory , wywołując addDelegateFactory() w InterpreterApi.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:

  1. Zapoznaj się z sekcją Ograniczenia na tej stronie, aby upewnić się, że Twój przypadek użycia jest obsługiwany.
  2. 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ą.
  3. 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.
  4. 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 .
  5. Dodaj import org.tensorflow.lite.InterpreterApi; i import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; do dowolnych plików źródłowych przy użyciu klas org.tensorflow.lite.Interpreter lub org.tensorflow.lite.InterpreterApi .
  6. Jeśli którekolwiek z wynikowych wywołań InterpreterApi.create() ma tylko jeden argument, dołącz new InterpreterApi.Options() do listy argumentów.
  7. Dołącz .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) do ostatniego argumentu wszystkich wywołań funkcji InterpreterApi.create() .
  8. Zamień wszystkie inne wystąpienia klasy org.tensorflow.lite.Interpreter na org.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 .