Tambahkan Rekomendasi ke aplikasi Anda dengan TensorFlow Lite dan Firebase - Android Codelab

1. Ikhtisar

Selamat datang di Rekomendasi dengan TensorFlow Lite dan codelab Firebase. Dalam codelab ini, Anda akan mempelajari cara menggunakan TensorFlow Lite dan Firebase untuk menerapkan model rekomendasi ke aplikasi Anda. Codelab ini didasarkan pada TensorFlow Lite ini misalnya .

Rekomendasi memungkinkan aplikasi menggunakan pembelajaran mesin untuk menyajikan konten yang paling relevan secara cerdas bagi setiap pengguna. Mereka memperhitungkan perilaku pengguna di masa lalu untuk menyarankan konten aplikasi yang mungkin ingin berinteraksi dengan pengguna di masa mendatang dengan menggunakan model yang dilatih tentang perilaku agregat dari sejumlah besar pengguna lain.

Tutorial ini menunjukkan cara mendapatkan data dari pengguna aplikasi Anda dengan Firebase Analytics, membuat model pembelajaran mesin untuk rekomendasi dari data tersebut, lalu menggunakan model tersebut di aplikasi Android untuk menjalankan inferensi dan mendapatkan rekomendasi. Secara khusus, rekomendasi kami akan menyarankan film mana yang kemungkinan besar akan ditonton pengguna berdasarkan daftar film yang disukai pengguna sebelumnya.

Apa yang akan Anda pelajari?

  • Integrasikan Firebase Analytics ke dalam aplikasi android untuk mengumpulkan data perilaku pengguna
  • Ekspor data itu ke Google Big Query
  • Pra-proses data dan latih model rekomendasi TF Lite
  • Terapkan model TF Lite ke Firebase ML dan akses dari aplikasi Anda
  • Jalankan pada inferensi perangkat menggunakan model untuk menyarankan rekomendasi kepada pengguna

Apa yang Anda butuhkan?

  • Android Studio versi 3.4+.
  • Kode sampel.
  • Perangkat uji dengan Android 2.3+ dan layanan Google Play 9.8 atau lebih baru, atau Emulator dengan layanan Google Play 9.8 atau lebih baru
  • Jika menggunakan perangkat, kabel koneksi.

Bagaimana Anda akan menggunakan tutorial ini?

Baca saja sampai habis Baca dan selesaikan latihannya

Bagaimana penilaian pengalaman Anda dalam membuat aplikasi Android?

pemula Intermediat Ahli

2. Dapatkan kode sampel

Kloning repositori GitHub dari baris perintah.

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

3. Impor aplikasi pemula

Dari Android Studio, pilih codelab-recommendations-android direktori ( android_studio_folder.png ) Dari download kode contoh (File> Open> ... / codelab-rekomendasi-android / start).

Anda sekarang harus membuka proyek awal di Android Studio.

4. Buat proyek konsol Firebase

Buat proyek baru

  1. Pergi ke konsol Firebase .
  2. Pilih proyek Tambah (atau Buat proyek jika itu yang pertama).
  3. Pilih atau masukkan nama proyek dan klik Lanjutkan.
  4. Pastikan bahwa "Aktifkan Google Analytics untuk proyek ini" diaktifkan.
  5. Ikuti langkah penyiapan selanjutnya di Firebase console, lalu klik Buat proyek (atau Tambahkan Firebase, jika Anda menggunakan proyek Google yang sudah ada).

5. Tambahkan Firebase

  1. Dari layar ikhtisar proyek baru Anda, klik ikon Android untuk meluncurkan alur kerja penyiapan.
  2. Masukkan codelab Nama paket: com.google.firebase.codelabs.recommendations
  3. Pilih Register aplikasi.

Tambahkan file google-services.json ke aplikasi Anda

Setelah menambahkan nama paket dan memilih Register, klik Download google-services.json untuk mendapatkan Anda file konfigurasi Firebase Android kemudian salin file google-services.json ke app direktori dalam proyek Anda. Setelah file di-download Anda dapat Loncat langkah selanjutnya ditampilkan di konsol (mereka sudah pernah dilakukan untuk Anda dalam membangun proyek-android-start).

Tambahkan plugin layanan-google ke aplikasi Anda

Plugin google-services menggunakan file google-services.json untuk mengonfigurasi aplikasi Anda agar menggunakan Firebase. Baris berikut harus sudah ditambahkan ke file build.gradle di proyek (periksa untuk mengonfirmasi):

app/build.grade

apply plugin: 'com.google.gms.google-services'

build.grade

classpath 'com.google.gms:google-services:4.3.4'

Sinkronkan proyek Anda dengan file gradle

Untuk memastikan bahwa semua dependensi tersedia untuk aplikasi Anda, Anda harus menyinkronkan proyek Anda dengan file gradle pada saat ini. Pilih File> Sync Proyek dengan Gradle File dari Android Studio toolbar.

6. Jalankan aplikasi pemula

Sekarang bahwa Anda telah mengimpor proyek ke Android Studio dan dikonfigurasi google-services Plugin dengan berkas JSON Anda, Anda siap untuk menjalankan aplikasi untuk pertama kalinya. Menghubungkan perangkat Android Anda, dan klik Run ( eksekusi.png ) di bilah alat Android Studio.

Aplikasi harus diluncurkan di perangkat Anda. Pada titik ini, Anda dapat melihat aplikasi yang berfungsi yang menampilkan tab dengan daftar film, tab Film yang disukai, dan tab Rekomendasi. Anda dapat mengklik film dalam daftar film untuk menambahkannya ke daftar yang Anda sukai. Setelah menyelesaikan langkah codelab yang tersisa, kami akan dapat membuat rekomendasi film di tab Rekomendasi.

7. Tambahkan Firebase Analytics ke aplikasi

Pada langkah ini, Anda akan menambahkan Firebase Analytics ke aplikasi untuk mencatat data perilaku pengguna (dalam hal ini, film mana yang disukai pengguna). Data ini akan digunakan secara agregat dalam langkah-langkah mendatang untuk melatih model rekomendasi.

Tambahkan ketergantungan Firebase Analytics

Dependensi berikut diperlukan untuk menambahkan Firebase Analytics ke aplikasi Anda. Seharusnya sudah disertakan dalam file app/build.gradle (verifikasi).

app/build.grade

implementation 'com.google.firebase:firebase-analytics-ktx:17.6.0'

Siapkan Firebase Analytics di aplikasi

The LikedMoviesViewModel berisi fungsi untuk menyimpan film pengguna suka. Setiap kali pengguna menyukai film baru, kami juga ingin mengirimkan peristiwa log analitik untuk merekam suka itu.

Tambahkan fungsi onMovieLiked dengan kode di bawah ini untuk mendaftarkan peristiwa analitik saat pengguna mengklik suka pada film.

MenyukaiMoviesViewModel.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())
    }
       
}

Tambahkan bidang dan fungsi berikut untuk mencatat peristiwa Analytics saat film ditambahkan ke daftar Disukai pengguna.

MenyukaiMoviesViewModel.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. Uji integrasi Analytics Anda

Pada langkah ini, kami akan membuat peristiwa Analytics di aplikasi dan memverifikasi bahwa peristiwa tersebut dikirim ke Firebase Console.

Aktifkan Pencatatan Debug Analytics

Firebase Analytics dirancang untuk memaksimalkan masa pakai baterai pengguna dan akan mengelompokkan peristiwa di perangkat dan hanya mengirimkannya ke Firebase sesekali. Untuk tujuan debugging, kami dapat menonaktifkan perilaku ini untuk melihat peristiwa saat mereka masuk secara real time dengan menjalankan perintah berikut di shell.

Terminal

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

Verifikasi peristiwa Analytics dihasilkan

  1. Di Android studio, buka jendela Logcat untuk memeriksa logging dari aplikasi Anda.
  2. Setel filter Logcat ke string "Logging event".
  3. Verifikasi bahwa peristiwa Analytics "select_item" dipancarkan setiap kali Anda menyukai film di aplikasi.

