Use la cámara OpenMV para comenzar rápidamente a aplicar aprendizaje automático a la detección de objetos

Por Jacob Beningo

Colaboración de Editores de DigiKey de América del Norte

La aplicación del aprendizaje automático (ML) para la detección y clasificación de objetos se está convirtiendo en una necesidad urgente dentro de la industria de sistemas integrados, especialmente para Internet de las cosas (IoT), seguridad, sistemas avanzados de asistencia a la conducción (ADAS) y sistemas basados en automatización industrial. Sin embargo, la detección de objetos es un tema complejo y el ML es relativamente nuevo, por lo que desarrollar aplicaciones de ML para detectar objetos puede ser difícil y complicado.

Por ejemplo, la detección de objetos ha requerido tradicionalmente que los desarrolladores aprendan un marco como OpenCV y compren miles de dólares en equipos informáticos para tener éxito. Como tales, los enfoques tradicionales para la detección de objetos y la visión artificial no solo requieren mucho tiempo, sino que también son caros.

Para los ingenieros que buscan aplicar ML para aplicaciones de detección de objetos y visión artificial sin la necesidad de convertirse en un experto en ML o gastar una pequeña fortuna en equipos, el módulo de cámara programable Python OpenMV H7 de SparkFun Electronics es una solución innovadora. El módulo está diseñado para ser un módulo tipo "Arduino" de bajo costo para el procesamiento y la detección de imágenes. Como tal, el ecosistema de módulos y software proporciona una solución única e interesante para permitir una fácil detección y clasificación de objetos utilizando ML en la forma de un módulo de bajo costo.

Este artículo presenta el módulo de cámara OpenMV H7 y muestra cómo los desarrolladores pueden comenzar a aplicar ML a la detección de objetos utilizando el conjunto de datos de imagen de visión por computadora CIFAR-10.

El módulo de cámara OpenMV H7

Con sus bibliotecas de software con muchas características, el módulo de cámara OpenMV H7 proporciona mucho para ayudar a un desarrollador a crear rápidamente una aplicación ML. Por ejemplo, los desarrolladores pueden usar la cámara OpenMV para la detección de rostros y ojos, e incluso para rastrear con precisión las pupilas. Se puede usar para crear manchas o marcadores que luego rastrean un color. Incluso hay ejemplos sobre cómo usar ML para detectar y rastrear objetos personalizados.

El módulo de cámara OpenMV H7 es una placa de desarrollo integrada única que incluye todos los componentes de hardware necesarios para la detección y clasificación de objetos basados en ML a un costo que es mucho menor que los sistemas tradicionales de visión artificial. El módulo es relativamente pequeño, mide solo 1.4 x 1.75 pulgadas (pulg.) e incluye:

  • Un microcontrolador de alta gama.
  • Un módulo de cámara integrado y reemplazable.
  • Conector de batería.
  • Microconector USB.
  • Led tricolor.
  • Un zócalo microSD (admite tarjetas de hasta 64 Gigabytes).
  • Expansión de entrada y salida (E/S).

Imagen del módulo de cámara SparkFun Electronics OpenMV H7.Figura 1: El módulo de cámara OpenMV H7 viene completamente integrado con todos los componentes necesarios para desarrollar e implementar rápidamente una aplicación de visión artificial con ML. (Fuente de la imagen: SparkFun Electronics)

La expansión de E/S proporciona a los desarrolladores una gama de características periféricas del microcontrolador (Figura 2). Estas características incluyen interfaces de comunicación como:

  • Transmisor receptor asíncrono universal (UART).
  • Interfaz periférica serial (SPI).
  • I2C.
  • CAN.

La expansión de E/S también incluye canales de control y datos para conducir servos, generar señales a través de un convertidor digital a analógico (DAC) o leer valores de sensores a través de un convertidor analógico a digital (ADC). Estas E/S de expansión hacen que el módulo OpenMV sea extremadamente interesante para aplicaciones de visión dentro de la automatización del hogar, la orientación del robot, la automatización industrial y los espacios de detección y seguimiento de objetos.

Tabla de configuraciones de pines del módulo de cámara SparkFun OpenMV H7Figura 2: El módulo de cámara OpenMV H7 viene con una gran cantidad de pines de E/S expandibles. Estos pines se pueden usar para controlar servomotores, sensores de muestra o para comunicarse con un módulo Wi-Fi para crear un dispositivo de IoT. (Fuente de la imagen: SparkFun)

