
# <center> Experiencia Nº3: Deep Learning & IoT </center>
<center>
<SIGLA> - <Nombre Asignatura> <br>
<Semestre> <br>
<Fecha>
</center>
## Introducción
<div style="text-align: justify">
<p>
DL (Deep Learning | Aprendizaje profundo) es una técnica de ML (Machine Learning | Aprendizaje automático) que utiliza un grafo de computación como arquitectura base para recibir datos de entrada [x] y transformarlos en una salida [y=f(x)]
Una de las características más importantes de este tipo de arquitectura es la posibilidad de modificar la función de transformación f(x) variando los parámetros presentes dentro del grafo de computación, por ejemplo, se puede aumentar el peso de conexión existente en la unión de dos nodos (en adelante, neuronas). Del mismo modo, se puede distribuir la configuración de las neuronas, aumentar conexiones entre estas y agregar nuevas capas intermedias, todo esto con el propósito de adaptarse de mejor manera a los datos de entrada (dataset) y de esta forma, obtener un modelo de aprendizaje que sea representativo del fenómeno en la etapa de inferencia.
¿Qué características posee una arquitectura IoT que podrían ser útiles para la creación de modelos de Deep Learning?, ¿En qué fase se encuentran las mayores ventajas?
</p>
</div>
## Objetivos
### 1. Objetivo Principal:
> Comprender el potencial rol que ocupa una arquitectura IoT en la creación de modelos de Deep Learning.
### 2. Objetivos Secundarios:
> Introducir los conceptos básicos de IoT utilizando la placa de desarrollo Arduino nano 33 BLE Sense como sensor de bajo consumo.
> Programar, compilar y configurar placas de desarrollo vía Arduino IDE.
> Programar, compilar y configurar modelos de Deep Learning utilizando TensorFlow Lite.
> Entrenar modelos de Deep Learning para predicción en tiempo real.
> Ejecutar modelos de Deep Learning en placa de desarrollo Arduino Nano 33 BLE Sense.
## Materiales
* 1 Placa Arduino nano 33 BLE Sense
* 1 cable USB A - Micro USB
* Notebook con puerto USB A
## Plataformas
* Arduino IDE [https://www.arduino.cc/en/software]
* Google Colaboratory [https://colab.research.google.com/?hl=es]
## Marco Teórico
1. **Distribución Sensores Arduino nano 33 BLE Sense**
<center>

</center>
<center>
<p>
<font size="2px"> Fuente: https://store-usa.arduino.cc/products/arduino-nano-33-ble-sense-with-headers
</font>
</p>
</center>
2. **Arquitectura básica de una Red Neuronal Artificial (ANN)**
<p style="text-align: justify;">
Deep Learning se considera como un campo de estudio del Machine Learning que le da a las computadoras la capacidad de aprender sin ser programadas explícitamente. En particular, una red neuronal artificial (ANN) de tipo Feed Forward (FF) utiliza un grafo de computación para adaptar los pesos de conexión en cada neurona y, de esta forma, “aprender” de los datos de entrada.
</p>
<center>

</center>
<p style="text-align: justify;">
<font size="2px"> Fuente: https://docs.arduino.cc/tutorials/nano-33-ble-sense/edge-impulse & Ñanculef. (2020). Arquitectura Básica de Redes Neuronales. UTFSM, v1, 18.
</font>
</p>
## Procedimiento empírico
**1. Configurar placa de desarrollo en Arduino IDE**
> - [ ] **Abrir software Arduino IDE**
> - [ ] **Conectar la placa Arduino nano 33 BLE Sense al ordenador**
> - [ ] **Dentro del software ir a “Herramientas/Placa/Gestor de Tarjetas”**
> - [ ] **En la nueva ventana emergente buscar “nano 33 ble sense”***
> - [ ] **Instalar la última versión de “Arduino Mbed OS Nano Boards” (Sólo si no esta previamente instalada)**
> - [ ] **Cerrar la ventana y comprobar que en la ruta [Herramientas/Placa/Arduino Mbed OS Nano Boards] se encuentre seleccionada la placa “Arduino Nano 33 BLE”**
> - [ ] **Si sigue la ruta “Herramientas/Obtener información de la placa” debe ver una ventana emergente parecida a la imágen inferior**
<center>

</center>
<p><b>1.1</b></p>
<div style="margin-bottom: 22px; padding-left: 5px; border: solid 1px; background: lightgreen;">
Entregue una captura de pantalla con la información de su placa.
</div>
**2. Primeros pasos: Hello World**
<p style="text-align: justify">
Hello World es un script de prueba en Arduino IDE diseñado como ejemplo inicial de la librería TensorFlow Lite. Su principal función es poder compilar una red neuronal Feed Forward (FF) precompilada para predecir el valor de la función trigonométrica SIN(x) dado un x de entrada.
</p>
> - [ ] **Para poder ejecutar un modelo de Deep Learning pre entrenado en la placa Arduino nano 33 BLE sense, es necesario obtener este modelo desde cero. Para ello, se utilizará el documento anexo a este ejercicio proporcionado por su ayudante.**
> - [ ] **Siga las instrucciones de este anexo para obtener un código hexadecimal que representa el modelo pre entrenado requerido.**
> - [ ] **Una vez obtenido este modelo, ingrese a Arduino IDE e instale la librería “Arduino_TensorFlowLite” en la ruta “Herramientas/Administrar Bibliotecas”**
> - [ ] **En la ruta “Archivo/Ejemplos/Arduino_TensorFlowLite” Abra el ejemplo “hello_world”, se abrirá una ventana con el código fuente.**
> - [ ] **Para poder editar este ejemplo, guarde el script como una copia (Archivo/Guardar Como)**
> - [ ] **Reemplace el código hexadecimal presente en la pestaña “model.cpp” por el código obtenido en el documento anexo.**
> - [ ] **Guarde los cambios realizados y cargue el script en la placa de desarrollo presionando el ícono “⇨” de la esquina superior izquierda.**
> - [ ] **Abra el monitor serie presionando la lupa de la esquina superior derecha.**
**2.1 ¿Qué se observa en el monitor serial?, ¿Que representa?, ¿Para qué podría ser útil?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **Ahora abra el Serial plotter en la ruta “Herramientas/Serial Plotter”, se abrirá una ventana.**
**2.2 ¿Qué se observa en el serial plotter?, ¿Que representa?, ¿Para qué podría ser útil?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
**2.3 Estime visualmente, ¿Cuál es el delay existente entre la predicción obtenida desde la red neuronal y su representación en el serial plotter?**
**a) 1 segundo
b) 2 segundos
c) Casi instantáneamente (milisegundos)
d) más de 2 segundos**
**2.4 Estime visualmente desde el serial plotter, ¿Donde se puede observar el error de predicción de los valores obtenidos por la red neuronal?**
**a) En los valores de la abscisa (eje x)
b) En la frecuencia de la gráfica
c) En la suavidad de la curva
d) En el tamaño de la gráfica**
**2.5**
<div style="margin-top: 10px; margin-bottom: 22px; padding: 10px; border: solid 1px; background: lightgreen;">
Entregue una captura de pantalla de su serial plotter y del monitor serial
</div>
**2.6**
<div style="margin-top: 10px; margin-bottom: 22px; padding: 10px; border: solid 1px; background: lightgreen;">
Entregue el código hexadecimal del modelo pre entrenado generado en el documento anexo.
</div>
**3. Reconocimiento de gestos: Simple Gesture Recognition**
<p style="text-align: justify">Simple gesture recognition es un script de la librería AIfES diseñado para entrenar una red neuronal y predecir tres gestos realizados por el usuario. En esta ocasión, se simularán tres gestos detallados en la tabla inferior. Para una mayor efectividad en el proceso de entrenamiento, se recomienda completar estos gestos en menos de un segundo de duración y de la forma más prolija posible.</p>
<center>

