Dodaj rekomendacje do swojej aplikacji za pomocą TensorFlow Lite i Firebase — laboratorium kodowania na Androida

1. Przegląd

Witamy w rekomendacjach dotyczących TensorFlow Lite i Firebase codelab. W tym laboratorium kodowania dowiesz się, jak używać TensorFlow Lite i Firebase do wdrażania modelu rekomendacji w swojej aplikacji. To laboratorium kodowania jest oparte na tym przykładzie TensorFlow Lite.

Rekomendacje umożliwiają aplikacjom korzystanie z uczenia maszynowego w celu inteligentnego udostępniania treści najbardziej odpowiednich dla każdego użytkownika. Biorą pod uwagę zachowanie użytkowników w przeszłości, aby zasugerować zawartość aplikacji, z którą użytkownik może chcieć wchodzić w interakcje w przyszłości, korzystając z modelu przeszkolonego na podstawie zbiorczego zachowania dużej liczby innych użytkowników.

W tym samouczku pokazano, jak uzyskiwać dane od użytkowników aplikacji za pomocą Firebase Analytics, tworzyć model uczenia maszynowego dla rekomendacji na podstawie tych danych, a następnie używać tego modelu w aplikacji na Androida do uruchamiania wnioskowania i uzyskiwania rekomendacji. W szczególności nasze rekomendacje zasugerują, które filmy użytkownik najprawdopodobniej obejrzy, biorąc pod uwagę listę filmów, które użytkownik lubił wcześniej.

Czego się nauczysz

  • Zintegruj Firebase Analytics z aplikacją na Androida, aby zbierać dane o zachowaniu użytkowników
  • Wyeksportuj te dane do Google Big Query
  • Wstępnie przetwarzaj dane i trenuj model rekomendacji TF Lite
  • Wdróż model TF Lite w Firebase ML i uzyskaj do niego dostęp ze swojej aplikacji
  • Uruchamiaj wnioskowanie o urządzeniu, korzystając z modelu, aby sugerować użytkownikom zalecenia

Co będziesz potrzebował

  • Najnowsza wersja Android Studio .
  • Przykładowy kod.
  • Urządzenie testowe z systemem Android 7+ i usługami Google Play 9.8 lub nowszymi albo emulator z usługami Google Play 9.8 lub nowszymi
  • W przypadku korzystania z urządzenia kabel połączeniowy.

Jak będziesz korzystać z tego samouczka?

Przeczytaj go tylko Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie w tworzeniu aplikacji na Androida?

Nowicjusz Mediator Biegły

2. Pobierz przykładowy kod

Sklonuj repozytorium GitHub z wiersza poleceń.

$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git

3. Zaimportuj aplikację startową

W Android Studio wybierz katalog codelab-recommendations-android ( android_studio_folder.png ) z przykładowego kodu do pobrania ( Plik > Otwórz > .../codelab-recommendations-android/start).

Projekt startowy powinien być teraz otwarty w Android Studio.

4. Utwórz projekt konsoli Firebase

Utwórz nowy projekt

  1. Przejdź do konsoli Firebase .
  2. Wybierz Dodaj projekt (lub Utwórz projekt, jeśli jest to pierwszy).
  3. Wybierz lub wprowadź nazwę projektu i kliknij Kontynuuj .
  4. Upewnij się, że opcja „Włącz Google Analytics dla tego projektu” jest włączona.
  5. Wykonaj pozostałe kroki konfiguracji w konsoli Firebase, a następnie kliknij Utwórz projekt (lub Dodaj Firebase, jeśli używasz istniejącego projektu Google).

5. Dodaj Firebase

  1. Na ekranie przeglądu nowego projektu kliknij ikonę Androida, aby uruchomić proces konfiguracji.
  2. Wpisz nazwę pakietu codelab: com.google.firebase.codelabs.recommendations
  3. Wybierz Zarejestruj aplikację .

Dodaj plik google-services.json do swojej aplikacji

Po dodaniu nazwy pakietu i wybraniu Zarejestruj kliknij Pobierz google-services.json , aby uzyskać plik konfiguracyjny Firebase Android, a następnie skopiuj plik google-services.json do katalogu app w swoim projekcie. Po pobraniu pliku możesz pominąć kolejne kroki wyświetlane w konsoli (zostały one już wykonane w projekcie build-android-start).

Dodaj wtyczkę Google-Services do swojej aplikacji

Wtyczka google-services używa pliku google-services.json do skonfigurowania Twojej aplikacji do korzystania z Firebase. Następujące linie powinny już zostać dodane do plików build.gradle.kts w projekcie (zaznacz, aby potwierdzić):

