1. Introdução

Observação: este codelab requer um dispositivo físico para teste.
O TensorFlow é um framework de machine learning de várias finalidades. É possível usar o TensorFlow para treinar modelos grandes em clusters na nuvem ou executar modelos localmente em um sistema incorporado, como seu smartphone.
Este codelab usa o TensorFlow Lite para executar um modelo de reconhecimento de imagem em um dispositivo Android.
Instalar o Android Studio 4.1 ou uma versão mais recente
Se você ainda não tiver instalado, faça o download e instale o Android Studio 4.1 ou mais recente enquanto treina seu modelo do TensorFlow Lite.
O que você vai aprender
- Como treinar seu próprio classificador de imagens personalizado usando o TensorFlow Lite Model Maker.
- Como usar o Android Studio para importar o modelo do TensorFlow Lite e integrar o modelo personalizado em um app Android usando o CameraX.
- Como usar a GPU no smartphone para acelerar o modelo.
O que você criará
Um app de câmera simples que executa um programa de reconhecimento de imagens do TensorFlow para identificar flores.

Licença: sem custo financeiro
2. Treinar um reconhecedor de flores usando o Colab
Antes de iniciar o treinamento de modelo, faça o download e instale o Android Studio 4.1 ou uma versão mais recente.
Abra o Colab, que mostra como treinar um classificador com o Keras para reconhecer flores usando o aprendizado por transferência do TensorFlow Lite.
3. Configurar o diretório de trabalho
Clonar o repositório Git
O comando a seguir vai clonar o repositório do Git com os arquivos necessários para este codelab:
git clone https://github.com/hoitab/TFLClassify.git
Em seguida, acesse o diretório em que você acabou de clonar o repositório. É aqui que você vai trabalhar pelo restante deste codelab:
cd TFLClassify
4. Configurar o app esqueleto do Android

Instalar o Android Studio 4.1 ou uma versão mais recente
Se você ainda não o tem, instale o Android Studio 4.1 ou uma versão mais recente.
Abrir o projeto com o Android Studio
Abra um projeto com o Android Studio seguindo estas etapas:
- Abra o Android Studio
. Depois que ele for carregado, selecione "Abrir um projeto atual" nesta janela pop-up:

- No seletor de arquivos, escolha
TFLClassify/build.gradleno diretório de trabalho.
- Na primeira vez que você abrir o projeto, vai aparecer uma janela pop-up "Sincronização do Gradle" perguntando sobre o uso do wrapper do Gradle. Clique em "OK".

- Ative o modo de desenvolvedor e a depuração USB no smartphone, se ainda não tiver feito isso. Essa é uma configuração única. Siga estas instruções.
- Quando o projeto e o smartphone estiverem prontos, execute-o em um dispositivo real selecionando
TFL_Classify.starte pressionando o botão de execução
na barra de ferramentas:

- Agora permita que a demonstração do Tensorflow acesse sua câmera:

- A seguinte tela vai aparecer no smartphone com números aleatórios no lugar dos resultados reais.

5. Adicionar o TensorFlow Lite ao app Android
- Selecione o módulo
startno explorador de projetos à esquerda:

- Clique com o botão direito do mouse no módulo
startou clique emFile, depois emNew>Other>TensorFlow Lite Model.

- Selecione o local do modelo em que você baixou o
FlowerModel.tflitetreinado personalizado anteriormente.

- Clique em
Finish. - Você vai encontrar o seguinte no final. O FlowerModel.tflite é importado com sucesso e mostra as informações de alto nível sobre o modelo, incluindo entrada / saída e um exemplo de código para você começar.

6. Opcional: conferir toda a lista de tarefas
A lista de tarefas facilita a navegação até o local exato em que você precisa atualizar o codelab. Você também pode usar no seu Projeto do Android para lembrar de trabalhos futuros. Você pode adicionar itens a fazer usando comentários de código e digitando a palavra-chave TODO. Para acessar a lista de TODOs, você pode:
- Uma ótima maneira de ver o que vamos fazer é conferir a lista de tarefas. Para fazer isso, selecione na barra de menus superior
View>Tool Windows>TODO

- Por padrão, ele lista todos os TODOs em todos os módulos, o que pode ser um pouco confuso. Para classificar apenas as tarefas pendentes de início, clique no botão "Agrupar por" ao lado do painel de tarefas pendentes e escolha
Modules.

- Abra todos os itens nos módulos iniciais:

7. Executar o modelo personalizado com o TensorFlow Lite
- Clique em TODO 1 na lista de tarefas ou abra o arquivo MainActivity.kt e localize TODO 1. Inicialize o modelo adicionando esta linha:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
ImageAnalysis.Analyzer {
...
// TODO 1: Add class variable TensorFlow Lite Model
private val flowerModel = FlowerModel.newInstance(ctx)
...
}
- Dentro do método de análise do CameraX Analyzer, precisamos converter a entrada de câmera
ImageProxyem umBitmape criar um objetoTensorImagepara o processo de inferência.
override fun analyze(imageProxy: ImageProxy) {
...
// TODO 2: Convert Image to Bitmap then to TensorImage
val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
...
}
- Processe a imagem e execute as seguintes operações no resultado:
- Ordene os resultados por probabilidade em ordem decrescente no atributo
score, começando pela maior probabilidade. - Use os k principais resultados definidos pela constante
MAX_RESULT_DISPLAY. Você pode variar o valor dessa variável para ter mais ou menos resultados.
override fun analyze(imageProxy: ImageProxy) {
...
// TODO 3: Process the image using the trained model, sort and pick out the top results
val outputs = flowerModel.process(tfImage)
.probabilityAsCategoryList.apply {
sortByDescending { it.score } // Sort with highest confidence first
}.take(MAX_RESULT_DISPLAY) // take the top results
...
}
- Converta os resultados classificados e filtrados em objetos de dados
Recognitionprontos para serem consumidos porRecyclerViewvia vinculação de dados:
override fun analyze(imageProxy: ImageProxy) {
...
// TODO 4: Converting the top probability items into a list of recognitions
for (output in outputs) {
items.add(Recognition(output.label, output.score))
}
...
}
- Marque como comentário ou exclua as seguintes linhas, que ajudam a gerar os resultados falsos que vimos antes:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
- Execute o app em um dispositivo real selecionando
TFL_Classify.starte pressione o botão de execução
na barra de ferramentas:

- A seguinte tela vai aparecer no seu smartphone com números aleatórios no lugar dos resultados reais:

8. Opcional: acelerar a inferência com o delegado de GPU
O TensorFlow Lite é compatível com vários aceleradores de hardware para acelerar a inferência no seu dispositivo móvel. A GPU é um dos aceleradores que o TensorFlow Lite pode aproveitar usando um mecanismo de delegação, e é bem fácil de usar.
- Abra build.gradle no módulo
startou clique em "TODO 5" na lista de tarefas e adicione a seguinte dependência:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- Volte ao arquivo MainActivity.kt ou clique em TODO 6 na lista de tarefas. Substitua a inicialização simples do flowerModel pelo seguinte: receba uma instância da lista de compatibilidade de GPU e inicialize a GPU dependendo se ela é uma das GPUs compatíveis listadas. Caso contrário, inicie quatro linhas de execução da CPU para executar o modelo:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
ImageAnalysis.Analyzer {
...
// TODO 1: Add class variable TensorFlow Lite Model
// Initializing the flowerModel by lazy so that it runs in the same thread when the process
// method is called.
private val flowerModel: FlowerModel by lazy{
// TODO 6. Optional GPU acceleration
val compatList = CompatibilityList()
val options = if(compatList.isDelegateSupportedOnThisDevice){
Log.d(TAG, "This device is GPU Compatible ")
Model.Options.Builder().setDevice(Model.Device.GPU).build()
} else {
Log.d(TAG, "This device is GPU Incompatible ")
Model.Options.Builder().setNumThreads(4).build()
}
...
}
- Mude o inicializador do modelo para usar isso adicionando
optionsà entrada do método:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
ImageAnalysis.Analyzer {
private val flowerModel: FlowerModel by lazy{
...
// Initialize the Flower Model
FlowerModel.newInstance(ctx, options)
}
}
- Execute o app em um dispositivo real selecionando
TFL_Classify.starte pressione o botão de execução
na barra de ferramentas:

9. Próximos passos
Confira alguns links para mais informações:
- Teste outros modelos do TFLite compatíveis com a vinculação de modelos de ML em tfhub.dev.
- Saiba mais sobre o TFLite na documentação em tensorflow.org e no repositório de código (links em inglês).
- Tente usar outros modelos pré-treinados do TFLite, incluindo um detector de hotwords de fala e uma versão de resposta inteligente no dispositivo.
- Saiba mais sobre o TensorFlow em geral com a documentação de primeiros passos.