Visión artificial con módulos de cámara de bajo costo. Deja un comentario

Si está interesado en el aprendizaje automático integrado (TinyML) en Arduino Nano 33 BLE Sense , habrá encontrado un tonelada de sensores integrados: micrófono digital, acelerómetro, giroscopio, magnetómetro, luz, proximidad, temperatura, humedad y color, pero se dio cuenta de que para la visión necesita conectar una cámara externa.

En este artículo, le mostraremos cómo obtener datos de imagen de un módulo de cámara VGA de bajo costo. Utilizaremos la biblioteca Arduino_OVD767x para simplificar el lado del software de las cosas.

Configuración de hardware

Para comenzar, necesitará:

Por supuesto, puedes obtener una placa sin encabezados y soldadura, si así lo prefieres.

El único inconveniente de esta configuración es que (en forma de módulo) hay muchos puentes para conectar. No es difícil, pero debes tener cuidado de conectar los cables correctos en cada extremo. Puede usar cinta para asegurar los cables una vez que las cosas estén hechas, para que no se suelte.

Debe conectar los cables de la siguiente manera:

Configuración de software

Primero, instale el IDE de Arduino o regístrese para crear las herramientas de Arduino. Una vez que instala y abre su entorno, la biblioteca de la cámara está disponible en el administrador de la biblioteca.

  • Instale el Arduino IDE o regístrese en Arduino Create
  • Herramientas> Administrar bibliotecas y busque la biblioteca OV767
  • Presione el botón Instalar

