Добавьте рекомендации в свое приложение с помощью TensorFlow Lite и Firebase — Android Codelab

1. Обзор

Добро пожаловать в Рекомендации с TensorFlow Lite и лабораторией кода Firebase. В этой лаборатории вы узнаете, как использовать TensorFlow Lite и Firebase для развертывания модели рекомендаций в вашем приложении. Эта кодовая лаборатория основана на этом примере TensorFlow Lite.

Рекомендации позволяют приложениям использовать машинное обучение для интеллектуального предоставления наиболее актуального контента для каждого пользователя. Они учитывают прошлое поведение пользователя, чтобы предложить контент приложения, с которым пользователь, возможно, захочет взаимодействовать в будущем, используя модель, обученную на совокупном поведении большого количества других пользователей.

В этом руководстве показано, как получить данные от пользователей вашего приложения с помощью Firebase Analytics, построить модель машинного обучения для рекомендаций на основе этих данных, а затем использовать эту модель в приложении Android для выполнения логических выводов и получения рекомендаций. В частности, наши рекомендации подскажут, какие фильмы пользователь с наибольшей вероятностью будет смотреть, учитывая список фильмов, которые ему нравились ранее.

Что вы узнаете

  • Интегрируйте Firebase Analytics в приложение для Android, чтобы собирать данные о поведении пользователей.
  • Экспортируйте эти данные в Google Big Query.
  • Предварительная обработка данных и обучение модели рекомендаций TF Lite.
  • Разверните модель TF Lite в Firebase ML и получите к ней доступ из своего приложения.
  • Выполните вывод об устройстве, используя модель, чтобы предложить пользователям рекомендации.

Что вам понадобится

  • Последняя версия Android Studio .
  • Образец кода.
  • Тестовое устройство с Android 7+ и сервисами Google Play 9.8 или новее или эмулятор с сервисами Google Play 9.8 или новее.
  • При использовании устройства — соединительный кабель.

Как вы будете использовать этот урок?

Прочтите только до конца Прочитайте его и выполните упражнения.

Как бы вы оценили свой опыт создания приложений для Android?

Новичок Средний Опытный

2. Получите пример кода

Клонируйте репозиторий GitHub из командной строки.

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

3. Импортируйте стартовое приложение.

В Android Studio выберите каталог codelab-recommendations-android ( android_studio_folder.png ) из загрузки примера кода ( Файл > Открыть > .../codelab-recommendations-android/start).

Теперь у вас должен быть открыт стартовый проект в Android Studio.

4. Создайте консольный проект Firebase.

Создать новый проект

  1. Перейдите в консоль Firebase .
  2. Выберите «Добавить проект» (или «Создать проект» , если он первый).
  3. Выберите или введите имя проекта и нажмите «Продолжить» .
  4. Убедитесь, что параметр «Включить Google Analytics для этого проекта» включен.
  5. Выполните оставшиеся шаги настройки в консоли Firebase, затем нажмите «Создать проект» (или «Добавить Firebase», если вы используете существующий проект Google).

5. Добавьте Firebase

  1. На обзорном экране вашего нового проекта щелкните значок Android, чтобы запустить рабочий процесс установки.
  2. Введите имя пакета лаборатории кода: com.google.firebase.codelabs.recommendations .
  3. Выберите Зарегистрировать приложение .

Добавьте файл google-services.json в свое приложение.

Добавив имя пакета и выбрав «Зарегистрироваться», нажмите «Загрузить google-services.json» , чтобы получить файл конфигурации Firebase Android, а затем скопируйте файл google-services.json в каталог app в своем проекте. После загрузки файла вы можете пропустить следующие шаги, показанные в консоли (они уже были сделаны за вас в проекте build-android-start).

Добавьте плагин Google-сервисов в свое приложение

Плагин google-services использует файл google-services.json для настройки вашего приложения на использование Firebase. Следующие строки уже должны быть добавлены в файлы build.gradle.kts проекта (проверьте для подтверждения):

приложение/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
}

Синхронизируйте свой проект с файлами gradle

Чтобы быть уверенным, что все зависимости доступны для вашего приложения, на этом этапе вам следует синхронизировать свой проект с файлами Gradle. Выберите «Файл» > «Синхронизировать проект с файлами Gradle» на панели инструментов Android Studio.

6. Запустите стартовое приложение.

