Introducción a la visión artificial con TinyML y OpenMV - Parte 1
Hay muchos problemas de aplicación que el aprendizaje automático y tinyML pueden resolver potencialmente para los ingenieros de sistemas integrados. Un problema único que es muy difícil de codificar desde cero es la detección y el reconocimiento de objetos dentro de una imagen. Resulta que la detección y el reconocimiento de objetos es una aplicación perfecta para tinyML. Sin embargo, empezar con tinyML y la visión artificial (MV) puede ser complicado. En las próximas publicaciones, exploraremos cómo empezar con la MV usando la cámara OpenMV.
Introducción a la OpenMV Cam H7
Supongamos que está interesado en la MV para aplicaciones de bajo consumo utilizando un microcontrolador. En ese caso, tiene que diseñar su módulo de cámara a medida o encontrar uno ya disponible en el mercado. Crear un módulo desde cero sería divertido, costoso y llevaría mucho tiempo. Una solución interesante disponible en el mercado es la OpenMV Cam.
La OpenMV Cam es una placa de desarrollo pequeña similar a la Arduino que incluye todo lo que un desarrollador necesita para empezar con la MV. En primer lugar, es esencial saber que existen diferentes versiones de hardware. La última versión es la OpenMV Cam H7 (Figura 1). La Cam H7 se basa en un microcontrolador STM32H743VI de STMicroelectronics; este utiliza una arquitectura Arm Cortex-M7 con una velocidad de reloj de 480 megahercios (MHz). La pieza también tiene 1 megabyte (Mbyte) de SRAM y 2 Mbytes de flash. Cuando se trabaja con aplicaciones de MV y de aprendizaje, siempre es bueno tener mucha memoria disponible. La Cam H7 utiliza un módulo de cámara MT9M114 que puede capturar imágenes de 640 x 320 en escala de grises de 8 bits a 40 cuadros por segundo (fps) o 320 x 240 QVGA a 40 - 80 fps. El módulo de la cámara puede cambiarse en función de las necesidades de la aplicación
Figura 1: El módulo de OpenMV Cam H7 tiene todo lo necesario para empezar con los diseños de MV. (Fuente de imagen: OpenMV)
El entorno de desarrollo de OpenMV
El entorno de desarrollo integrado (IDE) de OpenMV, que se muestra en la Figura 2, es la forma en que los desarrolladores interactúan con la Cam H7. El IDE ofrece a los desarrolladores la posibilidad de editar la secuencia de comandos de Python que se ejecutarán en el módulo. La Cam H7 utiliza MicroPython, un puerto de C Python diseñado específicamente para ejecutarse en sistemas basados en microcontroladores. Los desarrolladores pueden entonces conectarse a su Cam H7, cargar su secuencia de comandos en el dispositivo y ejecutar su aplicación. El IDE también se puede utilizar para obtener una transmisión en directo de las imágenes de la memoria intermedia de la Cam H7.
Figura 2: El entorno de desarrollo de OpenMV incluye todo lo que los desarrolladores necesitan para programar e interactuar con la Cam H7, como un editor de texto, un terminal y una pantalla de captura de imágenes. (Fuente de imagen: OpenMV)
Los desarrolladores que quieran empezar a utilizar el módulo para la visión artificial y, eventualmente, el aprendizaje automático, no necesitan buscar muy lejos. El IDE de OpenMV incluye secuencias de comandos de ejemplo que van desde poner el sistema en modo de bajo consumo hasta la detección de objetos y rostros. También hay ejemplos de interconexión del módulo con placas de desarrollo externas como Wi-Fi, unidades de medición inercial (IMU) y otras opciones.
Detección de un círculo en una imagen
El IDE de OpenMV incluye una secuencia de comandos HelloWorld que permite al desarrollador conectarse a la cámara y tomar imágenes que alimentan la memoria intermedia. Para esta publicación, pensé que sería interesante ver un ejemplo que puede detectar algo en una imagen, como un círculo.
Si abriera el IDE de OpenMV e hiciera clic en Archivo->Ejemplos->Detección de características->find_circles.py (vea la Figura 3), aparecería una secuencia de comandos que hace exactamente eso. Es muy fácil probar esta secuencia de comandos; primero, necesita una hoja de papel o un anotador adhesivo y dibujar un círculo (¡por favor, no juzgue mi habilidad para dibujar, es bastante horrible!). A continuación, en la parte inferior izquierda del IDE, verá un botón de conexión. Haga clic en ese botón para conectarse a la Cam H7. A continuación, haga clic en el botón de reproducción verde inmediatamente debajo del botón de conexión. Finalmente, apunte la Cam H7 al círculo que dibujó y monitoree la memoria intermedia en el IDE de OpenMV.
Figura 3: Navegación a la secuencia de comandos de ejemplo find_circles.py en el IDE de OpenMV. (Fuente de imagen: Beningo Embedded Group)
Debe notar que, periódicamente, se dibujará un círculo rojo en la memoria intermedia que se superpone al círculo que dibujó, como se muestra en la Figura 4. Tenga en cuenta que a pesar de que mi habilidad artística deja mucho que desear, la Cam H7 pudo detectar que había algo parecido a un círculo en la imagen que se capturó. Un círculo es nuestra primera detección en esta serie de blogs, ¡pero no la última! Echemos un vistazo a la secuencia de comandos de ejemplo para entender lo que está haciendo.
Figura 4: La secuencia de comandos de ejemplo find_circles.py agregará un círculo rojo a la memoria intermedia, resaltando cuando se detecta un círculo. (Fuente de imagen: Beningo Embedded Group)
Análisis del ejemplo de find_circles.py
La secuencia de comandos que brinda el IDE de OpenMV para detectar círculos es sencilla. Primero, la secuencia de comandos importa las bibliotecas de Python necesarias e inicializa el sensor de la cámara y el reloj, como se muestra en el Listado 1.
Copiarimport sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
Listado 1: Código de ejemplo que inicializa el sensor de la cámara. (Fuente del código: OpenMV)
A continuación, un ciclo infinito ejecuta continuamente la aplicación, como en cualquier aplicación integrada estándar. Luego, finalmente, está la magia que provoca la detección. Tómese un momento para examinar el Listado 2.
Copiarwhile(True):
clock.tick()
img = sensor.snapshot().lens_corr(1.8)
for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10,
r_min = 2, r_max = 100, r_step = 2):
img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
print(c)
print("FPS %f" % clock.fps())
Listado 2: Código de ejemplo que lee el sensor de la cámara y busca círculos en la imagen. (Fuente del código: OpenMV)
El código del Listado 2 comienza tomando una imagen instantánea. Luego, se usa un método llamado find_circles, incluido en las bibliotecas de OpenMV, para buscar círculos en la imagen. Puede leer los comentarios en el ejemplo de código fuente real para obtener detalles sobre los parámetros, pero estamos más interesados en los parámetros r_min, r_max, y r_step Los parámetros r_min especifican el radio de círculo mínimo que se puede detectar. El parámetro r_max establece el máximo. El programa verá círculos entre 2 y 100 píxeles en el ejemplo.
Cuando se detecta un círculo, se utiliza el método draw_circle, junto con los valores “x”, “y” y “radio” del círculo, para dibujar un círculo sobre el círculo detectado. Notará que el color se especifica en notación RGB, en este caso, al dibujar un círculo rojo.
Conclusión
Los desarrolladores pueden aprovechar la visión artificial y TinyML, y aplicarlos a una cantidad casi infinita de casos de uso. En esta publicación, acabamos de presentar OpenMV Cam H7 y el IDE de OpenMV para que pueda comenzar a detectar círculos. Sin embargo, la detección de círculos no requería tinyML, sino solo algunas funciones de biblioteca. En la próxima publicación, exploraremos los ejemplos de aprendizaje automático integrados antes de pasar a un ejemplo más complejo donde entrenaremos e implementaremos nuestro proyecto de detección.
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum




