Adicione o Firebase ao seu aplicativo Android com tecnologia TFLite

1. Visão Geral

cd824ecfd05a2822.png

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?

Leia apenas Leia-o e complete os exercícios

Como classificaria sua experiência com a criação de aplicativos Android?

Novato Intermediário Proficiente

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 ( android_studio_folder.png ) 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 ( execute.png ) 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.

6e36e1b947b395f2.png

5. Crie um projeto de console do Firebase

Adicionar Firebase ao projeto

  1. Acesse o console do Firebase .
  2. Selecione Adicionar projeto .
  3. Selecione ou insira um nome de projeto.
  4. 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

  1. Na tela de visão geral do seu novo projeto, clique no ícone do Android para iniciar o fluxo de trabalho de configuração.
  2. 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 ( execute.png ) 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:

  1. Podemos manter o tamanho da instalação do aplicativo pequeno e baixar o modelo apenas se necessário
  2. 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.

3c3c50e6ef12b3b.png

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.

5276199a086721fd.png

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

  1. Habilite o log de depuração para monitoramento de desempenho no momento da compilação adicionando um elemento <meta-data> ao arquivo AndroidManifest.xml do seu aplicativo, da seguinte forma:

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. Verifique suas mensagens de log para quaisquer mensagens de erro.
  2. 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
  1. 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. fbbea78f0eb3dc9f.png

Siga o diálogo para configurar seu balde.

19517c0d6d2aa14d.png

Ativar Firebase ML API

Acesse a página Firebase ML API no Console do Google Cloud e clique em Ativar.

2414fd5cced6c984.png 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.

c3b95de1e5508516.png

Agora podemos treinar e implantar o novo modelo.

  1. Abra este notebook colab e faça uma cópia dele em seu próprio Drive.
  2. 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.
  3. 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.

71e847c6a85423b3.png

  1. 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 .

c316683bb4d75d57.png

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.

2949cb95c7214ca4.png

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

  1. Clique no 98205811bbed9d74.png botão Executar .
  2. Verifique se você vê a mensagem Toast informando que o modelo mnist_v1 foi baixado.
  3. Volte para o Firebase Console, altere o valor padrão para mnist_v2 e selecione Publish Changes para aplicar as atualizações.
  4. 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.

fad5ea36969d2aeb.png

No menu a seguir, aceite o nome padrão.

d7c006669ace6e40.png

Selecione seu aplicativo no menu suspenso e altere os critérios de segmentação para 50% dos usuários ativos.

cb72dcc7d2666bd3.png

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 .

1ac9c94fb3159271.png

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 .

e4510434f8da31b6.png

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

Ter uma questão?

Relatar problemas