Теперь, когда вы импортировали проект в Android Studio и настроили плагин google-services с помощью файла JSON, вы готовы запустить приложение в первый раз. Подключите устройство Android и нажмите «Выполнить» ( выполнить.png ) на панели инструментов Android Studio.

Приложение должно запуститься на вашем устройстве. На этом этапе вы можете увидеть работающее приложение, которое показывает вкладку со списком фильмов, вкладку «Понравившиеся фильмы» и вкладку «Рекомендации». Вы можете нажать на фильм в списке фильмов, чтобы добавить его в список понравившихся. После завершения оставшихся шагов кодовой лаборатории мы сможем генерировать рекомендации по фильмам на вкладке «Рекомендации».

7. Добавьте Firebase Analytics в приложение.

На этом этапе вы добавите Firebase Analytics в приложение для регистрации данных о поведении пользователей (в данном случае о том, какие фильмы нравятся пользователю). Эти данные будут использоваться в совокупности на будущих этапах обучения модели рекомендаций.

Добавьте зависимость Firebase Bill of Materials and Analytics

Следующие зависимости необходимы для добавления Firebase Analytics в ваше приложение. Они уже должны быть включены в файл app/build.gradle.kts (проверьте).

приложение/build.grade.kts

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

Настройте Firebase Analytics в приложении.

LikedMoviesViewModel содержит функции для хранения фильмов, которые нравятся пользователю. Каждый раз, когда пользователю нравится новый фильм, мы хотим также отправить событие журнала аналитики, чтобы записать это лайк.

Добавьте функцию onMovieLiked к приведенному ниже коду, чтобы зарегистрировать событие аналитики, когда пользователь нажимает лайк на фильм.

ПонравилосьMoviesViewModel.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())
    }
       
}

Добавьте следующее поле и функцию, чтобы регистрировать событие Analytics, когда фильм добавляется в список «Понравилось» пользователю.

ПонравилосьMoviesViewModel.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. Проверьте интеграцию с Google Analytics

На этом этапе мы создадим события Analytics в приложении и проверим, что они отправляются в консоль Firebase.

Включить ведение журнала отладки Analytics

Firebase Analytics разработан для максимального увеличения времени автономной работы пользователя и группирует события на устройстве и лишь изредка отправляет их в Firebase. В целях отладки мы можем отключить это поведение, чтобы видеть события по мере их регистрации в реальном времени, выполнив следующую команду в оболочке.

Терминал

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

Убедитесь, что события Analytics генерируются.

  1. В студии Android откройте окно Logcat, чтобы просмотреть журналирование вашего приложения.
  2. Установите фильтр Logcat на строку «Событие регистрации».
  3. Убедитесь, что события аналитики select_item создаются каждый раз, когда вам нравится фильм в приложении.

На этом этапе вы успешно интегрировали Firebase Analytics в свое приложение. Когда пользователи используют ваше приложение и им нравятся фильмы, их лайки будут регистрироваться в совокупности. Мы будем использовать эти совокупные данные в оставшейся части этой лаборатории для обучения нашей модели рекомендаций. Ниже приведен необязательный шаг, позволяющий увидеть, что те же события Analytics, которые вы видели в Logcat, также передаются в консоль Firebase. Смело переходите на следующую страницу.

Необязательно: подтвердите события Analytics в консоли Firebase.

  1. Перейдите в консоль Firebase .
  2. Выберите DebugView в разделе Analytics.
  3. В Android Studio выберите «Выполнить» , чтобы запустить приложение и добавить несколько фильмов в список «Понравилось».
  4. В DebugView консоли Firebase убедитесь, что эти события регистрируются при добавлении фильмов в приложение.

9. Экспортируйте данные Analytics в Big Query.

Big Query — это продукт Google Cloud, который позволяет просматривать и обрабатывать большие объемы данных. На этом этапе вы подключите свой проект Firebase Console к Big Query, чтобы данные Analytics, сгенерированные вашим приложением, автоматически экспортировались в Big Query.

Включить экспорт Big Query

  1. Перейдите в консоль Firebase .
  2. Щелкните значок шестеренки «Настройки» рядом с пунктом «Обзор проекта» , а затем выберите «Настройки проекта».
  3. Выберите вкладку «Интеграции» .
  4. Выберите «Ссылка» (или «Управление ») внутри блока BigQuery .
  5. Нажмите «Далее» на этапе «О связывании Firebase с BigQuery» .
  6. В разделе «Настроить интеграцию» нажмите переключатель, чтобы включить отправку данных Google Analytics, и выберите «Связать с BigQuery» .