El microcontrolador integrado es STM32F765VIT6 de STMicroelectronics, que incluye un procesador Arm Cortex-M7 en un LQFP de 100 pines. El procesador funciona a 216 megahercios (MHz) y tiene 2 megabytes (Mbytes) de Flash y 512 kilobytes (Kbytes) de RAM. El procesador es extremadamente capaz y está bien emparejado para aplicaciones de visión artificial debido a su unidad de punto flotante (FPU) de doble precisión y las instrucciones completas del procesador de señal digital (DSP). El microcontrolador también incluye un codificador JPEG basado en hardware que puede acelerar las aplicaciones de imágenes. El diagrama de bloques general para el STM32F765VIT6 se muestra en la Figura 3.

Diagrama de STMicroelectronics STM32F765VIT incluye 2 Mbytes de Flash, 512 Kbytes de RAMFigura 3: El STM32F765VIT incluye 2 Mbytes de Flash, 512 Kbytes de RAM y periféricos como codificación JPEG basada en hardware e instrucciones del DSP que lo hacen perfecto para aplicaciones de visión artificial. (Fuente de la imagen: STMicroelectronics)

El módulo de cámara OpenMV H7 es único porque admite varios módulos de cámara diferentes. Por ejemplo, si un desarrollador no quería usar la cámara integrada, que tiene una resolución de 640 x 480, un desarrollador podría cambiar a un módulo que admita el sensor de imagen MT9V034 de ON Semiconductor. El MT9V034 es un sensor de imagen digital de píxeles activos semiconductores de metal - óxido complementario (CMOS) de formato VGA de 1/3 de ancho que incluye un obturador global y un modo de alto rango dinámico (HDR). El sensor tiene una resolución de imagen de 752 x 480, y está diseñado para funcionar en un amplio rango de temperatura de -30 °C a +70 °C. ON Semiconductor proporciona una placa de desarrollo para este sensor de imagen, el MT9V034C12STCH-GEVB (Figura 4).

Imagen de la placa de desarrollo ON Semiconductor MT9V034C12STCH-GEVBFigura 4: El MT9V034C12STCH-GEVB es una placa de desarrollo para el sensor de imagen MT9V034 que incluye una lente incorporada para acelerar el desarrollo y las pruebas. (Fuente de la imagen: ON Semiconductor)

Desarrollo de una primera aplicación de detección de objetos

El desarrollo de aplicaciones para el módulo de cámara OpenMV H7 se realiza a través de entorno completo de desarrollo integrado (IDE) OpenMV, que proporciona una interfaz Python para el desarrollo de aplicaciones (Figura 5). Con Python, no hay necesidad de conocer un lenguaje de programación de bajo nivel. De hecho, no solo el script está escrito en Python, el módulo de cámara OpenMV H7 ejecuta MicroPython de forma nativa. Esto proporciona a los desarrolladores una forma extremadamente fácil de comenzar a escribir aplicaciones de visión artificial y ejecutar inferencias de ML con un mínimo esfuerzo.

Imagen de la interfaz del IDE de OpenMV basada en Python (haga clic para ampliar)Figura 5: El IDE de OpenMV proporciona una interfaz basada en Python para desarrollar código de aplicación para el módulo de cámara OpenMV H7. Luego, la aplicación se envía como un script al módulo de la cámara, que ejecuta MicroPython. (Fuente de la imagen: Beningo Embedded Group)

Una de las primeras cosas que hace un desarrollador una vez que está configurado es ejecutar el hello_world.py básico, que contiene el código que se muestra en el Listado 1. El script Python muestra a un desarrollador cómo habilitar la cámara OpenMV y tomar instantáneas continuamente. Esto permite al desarrollador obtener video en vivo y medir la velocidad de cuadros. La velocidad de fotogramas puede variar mientras está conectado a una PC desde tan solo 25 fotogramas por segundo (fps) a alrededor de 60 fps. La aplicación se ejecuta simplemente al conectar la cámara OpenMV al IDE de OpenMV usando el botón de conexión en la esquina inferior izquierda de la pantalla, y luego al hacer clic en el botón verde de ejecución.

