Добавьте рекомендации в свое приложение с помощью 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. Введите имя пакета codelab: com.google.firebase.codelabs.recommendations
  3. Выберите Зарегистрировать приложение .

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

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

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

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

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
}

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

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

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

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

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

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

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

Добавить зависимость спецификации материалов и аналитики Firebase

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

app/build.grade.kts

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

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

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

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

LikedMoviesViewModel.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 при добавлении фильма в список понравившихся пользователю.

LikedMoviesViewModel.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. Проверьте интеграцию вашей аналитики

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

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

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

Терминал

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

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

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

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

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

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

9. Экспорт аналитических данных в 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

Включить Firebase ML API

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

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

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

Открыть в Colab

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

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

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

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

app/build.grade.kts

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

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

Скопируйте приведенный ниже код в ReferenceClient.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. Скопируйте следующий код, чтобы загрузить этих кандидатов.

РекомендацияКлиента.кт

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

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

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

РекомендацияКлиента.кт

    /** 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
        }
    }


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

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

РекомендацияКлиента.кт

    /** 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()
            }
        }
    }



Реализовать постобработку

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

РекомендацияКлиента.кт

    /** 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 в свое приложение.

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

Есть вопрос?

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