app/build.grade.kts

plugins {
    id("com.google.gms.google-services")
}

build.grade.kts

plugins {
    id("com.google.gms.google-services") version "4.3.15" apply false
}

Zsynchronizuj swój projekt z plikami gradle

Aby mieć pewność, że wszystkie zależności są dostępne dla Twojej aplikacji, powinieneś w tym momencie zsynchronizować swój projekt z plikami gradle. Wybierz Plik > Synchronizuj projekt z plikami Gradle z paska narzędzi Android Studio.

6. Uruchom aplikację startową

Teraz, po zaimportowaniu projektu do Android Studio i skonfigurowaniu wtyczki google-services z plikiem JSON, możesz uruchomić aplikację po raz pierwszy. Podłącz swoje urządzenie z Androidem i kliknij Uruchom ( wykonać.png ) na pasku narzędzi Android Studio.

Aplikacja powinna uruchomić się na Twoim urządzeniu. W tym momencie możesz zobaczyć działającą aplikację, która pokazuje zakładkę z listą filmów, zakładkę Lubiane filmy i zakładkę Rekomendacje. Możesz kliknąć film na liście filmów, aby dodać go do listy ulubionych. Po wykonaniu pozostałych kroków codelab będziemy mogli wygenerować rekomendacje filmów w zakładce Recommendations.

7. Dodaj Firebase Analytics do aplikacji

W tym kroku dodasz Firebase Analytics do aplikacji, aby rejestrować dane o zachowaniu użytkownika (w tym przypadku, jakie filmy lubi użytkownik). Te dane będą używane zbiorczo w przyszłych krokach w celu nauczenia modelu rekomendacji.

Dodaj zależność Firebase Bill of Materials i Analytics

Poniższe zależności są niezbędne do dodania Firebase Analytics do Twojej aplikacji. Powinny już być uwzględnione w pliku app/build.gradle.kts (zweryfikuj).

app/build.grade.kts

implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")

Skonfiguruj Firebase Analytics w aplikacji

Model LikedMoviesViewModel zawiera funkcje do przechowywania filmów, które lubi użytkownik. Za każdym razem, gdy użytkownikowi podoba się nowy film, chcemy również wysłać zdarzenie z dziennika analitycznego, aby zarejestrować to polubienie.

Dodaj funkcję onMovieLiked z poniższym kodem, aby zarejestrować zdarzenie analityczne, gdy użytkownik kliknie „Lubię to” w filmie.

Lubiane filmyViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {

    ...

    fun onMovieLiked(movie: Movie) {
        movies.setLike(movie, true)
        logAnalyticsEvent(movie.id.toString())
    }
       
}

Dodaj następujące pole i funkcję, aby rejestrować zdarzenie Analytics po dodaniu filmu do listy ulubionych użytkownika.

Lubiane filmyViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
    ...
    private val firebaseAnalytics = Firebase.analytics

    ...

    /**
     * Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
     * model.
     */
    private fun logAnalyticsEvent(id: String) {
        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
            param(FirebaseAnalytics.Param.ITEM_ID, id)
        }
    }

8. Przetestuj integrację Analytics

W tym kroku wygenerujemy zdarzenia Analytics w aplikacji i sprawdzimy, czy są one wysyłane do konsoli Firebase.

Włącz rejestrowanie debugowania Analytics

Firebase Analytics ma na celu maksymalizację czasu pracy baterii użytkownika i grupuje zdarzenia na urządzeniu i wysyła je do Firebase tylko od czasu do czasu. Do celów debugowania możemy wyłączyć to zachowanie, aby zobaczyć zdarzenia, które są rejestrowane w czasie rzeczywistym, uruchamiając następujące polecenie w powłoce.

Terminal

adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations

Sprawdź, czy zdarzenia Analytics są generowane

  1. W Android Studio otwórz okno Logcat, aby sprawdzić logowanie z aplikacji.
  2. Ustaw filtr Logcat na ciąg „Logging event”.
  3. Sprawdź, czy zdarzenia Analytics „select_item” są emitowane za każdym razem, gdy polubisz film w aplikacji.

W tym momencie pomyślnie zintegrowałeś Firebase Analytics ze swoją aplikacją. Gdy użytkownicy korzystają z Twojej aplikacji i lubią filmy, ich polubienia będą rejestrowane zbiorczo. Będziemy używać tych zbiorczych danych w pozostałej części tego modułu do trenowania naszego modelu rekomendacji. Poniższy krok jest opcjonalnym krokiem, dzięki któremu te same zdarzenia Analytics, które widziałeś w Logcat, są również przesyłane strumieniowo do konsoli Firebase. Możesz przejść do następnej strony.