</center>
> - [ ] **Para crear un clasificador de gestos, ingrese a Arduino IDE e instale la librería “AIfES for Arduino” en la ruta “Herramientas/Administrar Bibliotecas”**
> - [ ] **En la ruta “Archivo/Ejemplos/AIfES for Arduino/1_Nano_33_BLE_Sense” Abra el ejemplo “2_simple_gesture_recognition”, se abrirá una ventana con el código fuente.**
> - [ ] **Cargue el script en la placa de desarrollo presionando el ícono “⇨” de la esquina superior izquierda.**
> - [ ] **Tome su placa Arduino Nano 33 BLE Sense y realice el primer gesto. (Es importante que el gesto no dure más de un segundo y que al finalizar el movimiento la placa quede estática en la posición final del gesto)**
> - [ ] **Repita el mismo gesto otras cuatro veces, observe la información entregada por el monitor serial.**
> - [ ] **Repita los pasos anteriores para capturar los gestos 2 y 3.**
> - [ ] **Una vez capturado todos los gestos, verá en el monitor serial como se entrena la red neuronal pre diseñada para el experimento, espere al mensaje “Training finished”.**
> - [ ] **Llegó la etapa de predicción (clasificación), realice el gesto 1 usando su placa Arduino nano 33 BLE Sense.**
**3.1 ¿Qué pasa en el monitor serial?, ¿Tiene sentido lo obtenido? Explique**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
**3.2 ¿Cuál gesto ha recibido mayor porcentaje?, ¿Por qué? Explique**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **Ahora realice los gestos 2 y 3.**
**3.3 ¿Qué varía en el monitor serial?, ¿Por qué? Explique**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
**3.4**
<div style="margin-top: 10px; margin-bottom: 22px; padding: 10px; border: solid 1px; background: lightgreen;">
Entregue el output generado en el monitor serial, asegúrese de haber predecido correctamente los 3 gestos al menos una vez.
</div>
**4. Detección inteligente de colores: Color Detection**
<p style="text-align: justify">Color detection es un script que nos permite poder capturar la data de tres colores diferentes y utilizar esta información para poder entrenar una red neuronal artificial. La idea es poder predecir el grado de similitud de un objeto particular hacia estos tres colores previamente definidos.</p>
> - [ ] **Para crear un clasificador inteligente de colores ingrese a Arduino IDE e instale la librería “AIfES for Arduino” en la ruta “Herramientas/Administrar Bibliotecas” (solo si no está previamente instalada)**
> - [ ] **En la ruta “Archivo/Ejemplos/AIfES for Arduino/1_Nano_33_BLE_Sense” Abra el ejemplo “0_color_detection”, se abrirá una ventana con el código fuente.**
> - [ ] **Cargue el script en la placa de desarrollo presionando el ícono “⇨” de la esquina superior izquierda.**
> - [ ] **Abra el monitor serie presionando la lupa de la esquina superior derecha.**
> - [ ] **Utilizando el sensor de color de su placa Arduino Nano 33 BLE Sense, capture la data acercando el sensor al color rojo.**
<center>