Теперь вы включили в своем проекте консоли Firebase автоматическую отправку данных о событиях Firebase Analytics в Big Query. Это происходит автоматически без какого-либо дальнейшего взаимодействия, однако первый экспорт, при котором создается набор аналитических данных в BigQuery, может произойти не раньше, чем через 24 часа. После создания набора данных Firebase постоянно экспортирует новые события Analytics в Big Query во внутридневную таблицу и группирует события прошлых дней в таблице событий.

Для обучения модели рекомендаций требуется много данных. Поскольку у нас еще нет приложения, генерирующего большие объемы данных, на следующем этапе мы импортируем образец набора данных в BigQuery, чтобы использовать его в оставшейся части этого руководства.

10. Используйте BigQuery для получения данных обучения модели.

Теперь, когда мы подключили консоль Firebase для экспорта в BigQuery, данные о событиях аналитики наших приложений через некоторое время автоматически появятся в консоли BigQuery. Чтобы получить некоторые исходные данные для целей этого руководства, на этом этапе мы импортируем существующий образец набора данных в вашу консоль BigQuery, чтобы использовать его для обучения нашей модели рекомендаций.

Импортируйте образец набора данных в BigQuery.

  1. Перейдите на панель управления BigQuery в облачной консоли Google.
  2. Выберите название вашего проекта в меню.
  3. Чтобы просмотреть подробности, выберите название своего проекта в нижней части левой панели навигации BigQuery.
  4. Выберите Создать набор данных , чтобы открыть панель создания набора данных.
  5. Введите «firebase_recommendations_dataset» в качестве идентификатора набора данных и выберите «Создать набор данных» .
  6. Новый набор данных появится в левом меню под названием проекта. Нажмите на него.
  7. Выберите Создать таблицу , чтобы открыть панель создания таблицы.
  8. Для создания таблицы выберите «Google Cloud Storage».
  9. В поле «Выбрать файл из сегмента GCS» введите «gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt».
  10. Выберите «JSONL» в раскрывающемся списке «Формат файла» .
  11. Введите «recommendations_table» в качестве имени таблицы .
  12. Установите флажок в разделе «Схема» > «Автоопределение» > «Схема и входные параметры».
  13. Выберите Создать таблицу.

Изучите образец набора данных

На этом этапе вы можете дополнительно изучить схему и просмотреть этот набор данных.

  1. Выберите набор данных firebase-recommendations-dataset в левом меню, чтобы развернуть содержащиеся в нем таблицы.
  2. Выберите таблицу таблицы рекомендаций , чтобы просмотреть схему таблицы.
  3. Выберите «Предварительный просмотр» , чтобы просмотреть фактические данные о событиях Analytics, содержащиеся в этой таблице.

Создайте учетные данные сервисной учетной записи

Теперь мы создадим учетные данные сервисной учетной записи в нашем проекте консоли Google Cloud, которые мы сможем использовать в среде Colab на следующем шаге для доступа и загрузки наших данных BigQuery.

  1. Убедитесь, что для вашего проекта Google Cloud включена оплата.
  2. Включите API BigQuery и BigQuery Storage API. < нажмите здесь >
  3. Перейдите на страницу создания ключа учетной записи службы .
  4. В списке Учетная запись службы выберите Новая учетная запись службы .
  5. В поле Имя учетной записи службы введите имя.
  6. В списке Роль выберите Проект > Владелец .
  7. Нажмите Создать . Файл JSON, содержащий ваш ключ, загружается на ваш компьютер.

На следующем этапе мы будем использовать Google Colab для предварительной обработки этих данных и обучения нашей модели рекомендаций.

11. Предварительная обработка данных и обучение модели рекомендаций.

На этом этапе мы будем использовать блокнот Colab для выполнения следующих шагов:

  1. импортируйте данные BigQuery в блокнот Colab
  2. предварительно обработать данные, чтобы подготовить их к обучению модели
  3. обучить модель рекомендаций на аналитических данных
  4. экспортируйте модель как модель TF lite
  5. разверните модель в консоли Firebase, чтобы мы могли использовать ее в нашем приложении.

Прежде чем запустить учебный блокнот Colab, мы сначала включим API управления моделями Firebase, чтобы Colab мог развернуть обученную модель на нашей консоли Firebase.

