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

1. Обзор

Добро пожаловать в раздел рекомендаций по кодовой лаборатории TensorFlow Lite и Firebase. В этой кодовой лаборатории вы узнаете, как использовать TensorFlow Lite и Firebase для развертывания модели рекомендаций в вашем приложении. Это codelab основано на этом 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 ) Из образца кода загрузки (File> Open> ... / codelab-рекомендации-андроид / старт).

Теперь у вас должен быть открыт стартовый проект в 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 каталог в вашем проекте. После загрузки файла вы можете пропустить следующие шаги , показанные на консоли (они уже сделали для вас в билд-андроида-старта проекта).

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

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

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

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

build.grade

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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. Не стесняйтесь переходить к следующей странице.

Дополнительно: Подтверждение события Аналитика в Firebase консоли

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

9. Экспорт данных Google Analytics в Big Query.

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

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

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

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

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

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

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

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

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

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

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

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

Создать учетные данные службы

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

  1. Убедитесь, что для вашего проекта Google Cloud включен биллинг.
  2. Включите API BigQuery и BigQuery Storage. < Нажмите здесь >
  3. Перейти к Create Service Key Account странице .
  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

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

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

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

Открыть в Colab

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

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

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

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

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

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

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

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

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

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

Загрузить словарь и ярлыки

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

Рекомендация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 Analytics
  • Экспорт аналитических событий в BigQuery
  • Предварительная обработка событий аналитики
  • Рекомендации по обучению Модель TensorFlow
  • Экспорт модели и развертывание в Firebase Console
  • Показывать рекомендации фильмов в приложении

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

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

Учить больше

Есть вопрос?

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