Visión artificial con la placa OpenVM Cam H7 Plus

Introducción

En este tutorial vamos a utilizar la placa OpenMV Cam H7 Plus para comenzar a realizar proyectos de visión artificial en MicroPython (Python para microcontroladores). El objetivo que han tenido los creadores del proyecto OpenMV es crear un placa de bajo coste que pretenda ser el “Arduino de la visión artificial”, es decir, la idea del proyecto OpenMV es obtener una experiencia similar a la que se tiene cuando se trabaja con proyectos con Arduino pero enfocado a la visión artificial. De hecho se han asociado con Arduino para que utilicen su IDE (OpenVM IDE) para programar varias placas Arduino en MicroPython (Nicla Vision, Portenta H7, Nano 33 BLE Sense, Nano RP2040).

Las características de la placa la podéis encontrar en la página oficial:

https://openmv.io/collections/products/products/openmv-cam-h7-plus

En este tutorial vamos a utilizar dos scripts que vienen como ejemplo en el OpenVM IDE para por una lado detectar colores y por otro lado para detectar caras de personas. Modificaremos un poco estos scripts para conectar la placa OpenVM Cam H7 Plus con el módulo Grove – 4-Digit Display mediante el puerto I2C. 

En el primer ejemplo haremos que detecte en un cubo Rubik de 3×3 cuántos cuadrados de color naranja existen en la cara del cubo que estamos mostrando a cámara.

En el segundo ejemplo haremos que detecte en una imagen cuántas caras de personas existen en dicha imagen. 

El número total de detecciones se mostrará en tiempo real en el display de 4 dígitos (módulo Grove)  que hemos conectado por I2C y también de forma visual en el OpenVM IDE.

Listado de componentes

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

Conexionado

Como hemos comentado en la introducción 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: Pinout OpenVM Cam H7 Plus

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

 

Programación

Para los dos ejemplos que vamos a realizar 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. Podéis descargar la librería desde el siguiente enlace:

https://github.com/mcauser/micropython-tm1637

Una vez descargada la librería cogeremos el archivo tm1637.py y la copiaremos en la memoria flash de la cámara (cuando conectamos la cámara al USB del ordenador aparecerá una unidad flash USB disponible como si de un pendrive se tratara).

Ejemplo 1: Detección de cuadrados de color naranja en un cubo rubik 3×3

En este ejemplo haremos que la cámara detecte en un cubo Rubik de 3×3 cuántos cuadrados de color naranja existen en la cara del cubo que estamos mostrando a cámara.

Para ello dentro del OpenVM IDE cargaremos y ejecutaremos el script del siguiente enlace:

https://github.com/avilmaru/openvm_cam_h7_plus_examples/tree/main/ejemplo1

Este script está basado en el ejemplo: single_color_rgb565_blob_tracking.py (en la versión 2.9.7 del OpenMV IDE se encuentra en Image Processing → Color Tracking).  

Podemos ajustar los parámetros del color que queremos detectar (en caso de que no detecte correctamente el color naranja)  ajustando los siguientes valores presentes en el script (los marcados en negrita):

thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds

                     (30, 100, -64, -8, -32, 32), # generic_green_thresholds

                     (0, 30, 0, 64, -128, 0)] # generic_blue_thresholds

 

Los parámetros están basados en el espacio de color LAB.

El espacio de color L*a*b*, también referido como CIELAB, es actualmente uno de los espacios de color más populares y uniformes usado para evaluar el color de un objeto. Este espacio de color es ampliamente usado porque correlaciona los valores numéricos de color consistentemente con la percepción visual humana.

Para ajustar y obtener los parámetros en este formato de un color concreto podéis usar esta página como ayuda: https://colorizer.org/

Ejemplo 2: Detección de rostros humanos presentes en una imagen.

En el segundo ejemplo haremos que detecte en una imagen cuántas caras de personas existen en dicha imagen. 

Para ello dentro del OpenVM IDE cargaremos y ejecutaremos el script del siguiente enlace:

https://github.com/avilmaru/openvm_cam_h7_plus_examples/tree/main/ejemplo2

Este script está basado en el ejemplo: face_detection.py (en la versión 2.9.7 del OpenMV IDE se encuentra en Machine learning → Haar Cascade).  

La detección de rostros funciona mediante el uso del detector de características Haar Cascade en una imagen.

El resultado de ambos ejemplos lo podéis ver en el siguiente vídeo:

Como podéis ver la utilización de esta placa junto con su IDE hace que sea muy sencillo realizar y ejecutar ejemplos de visión artificial al estilo Arduino. Como bien explica en el apartado de FAQS del proyecto OpenVM:

¿Cuánto tardas en hacer parpadear un LED en un Arduino? Bueno, instalas el IDE de Arduino en tu ordenador, conectas tu Arduino, abres un script de ejemplo y listo (menos de 5 minutos).

¿Cuánto tiempo se tarda en rastrear un objeto de color en una cámara OpenMV? Bueno, instalas OpenMV IDE en tu ordenador, conectas tu OpenMV Cam, abres un script de ejemplo y listo (menos de 5 minutos).

Pues esta es la idea que hay detrás del proyecto OpenVM, ser el “Arduino de la visión artificial” y tener una experiencia similar a la que se tiene cuando se trabaja con proyectos con Arduino. En este tutorial hemos visto dos ejemplos pero en el OpenVM IDE hay muchos más y os animo a que los probéis.