Machine Learning con OpenVM Cam H7 Plus y Edge Impulse

Introducción

En el anterior tutorial vimos como utilizar la placa OpenVM Cam H7 Plus para crear un par de ejemplos de visión artificial de una forma sencilla:

https://mecatronicalab.es/vision-artificial-con-la-placa-openvm-cam-h7-plus/

En esta ocasión vamos a crear un modelo de Machine Learning utilizando la plataforma Cloud Edge Impulse. El Machine Learning o aprendizaje automático es una rama de la inteligencia artificial que permite que las máquinas “aprendan” (reconocimiento de patrones) sin ser expresamente programadas para ello. Utilizaremos el aprendizaje automático para construir un sistema que pueda reconocer objetos (clasificación de imágenes) a través de una cámara conectada a un microcontrolador (en nuestro caso con la placa OpenVM Cam H7 Plus).

¿Qué framework utiliza la plataforma Edge Impulse para entrenar los modelos de aprendizaje automático?. Según la información de su página Web (https://docs.edgeimpulse.com/docs/faq) utilizan una amplia variedad de herramientas, dependiendo del modelo de aprendizaje automático. Para las redes neuronales, normalmente usan TensorFlow y Keras, para los modelos de detección de objetos, usan TensorFlow con la API de detección de objetos de Google.

 

 

Software necesario

Para realizar este proyecto es necesario instalar el siguiente software:

  1. Instalar el OpenVM IDE: https://openmv.io/pages/download
  2. Crearnos una cuenta en la plataforma Cloud Edge Impulse (es gratis para desarrolladores): https://studio.edgeimpulse.com/signup
  3. Instalar Edge Impulse CLI: https://docs.edgeimpulse.com/docs/edge-impulse-cli/cli-installation

Listado de componentes

  • OpenVM Cam H7 Plus.
  • Módulo Grove – 4-Digit Display.
  • Cable Grove a 4 pines Dupont Macho.

Montaje

Vamos a conectar la placa OpenVM Cam H7 Plus con el módulo Grove – 4-Digit Display mediante el puerto I2C. Para ello conectaremos los pines de los diferentes módulos de la siguiente manera:

Placa OpenVM Cam H7 Plus Módulo Grove – 4-Digit Display
GND GND
3,3 V VCC
I2C SDA (Pin 5)  DIO
I2C SCL(Pin 4)  CLK

El pinout de la placa OpenVM Cam H7 Plus lo tenéis disponible en el siguiente enlace

Las características del  módulo Grove – 4-Digit Display lo teneis en el siguiente enlace:

Generando el modelo

Para crear el modelo nos vamos a basar en el tutorial ‘Adding sight to your sensors’ que explica Edge Impulse en su página Web.

En este tutorial vamos a realizar un modelo que pueda distinguir/clasificar 3 objetos. En nuestro caso estos objetos serán 3 imágenes que mostraremos en una tablet correspondientes al  número 1,  al número 2 y al número 3.

Cuando detecte y reconozca cualquiera de los objetos se mostrará en tiempo real el número presente en la imagen (1, 2 o 3) en el display de 4 dígitos (módulo Grove que hemos conectado por I2C). También lo veremos de forma visual en el OpenVM IDE.

Generando el Dataset

Para construir el dataset con el OpenVM IDE nos basaremos en el tutorial paso a paso explicado en el siguiente enlace.

Lo primero que tenemos que hacer para crear nuestro modelo es recolectar muchas imágenes (dataset) de los 3 objetos que queremos detectar así como imágenes de otros objetos que nada tengan que ver con éstos.  Estas imágenes le servirán al modelo para aprender y distinguir unos objetos de otros. Cuantas más imágenes se capturen mejor pero con unas 50 imágenes para este proyecto serán suficientes. Por tanto crearemos un dataset con:

  • 50 instantáneas de la tablet con la imagen del número 1.
  • 50 instantáneas de la tablet con la imagen del número 2.
  • 50 instantáneas de la tablet con la imagen del número 3.
  • 50 instantáneas de objetos que no tengan nada que ver con los 3 anteriores. Cuanto más variedad de objetos diferentes mejor.

Es importante tomar imágenes de los objetos que queremos detectar con diferentes ángulos y distancias, cuanto más variedad mejor.

Para crear el dataset utilizaremos la opción Herramientas → Editor de conjunto de datos → Nuevo conjunto de datos que se encuentra dentro del editor OpenVM IDE.

Esto abre el panel Editor de conjunto de datos‘ en el lado izquierdo y el script de captura de conjunto de datos ‘dataset_capture_script.py’ en el panel principal del OpenVM IDE.

Ahora crearemos 4 clases (opción ‘Nueva carpeta de clase’ del panel en el lado izquierdo): 

  • desconocido.class
  • numero1.class
  • numero2.class
  • numero3.class

Empezaremos a tomar fotos para las tres clases. Para ello:

  1. Clicamos en el icono Play para ejecutar el script  ‘dataset_capture_script.py’.
  2. Seleccionamos una de las clases haciendo clic en el nombre de la carpeta en el Editor de conjuntos de datos.
  3. Vamos tomando instantáneas haciendo clic en el botón ‘Captura de datos’ (icono de cámara del panel en el lado izquierdo).

Una vez tenemos todas las imágenes tenemos que enviarlas a la plataforma Cloud de Edge Impulse. Para ello podemos utilizar la opción  Herramientas → Editor de conjunto de datos → Exportar → Iniciar sesión en la cuenta Edge Impulse y cargue en el proyecto que se encuentra dentro del editor OpenVM IDE. Por desgracia a mi está opción no me funciona ya que me da el error “Error al crear el contexto SSL()”  pero no pasa nada porque tenemos más opciones para poder subir este dataset. En mi caso utilizaré la utilidad edge-impulse-uploader de la herramienta Edge Impulse CLI que previamente hemos instalado. Para ello abriremos una ventana del símbolo del sistema en nuestro ordenador y ejecutaremos la siguiente instrucción:

$ edge-impulse-uploader --format-openmv path_donde_se_encuentra_el_dataset

Nos pedirá las credenciales y el proyecto a donde se deberán guardar las imágenes (deberemos haber creado previamente dentro de Edge Impulse el proyecto) y automáticamente se subirán las imágenes.

En el siguiente enlace se detalla el procedimiento (apartado ‘Upload data from OpenMV datasets’) que acabamos de realizar:

Dentro de la plataforma Edge Impulse podemos ver que nuestro conjunto de datos ya aparece en la sección ‘Data acquisition’ de nuestro proyecto.

Como se puede apreciar los datos se han dividido automáticamente entre datos de entrenamiento y datos de prueba en una proporción aproximada de 80/20.

Creando el Impulso

Dentro de la plataforma Edge Impulse, un impulso toma los datos sin procesar, ajusta el tamaño de la imagen, usa un bloque de procesamiento para extraer características de la imagen y luego usa un bloque de aprendizaje para clasificar nuevos datos.

En nuestro caso seleccionaremos los bloques que la propia plataforma nos recomienda para este tipo de proyectos. Son los siguientes:

Configuración del bloque de procesamiento de imagen

Seleccionamos la opción ‘Image’ presente en el menú izquierdo que se encuentra dentro de la opción  ‘Impulse design para configurar el bloque de procesamiento.

Una vez dentro de la opción podemos ver los datos sin procesar en la parte superior de la pantalla (podemos seleccionar otros archivos a través del menú desplegable) y los resultados del procesamiento a la derecha (DSP Result). Podemos usar la opción para cambiar  la profundidad de color entre el modo ‘RGB’ y ‘Escala de grises’ aunque dejaremos la profundidad de color en ‘RGB’ . Haremos clic en ‘Save parameters’

Esta acción nos llevará a la pantalla que generará las características. Una vez dentro de esa pantalla hacemos clic en el botón verde Generate features  que hará que se generen las siguientes acciones:

  • Cambiar el tamaño de todos los datos.
  • Aplicar el bloque de procesamiento sobre todos estos datos.
  • Cree una visualización 3D de su conjunto de datos completo.

Configuración del modelo de transferencia de aprendizaje

Con todos los datos procesados, es hora de comenzar a entrenar una red neuronal. Las redes neuronales son un conjunto de algoritmos, modelados libremente según el cerebro humano, que están diseñados para reconocer patrones. La red que estamos entrenando aquí tomará los datos de la imagen como entrada e intentará asignarlos a una de las cuatro clases que hemos creado (numero1, numero2, numero3, desconocido). 

Seleccionamos la opción Transfer learning’ presente en el menú izquierdo que se encuentra dentro de la opción ‘Impulse design y una vez dentro de la pantalla hacemos clic en el botón ‘Start trainingpara empezar a entrenar la red neural. Antes debemos asegurarnos de tener las opciones de configuración de la red neuronal que nos aparecen en la pantalla con los siguientes valores:

  • Number of training cycles: 20.
  • Learning rate: 0.0005.
  • Validation set size: 20%.
  • Auto-balance dataset: desmarcado.
  • Data augmentation: marcado.
  • Transfer learning model: MobileNetV1 96×96 0.35 (modelo que aparece por defecto).

Una vez que termine de procesar ya tendremos el modelo entrenado y podremos ver el porcentaje del nivel de precisión que hemos obtenido (cuanto más grande sea este porcentaje mejor). En nuestro caso el nivel de precisión obtenido es del 100%.

 Validando el modelo

Con el modelo entrenado vamos a comprobar que tal funciona usando los datos de prueba (test). Recordemos que al cargar el dataset el conjunto de datos se dividió en una proporción aproximada de 80/20 entre datos de entrenamiento y datos de prueba. El modelo se entrenó solo con los datos de entrenamiento y lo que vamos a hacer ahora es usar los datos de prueba para validar qué tan bien funciona el modelo.

Para validar el modelo, iremos a la opción ‘Model testing’  (presente en el menú izquierdo) y veremos que en la pantalla aparece el listado de todas las imágenes de prueba. 

Podemos clasificar una imagen individual de las que aparecen en la lista (seleccionando dentro de los 3 puntitos que aparecen junto a la muestra la opción ‘Show classification’) o podríamos clasificar todas las imágenes con la opción ‘Classify all’. En nuestro caso las clasificaremos todas.

El resultado que nos ha dado ha sido excelente ya que hemos obtenido una precisión del 100%.

 Ejecutar el modelo en nuestro dispositivo

Ahora iremos a la opción del menú izquierdo ‘Deployment’  y exportaremos  el modelo como una librería y no como un firmware.

En el siguiente enlace podéis ver un tutorial de cómo exportar el modelo creado desde la plataforma Edge Impulse a nuestra OpenVM Cam H7 tanto como una librería como un firmware.

Para ello seleccionamos la biblioteca OpenMV y hacemos clic en el botón ‘Build’ que se encuentra en la parte inferior de la pantalla. 

Se generará un archivo .zip que contiene 3 archivos:  ‘trained.tflite’ (modelo creado), ‘labels.txt’  y ‘ei_image_classification.py’.

Para agregar el modelo a su nuestra cámara OpenMV Cam H7 Plus copiaremos los archivos ‘trained.tflite’ y ‘labels.txt’ en la unidad flash (unidad USB que se crea al conectar el dispositivo en el ordenador) de la  OpenMV Cam H7 Plus.

Utilizaremos la librería TM1637 de MicroPython de Mike Causer para poder usar fácilmente el módulo  Grove – 4-Digit Display (el cual usa el TM1637 LED driver) dentro de nuestro script. Por este motivo también copiaremos en la unidad flash el fichero ‘tm1637.py’ correspondiente a esta librería. Podéis descargar la librería desde el siguiente enlace.

Por último lo que haremos es abrir el script ‘ei_image_classification.py’ en el OpenMV IDE y ejecutarlo pero primero lo modificaremos para añadir el código necesario para que muestre en el módulo Grove – 4 Digit Display el número que ha detectado.

Podéis descargar el script ya modificado así como el modelo generado y las imágenes que hemos utilizado para ser detectadas y clasificadas en el siguiente enlace:

https://github.com/avilmaru/openvmcamh7plus_machinelearning

Al ejecutar el modelo podemos ver que detecta y clasifica perfectamente los 3 objetos (imágenes) al ponerlos enfrente de la cámara dando porcentajes de precisión de más del 90% (podéis ver el video asociado a este tutorial con todos los pasos aquí explicados y el resultado obtenido al ejecutar el modelo).

Como podemos ver el generar un modelo de Machine Learning para detectar y clasificar objetos con la OpenVM Cam H7 Plus junto con la plataforma Cloud Edge Impulse es realmente sencillo y nos brinda un montón de posibilidades para crear futuros proyectos utilizando esta tecnología. 

Si queréis ver como construir  un modelo de Machine Learning pero no para clasificar objetos si no para detectar dentro de una imagen cuántos objetos existen y en qué posición están podéis ver mi otro tutorial:

FOMO: Machine Learning con OpenVM Cam H7 Plus y Edge Impulse