Como começar a usar o aprendizado de máquina no Arduino

Tempo de leitura: 11 minutes

O Arduino tem a missão de tornar o aprendizado de máquina simples o suficiente para qualquer pessoa usar. Temos trabalhado com a equipe do TensorFlow Lite nos últimos meses e estamos ansiosos para mostrar o que temos feito juntos: trazer o TensorFlow Lite Micro para o Arduino Nano 33 BLE Sense. Neste artigo, mostraremos como instalar e executar vários novos exemplos do TensorFlow Lite Micro que agora estão disponíveis no Arduino Library Manager.

O primeiro tutorial abaixo mostra como instalar uma rede neural na placa Arduino para reconhecer comandos de voz simples.

Exemplo 1: Executando o exemplo de inferência pré-treinado de micro_speech.

 

A seguir, apresentaremos um tutorial mais aprofundado que você pode usar para treinar seu próprio modelo de reconhecimento de gesto personalizado para Arduino usando TensorFlow no Colab. Este material é baseado em um workshop prático ministrado por Sandeep Mistry e Don Coleman, cuja versão atualizada já está online.

Exemplo 2: treinando seu próprio modelo de classificação de gestos.

Se você tiver experiência anterior com o Arduino, poderá fazer com que esses tutoriais funcionem em algumas horas. Se você for totalmente novo em microcontroladores, pode demorar um pouco mais.

Estamos entusiasmados em compartilhar alguns dos primeiros exemplos e tutoriais e ver o que você construirá a partir daqui. Vamos começar!

Observação: os projetos a seguir são baseados no TensorFlow Lite para Microcontroladores, que atualmente é experimental no repositório TensorFlow. Este ainda é um campo novo e emergente!

 

Microcontroladores e TinyML

Microcontroladores, como os usados nas placas Arduino, são sistemas de computador autocontidos de baixo custo, com chip único. Eles são os computadores invisíveis embutidos em bilhões de dispositivos do dia a dia, como wearables, drones, impressoras 3D, brinquedos, panelas elétricas de arroz, plugues inteligentes, e-scooters, máquinas de lavar. A tendência de conectar esses dispositivos faz parte do que é conhecido como Internet das Coisas.

Arduino é uma plataforma e comunidade de código aberto focada em tornar o desenvolvimento de aplicativos de microcontroladores acessível a todos. A placa que estamos usando aqui tem um microcontrolador Arm Cortex-M4 rodando a 64 MHz com 1 MB de memória Flash e 256 KB de RAM. Isso é minúsculo em comparação com a nuvem, PC ou celular, mas razoável para os padrões do microcontrolador.

Arduino Nano 33 BLE Sense board é menor do que um chiclete

Existem razões práticas pelas quais você pode querer espremer ML em microcontroladores, incluindo:

  • Função – desejar que um dispositivo inteligente atue de forma rápida e local (independente da Internet).
  • Custo – conseguindo isso com hardware simples e de baixo custo.
  • Privacidade – não querer compartilhar todos os dados do sensor externamente.
  • Eficiência – fator de forma de dispositivo menor, coleta de energia ou vida útil da bateria mais longa.

Há um objetivo final que estamos construindo e que é muito importante:

  • O aprendizado de máquina pode tornar os microcontroladores acessíveis a desenvolvedores que não têm experiência em desenvolvimento integrado

No lado do aprendizado de máquina, existem técnicas que você pode usar para ajustar modelos de rede neural em dispositivos com restrição de memória, como microcontroladores. Uma das etapas principais é a quantização dos pesos do ponto flutuante para números inteiros de 8 bits. Isso também tem o efeito de tornar a inferência mais rápida para calcular e mais aplicável a dispositivos de menor clock.

TinyML é um campo emergente e ainda há trabalho a fazer – mas o que é empolgante é que há um vasto espaço de aplicativos inexplorado por aí. Bilhões de microcontroladores combinados com todos os tipos de sensores em todos os tipos de lugares que podem levar a alguns aplicativos Tiny ML seriamente criativos e valiosos no futuro.

O que você precisa para começar

  • Uma placa Arduino Nano 33 BLE Sense
  • Um cabo Micro USB para conectar a placa Arduino à sua máquina desktop
  • Para programar sua placa, você pode usar o Arduino Web Editor ou instalar o Arduino IDE. Forneceremos mais detalhes sobre como configurá-los na seção a seguir