Opcjonalnie: potwierdź zdarzenia Analytics w konsoli Firebase

  1. Przejdź do konsoli Firebase .
  2. Wybierz pozycję DebugView w obszarze Analytics
  3. W Android Studio wybierz opcję Uruchom , aby uruchomić aplikację i dodać kilka filmów do listy ulubionych.
  4. W oknie DebugView konsoli Firebase sprawdź, czy te zdarzenia są rejestrowane podczas dodawania filmów w aplikacji.

9. Eksportuj dane Analytics do Big Query

Big Query to produkt Google Cloud, który pozwala badać i przetwarzać duże ilości danych. W tym kroku połączysz swój projekt Firebase Console z Big Query, aby dane Analytics generowane przez Twoją aplikację były automatycznie eksportowane do Big Query.

Włącz eksport Big Query

  1. Przejdź do konsoli Firebase .
  2. Wybierz ikonę koła zębatego Ustawienia obok Przegląd projektu , a następnie wybierz Ustawienia projektu
  3. Wybierz zakładkę Integracje .
  4. Wybierz Połącz (lub Zarządzaj ) w bloku BigQuery .
  5. Wybierz Dalej w kroku Informacje o łączeniu Firebase z BigQuery .
  6. W sekcji Konfiguruj integrację kliknij przełącznik, aby włączyć wysyłanie danych Google Analytics, i wybierz Połącz z BigQuery .

Włączyłeś teraz w projekcie konsoli Firebase automatyczne wysyłanie danych zdarzeń Firebase Analytics do Big Query. Dzieje się to automatycznie, bez żadnej dalszej interakcji, jednak pierwszy eksport, który tworzy zbiór danych analitycznych w BigQuery, może nastąpić dopiero po 24 godzinach. Po utworzeniu zbioru danych Firebase nieustannie eksportuje nowe zdarzenia Analytics do Big Query do tabeli intraday i grupuje zdarzenia z ostatnich dni w tabeli zdarzeń.

Trenowanie modelu rekomendacji wymaga dużej ilości danych. Ponieważ nie mamy jeszcze aplikacji generującej duże ilości danych, w następnym kroku zaimportujemy przykładowy zestaw danych do BigQuery do wykorzystania w pozostałej części tego samouczka.

10. Użyj BigQuery, aby uzyskać dane szkoleniowe modelu

Teraz, gdy połączyliśmy naszą konsolę Firebase w celu eksportowania do BigQuery, po pewnym czasie nasze dane o zdarzeniach analityki aplikacji automatycznie pojawią się w konsoli BigQuery. Aby uzyskać wstępne dane na potrzeby tego samouczka, w tym kroku zaimportujemy istniejący przykładowy zbiór danych do Twojej konsoli BigQuery, aby użyć go do trenowania naszego modelu rekomendacji.

Zaimportuj przykładowy zbiór danych do BigQuery

  1. Przejdź do pulpitu nawigacyjnego BigQuery w konsoli Google Cloud.
  2. Wybierz nazwę projektu w menu.
  3. Aby zobaczyć szczegóły, wybierz nazwę projektu w lewym dolnym rogu BigQuery.
  4. Wybierz opcję Utwórz zestaw danych , aby otworzyć panel tworzenia zestawu danych.
  5. Wpisz „firebase_recommendations_dataset” jako identyfikator zestawu danych i wybierz opcję Utwórz zestaw danych .
  6. Nowy zestaw danych pojawi się w lewym menu pod nazwą projektu. Kliknij to.
  7. Wybierz opcję Utwórz tabelę , aby otworzyć panel tworzenia tabeli.
  8. Aby utworzyć tabelę z wybierz „Google Cloud Storage”.
  9. W polu Wybierz plik z zasobnika GCS wpisz „gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt”.
  10. Wybierz „JSONL” z listy rozwijanej Format pliku .
  11. Wpisz „recommendations_table” jako nazwę tabeli .
  12. Zaznacz pole w obszarze Schemat > Automatyczne wykrywanie > Schemat i parametry wejściowe
  13. Wybierz Utwórz tabelę

Eksploruj przykładowy zestaw danych

W tym momencie możesz opcjonalnie eksplorować schemat i wyświetlić podgląd tego zestawu danych.

  1. Wybierz firebase-recommendations-dataset w lewym menu, aby rozwinąć zawarte w nim tabele.
  2. Wybierz tabelę z zaleceniami , aby wyświetlić schemat tabeli.
  3. Wybierz Podgląd, aby zobaczyć rzeczywiste dane zdarzeń Analytics, które zawiera ta tabela.

