1. Visão geral
Este é o codelab Recomendações com o TensorFlow Lite e o Firebase. Neste codelab, você aprenderá a usar o TensorFlow Lite e o Firebase para implantar um modelo de recomendação no seu app. Este codelab é baseado neste exemplo do TensorFlow Lite.
As recomendações permitem que os apps usem o aprendizado de máquina para veicular de forma inteligente o conteúdo mais relevante para cada usuário. Eles consideram o comportamento anterior do usuário para sugerir conteúdo do app com o qual o usuário pode gostar de interagir no futuro usando um modelo treinado no comportamento agregado de um grande número de outros usuários.
Neste tutorial, mostramos como receber dados dos usuários do seu aplicativo com o Firebase Analytics, criar um modelo de machine learning para recomendações desses dados e usar esse modelo em um app Android para executar inferência e receber recomendações. Em particular, nossas recomendações sugerem quais filmes um usuário provavelmente assistirá, considerando a lista de filmes que ele marcou como "Gostei" anteriormente.
O que você vai aprender
- Integrar o Firebase Analytics a um app Android para coletar dados de comportamento do usuário
- Exportar os dados para o Google BigQuery
- Pré-processar os dados e treinar um modelo de recomendações do TF Lite
- Implante o modelo do TF Lite no Firebase ML e acesse-o pelo app
- Executar na inferência do dispositivo usando o modelo para sugerir recomendações aos usuários
O que é necessário
- Versão mais recente do Android Studio.
- Exemplo de código.
- Um dispositivo de teste com o Android 7 ou versão mais recente e o Google Play Services 9.8 ou mais recente ou um emulador com o Google Play Services 9.8 ou mais recente
- Se estiver usando um dispositivo, um cabo de conexão.
Como você usará este tutorial?
Como você classificaria sua experiência com a criação de apps Android?
2. Acessar o exemplo de código
Clone o repositório do GitHub na linha de comando.
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
3. Importar o app inicial
No Android Studio, selecione o diretório codelab-recommendations-android
( ) no download do exemplo de código (File > Open > .../codelab-recommendations-android/start).
O projeto inicial deve estar aberto no Android Studio.
4. Criar projeto do console do Firebase
Criar um novo projeto
- Acesse o Console do Firebase.
- Selecione Adicionar projeto ou Criar um projeto se for o primeiro.
- Selecione ou digite um nome de projeto e clique em Continuar.
- Certifique-se de que a opção "Ativar o Google Analytics para este projeto" está ativado.
- Siga as demais etapas de configuração no Console do Firebase e clique em Criar projeto (ou Adicionar Firebase, se estiver usando um projeto atual do Google).
5. Adicionar Firebase
- Na tela de visão geral do novo projeto, clique no ícone do Android para iniciar o fluxo de trabalho de configuração.
- Insira o nome do pacote do codelab:
com.google.firebase.codelabs.recommendations
- Selecione Registrar app.
Adicionar o arquivo google-services.json ao app
Depois de adicionar o nome do pacote e selecionar "Registrar", clique em Fazer o download do google-services.json para receber o arquivo de configuração do Firebase para Android e copie o arquivo google-services.json para o diretório app
do seu projeto. Depois de fazer o download do arquivo, você pode pular as próximas etapas mostradas no console (elas já foram feitas para você no projeto build-android-start).
Adicionar o plug-in google-services ao app
O plug-in google-services usa o arquivo google-services.json para configurar seu aplicativo para usar o Firebase. As linhas a seguir já devem ter sido adicionadas aos arquivos build.gradle.kts no projeto (verifique para confirmar):
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
}
Sincronizar seu projeto com arquivos do Gradle
Para garantir que todas as dependências estejam disponíveis para o app, sincronize o projeto com os arquivos do Gradle. Selecione File > Sync Project with Gradle Files na barra de ferramentas do Android Studio.
6. Executar o app inicial
Agora que você importou o projeto para o Android Studio e configurou o plug-in google-services
com o arquivo JSON, já pode executar o app pela primeira vez. Conecte o dispositivo Android e clique em Run ( ) na barra de ferramentas do Android Studio.
O app será iniciado no dispositivo. Neste ponto, é possível ver um aplicativo em funcionamento que mostra uma guia com uma lista de filmes, uma guia "Filmes curtidos" e uma guia "Recomendações". Clique em um filme na lista para adicioná-lo à sua lista de favoritos. Depois de concluir as etapas restantes do codelab, vamos conseguir gerar recomendações de filmes na guia "Recomendações".
7. Adicionar o Firebase Analytics ao app
Nesta etapa, você vai adicionar o Firebase Analytics ao app para registrar dados de comportamento do usuário (neste caso, quais filmes o usuário gosta). Esses dados serão usados de forma agregada em etapas futuras para treinar o modelo de recomendações.
Adicionar a dependência do Firebase Bill of Materials e do Analytics
As dependências a seguir são necessárias para adicionar o Firebase Analytics ao seu app. Elas já precisam estar incluídas no arquivo app/build.gradle.kts (verifique).
app/build.grade.kts (link em inglês)
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Configurar o Firebase Analytics no app
O LikedMoviesViewModel contém funções para armazenar os filmes de que o usuário gosta. Sempre que o usuário gosta de um novo filme, queremos enviar também um evento de registro do Analytics para registrar isso.
Adicione a função onMovieLiked com o código abaixo para registrar um evento de análise quando o usuário clica em um filme.
LikedMoviesViewModel.kt (link em inglês)
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())
}
}
Adicione o campo e a função a seguir para registrar um evento do Analytics quando um filme for adicionado à lista "Gostei" do usuário.
LikedMoviesViewModel.kt (link em inglês)
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. Testar a integração do Google Analytics
Nesta etapa, vamos gerar eventos do Google Analytics no app e verificar se eles estão sendo enviados ao Console do Firebase.
Ativar os registros de depuração do Analytics
O Firebase Analytics foi criado para maximizar a duração da bateria do usuário e agrupar eventos no dispositivo e enviá-los ao Firebase apenas ocasionalmente. Para fins de depuração, podemos desativar esse comportamento e conferir os eventos à medida que são registrados em tempo real. Para isso, basta executar o comando a seguir no shell.
Terminal
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
Verificar se os eventos do Google Analytics são gerados
- No Android Studio, abra a janela do Logcat para examinar o registro do app.
- Defina o filtro do Logcat como a string "Logging event".
- Verifique se "select_item" Eventos de análise são emitidos sempre que você gosta de um filme no app.
Neste ponto, você integrou o Firebase Analytics ao seu aplicativo. À medida que os usuários usam seu app e gostam de filmes, as marcações "Gostei" são registradas de forma agregada. Usaremos esses dados agregados no restante deste codelab para treinar nosso modelo de recomendações. Esta é uma etapa opcional para conferir os mesmos eventos do Google Analytics que você viu no Logcat no console do Firebase. Se quiser, pule para a próxima página.
Opcional: Confirmar eventos do Google Analytics no Console do Firebase
- Acesse o Console do Firebase.
- Selecione DebugView em "Google Analytics".
- No Android Studio, selecione Run para iniciar o app e adicionar alguns filmes à lista "Liked".
- No DebugView do Console do Firebase, verifique se esses eventos estão sendo registrados à medida que você adiciona filmes no app.
9. Exportar dados do Google Analytics para o BigQuery
O BigQuery é um produto do Google Cloud que permite analisar e processar grandes quantidades de dados. Nesta etapa, você conectará seu projeto do console do Firebase ao BigQuery para que os dados do Google Analytics gerados pelo seu aplicativo sejam exportados automaticamente para o BigQuery.
Ativar a exportação do BigQuery
- Acesse o Console do Firebase.
- Selecione o ícone de engrenagem ao lado de Visão geral do projeto e selecione Configurações do projeto.
- Selecione a guia Integrações.
- Selecione Vincular (ou Gerenciar) dentro do bloco BigQuery.
- Selecione Próxima na etapa Sobre a vinculação do Firebase ao BigQuery.
- Na seção Configurar integração, clique na chave para ativar o envio de dados do Google Analytics e selecione Vincular ao BigQuery.
Agora, seu projeto do console do Firebase está configurado para enviar automaticamente os dados de eventos do Firebase Analytics ao BigQuery. Isso acontece automaticamente sem mais interação. No entanto, a primeira exportação que cria o conjunto de dados de análise no BigQuery pode não acontecer em 24 horas. Depois que o conjunto de dados é criado, o Firebase exporta continuamente novos eventos do Google Analytics para o BigQuery para a tabela intradiária e agrupa os eventos dos dias anteriores na tabela de eventos.
O treinamento de um modelo de recomendações requer muitos dados. Como ainda não temos um aplicativo que gere grandes quantidades de dados, na próxima etapa importaremos um conjunto de dados de amostra no BigQuery para usar no restante deste tutorial.
10. Usar o BigQuery para extrair dados de treinamento do modelo
Agora que conectamos o console do Firebase para exportar para o BigQuery, os dados de eventos de análise de app vão aparecer automaticamente no console do BigQuery depois de algum tempo. Para conseguir alguns dados iniciais para fins deste tutorial, nesta etapa vamos importar um conjunto de dados de amostra para o console do BigQuery a ser usado para treinar nosso modelo de recomendações.
Importar um conjunto de dados de amostra para o BigQuery
- Acesse o painel BigQuery no console do Google Cloud.
- Selecione o nome do projeto no menu.
- Selecione o nome do seu projeto na parte de baixo do painel de navegação à esquerda do BigQuery para conferir os detalhes.
- Selecione Criar conjunto de dados para abrir o painel de criação do conjunto de dados.
- Insira "firebase_recommendations_dataset". como ID do conjunto de dados e selecione Criar conjunto de dados.
- O novo conjunto de dados será exibido no menu à esquerda abaixo do nome do projeto. Clique nele.
- Selecione Criar tabela para abrir o painel de criação de tabelas.
- Em Criar tabela de, selecione "Google Cloud Storage".
- No campo Selecionar arquivo do bucket do GCS, digite "gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt".
- Selecione "JSONL" no menu suspenso Formato do arquivo.
- Insira "recommendations_table" para o Nome da tabela.
- Marque a caixa em Esquema > Detectar automaticamente > parâmetros de esquema e entrada
- Selecione Criar tabela.
analisar um conjunto de dados de amostra
Neste ponto, você tem a opção de explorar o esquema e visualizar esse conjunto de dados.
- Selecione firebase-recommendations-dataset no menu à esquerda para expandir as tabelas contidas nele.
- Selecione a tabela recommendations-table para ver o esquema da tabela.
- Selecione Visualizar para conferir os dados reais de eventos do Google Analytics que essa tabela contém.
Criar credenciais de conta de serviço
Agora, vamos criar credenciais de conta de serviço no projeto do console do Google Cloud que podemos usar no ambiente do Colab na etapa a seguir para acessar e carregar dados do BigQuery.
- Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
- Ative as APIs BigQuery e BigQuery Storage. < clique aqui>
- Acesse a página Criar chave da conta de serviço.
- Na lista Conta de serviço, selecione Nova conta de serviço.
- No campo Nome da conta de serviço, insira um nome.
- Na lista Papel, selecione Projeto > Proprietário.
- Clique em Criar. O download de um arquivo JSON com sua chave é feito no seu computador.
Na próxima etapa, vamos usar o Google Colab para pré-processar esses dados e treinar nosso modelo de recomendações.
11. Pré-processar dados e treinar o modelo de recomendações
Nesta etapa, vamos usar um notebook do Colab para realizar as seguintes etapas:
- importar os dados do BigQuery para o bloco do Colab
- Pré-processar os dados para o treinamento do modelo
- treinar o modelo de recomendações com os dados de análise;
- exportar o modelo como um modelo do TF Lite;
- implantar o modelo no Console do Firebase para que possamos usá-lo no nosso app
Antes de lançarmos o notebook de treinamento do Colab, vamos ativar a API Firebase Model Management para que o Colab possa implantar o modelo treinado no console do Firebase.
Ativar a API Firebase Model Management
Crie um bucket para armazenar seus modelos de ML
No Console do Firebase, acesse "Armazenamento" e clique em "Começar".
Siga a conversa para configurar o bucket.
Ativar a API Firebase ML
Acesse a página da API Firebase ML no console do Google Cloud e clique em "Ativar".
Usar o bloco do Colab para treinar e implantar o modelo
Abra o notebook do Colab usando o link a seguir e conclua as etapas. Depois de concluir as etapas no bloco do Colab, você terá um arquivo de modelo do TF Lite implantado no console do Firebase que poderemos sincronizar com nosso aplicativo.
Abrir no Colab
12. Fazer o download do modelo no app
Nesta etapa, vamos modificar nosso app para fazer o download do modelo que acabamos de treinar no Machine Learning do Firebase.
Adicionar a dependência do Firebase ML
A dependência a seguir é necessária para usar modelos de machine learning do Firebase no seu app. Ele já deve ter sido adicionado (verificar).
app/build.grade.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Fazer o download do modelo com a API Firebase Model Manager
Copie o código abaixo em RecommendationClient.kt para configurar as condições em que o download do modelo ocorre e crie uma tarefa de download para sincronizar o modelo remoto com nosso app.
RecommendationClient.kt (link em inglês)
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. Integrar o modelo de recomendação do TensorFlow Lite no seu app
O ambiente de execução do Tensorflow Lite permite que você use seu modelo no app para gerar recomendações. Na etapa anterior, inicializamos um interpretador TFLite com o arquivo de modelo que fizemos o download. Nesta etapa, primeiro vamos carregar um dicionário e rótulos para acompanhar nosso modelo na etapa de inferência. Em seguida, vamos adicionar o pré-processamento para gerar as entradas do modelo e o pós-processamento, em que extraímos os resultados da inferência.
Carregar dicionário e rótulos
Os rótulos usados para gerar os candidatos à recomendação pelo modelo de recomendações estão listados no arquivo sorted_movie_vocab.json na pasta res/assets. Copie o código a seguir para carregar esses candidatos.
RecommendationClient.kt (link em inglês)
/** 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.")
}
}
Implementar o pré-processamento
Na etapa de pré-processamento, mudamos a forma dos dados de entrada para corresponder ao que nosso modelo espera. Aqui, aumentamos o comprimento da entrada com um valor de marcador de posição se não tivermos gerado muitas curtidas do usuário. Copie o código abaixo:
RecommendationClient.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
}
}
Executar o interpretador para gerar recomendações
Aqui, usamos o modelo baixado em uma etapa anterior para executar a inferência na entrada pré-processada. Definimos o tipo de entrada e saída do modelo e executamos a inferência para gerar recomendações de filmes. Copie o código a seguir no seu app.
RecommendationClient.kt (link em inglês)
/** 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()
}
}
}
Implementar o pós-processamento
Por fim, nesta etapa, processamos a saída do nosso modelo, selecionando os resultados com a maior confiança e removendo os valores contidos (filmes que o usuário já curtiu). Copie o código abaixo no seu app.
RecommendationClient.kt (link em inglês)
/** 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
}
}
Teste seu app.
Execute o app novamente. À medida que você seleciona alguns filmes, o novo modelo será transferido por download automaticamente e as recomendações vão começar a ser geradas.
14. Parabéns!
Você criou um recurso de recomendações no app usando o TensorFlow Lite e o Firebase. As técnicas e o pipeline mostrados neste codelab podem ser generalizados e usados para atender a outros tipos de recomendações.
O que vimos
- Firebase ML
- Firebase Analytics
- Exportar eventos de análise para o BigQuery
- Pré-processar eventos de análise
- Treinar o modelo do TensorFlow de recomendações
- Exportar modelo e implantar no Console do Firebase
- Exibir recomendações de filmes em um app
Próximas etapas
- Implemente as recomendações do Firebase ML no seu app.
Saiba mais
Perguntas?
- Stackoverflow "firebase-machine-learning" (em inglês)