Criando um aplicativo em Flutter para classificar imagens (gato e cachorro) com Teachable Machine (TensorFlow)

Notas de aula do prof. Kleber de Oliveira Andrade

Kleber Andrade
Flutter — Comunidade BR
6 min readMar 30, 2020

--

Tom M. Mitchell forneceu uma definição mais formal amplamente citada: “Diz-se que um programa de computador aprende pela experiência E, com respeito a algum tipo de tarefa T e performance P, se sua performance P nas tarefas em T, na forma medida por P, melhoram com a experiência E.” Esta definição das tarefas envolvidas no aprendizado de máquina é dada de forma fundamentalmente operacional, ao invés de cognitiva, seguindo a proposta de Alan Turing em seu artigo “Computadores e inteligência”, em que a pergunta “As máquinas são capazes de pensar?” seja substituída pela pergunta “As máquinas são capazes de fazer o que (nós como entidades pensantes) podemos fazer?”

Teachable Machine

Machine Learning e a Inteligência Artificial estão na ordem do dia, parecendo não haver nada que não lhes dê uso. No entanto, o que são exactamente estas coisas? E é aí que este Teachable Machine dá uma ajuda.

Criado para ser utilizado de forma fácil em salas de aula, este Teachable Machine da Google permite que rapidamente se possam construir modelos de machine learning e ver o seu resultado. Por exemplo, podemos usá-lo para aprender a distinguir entre fotos de pessoas e de animais, objetos, posições (do corpo ou da cabeça), ou até sons.

Em todos os casos o processo e sempre o mesmo, arranjar exemplos dos casos a diferenciar, treinar o sistema, e aplicá-lo.

Criando um projeto no Teachable Machine

Iremos neste projeto, trabalhar com classificação de imagens.

Passo 1: criar classes (rótulos) para um grupo de imagens. Neste nosso pequeno exemplo, iremos criar duas classes Cães e Gatos. Para facilitar nossa vida, iremos utilizar uma base de dados pronta (kaggle cats and dogs), mas poderíamos tirar nossas próprias fotos ou até mesmo pega-las na internet.

  • Mude o nome da classe 1 para Gato e clique no upload para fazer upload das imagens de treinamento para os gatos.
  • Mude o nome da classe 2 para Cachorro e clique no upload para fazer upload das imagens de treinamento para os cachorros.

Passo 2: Definir os parâmetros de treinamento e iniciar o treino.

  • Vamos utilizar os seguintes parâmetros para treinar
  • Depois clique em Train Model (pode ir tomar um café pois vai demorar)

É possível analizar os resultados em tempo real clicando em Under the hood.

  • Neste treino, podemos observar uma precisão de 98% para reconhecer os gatos e 97% para reconhecer os cachorros.
  • Também podemos ver no primeiro gráfico como ficou a precisão das classes ao longo das 50 temporadas, não tendo alterações após a 15ª época. Ou seja, poderiamos ter executado somente 16 temporadas para chegar no mesmo resultado;
  • No segundo gráfico observamos que após 15ª época, os testes começam a falhar, porém a taxa de perdas de treinamento diminui e se estabiliza, neste momento, falamos que a rede neural esta decorando as amostras, ou seja, quando mais ela demorar, menos ela vai conseguir generalizar para imagens não apresentadas.

Passo 3: Testar e exportar o modelo

  • Clique em Export Model e faça download do modelo (Floating Point) clicando em Download my model

Salve seu projeto (Menu lateral esquerdo → Save Project to Drive) para conseguir acessar no futuro, caso queira fazer outras mudanças.

Criando o aplicativo

Abra o Visual Studio Code, e abra a paleta de comandos (Ctrl + Shift + P) e digite: Flutter: New Project

  • Digite o nome do projeto Flutter (teachable_ml);
  • Selecione a pasta para criar o projeto Flutter;

Estrutura do projeto

O diagrama abaixo apresenta as comunicações do nosso aplicativo.

  • HomePage: é classe que apresentar uma interface visual para o usuário interagir;
  • Controller: todo o controle do aplicativo esta dividido nas classes CameraHelper, TFLiteHelper e meclado com a HomePage;
  • TFLiteResult: descreve a estrutura de dados utilizada pelo plugin tflite.

Por isso, dentro do projeto teremos um diretório chamado lib, e a arvore de arquivos deve ser como a apresentada abaixo:

Dependências

No arquivo pubspec.yaml adicione as seguintes dependências para este projeto

Programa Principal

Vamos atualizar o arquivo main.dart

Classe TFLiteResult

Crie a classe TFLiteResult (lib → models → tflite_result.dart), que utilizaremos para armazenar a resposta do classificador de imagens.

Esta classe é baseada na documentação do Plugin TFLite:

Criando Componentes

Sempre que possível, iremos criar alguns componentes para facilitar o desenho das telas e também para reutilizar componentes em outros projetos.

Classe CameraHelper

Crie a classe CameraHelper (lib → components → camera_helper.dart), que servirá para capturar uma foto da câmera e devolver um arquivo. Para conhecer mais é só estudar o plugin ImagePicker que estamos utilizando.

Classe TFLiteHelper

Crie a classe TFLiteHelper (lib → components → tflite_helper.dart), que utilizaremos para carregar o modelo treinador e classificar as fotos. Para conhecer mais é só estudar o plugin Tflite que estamos utilizando

Para carregarmos o modelo, vamos precisar realizar algumas etapas:

  • Crie uma pasta chamada assets no projeto e adicione os arquivos que fez download após o treinamento (labels.txt e model_unquant.tflite).
  • Agora precisamos abrir o arquivo android →app →build.gradle e adicionar o aaptOptions e trocar a versão mínima do sdk.

Classe HomePage (View)

Crie a classe HomePage (lib → pages → home_page.dart), que utilizaremos para desenhar apresentar o resultado e a foto tirada pelo usuário quando precionar o botão flutuante.

Resultados

Agora, aperte F5 para iniciar a depuração do projeto

Selecione um emulador existente ou crie um novo se for necessário. Se seu celular estiver plugado no computador e com o modo desenvolver ativado, você poderá rodar o aplicativo direto no celular.

Vale ressaltar que qualquer foto tirada, ela deverá ser classificada em Gato ou Cachorro (só temos duas classes), ou seja, se você tirar a foto da cadeira, da tv, do sofá, ela será classificada em gato ou cachorro também.

O código completo pode ser baixado aqui.

Espero que tenham gostado, deixem seus comentários a baixo e um forte abraço!

Desafio

  1. Defina pelo menos três tipos de objetos que deseja reconhecer e prepare sua base de dados; Quanto mais imagens dos objetos melhor, mas cuidado com as outras informações das imagens (objetos, pessoas e etc);
  2. Crie um projeto novo no Teachable Machine, crie suas classes e faça upload das imagens; Treine, faça download do seu modelo e adicione ao projeto;
  3. Quando clicar para tirar fotos, eu gostaria de poder escolher entre câmera ou galeria de imagens. Estude mais a fundo o plugin ImagePicker (exemplo de uso);
  4. Altere o tema do seu aplicativo — já fizemos isso várias vezes; Teste seu aplicativo para ver se ele reconhece os objetos;
  5. Escrever um relatório explicando de no máximo 2 páginas, explicando o resultado da sua classificação de imagens;

--

--

Kleber Andrade
Flutter — Comunidade BR

Expert Developer of Robot, Games, Artificial Intelligence. Languages C/C++, Python, Java and C#