Copiar # Hello World Example # # ¡Bienvenido al IDE de OpenMV! Haga clic en el botón de flecha verde de ejecución a continuación para ejecutar el script.
importar sensor, imagen, tiempo   sensor.reset ()                      # Restablecer e inicializar el sensor.
sensor.set_pixformat (sensor.RGB565) # Establecer el formato de píxel en RGB565 (o ESCALA DE GRISES) sensor.set_framesize (sensor.QVGA)   # Establecer el tamaño del cuadro en QVGA (320x240) sensor.skip_frames (tiempo = 2000)     # Esperar a que la configuración surta efecto.
clock = time.clock ()                # Crear un objeto de reloj para rastrear el FPS.
while(True):     clock.tick ()                     # Actualizar el reloj FPS.
img = sensor.snapshot ()         # Tomar una fotografía y devolver la imagen.
print (clock.fps ())              # Nota: OpenMV Cam funciona aproximadamente la mitad de rápido cuando está conectado                                                                         # al IDE. Los FPS deberían aumentar una vez que se desconecta la cámara. 

Listado 1: La aplicación de IDE de OpenMV hello_world.py permite que el módulo de cámara OpenMV proporcione video en vivo. (Fuente del código: OpenMV)

Para realizar una primera prueba de detección y clasificación de objetos, una red de ML necesita ser entrenada con las clases de reconocimiento de objetos deseadas. Un conjunto de datos de imagen de uso común que se utiliza para entrenar modelos de detección de objetos y probar qué tan bien está funcionando el modelo es el conjunto de datos CIFAR-10. El conjunto de datos CIFAR-10 consta de 60,000 imágenes que contienen 32 x 32 imágenes en color para las siguientes 10 clases de imágenes diferentes:

  • Avión.
  • Automóvil.
  • Pájaro.
  • Gato.
  • Ciervo.
  • Perro.
  • Rana.
  • Caballo.
  • Buque.
  • Camión.

Describir el proceso que se usa para entrenar el modelo y convertirlo en una inferencia que pueda ejecutarse en la cámara OpenMV está más allá del alcance de este artículo. Pero es posible ejecutar una red capacitada CIFAR-10 sin pasar por el desarrollo del modelo: El IDE de OpenMV ya incluye un modelo entrenado para CIFAR-10 que solo necesita cargarse en la cámara.

Para usar este modelo, conecte la cámara OpenMV a la PC y el IDE de OpenMV. Desde el IDE de OpenMV, haga clic en herramientas -> aprendizaje automático -> Biblioteca de red neuronal convolucional (CNN). Se abrirá una ventana con la carpeta de modelos qtcreator de OpenMV. Hay dos opciones:

  • cmsisnn.
  • tensorflow.

En cmsisnn, navegue a la carpeta cifar10, haga clic en cifar10.network y luego ábralo. Entonces se abrirá otra ventana. Esta ventana es para guardar el archivo de red entrenado en la cámara OpenMV. El usuario puede seleccionar la unidad de almacenamiento masivo que aparece con la cámara para guardar la red.

Una vez que se haya guardado la red, cargue el ejemplo de aprendizaje automático CIFAR-10 yendo a Archivo -> Ejemplos -> 25-Aprendizaje automático -> nn_cifar10_search_whole_window.py. Esto carga un script de ejemplo que se puede ver a continuación (Listado 2).

