Добавьте рекомендации в свое приложение с помощью 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 версии 3.4+.
  • Образец кода.
  • Тестовое устройство с Android 2.3+ и сервисами 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, а затем скопируйте файл google-services.json в каталог app в вашем проекте. После загрузки файла вы можете пропустить следующие шаги, показанные в консоли (они уже были выполнены за вас в проекте build-android-start).

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

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

приложение/сборка.оценка

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

уровень сборки

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

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

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

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

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

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

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

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

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

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

приложение/сборка.оценка

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

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

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

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

НравитсяФильмыViewModel.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, когда фильм добавляется в список понравившихся пользователей.

НравитсяФильмыViewModel.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

На этом этапе мы создадим события 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. Убедитесь, что события Analytics "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.

Включить экспорт больших запросов

  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».
  9. В поле « Выберите файл из корзины GCS » введите «gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt».
  10. Выберите «JSONL» в раскрывающемся списке « Формат файла» .
  11. Введите «recommendations_table» в качестве названия таблицы .
  12. Установите флажок в разделе « Схема»> «Автоопределение»> «Схема и входные параметры» .
  13. Выберите Создать таблицу

Исследуйте образец набора данных

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

  1. Выберите набор данных firebase-recommendations-dataset в левом меню, чтобы развернуть содержащиеся в нем таблицы.
  2. Выберите таблицу рекомендаций, чтобы просмотреть схему таблицы.
  3. Выберите Предварительный просмотр , чтобы увидеть фактические данные о событиях Google 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 Console, чтобы мы могли использовать ее в нашем приложении.

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

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

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

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

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

19517c0d6d2aa14d.png

Включить API Firebase ML

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

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

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

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

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

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

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

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

приложение/сборка.оценка

implementation 'com.google.firebase:firebase-ml-modeldownloader:24.0.4'

Загрузите модель с помощью 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 Console
  • Подавать рекомендации фильмов в приложении

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

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

Учить больше

Есть вопрос?

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