Tabla de contenido:

Detección de objetos con placas Sipeed MaiX (Kendryte K210): 6 pasos
Detección de objetos con placas Sipeed MaiX (Kendryte K210): 6 pasos

Video: Detección de objetos con placas Sipeed MaiX (Kendryte K210): 6 pasos

Video: Detección de objetos con placas Sipeed MaiX (Kendryte K210): 6 pasos
Video: #XGNR2020 | Inteligencia Artificial con MaixPy 2024, Noviembre
Anonim
Image
Image

Como continuación de mi artículo anterior sobre el reconocimiento de imágenes con Sipeed MaiX Boards, decidí escribir otro tutorial, centrándome en la detección de objetos. Recientemente apareció un hardware interesante con el chip Kendryte K210, incluido Seeed AI Hat para Edge Computing, M5StickV de M5 stack y HuskyLens de DFRobot (aunque ese tiene firmware propietario y está más dirigido a principiantes completos). Debido a su bajo precio, Kendryte K210 ha atraído a las personas que desean agregar visión por computadora a sus proyectos. Pero como es habitual con los productos de hardware chinos, falta el soporte técnico y esto es algo que estoy tratando de mejorar con mis artículos y videos. Pero tenga en cuenta que no estoy en el equipo de desarrolladores de Kendryte o Sipeed y no puedo responder todas las preguntas relacionadas con su producto.

Con eso en mente, ¡comencemos! Comenzaremos con una descripción breve (y simplificada) de cómo funcionan los modelos CNN de reconocimiento de objetos.

ACTUALIZACIÓN DE MAYO DE 2020: Al ver cómo mi artículo y video sobre Detección de objetos con placas K210 siguen siendo muy populares y entre los mejores resultados en YouTube y Google, decidí actualizar el artículo para incluir la información sobre aXeleRate, marco de trabajo basado en Keras para IA en el Edge que desarrollo. aXeleRate, esencialmente, se basa en la colección de scripts que utilicé para entrenar modelos de reconocimiento de imágenes / detección de objetos, combinados en un solo marco y optimizados para el flujo de trabajo en Google Colab. Es más cómodo de usar y más actualizado.

Para la versión anterior del artículo, aún puede verlo en steemit.com.

Paso 1: Explicación de la arquitectura del modelo de detección de objetos

Explicación de la arquitectura del modelo de detección de objetos
Explicación de la arquitectura del modelo de detección de objetos
Explicación de la arquitectura del modelo de detección de objetos
Explicación de la arquitectura del modelo de detección de objetos

Los modelos de reconocimiento de imágenes (o clasificación de imágenes) toman la imagen completa como entrada y generan una lista de probabilidades para cada clase que estamos tratando de reconocer. Es muy útil si el objeto que nos interesa ocupa una gran parte de la imagen y no nos importa mucho su ubicación. Pero, ¿qué pasa si nuestro proyecto (digamos, una cámara de seguimiento facial) requiere que tengamos no solo un conocimiento sobre el tipo de objeto en la imagen, sino también sus coordenadas? ¿Y qué pasa con el proyecto que requiere la detección de varios objetos (por ejemplo, para contar)?

Aquí es cuando los modelos de detección de objetos son útiles. En este artículo usaremos la arquitectura YOLO (solo mira una vez) y centraremos la explicación en la mecánica interna de esta arquitectura en particular.

Estamos tratando de determinar qué objetos están presentes en la imagen y cuáles son sus coordenadas. Dado que el aprendizaje automático no es magia y no es "una máquina pensante", sino simplemente un algoritmo que utiliza estadísticas para optimizar la función (red neuronal) para resolver mejor un problema en particular. Necesitamos parafrasear este problema para hacerlo más "optimizable". Un enfoque ingenuo aquí sería tener el algoritmo minimizando la pérdida (diferencia) entre su predicción y las coordenadas correctas del objeto. Eso funcionaría bastante bien, siempre que solo tengamos un objeto en la imagen. Para varios objetos, adoptamos un enfoque diferente: agregamos la cuadrícula y hacemos que nuestra red prediga la presencia (o ausencia) de los objetos en cada cuadrícula. Suena muy bien, pero aún deja demasiada incertidumbre para la red: ¿cómo generar la predicción y qué hacer cuando hay varios objetos con el centro dentro de una celda de la cuadrícula? Necesitamos agregar una restricción más, las llamadas anclas. Los anclajes son tamaños iniciales (ancho, alto), algunos de los cuales (los más cercanos al tamaño del objeto) cambiarán de tamaño al tamaño del objeto, utilizando algunas salidas de la red neuronal (mapa de características final).

Entonces, aquí hay una vista de nivel superior de lo que sucede cuando la red neuronal de la arquitectura YOLO realiza una detección de objetos en la imagen. Según las características detectadas por la red de extracción de características, para cada celda de la cuadrícula se realiza un conjunto de predicciones, que incluye el desplazamiento de anclajes, la probabilidad de anclaje y la clase de anclaje. Luego descartamos las predicciones con baja probabilidad y ¡listo!

Paso 2: preparar el medio ambiente

Preparar el medio ambiente
Preparar el medio ambiente

