Detector de linguagem TinyML baseado em Edge Impulse e Arduino
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
Ferramentas e máquinas necessárias
| ||||
|
Aplicativos e serviços online
| ||||
| ||||
|
Sobre este projeto
Visão geral
A ideia deste projeto é criar um classificatório de linguagem, utilizando uma rede neural / deep learning implementada em um microcontrolador. O dispositivo identificará uma palavra para os idiomas italiano, inglês e França. As palavras a serem reconhecidas são " si "para o italiano," oui "para os franceses, e" sim "para o inglês. O dispositivo está ouvindo continuamente e assim que uma das 3 palavras for reconhecida, surge a bandeira do idioma associado.
O projeto é baseado nos dois componentes principais:o microcontrolador Arduino Nano 33 BLE Sense e a plataforma de desenvolvimento Edge Impulse Studio.
A implementação do projeto seguiu estas etapas:
- Amostragem / criação do conjunto de dados
- Projete o modelo
- Treinamento do modelo
- Testando o modelo
- Personalize para o hardware
- Implantação do modelo e sua personalização
- Construa o dispositivo final (o hardware em torno do modelo).
Amostragem / Criação do conjunto de dados
O conjunto de dados é composto pela gravação de 3 palavras (oui, si, sim) globalmente com duração aproximada de 30 minutos (10 minutos para cada palavra).
Para cada palavra foi criado um arquivo de som contínuo, onde a mesma palavra foi repetida continuamente, então usando o aplicativo Audacity o arquivo foi dividido em vários arquivos cada um com a duração de um segundo. Cada arquivo contém um exemplo da palavra.
Esses arquivos foram carregados para o impulso do edge e rotulados de acordo com a palavra.
Além desses arquivos, outro conjunto de arquivos de gravação com a duração de 1 segundo foi carregado e rotulado como ruído de fundo.
Globalmente, os dados de treinamento foram compostos por 33 minutos (10 minutos para cada palavra e 3 minutos para o ruído de fundo)
Projete o modelo
O modelo foi implementado aproveitando a plataforma de impulso de borda, onde a maioria dos algoritmos necessários já estavam definidos e diminuídos.
A primeira etapa para criar o modelo é transformar o som em uma série temporal. Em seguida, a série temporal é particionada com um tamanho de janela de tempo predefinido.
(Esta primeira transformação é mostrada no lado vermelho da imagem abaixo).
A segunda etapa é utilizar a técnica de processamento de sinais, neste caso o MFCC (Mel Frequency Cepstral Coefficients), para extrair as feições das séries temporais que melhor caracterizam cada uma das 4 classes (3 palavras + fundo).
Abaixo um exemplo da transformação MFCC e seus coeficientes.
A convolução da série temporal e os coeficientes são usados para alimentar redes neurais. Finalmente, a saída das redes neurais fornece uma probabilidade de pertencer a cada classe.
Abaixo, uma visão geral da implementação da rede neural e seus desempenhos de classificação.
Treinamento - Personalize para o Arduino Nano 33 BLE Sense
Para o treinamento e para a personalização do modelo final, uma nova opção está disponível no Edge Impulse Studio chamada " EON Tuner ". Ele permite escolher a arquitetura ideal para um aplicativo de aprendizado de máquina embarcado.
Ele executa muitas instâncias de modelos possíveis em paralelo, cada instância com uma configuração diferente (técnica digital de sinal diferente e arquiteturas de redes neurais diferentes).
Esta opção requer apenas algumas informações para ser executada:
- O " Alvo "que representa o tipo de modelo (neste caso" Spotting de palavras-chave ")
- O hardware em que o aplicativo é executado (neste caso " Arduino Nano 33 BLE Sense (Cortex-M4F 64 MHz) ".
Para cada instância, ele fornece algumas métricas de desempenho de classificação, o tempo que leva para o cálculo, a quantidade de memória RAM e o espaço do sistema de arquivos usado no sistema de arquivos do microcontrolador.
Para este projeto selecionamos as 5 melhores instâncias para a acurácia da classificação e delas foi escolhida a mais rápida.
Teste
O teste foi realizado através da coleta de um novo conjunto de arquivos do gravador e verificação da qualidade da classificação.
Uma vez que foi verificado que a classificação estava correta. Passamos para a próxima etapa da implementação, a implantação final.
Implantação
A implantação graças ao estúdio de impulso de borda foi bastante direta.
Foi selecionada a opção de biblioteca Arduino entre as opções de implantação. Isso nos dá um arquivo arduino C padrão do modelo, que pode ser personalizado para nossas necessidades.
Uma vez concluída a construção pelo edge-boost, um arquivo zip é criado e baixado na máquina local, bastando para isso ser importado no Arduino Ide para a customização final.
Código
O código está disponível no link. O código é baseado no código baixado do Edge-Impulse com poucas personalizações, listado abaixo.
1. Foi adicionada a biblioteca Adafruit_PWMServoDriver.h para conduzir os servos anexados às bandeiras.
2. Foi definida a função servos_selector para coordenar os servos de acordo com os resultados da classificação.
void servos_selector (int iter) {
time_now =millis ();
delta =time_now - time_was;
if (delta> 2000) {
time_was =time_now;
switch (iter) {
case 0:
pwm.setPWM (0, 0, 350);
delay (500);
pwm.setPWM ( 0, 0, 200);
pwm.setPWM (1, 0, 200);
pwm.setPWM (2, 0, 200);
quebrar;
caso 1:
pwm.setPWM (1, 0, 350);
Serial.println ("2222");
atraso (500);
pwm.setPWM (0, 0, 200 );
pwm.setPWM (1, 0, 200);
pwm.setPWM (2, 0, 200);
quebrar;
caso 2:
pwm .setPWM (2, 0, 350);
Serial.println ("333");
atraso (500);
pwm.setPWM (0, 0, 200);
pwm.setPWM (1, 0, 200);
pwm.setPWM (2, 0, 200);
quebrar;
}
}
}
3. Finalmente, foi adicionada uma condição IF que invoca o servos_select função baseada em " result.classification "objeto.
for (size_t ix =0; ix ei_printf ("% s:% .5f \ n", result.classification [ix] .label,
result.classification [ix] .value);
}
#if EI_CLASSIFIER_HAS_ANOMALY ==1
ei_printf ("pontuação de anomalia:% .3f \ n", result.anomaly);
#endif
print_results =0;
}
if (result.classification [1] .value> 0,80) {
servos_selector (0);
}
else if (result.classification [2] .value> 0,80) {
servos_selector (1);
}
else if (result.classification [3] .value> 0,80) {
servos_selector (2);
}
}
Circuitos elétricos
O circuito elétrico é baseado no microcontrolador Arduino Nano 33 BLE Sense e está utilizando um PCA9685 para drivers de 3 servos.
A carga de trabalho PCA9685 é suportada por uma bateria externa de 9v.
Isso é tudo.
Código
código
https://github.com/EnzoCalogero/Tensorflow_Lite_embeded/tree/main/nano_sense_EdgeImpulse/language_detection/nano_ble33_sense_microphone_continuousPeças personalizadas e gabinetes
Esquemas
languagedetection_9RxXhRX5sj.fzzProcesso de manufatura
- Jogo Arduino Gyroscope com MPU-6050
- Dados digitais Arduino
- Homem de Ferro
- Encontre-me
- Controle do umidificador Arduino
- Sonar usando arduino e exibição no IDE de processamento
- MobBob:DIY Arduino Robot Controlado por Smartphone Android
- Arduino Audio Reactive Desk Light
- NeoMatrix Arduino Pong
- Joystick Arduino