Como construir um aplicativo móvel de visão computacional no Flutter

Publicados: 2020-04-22

Os recursos de aprendizado de máquina tornaram-se obrigatórios nos aplicativos atuais. Eles podem melhorar a satisfação e dar ao seu público a experiência extraordinária de aplicativo que eles desejam. Graças às recentes otimizações de hardware e software, a execução de modelos de Machine Learning está migrando da nuvem para os próprios dispositivos móveis.

Isso tem um enorme impacto na experiência do usuário, removendo a latência de resposta e abordando problemas de privacidade. Quando decidimos criar o Planter, um aplicativo que ajuda os usuários a cuidar de suas plantas domésticas, sabíamos que o que poderia se destacar no mercado de aplicativos era a IA.

Nossa ideia foi adicionar a funcionalidade de reconhecer o tipo de planta da casa a partir de uma imagem, usando técnicas de visão computacional. Graças às otimizações do TensorFlow Lite do desempenho no dispositivo, o aplicativo pode executar nosso modelo de classificação apenas no dispositivo do usuário. Neste artigo, explicarei como preparar rapidamente um modelo de classificação de imagens e implantá-lo em um aplicativo desenvolvido com Flutter.

Construindo o Módulo de Aprendizado de Máquina no Flutter - Passo a Passo

Lidando com um problema de dados pequenos

A primeira etapa na construção de um modelo de Machine Learning é a coleta de dados. Para criar um conjunto de dados de treinamento, usamos o Google Images Downloader que nos permitiu baixar imagens de plantas de uma Pesquisa do Google, com direitos rotulados para reutilização comercial, com o seguinte script curto:

 $ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights rotulado para reutilização

Nosso conjunto de dados final consistiu em cerca de 70-170 imagens por espécie. Teria sido muito difícil preparar um modelo de classificação de imagens de bom desempenho a partir do zero com tão poucos dados.

Felizmente, existem algumas redes neurais artificiais pré-treinadas poderosas disponíveis publicamente que podem ser usadas para construir um classificador de imagem de alta precisão, mesmo que seu conjunto de dados consista em apenas cerca de cem exemplos para cada classe. Essa técnica de usar e modificar um modelo pré-treinado para um caso de uso específico é chamada de aprendizado de transferência.

Aumento de dados

Para tirar o máximo proveito de nosso conjunto de dados, usamos o pacote de pré-processamento ImageDataGenerator do keras, que gera lotes de imagens de tensor, aumentando-as dinamicamente. Usamos as seguintes transformações:

  • Invertendo as entradas horizontalmente: horizontal_flip = True
  • Definindo um valor de mudança de brilho do intervalo: intervalo_brilho = (0,75, 1,25)
  • Cisalhamento com a intensidade fornecida: shear_range = 15
  • Redimensionamento, multiplicando por um valor especificado: rescale=1./255
  • Aumentar e diminuir o zoom: zoom_range=0,4
  • Deslocando em qualquer direção: width_shift_range = 0,1, height_shift_range = 0,15
 train_datagen_augment =

           ImageDataGenerator(rotation_range = 30,

           horizontal_flip = Verdadeiro,

           intervalo_brilho = (0,75,1,25),

           intervalo_cisalhamento = 15,

           redimensionar=1./255,

           zoom_range=0,4,

           largura_deslocamento_intervalo = 0,1,

           height_shift_range = 0,15)

Treinamento

Usamos o NASNet-Mobile, uma rede neural convolucional treinada em mais de um milhão de imagens do conjunto de dados ImageNet. A arquitetura do NasNetMobile consiste em um conjunto de blocos construídos com células de rede neural.

Block é um módulo operacional que inclui transformações conhecidas de redes neurais de classificação de imagens, incluindo: convoluções normais, convoluções separáveis, max-pooling, média-pooling, mapeamento de identidade, etc. A rede foi treinada para atribuir a uma imagem 1 de 1000 categorias que incluem animais, flores e móveis. Como resultado, a rede 'aprendeu' representações ricas de recursos para uma ampla variedade de imagens.

Criamos nosso modelo seguindo os seguintes passos:

  • Remova a última camada da rede pré-treinada
  • Adicione um modelo convolucional no final da rede
  • Congele todas as camadas na rede combinada, exceto aquelas que vêm do modelo adicionado
  • Treine o modelo até que a precisão pare de melhorar
  • Descongele todas as camadas no último bloco convolucional congelado do modelo pré-treinado
  • Treine o modelo até que a precisão pare de melhorar
  • Repita os pontos 5 e 6 cinco vezes
  • Descongele todo o modelo e treine-o até que a precisão pare de melhorar

Avaliação do modelo

O modelo de classificação do Planter tenta atribuir um tipo de planta a uma planta de casa, com base em sua foto. O modelo retorna três tipos aos quais atribuiu as maiores probabilidades, dos quais o usuário pode escolher um. Durante a avaliação do modelo, usamos as duas métricas a seguir:

  • categórica_precisão,
  • top_k_categorical_accuracy (com k=3).

O gráfico a seguir apresenta a precisão categórica para cada época de treinamento do nosso modelo.