Utwórz poświadczenia konta usługi

Teraz utworzymy poświadczenia konta usługi w naszym projekcie konsoli Google Cloud, których będziemy mogli użyć w środowisku Colab w następnym kroku, aby uzyskać dostęp do naszych danych BigQuery i je załadować.

  1. Upewnij się, że rozliczenia są włączone w Twoim projekcie Google Cloud.
  2. Włącz interfejsy API BigQuery i BigQuery Storage API. < kliknij tutaj >
  3. Przejdź do strony Utwórz klucz konta usługi .
  4. Z listy Konto usługi wybierz Nowe konto usługi .
  5. W polu Nazwa konta usługi wprowadź nazwę.
  6. Z listy Rola wybierz Projekt > Właściciel .
  7. Kliknij Utwórz . Plik JSON zawierający Twoje klucze do pobrania na Twój komputer.

W następnym kroku użyjemy Google Colab do wstępnego przetworzenia tych danych i wytrenowania naszego modelu rekomendacji.

11. Wstępne przetwarzanie danych i model rekomendacji pociągów

W tym kroku użyjemy notatnika Colab do wykonania następujących czynności:

  1. zaimportuj dane BigQuery do notatnika Colab
  2. wstępnie przetworzyć dane, aby przygotować je do trenowania modeli
  3. wytrenuj model rekomendacji na danych analitycznych
  4. wyeksportuj model jako model TF lite
  5. wdrożyć model w konsoli Firebase, abyśmy mogli używać go w naszej aplikacji

Zanim uruchomimy notatnik szkoleniowy Colab, najpierw włączymy interfejs Firebase Model Management API, aby Colab mógł wdrożyć przeszkolony model w naszej konsoli Firebase.

Włącz interfejs API zarządzania modelami Firebase

Utwórz zasobnik do przechowywania modeli ML

W konsoli Firebase przejdź do Storage i kliknij Rozpocznij. fbbea78f0eb3dc9f.png

Postępuj zgodnie z instrukcjami, aby skonfigurować wiadro.

19517c0d6d2aa14d.png

Włącz interfejs API Firebase ML

Przejdź do strony Firebase ML API w Google Cloud Console i kliknij Włącz.

Użyj notatnika Colab, aby wytrenować i wdrożyć model

Otwórz notatnik colab, korzystając z poniższego łącza, i wykonaj zawarte w nim czynności. Po wykonaniu kroków w notatniku Colab w konsoli Firebase zostanie wdrożony plik modelu TF lite, który możemy zsynchronizować z naszą aplikacją.

Otwórz w Colab

12. Pobierz model w swojej aplikacji

W tym kroku zmodyfikujemy naszą aplikację, aby pobrać model, który właśnie przeszkoliliśmy z Firebase Machine Learning.

Dodaj zależność Firebase ML

Aby korzystać z modeli uczenia maszynowego Firebase w Twojej aplikacji, potrzebna jest następująca zależność. Powinien być już dodany (zweryfikuj).

app/build.grade.kts

implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

Pobierz model za pomocą interfejsu Firebase Model Manager API

Skopiuj poniższy kod do RecommendationClient.kt , aby skonfigurować warunki pobierania modelu i utworzyć zadanie pobierania, aby zsynchronizować zdalny model z naszą aplikacją.

Rekomendacja Klient.kt

    private fun downloadModel(modelName: String) {
        val conditions = CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build()
        FirebaseModelDownloader.getInstance()
            .getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
            .addOnCompleteListener {
                if (!it.isSuccessful) {
                    showToast(context, "Failed to get model file.")
                } else {
                    showToast(context, "Downloaded remote model: $modelName")
                    GlobalScope.launch { initializeInterpreter(it.result) }
                }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }

13. Zintegruj model rekomendacji Tensorflow Lite w swojej aplikacji

Środowisko uruchomieniowe Tensorflow Lite pozwoli Ci użyć modelu w aplikacji do generowania rekomendacji. W poprzednim kroku zainicjowaliśmy interpreter TFlite z pobranym plikiem modelu. W tym kroku najpierw załadujemy słownik i etykiety towarzyszące naszemu modelowi na etapie wnioskowania, a następnie dodamy przetwarzanie wstępne w celu wygenerowania danych wejściowych do naszego modelu oraz przetwarzanie końcowe, w którym wyodrębnimy wyniki z naszego wnioskowania .

Załaduj słownik i etykiety

Etykiety używane do generowania kandydatów rekomendacji przez model rekomendacji są wymienione w pliku sorted_movie_vocab.json w folderze res/assets. Skopiuj poniższy kod, aby załadować tych kandydatów.

Rekomendacja Klient.kt

    /** Load recommendation candidate list.  */
    private suspend fun loadCandidateList() {
        return withContext(Dispatchers.IO) {
            val collection = MovieRepository.getInstance(context).getContent()
            for (item in collection) {
                candidates[item.id] = item
            }
            Log.v(TAG, "Candidate list loaded.")
        }
    }

Implementacja przetwarzania wstępnego

Na etapie wstępnego przetwarzania zmieniamy formę danych wejściowych, aby odpowiadała oczekiwaniom naszego modelu. Tutaj uzupełniamy długość wejściową wartością zastępczą, jeśli nie wygenerowaliśmy już wielu polubień użytkowników. Skopiuj poniższy kod:

Rekomendacja Klient.kt

    /** Given a list of selected items, preprocess to get tflite input.  */
    @Synchronized
    private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
        return withContext(Dispatchers.Default) {
            val inputContext = IntArray(config.inputLength)
            for (i in 0 until config.inputLength) {
                if (i < selectedMovies.size) {
                    val (id) = selectedMovies[i]
                    inputContext[i] = id
                } else {
                    // Padding input.
                    inputContext[i] = config.pad
                }
            }
            inputContext
        }
    }