Ahora, utilizaremos el boceto de ejemplo para probar que los cables están conectados correctamente:

  • Ejemplos> Arduino_OV767X> CameraCaptureRawBytes
  • Descomenta (elimina el //) de la línea 48 para mostrar un patrón de prueba
 Camera.testPattern (); 
  • Compile y cargue en su placa

Su Arduino ahora está emitiendo imágenes binarias sin formato en serie. Para ver esto como una imagen, hemos incluido una aplicación especial para ver la salida de imagen de la cámara usando Procesamiento.

El procesamiento es un entorno de programación simple que fue creado por estudiantes graduados en MIT Media Lab para facilitar el desarrollo de aplicaciones orientadas visualmente con énfasis en la animación y proporcionar a los usuarios comentarios instantáneos a través de la interacción.

  • Instalar y abrir Procesando
  • Pegue el código CameraVisualizerRawBytes en un croquis de procesamiento
  • Editar línea 31-37 para que coincida con máquina y puerto serie al que está conectado su Arduino
  • Presione el botón de reproducción en Procesando y debería ver un patrón de prueba (la actualización de la imagen tarda un par de segundos):

¡Si todo va bien, debería ver el patrón de prueba a rayas arriba!

A continuación, volveremos al IDE de Arduino y editaremos el boceto para que Arduino envíe una imagen en vivo desde la cámara en el visor de procesamiento:

  • Volver al IDE de Arduino
  • Comente la línea 48 del boceto de Arduino
 // Hemos desactivado el patrón de prueba y mostraremos un imagen en vivo
// Camera.testPattern (); 
  • Compile y cargue en el tablero
  • Una vez que se cargue el boceto, presione nuevamente el botón Reproducir en Procesando
  • Después de unos segundos, ahora debería tener una imagen en vivo: [19459020 ]

Consideraciones para TinyML

La salida VGA completa (resolución 640 × 480) de nuestra pequeña cámara es demasiado grande para las aplicaciones TinyML actuales. uTensor ejecuta la detección de escritura a mano con MNIST que utiliza imágenes de 28 × 28. El ejemplo de detección de personas en el ejemplo de TensorFlow Lite para microcontroladores usa 96 × 96, que es más que suficiente. Incluso las aplicaciones de vanguardia “Big ML” a menudo solo usan imágenes de 320 × 320 (consulte el libro TinyML ). Considere también que una imagen VGA en escala de grises de 8 bits ocupa 300 KB sin comprimir y el Nano 33 BLE Sense tiene 256 KB de RAM. ¡Tenemos que hacer algo para reducir el tamaño de la imagen!

Opciones de formato de cámara

El módulo OV7670 admite resoluciones más bajas a través de las opciones de configuración. Las opciones modifican los datos de la imagen antes de que lleguen al Arduino. Las configuraciones actualmente disponibles a través de la biblioteca hoy en día son:

  • VGA – 640 x 480
  • CIF – 352 x 240
  • QVGA – 320 x 240
  • QCIF – 176 x 144

Este es un buen comienzo, ya que reduce la cantidad de tiempo que se tarda en enviar una imagen de la cámara al Arduino. Reduce el tamaño de la matriz de datos de imagen requerida en su boceto Arduino también. Seleccione la resolución cambiando el valor en Camera.begin. No olvides cambiar el tamaño de tu matriz también.

 Camera.begin (QVGA, RGB565, 1) 

La biblioteca de cámaras también ofrece diferentes formatos de color: YUV422, RGB444 y RGB565. Estos definen cómo se codifican los valores de color y todos ocupan 2 bytes por píxel en nuestros datos de imagen. Estamos utilizando el formato RGB565 que tiene 5 bits para el rojo, 6 bits para el verde y 5 bits para el azul:

La conversión del píxel RGB565 de 2 bytes a valores rojos, verdes y azules individuales en su boceto se puede lograr de la siguiente manera:

 // Convertir de RGB565 a RGB de 24 bits

    uint16_t pixel = (alto << 8) | bajo; int red = ((pixel >> 11) & 0x1f) << 3; int green = ((pixel >> 5) & 0x3f) << 2; int blue = ((pixel >> 0) & 0x1f) << 3; 

Cambiar el tamaño de la imagen en el Arduino

Una vez que tenemos nuestros datos de imagen en el Arduino, podemos reducir aún más el tamaño de la imagen. Simplemente eliminar píxeles nos dará una imagen irregular (con alias). Para hacer esto sin problemas, necesitamos un algoritmo de muestreo descendente que pueda interpolar valores de píxeles y usarlos para crear una imagen más pequeña.

Las técnicas utilizadas para volver a muestrear imágenes es un tema interesante en sí mismo. Encontramos este ejemplo de disminución de resolución de Eloquent Arduino funciona bien con la salida de la biblioteca de la cámara Arduino_OV767X (ver GIF animado arriba).

Aplicaciones como el ejemplo TensorFlow Lite Micro Person Detection que usan modelos basados ​​en CNN en Arduino para visión artificial pueden no necesitar un preprocesamiento adicional de la imagen, aparte de promediar los valores RGB para eliminar el color para Datos de escala de grises de 8 bits por píxel.

Sin embargo, si desea realizar la normalización, iterar a través de píxeles utilizando las funciones Arduino max y min es una forma conveniente de obtener los límites superior e inferior de los valores de píxeles de entrada . Luego puede usar el mapa para escalar los valores de píxeles de salida a un rango de 0-255.

 byte pixelOut = mapa (entrada [y] [x] [c], inferior, superior, 0, 255); 

Conclusión

Esta fue una introducción a cómo conectar un módulo de cámara OV7670 al Arduino Nano 33 BLE Sense y algunas consideraciones para obtener datos de la cámara para aplicaciones TinyML. Hay mucho más por explorar sobre el tema de la visión artificial en Arduino, ¡esto es solo un comienzo!

Puede seguir cualquier respuesta a esta entrada a través del feed RSS 2.0 .
Puede dejar una respuesta o trackback desde su propio sitio.

Fuente:

Machine vision with low-cost camera modules

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

0
    0
    Tu Carrito
    Tu carrito esta vacíoVolver a la tienda
    Enviar Whatsapp
    Hola 👋
    ¿En qué podemos ayudarte?