Pada titik ini, Anda telah berhasil mengintegrasikan Firebase Analytics ke dalam aplikasi Anda. Saat pengguna menggunakan aplikasi Anda dan menyukai film, suka mereka akan dicatat secara agregat. Kami akan menggunakan data agregat ini di seluruh codelab ini untuk melatih model rekomendasi kami. Berikut ini adalah langkah opsional untuk melihat peristiwa Analytics yang sama dengan yang Anda lihat di Logcat yang juga dialirkan ke Firebase console. Jangan ragu untuk melompat ke halaman berikutnya.

Peristiwa Analytics Konfirmasi di Firebase Console: opsional

  1. Pergi ke konsol Firebase .
  2. Pilih DebugView bawah Analytics
  3. Di Android Studio, pilih Run untuk meluncurkan aplikasi dan menambahkan beberapa film ke daftar Anda Menyukai.
  4. Di DebugView konsol Firebase, verifikasi bahwa peristiwa ini dicatat saat Anda menambahkan film di aplikasi.

9. Ekspor data Analytics ke Big Query

Big Query adalah produk Google Cloud yang memungkinkan Anda memeriksa dan memproses data dalam jumlah besar. Pada langkah ini, Anda akan menghubungkan proyek Firebase Console ke Big Query sehingga data Analytics yang dihasilkan oleh aplikasi Anda secara otomatis diekspor ke Big Query.

Aktifkan ekspor Big Query

  1. Pergi ke konsol Firebase .
  2. Pilih Pengaturan ikon roda gigi di samping Ikhtisar proyek, lalu pilih pengaturan Project
  3. Pilih tab integrasi.
  4. Pilih Link (atau Kelola) di dalam blok BigQuery.
  5. Pilih Berikutnya di Tentang Menghubungkan Firebase ke BigQuery langkah.
  6. Di bawah bagian integrasi Configure, klik tombol untuk mengaktifkan pengiriman data Google Analytics dan pilih Link ke BigQuery.

Anda sekarang telah mengaktifkan proyek konsol Firebase untuk secara otomatis mengirim data peristiwa Firebase Analytics ke Big Query. Ini terjadi secara otomatis tanpa interaksi lebih lanjut, namun, ekspor pertama yang membuat set data analitik di BigQuery mungkin tidak terjadi selama 24 jam. Setelah set data dibuat, Firebase terus mengekspor peristiwa Analytics baru ke Big Query ke dalam tabel intraday, dan mengelompokkan peristiwa dari hari-hari sebelumnya di tabel peristiwa.

Pelatihan model rekomendasi membutuhkan banyak data. Karena kami belum memiliki aplikasi yang menghasilkan data dalam jumlah besar, pada langkah berikutnya kami akan mengimpor kumpulan data sampel ke BigQuery untuk digunakan selama sisa tutorial ini.

10. Gunakan BigQuery untuk mendapatkan data pelatihan model

Sekarang setelah kami menghubungkan Konsol Firebase untuk mengekspor ke BigQuery, data peristiwa analisis aplikasi kami akan otomatis muncul di konsol BigQuery setelah beberapa waktu. Untuk mendapatkan beberapa data awal untuk tujuan tutorial ini, pada langkah ini kami akan mengimpor kumpulan data sampel yang ada ke konsol BigQuery Anda untuk digunakan untuk melatih model rekomendasi kami.

Impor kumpulan data sampel ke BigQuery

  1. Pergi ke BigQuery dashboard di konsol Google awan.
  2. Pilih nama proyek Anda di menu.
  3. Pilih nama proyek Anda di bagian bawah navigasi kiri BigQuery untuk melihat detailnya.
  4. Pilih Buat dataset untuk membuka panel penciptaan dataset.
  5. Masukkan 'firebase_recommendations_dataset' untuk Dataset ID dan pilih Create dataset.
  6. Dataset baru akan muncul di menu sebelah kiri di bawah nama proyek. Klik itu.
  7. Pilih Buat tabel untuk membuka panel pembuatan tabel.
  8. Untuk Membuat tabel dari pilih 'Google Cloud Storage'.
  9. Dalam Pilih file dari GCS ember, masukkan 'gs: //firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. Pilih 'JSONL' dalam format file drop down.
  11. Masukkan 'recommendations_table' untuk nama tabel.
  12. Centang kotak di bawah Skema> Auto mendeteksi> Skema dan parameter input
  13. Pilih Buat tabel

Jelajahi kumpulan data sampel

Pada titik ini, Anda dapat menjelajahi skema dan melihat pratinjau kumpulan data ini secara opsional.

  1. Pilih firebase-rekomendasi-dataset di menu sebelah kiri untuk memperluas tabel yang dikandungnya.
  2. Pilih tabel rekomendasi-meja untuk melihat tabel skema.
  3. Pilih Preview untuk melihat sebenarnya Analytics data peristiwa tabel ini berisi.

Buat kredensial akun layanan

Sekarang, kami akan membuat kredensial akun layanan di proyek konsol Google Cloud kami yang dapat kami gunakan di lingkungan Colab pada langkah berikut untuk mengakses dan memuat data BigQuery kami.

  1. Pastikan penagihan diaktifkan untuk proyek Google Cloud Anda.
  2. Aktifkan BigQuery dan BigQuery Storage API API. < Klik disini >
  3. Pergi ke halaman Create Service Key Account .
  4. Dari Dinas daftar akun, pilih account layanan baru.
  5. Di bidang nama akun Service, masukkan nama.
  6. Dari daftar Peran, pilih Project> Pemilik.
  7. Klik Buat. File JSON yang berisi unduhan kunci Anda ke komputer Anda.

Pada langkah berikutnya, kami akan menggunakan Google Colab untuk melakukan praproses data ini dan melatih model rekomendasi kami.

11. Praproses data dan melatih model rekomendasi

Pada langkah ini, kita akan menggunakan notebook Colab untuk melakukan langkah-langkah berikut:

  1. mengimpor data BigQuery ke dalam notebook Colab
  2. praproses data untuk mempersiapkannya untuk pelatihan model
  3. melatih model rekomendasi pada data analitik
  4. ekspor model sebagai model TF lite
  5. menyebarkan model ke Konsol Firebase sehingga kami dapat menggunakannya di aplikasi kami

Sebelum meluncurkan notebook pelatihan Colab, pertama-tama kami akan mengaktifkan Firebase Model Management API sehingga Colab dapat menerapkan model yang dilatih ke Firebase console kami.

Aktifkan API Manajemen Model Firebase

Buat ember untuk menyimpan model ML Anda

Di Konsol Firebase Anda, buka Penyimpanan dan klik Mulai. fbbe78f0eb3dc9f.png

Ikuti dialog untuk menyiapkan ember Anda.

19517c0d6d2aa14d.png

Aktifkan Firebase ML API

Pergi ke Firebase ML halaman API di Google Cloud Console dan klik Aktifkan.

Gunakan notebook Colab untuk melatih dan menerapkan model

Buka buku catatan colab menggunakan tautan berikut dan selesaikan langkah-langkah di dalamnya. Setelah menyelesaikan langkah-langkah di notebook Colab, Anda akan memiliki file model TF lite yang di-deploy ke Firebase console yang dapat kami sinkronkan ke aplikasi kami.

Buka di Colab

12. Unduh model di aplikasi Anda

Pada langkah ini, kita akan memodifikasi aplikasi kita untuk mendownload model yang baru saja kita latih dari Firebase Machine Learning.

Tambahkan ketergantungan Firebase ML

Dependensi berikut diperlukan untuk menggunakan model Firebase Machine Learning di aplikasi Anda. Seharusnya sudah ditambahkan (verifikasi).

app/build.grade

implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.4'

Unduh model dengan Firebase Model Manager API

Salin kode di bawah ini ke RecommendationClient.kt untuk mengatur kondisi di mana model yang mendownload terjadi dan membuat tugas download untuk sinkronisasi model remote untuk aplikasi kita.