O Arduino Nano 33 BLE Sense tem uma variedade de sensores integrados, o que significa potencial para alguns aplicativos interessantes do Tiny ML:

  • Voz – microfone digital
  • Movimento – IMU de 9 eixos (acelerômetro, giroscópio, magnetômetro)
  • Ambientais – temperatura, umidade e pressão
  • Luz – brilho, cor e proximidade do objeto

Ao contrário do Arduino Uno clássico, a placa combina um microcontrolador com sensores integrados, o que significa que você pode lidar com muitos casos de uso sem hardware ou fiação adicional. A placa também é pequena o suficiente para ser usada em aplicações finais, como wearables. Como o nome sugere, ele possui conectividade Bluetooth LE para que você possa enviar dados (ou resultados de inferência) para um laptop, aplicativo móvel ou outras placas BLE e periféricos.

Dica: Sensores em um pendrive USB

Conectar a placa BLE Sense via USB é uma maneira fácil de capturar dados e adicionar vários sensores a computadores de placa única sem a necessidade de fiação ou hardware adicional – uma boa adição a um Raspberry Pi, por exemplo.

 

Exemplos do TensorFlow Lite para Microcontroladores

Os exemplos de inferência para TensorFlow Lite para microcontroladores agora estão empacotados e disponíveis por meio do gerenciador de biblioteca do Arduino, tornando possível incluí-los e executá-los no Arduino com alguns cliques. Nesta seção, mostraremos como executá-los. Os exemplos são:

  • micro_speech – reconhecimento de voz usando o microfone integrado
  • magic_wand – reconhecimento de gesto usando o IMU integrado
  • person_detection – detecção de pessoa usando uma câmera ArduCam externa

Para mais informações sobre os exemplos, você pode dar uma olhada na fonte no repositório do TensorFlow. Os modelos nesses exemplos foram treinados previamente. Os tutoriais abaixo mostram como implantá-los e executá-los em um Arduino. Na próxima seção, discutiremos o treinamento.

 

Como executar os exemplos usando o editor da web Arduino Create

Depois de conectar seu Arduino Nano 33 BLE Sense à sua máquina desktop com um cabo USB, você poderá compilar e executar os seguintes exemplos do TensorFlow na placa usando o editor da web Arduino Create:

Compilando um exemplo da biblioteca Arduino_TensorFlowLite

 

Concentre-se no exemplo de reconhecimento de voz: micro_speech

Uma das primeiras etapas com uma placa Arduino é fazer o LED piscar. Aqui, faremos isso de uma forma diferente, usando o TensorFlow Lite Micro para reconhecer palavras-chave de voz. Possui um vocabulário simples de “sim” e “não”. Lembre-se de que este modelo está sendo executado localmente em um microcontrolador com apenas 256 KB de RAM, então não espere precisão de nível de “assistente de voz” comercial – ele não tem conexão com a Internet e cerca de 2.000 vezes menos RAM local disponível

Observe que a placa também pode ser alimentada por bateria. Como o Arduino pode ser conectado a motores, atuadores e muito mais, isso oferece potencial para projetos controlados por voz.

Executando o exemplo micro_speech
Executando o exemplo micro_speech

 

Como executar os exemplos usando o IDE Arduino

Como alternativa, você pode usar try os mesmos exemplos de inferência usando o aplicativo Arduino IDE.

Primeiro, siga as instruções na próxima seção Configurando o IDE do Arduino.

No IDE do Arduino, você verá os exemplos disponíveis por meio do menu Arquivo > Exemplos > Arduino_TensorFlowLite no ArduinoIDE.

Selecione um exemplo e o sletch será aberto. Para compilar, fazer upload e executar os exemplos no quadro, clique no ícone de seta:

Para usuários avançados que preferem uma linha de comando, existe também o arduino-cli.

 

Treinamento de um modelo TensorFlow Lite Micro para Arduino

Classificação de gestos no Arduino BLE 33 Nano Sense, saída como Emojis
Classificação de gestos no Arduino BLE 33 Nano Sense, saída como Emojis

A seguir, usaremos o ML para permitir que a placa Arduino reconheça os gestos. Vamos capturar dados de movimento da placa Arduino Nano 33 BLE Sense, importá-los para o TensorFlow para treinar um modelo e implantar o classificador resultante na placa.

A ideia para este tutorial foi baseada no incrível Play Street Fighter de Charlie Gerard com movimentos corporais usando Arduino e Tensorflow.js. No exemplo de Charlie, a placa está transmitindo todos os dados do sensor do Arduino para outra máquina que realiza a classificação de gestos no Tensorflow.js. Levamos isso mais longe e “TinyML-ify” executando a classificação de gestos na própria placa Arduino. Isso é facilitado em nosso caso, pois a placa Arduino Nano 33 BLE Sense que estamos usando tem um processador Arm Cortex-M4 mais poderoso e uma IMU on-board.

