Diferència entre revisions de la pàgina «Classificació de gestos emprant la placa IoT-02»
m |
|||
(Hi ha 30 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 1: | Línia 1: | ||
− | = Instal·lació de l''''edge-impulse-data-forwarder''' = | + | [[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 = | ||
+ | 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: | ||
+ | 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 [https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/IoT-02_mpu6050_dataForwarder/IoT-02_mpu6050_dataForwarder.ino IoT-02_mpu6050_dataForwarder.ino] | ||
+ | |||
+ | 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''' | ||
+ | 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 [https://github.com/jordibinefa/IoT-02/blob/master/codes/python/machineLearning/imu.csv 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 [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 10: | 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
Contingut
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