Diferència entre revisions de la pàgina «Classificació de gestos emprant la placa IoT-02»

De binefa.com
Salta a la navegació Salta a la cerca
m
 
(Hi ha 21 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 +
[[Image:00gestos.png|center|thumb|Acceleròmetre / giroscopi MPU-6050 connectat a la placa IoT02]]
 +
 
= Instal·lació d'eines d'aprenentatge automàtic (''machine learning'') i ''tensorflow'' emprant Python =
 
= Instal·lació d'eines d'aprenentatge automàtic (''machine learning'') i ''tensorflow'' emprant Python =
Si no teniu instal·lat [https://www.anaconda.com/ Anaconda], feu-hi la instal·lació.
+
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 [https://www.anaconda.com/ Anaconda], podeu fer la instal·lació.
  
 
En cas de tenir actiu ''conda'', desactiveu-ho:
 
En cas de tenir actiu ''conda'', desactiveu-ho:
Línia 9: Línia 13:
 
  conda activate ml
 
  conda activate ml
 
  pip install everywhereml
 
  pip install everywhereml
 +
per a sortir de l'entorn conda:
 +
conda deactivate
  
Pugeu a la [[Placa IoT-02]] el codi [https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/IoT-02_mpu6050_dataForwarder/IoT-02_mpu6050_dataForwarder.ino IoT-02_mpu6050_dataForwarder.ino]
+
= Captació de les dades =
 
+
Connecteu la placa MPU-6050 a la [[Placa IoT-02]]. Pugeu el codi [https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/IoT-02_mpu6050_dataForwarder/IoT-02_mpu6050_dataForwarder.ino IoT-02_mpu6050_dataForwarder.ino]
python collector02.py
 
  
 +
Canvieu el port de comunicacions (a Linux '''/dev/ttyUSB0''') d'aquest tros del codi [https://github.com/jordibinefa/IoT-02/blob/master/codes/python/machineLearning/collector02.py 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'''  
 
  (ml) $ '''python collector02.py'''  
 
  This is an interactive data capturing procedure.
 
  This is an interactive data capturing procedure.
Línia 36: Línia 55:
 
  Are you sure you want to exit? (y|n) '''y'''
 
  Are you sure you want to exit? (y|n) '''y'''
  
i genera l'arxiu '''imu.csv'''
+
i genera l'arxiu '''imu.csv''' (exemple d'arxiu [https://github.com/jordibinefa/IoT-02/blob/master/codes/python/machineLearning/imu.csv imu.csv] generat).
  
 
Principi de l'arxiu '''imu.csv''':
 
Principi de l'arxiu '''imu.csv''':
Línia 62: Línia 81:
 
  -0.03,1.17,10.75,0.26,-0.29,0.46,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
 
  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:
+
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'''  
 
  (ml) $ python '''collector02.py'''  
 
                 ax          ay          az          gx          gy          gz      target
 
                 ax          ay          az          gx          gy          gz      target
Línia 74: Línia 93:
 
  max      6.070000    3.390000    14.180000    1.190000    0.690000    1.240000    3.000000
 
  max      6.070000    3.390000    14.180000    1.190000    0.690000    1.240000    3.000000
  
= Instal·lació de l''''edge-impulse-data-forwarder''' =
+
= Generació de codi per l'Arduino IDE =
 +
 
 +
A l'executar [https://github.com/jordibinefa/IoT-02/blob/master/codes/python/machineLearning/imu2arduinoIde.py imu2arduinoIde.py] (IMU to Arduino IDE) es generen dos arxius: '''Classifier.h''' i '''Pipeline.h''' ([https://github.com/jordibinefa/IoT-02/tree/master/codes/python/machineLearning/newArduinoIdeFiles exemples de Classifier.h i Pipeline.h] a partir de l'exemple [https://github.com/jordibinefa/IoT-02/blob/master/codes/python/machineLearning/imu.csv 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 [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_IMU_Classify_by_text IoT-02_IMU_Classify_by_text.ino] emprant Classifier.h i Pipeline.h generats amb l'arxiu imu.csv
 +
 
 +
Arxiu [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_IMU_Classify_by_led IoT-02_IMU_Classify_by_led.ino] que detecta el gest i l'identifica amb un led de color.
 +
<!-- = Instal·lació de l''''edge-impulse-data-forwarder''' =
 
Aquesta eina serveix per a publicar dades des de la placa fins al servidor d'[https://edgeimpulse.com/ Edge Impulse]
 
Aquesta eina serveix per a publicar dades des de la placa fins al servidor d'[https://edgeimpulse.com/ Edge Impulse]
  
Línia 85: Línia 113:
 
Un cop instal·lat, es pot executar des del terminal:
 
Un cop instal·lat, es pot executar des del terminal:
 
  edge-impulse-data-forwarder
 
  edge-impulse-data-forwarder
 +
-->
  
 
= Bibliografia =
 
= Bibliografia =

Revisió de 19:03, 13 des 2023

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