Adaptamos o tutorial abaixo, portanto, nenhum hardware adicional é necessário – a amostragem começa na detecção de movimento da placa. A versão original do tutorial adiciona uma placa de ensaio e um botão de hardware para pressionar para acionar a amostragem. Se você quiser entrar em um pouco de hardware, pode seguir essa versão.

Configurando o Arduino IDE

Seguir as etapas abaixo configura o aplicativo Arduino IDE usado para fazer upload de modelos de inferência para sua placa e baixar dados de treinamento dela na próxima seção. Existem mais algumas etapas envolvidas do que usar o editor da Web Arduino Create porque precisaremos baixar e instalar a placa e as bibliotecas específicas no Arduino IDE.

  • Baixe e instale o Arduino IDE em https://arduino.cc/downloads
  • Abra o aplicativo Arduino que você acabou de instalar
  • No menu do Arduino IDE, selecione Ferramentas > Placa > Gerenciador de placas …
  • Procure por “Nano BLE” e pressione instalar na placa
  • A instalação demorará vários minutos
  • Quando terminar, feche a janela do gerenciador de placas

  • Agora vá para Ferramentas do gerenciador de bibliotecas > Gerenciar bibliotecas …
  • Procure e instale a biblioteca Arduino_TensorFlowLite
  • Em seguida, procure e instale a biblioteca Arduino_LSM9DS1:

  • Por fim, conecte o cabo micro USB à placa e ao computador
  • Escolha a placa Ferramentas> Placa> Arduino Nano 33 BLE
  • Escolha a porta Ferramentas> Porta> COM5 (Arduino Nano 33 BLE)
  • Observe que o nome da porta real pode ser diferente no seu computador

Existem guias de introdução e solução de problemas mais detalhados no site do Arduino se você precisar de ajuda.

 

Transmitindo dados do sensor da placa Arduino

Primeiro, precisamos capturar alguns dados de treinamento. Você pode capturar registros de dados do sensor da placa Arduino pelo mesmo cabo USB que usa para programar a placa com seu laptop ou PC.

As placas Arduino executam pequenos aplicativos (também chamados de sketches) que são compilados do código-fonte do Arduino no formato .ino e programados na placa usando o IDE do Arduino ou o Arduino Create.

Estaremos usando um sketch pré-fabricado IMU_Capture.ino que faz o seguinte:

  • Monitore o acelerômetro e o giroscópio da placa
  • Acione uma janela de amostra ao detectar uma aceleração linear significativa da placa
  • Amostra por um segundo a 119 Hz, gerando dados em formato CSV por USB
  • Faça um loop e monitore o próximo gesto

Os sensores que escolhemos para ler da placa, a taxa de amostragem, o limite de disparo e se transmitimos a saída de dados como CSV, JSON, binário ou algum outro formato, são todos personalizáveis no sketch em execução no Arduino. Também é possível realizar o pré-processamento e a filtragem do sinal no dispositivo antes que os dados sejam enviados para o log – isso podemos abordar em outro blog. Por enquanto, você pode apenas fazer o upload do sketch e começar a amostragem.

Para programar a placa com este esboço no IDE Arduino:

  • Baixe IMU_Capture.ino e abra-o no IDE do Arduino
  • Compile e envie para o quadro com Sketch > Upload

Visualizando o registro de dados do sensor ao vivo a partir da placa Arduino

Feito isso, agora podemos visualizar os dados saindo do quadro. Ainda não estamos capturando dados – isso é apenas para lhe dar uma ideia de como a captura de dados do sensor é acionada e qual é o tamanho de uma janela de amostra. Isso ajudará na coleta de amostras de treinamento.

  • No IDE do Arduino, abra Serial Plotter Tools > Serial Plotter
  • Se você receber um erro informando que a placa não está disponível, selecione novamente a porta:
  • Ferramentas > Porta > nome da porta (Arduino Nano 33 BLE)
  • Pegue a prancha e pratique seus gestos de soco e flexão
  • Você verá apenas uma amostra por uma janela de um segundo, então espere pelo próximo gesto
  • Você deve ver um gráfico ao vivo da captura de dados do sensor (veja GIF abaixo)
Arduino IDE Serial Plotter mostrará um gráfico ao vivo da saída de dados CSV de sua placa
Arduino IDE Serial Plotter mostrará um gráfico ao vivo da saída de dados CSV de sua placa

Quando terminar, certifique-se de fechar a janela Serial Plotter – isso é importante porque a próxima etapa não funcionará de outra forma.

 

Captura de dados de treinamento de gestos

Para capturar dados como um registro CSV para fazer upload para o TensorFlow, você pode usar Arduino IDE > Ferramentas > Serial Monitor para visualizar os dados e exportá-los para sua máquina desktop:

  • Reinicie a placa pressionando o pequeno botão branco na parte superior
  • Pegue a placa com uma mão (pegá-la mais tarde irá acionar a amostragem)
  • No IDE do Arduino, abra as Ferramentas do Monitor Serial> Monitor Serial
  • Se você receber um erro informando que a placa não está disponível, selecione novamente a porta:
  • Ferramentas > Porta > nome da porta (Arduino Nano 33 BLE)
  • Faça um gesto de soco com o quadro em sua mão (tenha cuidado ao fazer isso!)
  • Faça o soco para fora rápido o suficiente para acionar a captura
  • Retorne para uma posição neutra lentamente para não acionar a captura novamente
  • Repita a etapa de captura de gestos 10 ou mais vezes para coletar mais dados
  • Copie e cole os dados do console serial em um novo arquivo de texto chamado punch.csv
  • Limpe a saída da janela do console e repita todas as etapas acima, desta vez com um gesto de flexão em um arquivo chamado flex.csv
  • Faça o flex para dentro rápido o suficiente para acionar a captura, retornando lentamente a cada vez

Observe que a primeira linha de seus dois arquivos csv deve conter os campos aX, aY, aZ, gX, gY, gZ

Dica do Linux: se você preferir, pode redirecionar a saída do log do sensor do Arduino diretamente para um arquivo .csv na linha de comando. Com as janelas Serial Plotter / Serial Monitor fechadas, use:

$ cat /dev/cu.usbmodem[nnnnn] > sensorlog.csv

 

Treinamento no TensorFlow

Usaremos o Google Colab para treinar nosso modelo de aprendizado de máquina usando os dados que coletamos da placa Arduino na seção anterior. O Colab fornece um notebook Jupyter que nos permite executar nosso treinamento TensorFlow em um navegador da web.

O Colab irá guiá-lo através do seguinte:

  • Configurar ambiente Python
  • Faça upload dos dados punch.csv e flex.csv
  • Analise e prepare os dados
  • Construir e treinar o modelo
  • Converter o modelo treinado para TensorFlow Lite
  • Codifique o modelo em um arquivo de cabeçalho Arduino

A etapa final do colab é gerar o arquivo model.h para baixar e incluir em nosso projeto de classificador de gestos do IDE do Arduino na próxima seção:

Vamos abrir o bloco de notas no Colab e percorrer as etapas nas células – arduino_tinyml_workshop.ipynb

 

Classificação de dados IMU

Em seguida, usaremos o arquivo model.h que acabamos de treinar e baixar do Colab na seção anterior em nosso projeto Arduino IDE:

  • Abra IMU_Classifier.ino no Arduino IDE.
  • Crie uma nova guia no IDE. Quando perguntado, nomeie model.h

3. Abra a guia model.h e cole a versão que você baixou do Colab

4. Faça upload do sketch: Sketch > Upload

5. Abra o Monitor serial: Ferramentas > Monitor serial

6. Faça alguns gestos

7. A confiança de cada gesto será impressa no Monitor Serial (0 = baixa confiança, 1 = alta confiança)

Parabéns, você acabou de treinar seu primeiro aplicativo de ML para Arduino!

Para maior diversão, o exemplo Emoji_Button.ino mostra como criar um teclado USB que imprime um caractere emoji no Linux e macOS. Tente combinar o exemplo Emoji_Button.ino com o sketch IMU_Classifier.ino para criar um teclado emoji controlado por gestos 👊.

Conclusão

É um momento emocionante, com muito para aprender e explorar no Tiny ML. Esperamos que este blog tenha dado a você uma ideia do potencial e um ponto de partida para começar a aplicá-lo em seus próprios projetos. Informe-nos sobre o que você construiu e compartilhe com a comunidade do Arduino.

Para obter um histórico abrangente sobre TinyML e os aplicativos de exemplo neste artigo, recomendamos o novo livro de O’Reilly de Pete Warden e Daniel Situnayake “TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Microcontrollers”