Copiar # CIFAR-10 Ejemplo de ventana completa de búsqueda # # CIFAR es una red neuronal convolucional diseñada para clasificar su campo de visión en varios # tipos de objetos diferentes y funciona en datos de video RGB.
# # En este ejemplo, deslizamos la ventana del detector LeNet sobre la imagen y obtenemos una lista de activaciones # donde podría haber un objeto. Tenga en cuenta que usar una CNN con una ventana deslizante es extremadamente costoso, # por lo que para una búsqueda exhaustiva no espere que la CNN sea en tiempo real.
importar sensor, imagen, tiempo, os, nn   sensor.reset ()                      # Restablecer e inicializar el sensor.
sensor.set_pixformat (sensor.RGB565) # Establecer el formato de píxel en RGB565 (o ESCALA DE GRISES) sensor.set_framesize (sensor.QVGA)      # Establecer el tamaño del cuadro en QVGA (320x240) sensor.set_windowing((128, 128))       # Configurar ventana de 128x128.
sensor.skip_frames (time = 750)           # No permita que la ganancia automática se ejecute por mucho tiempo.
sensor.set_auto_gain (False) # Desactive la ganancia automática.
sensor.set_auto_exposure (False)         # Desactivar el balance de blancos.
# Cargar la red cifar10 (puede obtener la red desde el IDE de OpenMV).
net = nn.load ('/cifar10.network') # Más rápido, más pequeño y menos preciso.
# net = nn.load ('/ cifar10_fast.network') etiquetas = ['avión', 'automóvil', 'pájaro', 'gato', 'venado', 'perro', 'rana', 'caballo', 'ship', 'truck']   clock = time.clock () while(True):     clock.tick ()   img = sensor.snapshot ()       # net.search () buscará un rendimiento de la inversión (ROI) en la imagen para la red (o la imagen completa si el ROI no está     # especificado). En cada ubicación para mirar en la imagen si una de las salidas del clasificador es mayor que     # el umbral, la ubicación y la etiqueta se almacenarán en una lista de objetos y se devolverán. En cada escala, la    # ventana de detección se mueve en el rendimiento de la inversión utilizando x_overlap (0-1) e y_overlap (0-1) como guía.
# Si establece la superposición en 0.5, cada ventana de detección se superpondrá a la anterior en un 50%. Nota    # la carga de trabajo computacional aumenta MUCHO más la superposición. Finalmente, para la coincidencia a múltiples escalas después de    # deslizar la red en las dimensiones x/y, la ventana de detección se reducirá en scale_mul (0-1)    # hasta min_scale (0-1). Por ejemplo, si scale_mul es 0.5, la ventana de detección se reducirá en un 50%.
# Tenga en cuenta que en una escala más baja hay aún más área para buscar si x_overlap e y_overlap son pequeñas...
# contrast_threshold omite ejecutar CNN en áreas planas.
para obj en net.search (img, umbral = 0.6, min_scale = 0.5, scale_mul = 0.5, \             x_overlap = 0.5, y_overlap = 0.5, contrast_threshold = 0.5):         print ("Detected % s - Confidence % f %%" % (labels [obj.index ()], obj.value ()))        img.draw_rectangle (obj.rect (), color = (255, 0, 0))     print (clock.fps ()) 

Listado 2: La aplicación de ejemplo de IDE de OpenMV nn_cifar10_search_whole_window.py se utiliza para clasificar imágenes y proporcionar una medición de nivel de confianza para la clasificación. (Fuente del código: OpenMV)

La aplicación de prueba se puede ejecutar según el script hello_world.py: conecte el IDE de OpenMV al módulo haciendo clic en Conectar en la esquina inferior izquierda y luego haga clic en ejecutar. En este punto, la cámara ejecutará el script e intentará clasificar las imágenes que está viendo. La ventana de terminal muestra si una imagen está clasificada o no, y cuál es el nivel de confianza.

En este punto, un desarrollador solo necesita presentar diferentes objetos que están dentro del conjunto de datos CIFAR-10 y dejar que la cámara los clasifique. A los fines de este artículo, se proporcionó a la cámara una imagen de un gato (Figura 6) y una imagen de un avión (Figura 7). Es difícil de ver en la imagen, pero el nivel de confianza fue de alrededor del 70%. El nivel de seguridad puede ser bajo debido a las diferencias en las imágenes entrenadas frente a las imágenes de prueba, las condiciones de iluminación y otros factores. Sin duda, se pueden lograr niveles más altos con entrenamiento adicional y un control más estricto sobre el entorno de la cámara.

Imagen de la cámara de IDE de OpenMV con una red CNN (haga clic para ampliar)Figura 6: La cámara de IDE de OpenMV que ejecuta una red CNN para el conjunto de datos CIFAR-10 presentada con un gato para reconocimiento. (Fuente de la imagen: Beningo Embedded Group)

Imagen de la cámara de IDE de OpenMV con una red CNN para el CIFAR-10 (haga clic para ampliar)Figura 7: La cámara IDE de OpenMV que ejecuta una red CNN para el conjunto de datos CIFAR-10 presentada con un avión para reconocimiento. (Fuente de la imagen: Beningo Embedded Group)

Expansión de las capacidades de OpenMV H7

Hay muchas oportunidades para expandir el módulo OpenMV para usarlo con diferentes módulos de cámara y una cantidad casi ilimitada de sensores externos.