aXeleRate se basa en un maravilloso proyecto de penny4860, detector de dígitos SVHN yolo-v2. aXeleRate lleva esta implementación del detector YOLO en Keras a un nivel superior y utiliza su conveniente sistema de configuración para realizar entrenamiento y conversión de reconocimiento de imágenes / detección de objetos y redes de segmentación de imágenes con varios backends.

Hay dos formas de usar aXeleRate: ejecutándose localmente en una máquina Ubuntu o en Google Colab. Para ejecutar en Google Colab, eche un vistazo a este ejemplo:

Cuaderno Colab de detección de objetos PASCAL-VOC

Entrenar su modelo localmente y exportarlo para usarlo con aceleración de hardware también es mucho más fácil ahora. Le recomiendo que instale todas las dependencias necesarias en el entorno Anaconda para mantener su proyecto separado de los demás y evitar conflictos.

Descarga el instalador aquí.

Una vez completada la instalación, cree un nuevo entorno:

conda crear -n yolo python = 3.7

Activemos el nuevo entorno

conda activar yolo

Aparecerá un prefijo antes de su shell bash con el nombre del entorno, lo que indica que ahora trabaja en ese entorno.

Instale aXeleRate en su máquina local con

pip install git +

Y luego ejecute esto para descargar los scripts que necesitará para el entrenamiento y la inferencia:

clon de git

Puede ejecutar pruebas rápidas con tests_training.py en la carpeta aXeleRate. Ejecutará entrenamiento e inferencia para cada tipo de modelo, guardará y convertirá modelos entrenados. Dado que solo se está entrenando durante 5 épocas y el conjunto de datos es muy pequeño, no podrá obtener modelos útiles, pero este script solo está destinado a verificar la ausencia de errores.

Paso 3: Entrene un modelo de detección de objetos con Keras

Entrene un modelo de detección de objetos con Keras
Entrene un modelo de detección de objetos con Keras

Ahora podemos ejecutar un script de entrenamiento con el archivo de configuración. Dado que la implementación de Keras del detector de objetos YOLO es bastante complicada, en lugar de explicar cada pieza de código relevante, explicaré cómo configurar la capacitación y también describiré los módulos relevantes, en caso de que desee realizar algunos cambios usted mismo.

Comencemos con un ejemplo de juguete y entrenemos a un detector de mapaches. Hay un archivo de configuración dentro de la carpeta / config, raccoon_detector.json. Elegimos MobileNet7_5 como arquitectura (donde 7_5 es el parámetro alfa de la implementación original de Mobilenet, controla el ancho de la red) y 224x224 como tamaño de entrada. Echemos un vistazo a los parámetros más importantes de la configuración:

El tipo es el frontend del modelo: clasificador, detector o Segnet La arquitectura es el backend del modelo (extractor de características)

- Yolo completo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Para obtener más información sobre los anclajes, lea aquí

Las etiquetas son etiquetas presentes en su conjunto de datos. IMPORTANTE: Por favor, enumere todas las etiquetas presentes en el conjunto de datos.

object_scale determina cuánto penalizar la predicción incorrecta de la confianza de los predictores de objetos

no_object_scale determina cuánto penalizar la predicción incorrecta de la confianza de los predictores que no son objetos

coord_scale determina cuánto penalizar la posición incorrecta y las predicciones de tamaño (x, y, w, h)

class_scale determina cuánto penalizar la predicción de clase incorrecta

aumento: aumento de la imagen, cambio de tamaño, cambio y desenfoque de la imagen para evitar el sobreajuste y tener una mayor variedad en el conjunto de datos.

train_times, validation_times: cuántas veces se repetirá el conjunto de datos. Útil si tienes aumento

activado

first_trainable_layer: le permite congelar ciertas capas si está utilizando una red de características previamente entrenada

Ahora tenemos que descargar el conjunto de datos, que compartí en mi Google Drive (conjunto de datos original), que es un conjunto de datos de detección de mapaches, que contiene 150 imágenes anotadas.

Asegúrese de cambiar las líneas en el archivo de configuración (train_image_folder, train_annot_folder) en consecuencia y luego comience el entrenamiento con el siguiente comando:

python axelerate / train.py -c configs / raccoon_detector.json

train.py lee la configuración del archivo.json y entrena el modelo con el script axelerate / networks / yolo / yolo_frontend.py. yolo / backend / loss.py es donde se implementa la función de pérdida personalizada y yolo / backend / network.py es donde se crea el modelo (entrada, extractor de características y capas de detección juntas). axelerate / networks / common_utils / fit.py es un script que implementa el proceso de entrenamiento y axelerate / networks / common_utils / feature.py contiene extractores de características. Si tiene la intención de utilizar un modelo entrenado con chip K210 y firmware Micropython, debido a limitaciones de memoria, puede elegir entre MobileNet (2_5, 5_0 y 7_5) y TinyYolo, pero he descubierto que MobileNet ofrece una mejor precisión de detección.