Precisão categórica para cada época de treinamento

A precisão categórica final para o conjunto de avaliação é 0,870 e a precisão categórica das 3 principais é 0,916. Esses resultados foram muito satisfatórios, levando em consideração o pequeno tamanho do conjunto de dados de treinamento utilizado.

Conversão de modelo

Se quisermos que um modelo keras seja usado em um aplicativo móvel, ele precisa ser convertido em um objeto FlatBuffer do TensorFlow Lite. Isso pode ser feito com o código mostrado no exemplo abaixo.

 importar tensorflow.lite como lite

keras_model_path = "model/keras_model"

tflite_model_path = "modelo/modelo.tflite"

model.save(keras_model_path)

conversor = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = converter.convert()

open(tflite_model_path, "wb").write(tflite_model)

Agora que tínhamos o modelo otimizado armazenado no caminho model/model.tflite, poderíamos usá-lo facilmente nos aplicativos móveis nativos, usando:

  • Core ML – para aplicativos iOS
  • Biblioteca de suporte do TensorFlow Lite Android – para aplicativos Android

Agora vou mostrar a você, com base em nossa experiência com o Planter, como usar esse modelo com o Flutter.

Por que Flutuar?

Flutter é um kit de ferramentas de interface do usuário de propriedade do Google. Ele foi criado para criar aplicativos compilados nativamente para dispositivos móveis, web e desktop a partir de uma única base de código. Se você está se perguntando se deve usar o Flutter, recomendo a leitura deste artigo, que é um estudo de caso do Topline da Abbey Road Studios desenvolvido em Flutter pela Miquido.

Podemos utilizar nosso modelo com a biblioteca tflite. É um plugin Flutter para acessar a API TensorFlow Lite. Ele suporta classificação de imagens, detecção de objetos, Pix2Pix, Deeplab e PoseNet nas plataformas iOS e Android.

Ícone de serviços de desenvolvimento de plataforma cruzada

Curioso sobre o desenvolvimento do Flutter?

Saber mais

Em nosso processo de desenvolvimento de aplicativos, tivemos que concluir as seguintes etapas:

  • Adicione tflite como uma dependência em nosso arquivo pubspec.yaml
  • Crie uma pasta de ativos e coloque um arquivo de etiqueta e um arquivo de modelo nela.
  • Em pubspec.yaml, adicione:
 ativos:

   - assets/labels.txt

   - assets/mobilenet_v1_1.0_224.tflite
  • Importe a biblioteca tflite:
 import 'pacote:tflite/tflite.dart';
  • Carregue o modelo e as etiquetas:
 String res = await Tflite.loadModel(

  modelo: "assets/model.tflite",

  marcadores: "recursos/rótulos.txt",

  numThreads: 1 // padrão para 1

);
  • Execute o modelo em uma imagem (faça uma previsão):
 var reconhecimentos = await Tflite.runModelOnImage(

        caminho: tfResizedImage.path, 

        padrão de imagem: 255,0, 

        numResultados: 3, 

        limite: 0,00001, 

        assíncrono: verdadeiro    

 );

A saída de previsão tem o formato mostrado no exemplo a seguir:

 [{confiança: 0,03441339731216431, índice: 46, rótulo: Vriesea splendens}, {confiança: 2,086162567138672e-7, índice: 7, rótulo: Aphelandra squarrosa}, {confiança: 1,4901161193847656e-7, índice: 19, rótulo: Fern arum }]
  • Recursos de lançamento:
 aguardar Tflite.close();

Resultados finais

Planter permite que você adicione uma planta com uma imagem à sua biblioteca. Você pode obter a imagem tirando uma foto de sua planta ou escolhendo uma da galeria do telefone. O modelo de classificação de plantas de casa incluído retorna três espécies reconhecidas com a maior probabilidade e as apresenta em uma lista.

Clicar em uma espécie o levará à visualização de resumo da planta, que contém um formulário pré-preenchido com sugestões de horários de irrigação e fertilização e algumas informações adicionais sobre a planta. No fluxo abaixo, você pode ver um exemplo em que uma Zamioculcas zamiifolia é reconhecida em uma imagem tirada com um celular com câmera.

Como funciona a Plantadeira
Plantadeira - sistema de reconhecimento
Como adicionar plantas no Planter

Mova seu aprendizado de máquina para dispositivos móveis!

Neste artigo, eu queria convencê-lo de que adicionar recursos de IA para o usuário em seu aplicativo móvel pode ser simples e rápido. Além disso, mover a execução do modelo para dispositivos móveis oferece aos usuários uma experiência agradável ao remover as latências de resposta da API. Também ajuda a garantir a segurança dos dados, pois não é necessário enviar dados para a nuvem.

Você pode se beneficiar muito usando o Flutter e sua capacidade de compilar código para aplicativos nativos iOS e Android ao mesmo tempo. Com pouco esforço, você pode destacar seu aplicativo no mercado e maximizar a retenção de público do seu aplicativo.

Pronto para o seu próximo projeto? Não hesite e entre em contato conosco!