Si bien hay una capacidad de expansión de E/S en el módulo OpenMV, puede ser útil usar una placa de expansión externa para proporcionar acceso adicional a las señales de alimentación, tierra y comunicación. Una placa de expansión útil es el DFR0578 Gravity Expansion Shield para el módulo OpenMV M7 de DFRobot (Figura 8). En la figura, se puede ver que el módulo Gravity proporciona acceso a unos cuantos pines de alimentación y tierra más. Incluso expande líneas I2C adicionales y proporciona opciones adicionales para alimentar el módulo. Esto hace que sea mucho más fácil interactuar con sensores y módulos externos sin tener que usar un tablero de prueba o empalmar cables.

Imagen de la placa de expansión DFRobot GravityFigura 8: La placa de expansión DFRobot Gravity para OpenMV cam M7 proporciona varias cabeceras adicionales de fácil acceso para simplificar la creación rápida de prototipos. (Fuente de la imagen: DFRobot)

Además de la placa Gravity, otra placa de expansión interesante que los desarrolladores pueden encontrar útil es la DFRobot DFR0498 FireBeetle Covers - Cámara y placa de medios de audio (Figura 9). El módulo de desarrollo FireBeetle incluye lo siguiente:

  • Una interfaz para conectar códecs IIS.
  • Un módulo de cámara.
  • Auriculares.
  • Micrófono.

Existen muchas otras placas de expansión que podrían conectarse al módulo de cámara OpenMV H7 dependiendo de la aplicación final.

Imagen de DFRobot FireBeetle DFR0498Figura 9:El DFRobot FireBeetle DFR0498 incluye expansión para dispositivos multimedia como un micrófono. (Fuente de la imagen: DFRobot)

Consejos y trucos para trabajar con el OpenMV

Comenzar con el módulo de cámara OpenMV H7 no es difícil, pero hay muchos matices y decisiones que los desarrolladores que trabajan con él por primera vez deben tener en cuenta. A continuación, se brindan algunos "consejos y trucos" para comenzar con el módulo:

  • Cuando utilice el módulo por primera vez, asegúrese de ajustar el enfoque en el módulo utilizando el procedimiento descrito en la documentación de OpenMV.
  • Desde el menú Archivos -> Ejemplos, acceda a docenas de ejemplos que van desde cómo detectar un color a través del reconocimiento facial.
  • Para agregar conectividad a Internet, considere usar un escudo de Wi-Fi. Se puede habilitar automáticamente un escudo de Wi-Fi al inicio en el IDE de OpenMV desde la opción Herramientas -> Configuración de la cámara OpenMV.
  • Considere usar TensorFlow Lite para entrenar un modelo de ML para los objetos de interés.

Los desarrolladores que siguen estos consejos y trucos verán que pueden ahorrar mucho tiempo y muchos inconvenientes al trabajar con el módulo de cámara OpenMV H7 por primera vez.

Conclusión

Como se muestra, el módulo de cámara OpenMV H7 es especialmente adecuado para ayudar a los desarrolladores a comenzar a aplicar rápidamente los principios de ML a la detección de objetos y aplicaciones relacionadas. No solo hay aplicaciones de ejemplo disponibles que los desarrolladores pueden aprovechar para acelerar su diseño, también hay numerosas opciones de expansión para cámaras y sensores. Para comenzar, los desarrolladores solo necesitan saber cómo escribir algunas líneas de código Python y pueden tener una aplicación que funcione dentro de varias horas, dependiendo de la complejidad.

DigiKey logo

Descargo de responsabilidad: Las opiniones, creencias y puntos de vista expresados por los autores o participantes del foro de este sitio web no reflejan necesariamente las opiniones, las creencias y los puntos de vista de DigiKey o de las políticas oficiales de DigiKey.

Acerca de este autor

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo es un consultor de software integrado que actualmente trabaja con clientes en más de una docena de países para transformar drásticamente sus negocios mejorando la calidad del producto, el costo y el tiempo de comercialización. Ha publicado más de 200 artículos sobre técnicas de desarrollo de software embebido, es un conferenciante y entrenador técnico muy solicitado y tiene tres títulos que incluyen una Maestría en Ingeniería de la Universidad de Michigan. No dude en ponerse en contacto con él en jacob@beningo.com, en su sitio web www.beningo.com, y suscríbase a su boletín mensual Embedded Bytes Newsletter.

Acerca de este editor

Editores de DigiKey de América del Norte