</center>
**4.1 ¿Qué pasa en el monitor serial?, ¿Tiene sentido lo obtenido? Explique**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **Realice el mismo procedimiento para los restantes colores.**
<center>

</center>
> - [ ] **Después de capturar los colores, el script comienza a entrenar la red neuronal.**
**4.2 ¿Cuántas Epochs utilizó el script para entrenar el dataset?, ¿Cuál es el último valor de Loss?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **Finalizado el entrenamiento, se puede utilizar el clasificador. Escanee con su placa alguno de los siguientes colores según su preferencia.**
<center>

</center>
**4.3 ¿Qué output arroja el monitor serial al escanear un color?, ¿Tiene coherencia? Explique.**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
**4.4 Responda según su intuición, ¿Qué significan el/los atributo(s) observado(s)?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **Ahora escanee un objeto cercano de color similar a los trabajados previamente.**
**4.5 ¿Tiene coherencia los valores obtenidos?, ¿Se puede decir que la red neuronal predice correctamente? Fundamente.**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
**4.6 Estime visualmente, ¿Cuál es el delay existente entre el escaneo de un color y la predicción realizada por la red neuronal?**
**a) Casi instantáneamente (milisegundos)
b) 1 segundo
c) 2 segundos
d) más de 2 segundos**
**4.7**
<div style="margin-top: 10px; margin-bottom: 22px; padding: 10px; border: solid 1px; background: lightgreen;">
Entregue el output generado en el monitor serial, asegúrese de haber predecido correctamente los 3 colores al menos una vez.
</div>
**5. Detección inteligente de Voz: Micro Speech**
<p style="text-align: justify">
Micro Speech es un script de la librería TensorFlow Lite que detecta palabras claves en el discurso, en esta oportunidad, se configura para poder detectar los monosílabos ingleses “Yes” & “No”.
</p>
> - [ ] **Para crear un detector inteligente de Voz ingrese a Arduino IDE e instale la librería “Arduino_TensorFlowLite” en la ruta “Herramientas/Administrar Bibliotecas” (solo si no está previamente instalada)**
> - [ ] **En la ruta “Archivo/Ejemplos/Arduino_TensorFlowLite” Abra el ejemplo “micro_speech”, se abrirá una ventana con el código fuente.**
> - [ ] **Cargue el script en la placa de desarrollo presionando el ícono “⇨” de la esquina superior izquierda.**
> - [ ] **Abra el monitor serie presionando la lupa de la esquina superior derecha.**
> - [ ] **Cuando el naranja de la placa Arduino nano 33 BLE Sense esté parpadeando significa que se encuentra en “modo escucha” para detectar las palabras claves “Yes/No”, dejará de predecir cuando el led naranja se encienda sin parpadear.**
> - [ ] **En modo escucha, diga la palabra “No” (/noou/) cerca de su placa Arduino Nano 33 BLE Sense. (Si es necesario intente varias veces)**
**5.1 Cuando se detecta la palabra “No”, ¿De qué color se enciende el Led RGB?**
**a) Verde
b) Azul
c) Rojo
d) Amarillo**
**5.2 ¿Qué mensaje arroja el monitor serial cuando se detecta la palabra clave “No”?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **En modo escucha, diga la palabra “Yes” (/ieees/) cerca de su placa Arduino Nano 33 BLE Sense. (Si es necesario intente varias veces)**
**5.3 Cuando se detecta la palabra “Yes”, ¿De qué color se enciende el Led RGB?**
**a) Verde
b) Azul
c) Rojo
d) Amarillo**
**5.4 ¿Qué mensaje arroja el monitor serial cuando se detecta la palabra clave “Yes”?**
<div style="background: Moccasin; border: solid 1px; padding: 25px; margin-bottom: 20px">
</div>
> - [ ] **En modo escucha, diga una palabra totalmente diferente cerca de su placa Arduino Nano 33 BLE Sense. (Si es necesario intente varias veces)**
**5.5 Cuando no se detectan palabras claves (“unknown”), ¿De qué color se enciende el Led RGB?**
**a) Verde
b) Azul
c) Rojo
d) Amarillo**