RekomendasiKlien.kt

    private fun downloadModel(modelName: String) {
        val remoteModel = FirebaseCustomRemoteModel.Builder(modelName).build()
        val firebaseModelManager = FirebaseModelManager.getInstance()
        firebaseModelManager
            .isModelDownloaded(remoteModel)
            .continueWithTask { task ->
                // Create update condition if model is already downloaded, otherwise create download
                // condition.
                val conditions = if (task.result != null && task.result == true) {
                    FirebaseModelDownloadConditions.Builder()
                        .requireWifi()
                        .build() // Update condition that requires wifi.
                } else {
                    FirebaseModelDownloadConditions.Builder().build(); // Download condition.
                }
                firebaseModelManager.download(remoteModel, conditions)
            }
            .addOnSuccessListener {
                firebaseModelManager.getLatestModelFile(remoteModel)
                    .addOnCompleteListener {
                        val model = it.result
                        if (model == null) {
                            showToast(context, "Failed to get model file.")
                        } else {
                            showToast(context, "Downloaded remote model")
                            GlobalScope.launch { initializeInterpreter(model) }
                        }
                    }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }



13. Integrasikan model rekomendasi Tensorflow Lite di aplikasi Anda

Waktu proses Tensorflow Lite memungkinkan Anda menggunakan model di aplikasi untuk membuat rekomendasi. Pada langkah sebelumnya kami menginisialisasi juru bahasa TFlite dengan file model yang kami unduh. Pada langkah ini, pertama-tama kita akan memuat kamus dan label untuk menyertai model kita dalam langkah inferensi, kemudian kita akan menambahkan pra-pemrosesan untuk menghasilkan input ke model dan pasca-pemrosesan di mana kita akan mengekstrak hasil dari inferensi kita. .

Muat Kamus dan Label

Label yang digunakan untuk menghasilkan calon rekomendasi oleh model rekomendasi tercantum dalam sorted_movie_vocab.json file dalam res / aset folder. Salin kode berikut untuk memuat kandidat ini.

RekomendasiKlien.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.")
        }
    }

Terapkan Pra-pemrosesan

Pada langkah pra-pemrosesan, kami mengubah bentuk data input agar sesuai dengan apa yang diharapkan model kami. Di sini, kami mengisi panjang input dengan nilai placeholder jika kami belum menghasilkan banyak suka pengguna. Salin kode di bawah ini:

RekomendasiKlien.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
        }
    }


Jalankan penerjemah untuk menghasilkan rekomendasi

Di sini kami menggunakan model yang kami unduh pada langkah sebelumnya untuk menjalankan inferensi pada input pra-proses kami. Kami mengatur jenis input dan output untuk model kami dan menjalankan inferensi untuk menghasilkan rekomendasi film kami. Salin kode berikut ke dalam aplikasi Anda.

RekomendasiKlien.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()
            }
        }
    }



Terapkan Pasca-pemrosesan

Terakhir, pada langkah ini kita mem-posting output dari model kita, memilih hasil dengan keyakinan tertinggi dan menghapus nilai yang terkandung (film yang sudah disukai pengguna). Salin kode berikut ke dalam aplikasi Anda.

RekomendasiKlien.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
        }
    }


Uji aplikasi Anda!

Jalankan kembali aplikasi Anda. Saat Anda memilih beberapa film, itu akan secara otomatis mengunduh model baru dan mulai membuat rekomendasi!

14. Selamat!

Anda telah membuat fitur rekomendasi ke dalam aplikasi Anda menggunakan TensorFlow Lite dan Firebase. Perhatikan bahwa teknik dan alur yang ditampilkan dalam codelab ini dapat digeneralisasi dan digunakan untuk menyajikan jenis rekomendasi lainnya juga.

Apa yang telah kita bahas

  • Firebase ML
  • Firebase Analytics
  • Ekspor peristiwa analitik ke BigQuery
  • Acara analitik praproses
  • Melatih rekomendasi model TensorFlow
  • Ekspor model dan terapkan ke Firebase Console
  • Sajikan rekomendasi film dalam aplikasi

Langkah selanjutnya

  • Terapkan rekomendasi Firebase ML di aplikasi Anda.

Belajarlah lagi

Punya Pertanyaan?

Laporkan Masalah