Uruchom interpreter, aby wygenerować rekomendacje

Tutaj używamy modelu, który pobraliśmy w poprzednim kroku, aby uruchomić wnioskowanie na naszych wstępnie przetworzonych danych wejściowych. Ustawiamy typ danych wejściowych i wyjściowych dla naszego modelu i uruchamiamy wnioskowanie, aby wygenerować nasze rekomendacje filmowe. Skopiuj poniższy kod do swojej aplikacji.

Rekomendacja Klient.kt

    /** Given a list of selected items, and returns the recommendation results.  */
    @Synchronized
    suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
        return withContext(Dispatchers.Default) {
            val inputs = arrayOf<Any>(preprocess(selectedMovies))

            // Run inference.
            val outputIds = IntArray(config.outputLength)
            val confidences = FloatArray(config.outputLength)
            val outputs: MutableMap<Int, Any> = HashMap()
            outputs[config.outputIdsIndex] = outputIds
            outputs[config.outputScoresIndex] = confidences
            tflite?.let {
                it.runForMultipleInputsOutputs(inputs, outputs)
                postprocess(outputIds, confidences, selectedMovies)
            } ?: run {
                Log.e(TAG, "No tflite interpreter loaded")
                emptyList()
            }
        }
    }



Zaimplementuj przetwarzanie końcowe

Wreszcie, w tym kroku przetwarzamy dane wyjściowe z naszego modelu, wybierając wyniki z najwyższą pewnością i usuwając zawarte w nich wartości (filmy, które użytkownik już polubił). Skopiuj poniższy kod do swojej aplikacji.

Rekomendacja Klient.kt

    /** Postprocess to gets results from tflite inference.  */
    @Synchronized
    private suspend fun postprocess(
        outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
    ): List<Result> {
        return withContext(Dispatchers.Default) {
            val results = ArrayList<Result>()

            // Add recommendation results. Filter null or contained items.
            for (i in outputIds.indices) {
                if (results.size >= config.topK) {
                    Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
                    break
                }
                val id = outputIds[i]
                val item = candidates[id]
                if (item == null) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
                    continue
                }
                if (selectedMovies.contains(item)) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
                    continue
                }
                val result = Result(
                    id, item,
                    confidences[i]
                )
                results.add(result)
                Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
            }
            results
        }
    }


Przetestuj swoją aplikację!

Ponownie uruchom aplikację. Gdy wybierzesz kilka filmów, powinien on automatycznie pobrać nowy model i zacząć generować rekomendacje!

14. Gratulacje!

Wbudowałeś w swoją aplikację funkcję rekomendacji za pomocą TensorFlow Lite i Firebase. Pamiętaj, że techniki i potoki pokazane w tym laboratorium kodowania można uogólnić i wykorzystać również do obsługi innych rodzajów zaleceń.

Co omówiliśmy

  • Firebase ML
  • Analityka Firebase
  • Eksportuj zdarzenia analityczne do BigQuery
  • Wstępne przetwarzanie zdarzeń analitycznych
  • Zalecenia dotyczące pociągu Model TensorFlow
  • Eksportuj model i wdrażaj w Firebase Console
  • Udostępniaj rekomendacje filmów w aplikacji

Następne kroki

  • Zaimplementuj rekomendacje Firebase ML w swojej aplikacji.

Ucz się więcej

Mam pytanie?

Zgłoś problemy