1. Visão Geral
O Firebase ML permite que você implante seu modelo over-the-air. Isso permite que você mantenha o tamanho do aplicativo pequeno e baixe o modelo de ML apenas quando necessário, experimente vários modelos ou atualize seu modelo de ML sem precisar republicar o aplicativo inteiro.
Neste codelab, você converterá um app Android usando um modelo TFLite estático em um app usando um modelo veiculado dinamicamente pelo Firebase.
O que você aprenderá
- Implante modelos TFLite no Firebase ML e acesse-os em seu aplicativo
- Rastreie o feedback do usuário para medir a precisão do modelo com o Firebase Analytics
- Desempenho do modelo de perfil via Firebase Performance
- Selecione qual dos vários modelos implantados é carregado por meio do Remote Config
- Experimente diferentes modelos por meio do teste A/B do Firebase
O que você precisará
- Última versão do Android Studio .
- Código de amostra.
- Um dispositivo de teste com Android 5.0+ e Google Play Services 9.8 ou posterior, ou um emulador com Google Play Services 9.8 ou posterior
- Se estiver usando um dispositivo, um cabo de conexão.
Como você usará este tutorial?
Como classificaria sua experiência com a criação de aplicativos Android?
2. Obtenha o código de amostra
Clone o repositório GitHub na linha de comando.
$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git
Se você não tiver o git instalado, também pode baixar o projeto de exemplo na página do GitHub ou clicando neste link .
3. Importe o aplicativo inicial
No Android Studio, selecione o diretório codelab-digitclassifier-android
( ) do download do código de exemplo ( Arquivo > Abrir > .../codelab-digitclassifier-android/start).
Agora você deve ter o projeto inicial aberto no Android Studio.
4. Execute o aplicativo inicial
Agora que você importou o projeto para o Android Studio, está pronto para executar o aplicativo pela primeira vez. Conecte seu dispositivo Android e clique em Executar ( ) na barra de ferramentas do Android Studio.
O aplicativo deve iniciar no seu dispositivo. Nesse ponto, se você tentar desenhar um dígito, o aplicativo poderá reconhecê-lo.
5. Crie um projeto de console do Firebase
Adicionar Firebase ao projeto
- Acesse o console do Firebase .
- Selecione Adicionar projeto .
- Selecione ou insira um nome de projeto.
- Siga as etapas de configuração restantes no console do Firebase e clique em Criar projeto (ou Adicionar Firebase, se estiver usando um projeto existente do Google).
6. Adicionar Firebase
- Na tela de visão geral do seu novo projeto, clique no ícone do Android para iniciar o fluxo de trabalho de configuração.
- Insira o nome do pacote do codelab:
org.tensorflow.lite.examples.digitclassifier
Adicione o arquivo google-services.json ao seu aplicativo
Depois de registrar o nome do pacote e selecionar Next, clique em Download google-services.json para obter seu arquivo de configuração Firebase Android e copie o arquivo google-services.json no diretório app
em seu projeto. Após 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).
Adicione o plug-in de serviços do Google ao seu aplicativo
O plug-in google-services usa o arquivo google-services.json para configurar seu aplicativo para usar o Firebase. Adicione a seguinte linha ao bloco plugins
na parte superior do arquivo build.gradle.kts no diretório app
do seu projeto:
app/build.gradle.kts
id("com.google.gms.google-services")
Em seguida, adicione a seguinte linha ao bloco plugins
do seu arquivo build.gradle.kts no projeto:
projeto/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
Sincronize seu projeto com arquivos gradle
Para ter certeza de que todas as dependências estão disponíveis para seu aplicativo, você deve sincronizar seu projeto com arquivos gradle neste momento. Selecione File > Sync Project with Gradle Files na barra de ferramentas do Android Studio.
7. Execute o aplicativo com o Firebase
Agora que você configurou o plug-in google-services
com seu arquivo JSON, está pronto para executar o aplicativo com o Firebase. Conecte seu dispositivo Android e clique em Executar ( ) na barra de ferramentas do Android Studio.
O aplicativo deve iniciar no seu dispositivo. Neste ponto, seu aplicativo ainda deve ser compilado com êxito.
8. Implante um modelo no Firebase ML
Implantar um modelo no Firebase ML é útil por dois motivos principais:
- Podemos manter o tamanho da instalação do aplicativo pequeno e baixar o modelo apenas se necessário
- O modelo pode ser atualizado regularmente e com um ciclo de lançamento diferente do aplicativo inteiro
Antes de podermos substituir o modelo estático em nosso aplicativo por um modelo baixado dinamicamente do Firebase, precisamos implantá-lo no Firebase ML. O modelo pode ser implantado por meio do console ou programaticamente, usando o Firebase Admin SDK. Nesta etapa, implantaremos por meio do console.
Para simplificar, usaremos o modelo TensorFlow Lite que já está em nosso aplicativo. Primeiro, abra o Firebase Console e clique em Machine Learning no painel de navegação esquerdo. Clique em 'Começar' se estiver abrindo pela primeira vez. Em seguida, navegue até "Personalizado" e clique no botão "Adicionar modelo personalizado".
Quando solicitado, dê ao modelo um nome descritivo como mnist_v1
e carregue o arquivo do diretório do projeto do codelab em start/app/src/main/assets/mnist.tflite
. Em seguida, você pode excluir este arquivo de modelo TF Lite do projeto Android.
9. Baixe o modelo do Firebase ML
Escolher quando baixar o modelo remoto do Firebase em seu aplicativo pode ser complicado, pois os modelos TFLite podem crescer relativamente grandes. Idealmente, queremos evitar carregar o modelo imediatamente quando o aplicativo for iniciado, pois se nosso modelo for usado para apenas um recurso e o usuário nunca usar esse recurso, teremos baixado uma quantidade significativa de dados sem motivo. Também podemos definir opções de download, como apenas buscar modelos quando conectado ao wi-fi. Se você deseja garantir que o modelo esteja disponível mesmo sem uma conexão de rede, é importante agrupá-lo também sem o aplicativo como backup.
Para simplificar, removeremos o modelo empacotado padrão e sempre baixaremos um modelo do Firebase quando o aplicativo for iniciado. Dessa forma, ao executar o reconhecimento de dígitos, você pode ter certeza de que a inferência está sendo executada com o modelo fornecido pelo Firebase.
No arquivo app/build.gradle.kts, adicione a dependência Firebase Machine Learning
app/build.gradle.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Em seguida, adicione lógica para baixar o modelo do Firebase.
Substituiremos digitClassifier.initialize(loadModelFile())
por downloadModel("mnist_v1")
e implementaremos esse método.
MainActivity.kt
private fun downloadModel(modelName: String): Task<CustomModel> {
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi()
.build()
return FirebaseModelDownloader.getInstance()
.getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
.addOnCompleteListener {
val model = it.result
if (model == null) {
showToast("Failed to get model file.")
} else {
showToast("Downloaded remote model: $modelName")
digitClassifier.initialize(model)
}
}
.addOnFailureListener {
showToast("Model download failed for $modelName, please check your connection.")
}
}
Execute novamente seu aplicativo e desenhe um dígito no classificador de dígitos. Depois que o download terminar, você verá uma mensagem do Toast informando que o modelo remoto foi baixado e um log indicando que seu novo modelo está sendo usado.
10. Acompanhe o feedback do usuário e a conversão para medir a precisão do modelo
O Google Analytics para Firebase oferece uma maneira de entender como os usuários se movem pelo seu aplicativo, onde eles obtêm sucesso e onde ficam parados e voltam. Também pode ser usado para entender as partes mais usadas do seu aplicativo.
Mediremos a precisão do modelo rastreando o feedback do usuário sobre as previsões do modelo. Se um usuário clicar em "SIM", isso indicará que a previsão foi precisa.
Podemos registrar um evento do Analytics para rastrear a precisão do nosso modelo. Primeiro, devemos adicionar o Analytics à dependência antes que ele possa ser usado no projeto:
Adicionar dependência do Firebase Analytics
app/build.gradle.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Registrar eventos
Em seguida, na função onCreate
, definiremos o ouvinte onclick para registrar o evento correct_inference
no Firebase.
MainActivity.kt (onCreate)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
Execute o aplicativo novamente e desenhe um dígito. Pressione o botão "Sim" algumas vezes para enviar feedback de que a inferência foi precisa.
Análise de depuração
Geralmente, os eventos registrados pelo seu aplicativo são agrupados em lotes durante o período de aproximadamente uma hora e carregados juntos. Essa abordagem economiza a bateria dos dispositivos dos usuários finais e reduz o uso de dados da rede. No entanto, para fins de validação de sua implementação de análise (e, para visualizar sua análise no relatório DebugView), você pode habilitar o modo de depuração em seu dispositivo de desenvolvimento para carregar eventos com um atraso mínimo.
Para habilitar o modo Analytics Debug em um dispositivo Android, execute os seguintes comandos:
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
Execute o aplicativo novamente e desenhe um dígito. Pressione o botão "Sim" algumas vezes para enviar feedback de que a inferência foi precisa. Agora você pode visualizar os eventos de log quase em tempo real por meio da visualização de depuração no console do Firebase. Clique em Analytics > DebugView na barra de navegação à esquerda.
11. Analise o Desempenho do Modelo
O monitoramento de desempenho do Firebase é um serviço que ajuda você a obter informações sobre as características de desempenho de seus aplicativos iOS, Android e da Web.
Você usa o SDK de monitoramento de desempenho para coletar dados de desempenho de seu aplicativo e, em seguida, revisa e analisa esses dados no console do Firebase. O monitoramento de desempenho ajuda você a entender onde e quando o desempenho de seu aplicativo pode ser melhorado para que você possa usar essas informações para corrigir problemas de desempenho.
Aqui adicionamos rastreamentos de desempenho em torno da inferência e baixamos
Isso é importante porque modelos maiores usados em aprendizado profundo têm potencial para serem mais precisos, mas também podem demorar mais para retornar uma resposta. Em nosso experimento, estamos tentando encontrar o equilíbrio certo entre precisão e velocidade.
Adicionar dependência do Firebase Performance
projeto/build.gradle.kts
plugins {
// ...
// Add the dependency for the Performance Monitoring plugin
id("com.google.firebase.firebase-perf") version "1.4.2" apply false
}
app/build.gradle.kts
plugins {
// ...
// Add the Performance Monitoring plugin
id("com.google.firebase.firebase-perf")
}
// ...
dependencies {
// ...
// Add the dependency for the Performance Monitoring library
implementation("com.google.firebase:firebase-perf")
}
Adicionar rastreamentos personalizados
Na função setupDigitClassifier()
, crie um novo downloadTrace e inicie-o logo antes de baixar o modelo. Em seguida, adicione um ouvinte onsuccess parando o rastreamento.
Na função classifyDrawing()
, crie um novo classTrace e inicie-o logo antes da classificação. Em seguida, pare o rastreamento no ouvinte onsuccess.
MainActivity.kt
class MainActivity : AppCompatActivity() {
// ...
private val firebasePerformance = FirebasePerformance.getInstance()
// ...
private fun setupDigitClassifier() {
// Add these lines to create and start the trace
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel("mnist_v1")
// Add these lines to stop the trace on success
.addOnSuccessListener {
downloadTrace.stop()
}
}
// ...
private fun classifyDrawing() {
val bitmap = drawView?.getBitmap()
if ((bitmap != null) && (digitClassifier.isInitialized)) {
// Add these lines to create and start the trace
val classifyTrace = firebasePerformance.newTrace("classify")
classifyTrace.start()
digitClassifier
.classifyAsync(bitmap)
.addOnSuccessListener { resultText ->
// Add this line to stop the trace on success
classifyTrace.stop()
predictedTextView?.text = resultText
}
.addOnFailureListener { e ->
predictedTextView?.text = getString(
R.string.tfe_dc_classification_error_message,
e.localizedMessage
)
Log.e(TAG, "Error classifying drawing.", e)
}
}
}
Exibir mensagens de log para eventos de desempenho
- Habilite o log de depuração para monitoramento de desempenho no momento da compilação adicionando um elemento
<meta-data>
ao arquivoAndroidManifest.xml
do seu aplicativo, da seguinte forma:
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
</application>
- Verifique suas mensagens de log para quaisquer mensagens de erro.
- O Monitoramento de desempenho marca suas mensagens de log com
FirebasePerformance
. Usando a filtragem logcat, você pode visualizar especificamente o rastreamento de duração e o registro de solicitação de rede HTTP/S executando o seguinte comando:
adb logcat -s FirebasePerformance
- Verifique os seguintes tipos de logs que indicam que o monitoramento de desempenho está registrando eventos de desempenho:
-
Logging TraceMetric
-
Logging NetworkRequestMetric
12. Implante um segundo modelo no Firebase ML
Ao criar uma nova versão do seu modelo, como uma com melhor arquitetura de modelo ou treinada em um conjunto de dados maior ou atualizado, podemos nos sentir tentados a substituir nosso modelo atual pela nova versão. No entanto, um modelo com bom desempenho no teste não necessariamente funciona igualmente bem na produção. Portanto, vamos fazer testes A/B em produção para comparar nosso modelo original e o novo.
Ativar a API Firebase Model Management
Nesta etapa, habilitaremos a API Firebase Model Management para implantar uma nova versão do nosso modelo TensorFlow Lite usando o código Python.
Crie um bucket para armazenar seus modelos de ML
No Firebase Console, vá para Storage e clique em Começar.
Siga o diálogo para configurar seu balde.
Ativar Firebase ML API
Acesse a página Firebase ML API no Console do Google Cloud e clique em Ativar.
Selecione o aplicativo Digit Classifier quando solicitado.
Treine um novo modelo e publique no Firebase ML
Agora vamos treinar uma nova versão do modelo usando um conjunto de dados maior e, em seguida, implantá-lo programaticamente diretamente do notebook de treinamento usando o Firebase Admin SDK.
Baixe a chave privada da conta de serviço
Antes de podermos usar o Firebase Admin SDK, precisamos criar uma conta de serviço. Abra o painel Service Accounts do Firebase console clicando neste link e clique no botão para criar uma nova conta de serviço para o Firebase Admin SDK. Quando solicitado, clique no botão Gerar nova chave privada. Usaremos a chave da conta de serviço para autenticar nossas solicitações do notebook colab.
Agora podemos treinar e implantar o novo modelo.
- Abra este notebook colab e faça uma cópia dele em seu próprio Drive.
- Execute a primeira célula "Treinar um modelo melhorado do TensorFlow Lite" clicando no botão de reprodução à esquerda dela. Isso treinará um novo modelo e pode levar algum tempo.
- A execução da segunda célula criará um prompt de upload de arquivo. Carregue o arquivo json que você baixou do Firebase Console ao criar sua conta de serviço.
- Execute as duas últimas células.
Depois de executar o notebook colab, você verá um segundo modelo no Firebase console. Certifique-se de que o segundo modelo seja denominado mnist_v2
.
13. Selecione um modelo via Remote Config
Agora que temos dois modelos separados, adicionaremos um parâmetro para selecionar qual modelo baixar no tempo de execução. O valor do parâmetro que o cliente recebe determinará qual modelo o cliente baixa.
Adicionar regras de configuração no console do Firebase
Primeiro, abra o console do Firebase e clique no botão Remote Config no menu de navegação à esquerda. Em seguida, clique no botão "Adicionar parâmetro".
Nomeie o novo parâmetro model_name
e dê a ele um valor padrão de "mnist_v1"
. Ao colocar o nome do modelo no parâmetro de configuração remota, podemos testar vários modelos sem adicionar um novo parâmetro para cada modelo que queremos testar. Clique em Publicar alterações para aplicar as atualizações.
Adicionar dependência do Firebase RemoteConfig
app/build.gradle.kts
implementation("com.google.firebase:firebase-config-ktx")
Configurar configuração remota do Firebase
MainActivity.kt
private fun configureRemoteConfig() {
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
}
Solicitar e usar configuração
Crie uma solicitação de busca para configuração e adicione um manipulador de conclusão para selecionar e usar os parâmetros de configuração.
MainActivity.kt
private fun setupDigitClassifier() {
configureRemoteConfig()
remoteConfig.fetchAndActivate()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val modelName = remoteConfig.getString("model_name")
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel(modelName)
.addOnSuccessListener {
downloadTrace.stop()
}
} else {
showToast("Failed to fetch model name.")
}
}
}
Testar configuração remota
- Clique no botão Executar .
- Verifique se você vê a mensagem Toast informando que o modelo mnist_v1 foi baixado.
- Volte para o Firebase Console, altere o valor padrão para mnist_v2 e selecione Publish Changes para aplicar as atualizações.
- Reinicie o aplicativo e verifique se a mensagem Toast informa que o modelo mnist_v2 foi baixado desta vez.
14. Eficácia do modelo de teste A/B
O teste A/B do Firebase ajuda você a otimizar a experiência do seu aplicativo, facilitando a execução, análise e dimensionamento de experimentos de produtos e marketing. Por fim, podemos usar o comportamento de teste A/B integrado do Firebase para ver qual dos nossos dois modelos tem melhor desempenho.
Acesse Analytics -> Events no console do Firebase. Se o evento correct_inference
estiver aparecendo, marque-o como um "Evento de conversão", caso contrário, você pode ir para Analytics -> Conversion Events e clicar em "Create a New Conversion Event" e colocar correct_inference.
Agora vá para "Configuração remota no console do Firebase, selecione o botão "Teste A/B" no menu de mais opções no parâmetro "model_name" que acabamos de adicionar.
No menu a seguir, aceite o nome padrão.
Selecione seu aplicativo no menu suspenso e altere os critérios de segmentação para 50% dos usuários ativos.
Se você conseguiu definir o evento correct_inference
como uma conversão anteriormente, use esse evento como a métrica principal a ser rastreada. Caso contrário, se não quiser esperar que o evento apareça no Analytics, você pode adicionar correct_inference
manually
.
Por fim, na tela Variantes, defina sua variante do grupo de controle para usar mnist_v1
e seu grupo Variante A para usar mnist_v2
.
Clique no botão Revisar no canto inferior direito.
Parabéns, você criou com sucesso um teste A/B para seus dois modelos separados! O teste A/B está atualmente em estado de rascunho e pode ser iniciado a qualquer momento clicando no botão "Iniciar experimento".
Para uma visão mais detalhada do teste A/B, confira a documentação do teste A/B .
15. Parabéns!
Neste codelab, você aprendeu a substituir um recurso tflite empacotado estaticamente em seu app por um modelo TFLite carregado dinamicamente do Firebase. Para saber mais sobre o TFLite e o Firebase, dê uma olhada em outros exemplos do TFLite e nos guias de primeiros passos do Firebase.
O que cobrimos
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- Monitoramento de desempenho do Firebase
- Configuração remota do Firebase
- Teste A/B do Firebase
Próximos passos
- Implemente o Firebase ML Deployment em seu aplicativo.
Saber mais
- Documentação do Firebase Machine Learning
- Documentação do TensorFlow Lite
- Modelos de teste A/B com Firebase