1. Introdução
Observação: este codelab requer um dispositivo físico para testar
O TensorFlow é um framework de machine learning para várias finalidades. O TensorFlow pode ser usado de diversas formas, desde o treinamento de modelos enormes em clusters na nuvem até a execução local de modelos 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 mais recente
Se você ainda não tiver feito isso, faça o download e instale o Android Studio 4.1 ou uma versão mais recente enquanto treina seu modelo do TensorFlow Lite.
O que você vai aprender
- Como treinar seu próprio classificador de imagens personalizadas usando o TensorFlow Lite Model Maker.
- Como usar o Android Studio para importar o modelo do TensorFlow Lite e integrar o modelo personalizado a 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 imagem do TensorFlow para identificar flores.
Licença: sem custo financeiro
2. Treinar um reconhecedor de flores usando o Colab
Antes de começar o treinamento de modelo, faça o download e instale o Android Studio 4.1 ou 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 Git que contém 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 Android Structure
Instalar o Android Studio 4.1 ou mais recente
Se você ainda não tiver feito isso, 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 . Após o carregamento, selecione "Open an Existing project" neste pop-up:
- No seletor de arquivos, escolha
TFLClassify/build.gradle
no diretório de trabalho.
- Você vai receber uma mensagem "Gradle Sync" pop-up, na primeira vez que você abrir o projeto, perguntando sobre o uso do wrapper do Gradle. Clique em "OK".
- Ative o modelo de desenvolvedor e a depuração USB em seu telefone se ainda não tiver feito isso. Essa configuração é feita apenas uma vez. Siga estas instruções.
- Quando o projeto e o smartphone estiverem prontos, execute em um dispositivo real selecionando
TFL_Classify.start
e pressionando o botão de execução na barra de ferramentas:
- Agora permita que a demonstração do Tensorflow acesse sua câmera:
- Você verá a tela a seguir no seu smartphone com números aleatórios no lugar de onde os resultados reais serão exibidos.
5. Adicionar o TensorFlow Lite ao app Android
- Selecione o módulo
start
no explorador de projetos no lado esquerdo:
- Clique com o botão direito do mouse no módulo
start
ou emFile
e depois emNew
>Other
>TensorFlow Lite Model
- Selecione o local do modelo em que você já fez o download do
FlowerModel.tflite
treinado personalizado.
- Clique em
Finish
. - Você verá o seguinte no final. O FlowerModel.tflite foi importado e mostra informações de alto nível sobre o modelo, incluindo entrada / saída, bem como alguns exemplos de código para você começar.
6. Opcional: como verificar 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 usá-lo em seu projeto Android para se lembrar de trabalhos futuros. Para adicionar itens de tarefas, use os comentários de código e digite a palavra-chave TODO
. Para acessar a lista de tarefas, você pode:
- Uma ótima maneira de saber o que vamos fazer é dar uma olhada na lista de tarefas. Para fazer isso, selecione
View
na barra de menus superior >Tool Windows
>TODO
- Por padrão, ele lista todos os TODOs em todos os módulos, o que o torna um pouco confuso. Podemos classificar apenas os TODOs iniciais clicando no botão group by na lateral do painel TODO e escolha
Modules
- Expanda 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)
...
}
- No método de análise do analisador CameraX, precisamos converter a entrada da câmera
ImageProxy
em umBitmap
e criar um objetoTensorImage
para 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:
- Classifique os resultados de maneira decrescente por probabilidade no atributo
score
, com a maior probabilidade primeiro. - Pegue os resultados Top-K, conforme definido pela constante
MAX_RESULT_DISPLAY
. Você tem a opção de variar o valor dessa variável para obter 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
Recognition
prontos para serem consumidos porRecyclerView
usando a 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))
}
...
}
- Comente ou exclua as linhas abaixo, 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.start
e pressionando o botão de execução na barra de ferramentas:
- Você verá a seguinte tela no seu smartphone com números aleatórios no lugar de onde os resultados reais serão exibidos:
8. Opcional: acelerar a inferência com o delegado da GPU
O TensorFlow Lite oferece suporte a 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 com um mecanismo de delegação e é bastante fácil de usar.
- Abra build.gradle no módulo
start
ou clique em "TODO 5" na lista e adicione a seguinte dependência:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- Volte para o arquivo MainActivity.kt ou clique em "TODO" na lista. Substitua a iniciação simples de flowerModel pelo seguinte: acesse uma instância da lista de compatibilidade de GPUs e inicialize a GPU dependendo se ela é uma das GPUs compatíveis listadas. Caso contrário, inicie quatro linhas de execução de 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 usá-lo 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.start
e pressionando o botão de execução na barra de ferramentas:
9. Próximos passos
Aqui estão alguns links para mais informações:
- Teste outros modelos do TFLite compatíveis com a vinculação de modelos de ML do tfhub.dev.
- Saiba mais sobre o TFLite nos documentos em tensorflow.org e no repositório de códigos (links em inglês).
- Teste alguns outros modelos pré-treinados do TFLite, incluindo um detector de hotword de fala e uma versão de resposta inteligente no dispositivo.
- Para saber mais sobre o TensorFlow em geral, consulte nossos documentos de primeiros passos.