Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

TinyML-taaldetector-gebaseerd op Edge Impulse &Arduino

Componenten en benodigdheden

Arduino Nano 33 BLE Sense
× 1
Nationale regelapparatuur PCA9685 8-kanaals 8W 12V FET-stuurprogramma proportionele klep Controller met I2C-interface
× 1
SG90 Micro-servomotor
× 3
9V batterijclip
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)

Apps en online services

Edge Impulse Studio
Arduino IDE
Autodesk Fusion 360

Over dit project

Overzicht

Het idee achter dit project is om een ​​taalclassificatie te maken, met behulp van een neuraal netwerk/deep learning geïmplementeerd in een microcontroller. Het apparaat identificeert één woord voor de talen Italiaans, Engels en Frankrijk. De te herkennen woorden zijn "si " voor de Italiaan, "oui " voor de Fransen, en "ja " voor het Engels. Het apparaat luistert continu en zodra een van de 3 woorden wordt herkend, verschijnt de vlag van de bijbehorende taal.

Het project is gebaseerd op de twee hoofdcomponenten, de Arduino Nano 33 BLE Sense-microcontroller en het ontwikkelingsplatform Edge Impulse Studio.

De projectimplementatie volgde deze stappen:

  • Het nemen van steekproeven/aanmaken van de dataset
  • Ontwerp het model
  • Het model trainen
  • Het model testen
  • Aanpassen voor de hardware
  • Implementatie van het model en de aanpassing ervan
  • Bouw het uiteindelijke apparaat (de hardware rond het model).

Monsters nemen/de dataset maken

De dataset bestaat uit de opname van de 3 woorden (oui, si, yes) die globaal ongeveer 30 minuten duurt (10 minuten voor elk woord).

Voor elk woord werd een doorlopend geluidsbestand gemaakt, waarbij hetzelfde woord voortdurend werd herhaald, en met behulp van de Audacity-toepassing werd het bestand opgesplitst in meerdere bestanden, elk met een duur van één seconde. Elk bestand bevat een voorbeeld van het woord.

Deze bestanden werden vervolgens geüpload naar edge impulse en gelabeld volgens het woord.

Naast deze bestanden is er nog een set opnamebestanden met een duur van 1 seconde geüpload en gelabeld als achtergrondruis.

Globaal bestonden de trainingsgegevens uit 33 minuten (10 minuten voor elk woord en de 3 minuten voor het achtergrondgeluid)

Ontwerp het model

Het model werd geïmplementeerd door gebruik te maken van het edge-impulsplatform, waar de meeste van de benodigde algoritmen al een kuiltje hadden gedefinieerd.

De eerste stap voor het maken van het model is om het geluid om te zetten in een tijdreeks. Vervolgens wordt de tijdreeks gepartitioneerd met een vooraf gedefinieerde tijdvenstergrootte.

(Deze eerste transformatie wordt getoond aan de rode kant van de afbeelding hieronder).

De tweede stap is het gebruik van signaalverwerkingstechniek, in dit geval de MFCC (Mel Frequency Cepstral Coefficients), om de kenmerken te extraheren uit de tijdreeksen die elk van de 4 klassen het beste karakteriseren (3 woorden + de achtergrond).

Hieronder een voorbeeld van de MFCC-transformatie en zijn coëfficiënten.

De convolutie van de tijdreeksen en de coëfficiënten wordt gebruikt om neurale netwerken te voeden. Ten slotte geeft de output van de neurale netwerken een kans om bij elke klasse te horen.

Hieronder een overzicht van de implementatie van het neurale netwerk en de classificatieprestaties.

Training - Aanpassen voor de Arduino Nano 33 BLE Sense

Voor de training en voor het aanpassen van het uiteindelijke model is er een nieuwe optie beschikbaar in de Edge Impulse Studio genaamd "EON Tuner ". Het maakt het mogelijk om de optimale architectuur te kiezen voor een embedded machine-learning applicatie.