Dado que es un ejemplo de juguete y solo contiene 150 imágenes de mapaches, el proceso de entrenamiento debería ser bastante rápido, incluso sin GPU, aunque la precisión estará lejos de ser estelar. Para un proyecto relacionado con el trabajo, entrené un detector de señales de tráfico y un detector de números, ambos conjuntos de datos incluían más de unos pocos miles de ejemplos de capacitación.

Paso 4: conviértalo a formato.kmodel

Conviértalo a formato.kmodel
Conviértalo a formato.kmodel

Con aXeleRate, la conversión del modelo se realiza automáticamente; esta es probablemente la mayor diferencia con la versión anterior de los scripts de entrenamiento. Además, los archivos del modelo y el gráfico de entrenamiento se guardan perfectamente en la carpeta del proyecto. También encontré que la precisión de la invalidación a veces no da una estimación del rendimiento real del modelo para la detección de objetos y por eso agregué mAP como una métrica de validación para los modelos de detección de objetos. Puede leer más sobre mAP aquí.

Si el mAP, la precisión promedio promedio (nuestra métrica de validación) no mejora durante 20 épocas, el entrenamiento se detendrá prematuramente. Cada vez que se mejora mAP, el modelo se guarda en la carpeta del proyecto. Una vez finalizado el entrenamiento, aXeleRate convierte automáticamente el mejor modelo a los formatos especificados; puede elegir "tflite", "k210" o "edgetpu" a partir de ahora.

Ahora, al último paso, ¡ejecutando nuestro modelo en hardware Sipeed!

Paso 5: ejecutar en el firmware de Micropython

Ejecutar en el firmware de Micropython
Ejecutar en el firmware de Micropython

Es posible ejecutar inferencias con nuestro modelo de detección de objetos con código C, pero por conveniencia usaremos firmware Micropython y MaixPy IDE en su lugar.

Descargue MaixPy IDE desde aquí y el firmware de micropython desde aquí. Puede usar el script de Python kflash.py para grabar el firmware o descargar la herramienta flash GUI separada aquí.

Copie model.kmodel a la raíz de una tarjeta SD e inserte la tarjeta SD en Sipeed Maix Bit (u otro dispositivo K210). Alternativamente, puede grabar.kmodel en la memoria flash del dispositivo. Mi script de ejemplo lee.kmodel de la memoria flash. Si está utilizando una tarjeta SD, cambie esta línea

tarea = kpu.load (0x200000)

para

task = kpu.load ("/ sd / model.kmodel")

Abra MaixPy IDE y presione el botón de conexión. Abra el script raccoon_detector.py de la carpeta example_scripts / k210 / detector y presione el botón Inicio. Debería ver una transmisión en vivo de la cámara con cuadros delimitadores alrededor … bueno, mapaches. Puede aumentar la precisión del modelo proporcionando más ejemplos de entrenamiento, pero tenga en cuenta que es un modelo pequeño de hadas (1,9 M) y tendrá problemas para detectar objetos pequeños (debido a la baja resolución).

Una de las preguntas que recibí en los comentarios de mi artículo anterior sobre reconocimiento de imágenes es cómo enviar los resultados de la detección a través de UART / I2C a otro dispositivo conectado a las placas de desarrollo Sipeed. En mi repositorio de github, podrá encontrar otro script de ejemplo, raccoon_detector_uart.py, que (lo adivinó) detecta mapaches y envía las coordenadas de los cuadros delimitadores a través de UART. Tenga en cuenta que los pines utilizados para la comunicación UART son diferentes de diferentes placas, esto es algo que debe verificar usted mismo en la documentación.

Paso 6: Resumen

Kendryte K210 es un chip sólido para visión artificial, flexible, aunque con memoria limitada disponible. Hasta ahora, en mis tutoriales hemos cubierto su uso para reconocer objetos personalizados, detectar objetos personalizados y ejecutar algunas tareas de visión por computadora basadas en OpenMV. Sé a ciencia cierta que también es adecuado para el reconocimiento facial y, con algunos retoques, debería ser posible realizar la detección de poses y la segmentación de imágenes (puede usar aXeleRate para entrenar el modelo de segmentación semántica, pero aún no implementé la inferencia con K210). ¡No dude en echar un vistazo a los problemas del repositorio de XeleRate y hacer un PR si cree que hay algunas mejoras que puede contribuir!

Aquí hay algunos artículos que utilicé para escribir este tutorial, eche un vistazo si desea obtener más información sobre la detección de objetos con redes neuronales:

Detectores de objetos de caja delimitadora: comprensión de YOLO, solo miras una vez

Entendiendo YOLO (más matemáticas)

Guía suave sobre cómo funciona la localización de objetos YOLO con Keras (Parte 2)

Detección de objetos en tiempo real con YOLO, YOLOv2 y ahora YOLOv3

¡Espero que pueda usar el conocimiento que tiene ahora para construir algunos proyectos increíbles con visión artificial! Puede comprar placas Sipeed aquí, se encuentran entre las opciones más baratas disponibles para ML en sistemas integrados.

Agrégueme a LinkedIn si tiene alguna pregunta y suscríbase a mi canal de YouTube para recibir notificaciones sobre proyectos más interesantes relacionados con el aprendizaje automático y la robótica.

Recomendado: