Classificació de gestos emprant la placa IoT-02

De binefa.com
La revisió el 19:03, 13 des 2023 per Jordi Binefa (discussió | contribucions)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca
Acceleròmetre / giroscopi MPU-6050 connectat a la placa IoT02

Instal·lació d'eines d'aprenentatge automàtic (machine learning) i tensorflow emprant Python

Es pot fer que totes les eines necessàries funcionin sense necessitat de crear un entorn virtual. Si teniu altres aplicacions funcionant en Python potser no us interessa haver de substituir paquets instal·lats amb pip per versions prèvies, per a poder fer compatibles totes les eines.

Una eina molt estesa per a crear entorns virtuals en Python és Anaconda. Si no teniu instal·lat Anaconda, podeu fer la instal·lació.

En cas de tenir actiu conda, desactiveu-ho:

conda deactivate

Feu un entorn per a treballar amb tensorflow:

conda create -n ml tensorflow
conda activate ml
pip install everywhereml

per a sortir de l'entorn conda:

conda deactivate

Captació de les dades

Connecteu la placa MPU-6050 a la Placa IoT-02. Pugeu el codi IoT-02_mpu6050_dataForwarder.ino

Canvieu el port de comunicacions (a Linux /dev/ttyUSB0) d'aquest tros del codi collector02.py per adaptar-lo al vostre port sèrie (per exemple COM3 a Windows):

   imu_collector = SerialCollector(
       port='/dev/ttyUSB0', 
       baud=115200, 
       start_of_frame='IMU:', 
       feature_names=['ax', 'ay', 'az', 'gx', 'gy', 'gz']
   )
   imu_dataset = imu_collector.collect_many_classes(
       dataset_name='ContinuousMotion', 
       duration=30
   )

Activeu l'entorn 'ml' (machine learning / aprenentatge automàtic) del conda:

conda activate ml

Us ha de sortir (ml) a l'esquerra del terminal. Executeu el programa collector02.py (amb la modificació del nom del port de comunicacions al vostre sistema operatiu. Per defecte hi ha /dev/ttyUSB0). Per a fer la captació de les dades he anomenat quatre estats gestuals (quiet: placa quasi quieta. amunt-avall: movent la placa amunt i avall. esquerra-dreta: movent la placa a esquerra i dreta. cercle: movent en cercle la placa):

(ml) $ python collector02.py 
This is an interactive data capturing procedure.
Keep in mind that as soon as you will enter a class name, the capturing will start, so be ready!
Which class are you going to capture? (leave empty to exit) quiet
31it [00:30,  1.01it/s]                                                                                 
Captured 1805 samples
Is this class ok? (y|n) y
Which class are you going to capture? (leave empty to exit) amunt-avall
31it [00:30,  1.03it/s]                                                                                 
Captured 1771 samples
Is this class ok? (y|n) y
Which class are you going to capture? (leave empty to exit) esquerra-dreta
31it [00:30,  1.03it/s]                                                                                 
Captured 1777 samples
Is this class ok? (y|n) y
Which class are you going to capture? (leave empty to exit) cercle
31it [00:30,  1.02it/s]                                                                                 
Captured 1794 samples
Is this class ok? (y|n) y
Which class are you going to capture? (leave empty to exit) 
Are you sure you want to exit? (y|n) y

i genera l'arxiu imu.csv (exemple d'arxiu imu.csv generat).

Principi de l'arxiu imu.csv:

(ml) $ head imu.csv 
ax,ay,az,gx,gy,gz,target,target_name
0.1,0.08,9.71,-0.01,-0.05,-0.07,0.0,quiet
0.14,-0.07,9.64,-0.0,-0.06,-0.06,0.0,quiet
0.12,-0.1,9.6,-0.02,-0.05,-0.06,0.0,quiet
0.11,-0.04,9.65,-0.02,-0.05,-0.06,0.0,quiet
0.09,0.0,9.7,-0.01,-0.05,-0.06,0.0,quiet
0.12,-0.02,9.66,-0.02,-0.05,-0.05,0.0,quiet 
0.14,-0.02,9.69,-0.01,-0.06,-0.06,0.0,quiet
0.1,-0.02,9.64,-0.01,-0.06,-0.06,0.0,quiet
0.09,-0.04,9.64,-0.02,-0.05,-0.05,0.0,quiet

Final de l'arxiu imu.csv:

(ml) $ tail imu.csv
0.05,1.05,9.84,0.02,-0.24,0.66,3.0,cercle
0.01,1.3,10.63,0.08,-0.21,0.7,3.0,cercle
-0.06,1.5,10.86,0.05,0.03,0.67,3.0,cercle
-0.08,1.65,10.44,0.06,0.29,0.61,3.0,cercle
0.05,1.58,9.56,-0.02,0.45,0.56,3.0,cercle
0.1,0.84,8.74,-0.07,0.36,0.46,3.0,cercle
0.49,0.77,8.32,-0.01,0.05,0.53,3.0,cercle
-0.1,0.92,9.93,0.09,-0.26,0.43,3.0,cercle
-0.03,1.17,10.75,0.26,-0.29,0.46,3.0,cercle
0.13,1.34,10.8,0.27,-0.09,0.38,3.0,cercle

Si l'arxiu imu.csv ja existeix es visualitza el resum de les dades enregistrades al tornar a executar collector02.py:

(ml) $ python collector02.py 
                ax           ay           az           gx           gy           gz       target
count  7147.000000  7147.000000  7147.000000  7147.000000  7147.000000  7147.000000  7147.000000
mean      0.126964    -0.001574     9.631492    -0.016372    -0.059793    -0.079418     1.498111
std       1.517042     0.885516     1.053995     0.248000     0.157644     0.412540     1.121298
min      -7.180000    -2.770000     4.330000    -1.230000    -0.990000    -1.490000     0.000000
25%      -0.590000    -0.640000     9.480000    -0.100000    -0.110000    -0.250000     0.000000
50%       0.140000     0.040000     9.650000    -0.020000    -0.050000    -0.120000     1.000000
75%       0.480000     0.490000     9.810000     0.060000    -0.010000     0.120000     3.000000
max       6.070000     3.390000    14.180000     1.190000     0.690000     1.240000     3.000000

Generació de codi per l'Arduino IDE

A l'executar imu2arduinoIde.py (IMU to Arduino IDE) es generen dos arxius: Classifier.h i Pipeline.h (exemples de Classifier.h i Pipeline.h a partir de l'exemple imu.csv)

Aquests dos arxius es generen a una nova carpeta anomenada newArduinoIdeFiles que hauran de ser copiats al mateix directori que l'arxiu .ino

Arxiu IoT-02_IMU_Classify_by_text.ino emprant Classifier.h i Pipeline.h generats amb l'arxiu imu.csv

Arxiu IoT-02_IMU_Classify_by_led.ino que detecta el gest i l'identifica amb un led de color.

Bibliografia

Gesture Classification by Eloquent Arduino

Gesture Classification with Esp32 and TinyML by João Vitor Yukio Bordin Yamashita