Включить API управления моделями Firebase

Создайте корзину для хранения моделей машинного обучения.

В консоли Firebase перейдите в раздел «Хранилище» и нажмите «Начать». fbbea78f0eb3dc9f.png

Следуйте диалогу, чтобы настроить ведро.

19517c0d6d2aa14d.png

Включить API Firebase ML

Перейдите на страницу Firebase ML API в Google Cloud Console и нажмите «Включить».

Используйте блокнот Colab для обучения и развертывания модели.

Откройте блокнот Colab, используя следующую ссылку, и выполните приведенные ниже шаги. После выполнения шагов в блокноте Colab у вас будет файл модели TF lite, развернутый на консоли Firebase, который мы сможем синхронизировать с нашим приложением.

Открыть в Колабе

12. Загрузите модель в свое приложение.

На этом этапе мы изменим наше приложение, чтобы загрузить модель, которую мы только что обучили с помощью Firebase Machine Learning.

Добавить зависимость Firebase ML

Следующая зависимость необходима для использования моделей машинного обучения Firebase в вашем приложении. Он уже должен быть добавлен (проверьте).

приложение/build.grade.kts

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

Загрузите модель с помощью Firebase Model Manager API.

Скопируйте приведенный ниже код в рекомендациюClient.kt , чтобы настроить условия, при которых происходит загрузка модели, и создайте задачу загрузки для синхронизации удаленной модели с нашим приложением.

РекомендацияClient.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. Интегрируйте модель рекомендаций Tensorflow Lite в свое приложение.

Среда выполнения Tensorflow Lite позволит вам использовать вашу модель в приложении для генерации рекомендаций. На предыдущем шаге мы инициализировали интерпретатор TFlite с помощью загруженного файла модели. На этом этапе мы сначала загрузим словарь и метки для сопровождения нашей модели на этапе вывода, затем добавим предварительную обработку для генерации входных данных для нашей модели и постобработку, при которой мы извлечем результаты нашего вывода. .

Загрузить словарь и метки

Метки, используемые для создания кандидатов в рекомендации с помощью модели рекомендаций, перечислены в файле sorted_movie_vocab.json в папке res/assets. Скопируйте следующий код, чтобы загрузить этих кандидатов.

РекомендацияClient.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.")
        }
    }

Внедрить предварительную обработку

На этапе предварительной обработки мы меняем форму входных данных, чтобы она соответствовала ожиданиям нашей модели. Здесь мы дополняем входную длину значением-заполнителем, если мы еще не получили много лайков от пользователей. Скопируйте приведенный ниже код:

РекомендацияClient.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
        }
    }


Запустите интерпретатор для генерации рекомендаций

Здесь мы используем модель, которую мы скачали на предыдущем шаге, для выполнения вывода на основе предварительно обработанных входных данных. Мы устанавливаем тип входных и выходных данных для нашей модели и выполняем вывод, чтобы сгенерировать рекомендации по фильмам. Скопируйте следующий код в свое приложение.

РекомендацияClient.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()
            }
        }
    }



Внедрить постобработку

Наконец, на этом этапе мы подвергаем постобработке выходные данные нашей модели, выбирая результаты с наибольшей достоверностью и удаляя содержащиеся значения (фильмы, которые уже понравились пользователю). Скопируйте следующий код в свое приложение.

РекомендацияClient.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
        }
    }


Проверьте свое приложение!

Перезапустите приложение. Когда вы выберете несколько фильмов, он должен автоматически загрузить новую модель и начать генерировать рекомендации!

14. Поздравляем!

Вы встроили функцию рекомендаций в свое приложение с помощью TensorFlow Lite и Firebase. Обратите внимание, что методы и конвейер, показанные в этой кодовой лаборатории, можно обобщить и использовать для предоставления других типов рекомендаций.

Что мы рассмотрели

  • Firebase ML
  • Аналитика Firebase
  • Экспортируйте события аналитики в BigQuery.
  • События предварительной обработки аналитики
  • Рекомендации по обучению Модель TensorFlow
  • Экспортируйте модель и разверните ее в консоли Firebase.
  • Показывайте рекомендации фильмов в приложении

Следующие шаги

  • Внедрите рекомендации Firebase ML в свое приложение.

Узнать больше

Есть вопрос?

Сообщить о проблемах