Het voert veel exemplaren van mogelijke modellen parallel uit, elk exemplaar met een andere configuratie (verschillende digitale signaaltechniek en verschillende neurale netwerkarchitecturen).

Deze optie vereist slechts een paar informatie om te worden uitgevoerd:

  • Het "Doel " wat het modeltype vertegenwoordigt (in dit geval "Keyword Spotting ")
  • De hardware waarop de applicatie draait (in dit geval "Arduino Nano 33 BLE Sense (Cortex-M4F 64MHz) ".

Voor elke instantie geeft het de paar prestatiestatistieken van de classificatie, de tijd die nodig is voor de berekening, de hoeveelheid RAM en de bestandssysteemruimte die wordt gebruikt op het bestandssysteem van de microcontroller.

Voor dit project selecteerden we de 5 beste instanties voor de nauwkeurigheid van de classificatie en daaruit werd de snelste gekozen.

Testen

Het testen werd uitgevoerd door een nieuwe set recorderbestanden te verzamelen en de kwaliteit van de classificatie te controleren.

Zodra het was verifiëren dat de classificatie juist was. We zijn overgegaan naar de volgende stap van de implementatie, de uiteindelijke implementatie.

Implementatie

De implementatie dankzij de edge-impulse-studio was vrij eenvoudig.

Het is gekozen voor de Arduino-bibliotheekoptie uit de implementatieopties. Dat geeft een standaard arduino C-bestand van het model, dat kan worden aangepast aan onze behoeften.

Zodra het gebouw is voltooid door de edge-impuls, wordt een zip-bestand gemaakt en gedownload op de lokale machine, en het hoeft alleen maar te worden geïmporteerd in de Arduino Ide voor de uiteindelijke aanpassing.

Code

De code is beschikbaar via de link. De code is gebaseerd op de code die is gedownload van de edge-impulse met enkele aanpassingen, zoals hieronder vermeld.

1. Het was de bibliotheek Adafruit_PWMServoDriver.h . toevoegen voor het aandrijven van de servo's die aan de vlaggen zijn bevestigd.

2. Het werd gedefinieerd als de functie servos_selector om de servo's te coördineren volgens de classificatieresultaten.

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);
onderbreking;
geval 1:
pwm.setPWM(1, 0, 350);
Serial.println("2222");
vertraging(500);
pwm.setPWM(0, 0, 200 );
pwm.setPWM(1, 0, 200);
pwm.setPWM(2, 0, 200);
break;
geval 2:
pwm .setPWM(2, 0, 350);
Serial.println("333");
vertraging(500);
pwm.setPWM(0, 0, 200);
pwm.setPWM(1, 0, 200);
pwm.setPWM(2, 0, 200);
break;
}
}
}

3. Ten slotte is er een IF-voorwaarde toegevoegd die de servos_select . aanroept functie gebaseerd op de "result.classification " object.

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(" anomaliescore:%.3f\n", resultaat.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);
}
}

Elektrische circuits

Het elektrische circuit is gebaseerd op de microcontroller Arduino Nano 33 BLE Sense-microcontroller en gebruikt een PCA9685 om de 3 servo's aan te sturen.

De werklast van de PCA9685 wordt ondersteund door een externe batterij van 9v.

Dat is alles.

Code

code
https://github.com/EnzoCalogero/Tensorflow_Lite_embeded/tree/main/nano_sense_EdgeImpulse/language_detection/nano_ble33_sense_microphone_continuous

Aangepaste onderdelen en behuizingen

Schema's

taaldetectie_9RxXhRX5sj.fzz

Productieproces

  1. Arduino-gyroscoopspel met MPU-6050
  2. Arduino digitale dobbelstenen
  3. Iron Man
  4. Vind mij
  5. Arduino-luchtbevochtigerbediening
  6. Sonar met arduino en weergave op verwerkings-IDE
  7. MobBob:doe-het-zelf Arduino-robot bestuurd door Android-smartphone
  8. Arduino Audio Reactive Desk Light
  9. NeoMatrix Arduino Pong
  10. Arduino-joystick
  11. Stappenteller (Arduino 101)