Entrenando la red Neuronal con MaixHub

Como entrenar un modelo de red neuronal convolucional con un ejemplo práctico de clasificación de naranjas y su posterior implementación en la MAIX II DOCK

INTELIGENCIA ARTIFICIAL

Biblioman

4/1/20247 min read

Introducción

Las redes neuronales convolucionales (CNN por sus siglas en inglés, Convolutional Neural Networks) son un tipo de algoritmo utilizado en el campo del aprendizaje automático y la inteligencia artificial, especialmente en el procesamiento de imágenes y reconocimiento visual. Estas redes están inspiradas en el funcionamiento del cerebro humano y su capacidad para procesar información visual.

A diferencia de las redes neuronales tradicionales, las CNN están diseñadas específicamente para trabajar con datos tridimensionales, como imágenes. Utilizan una arquitectura especializada que permite extraer características relevantes de las imágenes de manera automática y realizar tareas de clasificación, detección de objetos, segmentación y otras aplicaciones relacionadas con el procesamiento de imágenes.

Su capacidad para aprender automáticamente características relevantes de las imágenes las hace muy útiles en una amplia gama de aplicaciones, como reconocimiento facial, diagnóstico médico, conducción autónoma y mucho más. En este ejemplo las vamos a utilizar para realizar una aplicación que nos permita clasificar las naranjas de mesa de las de zumo.

MaixHub

La plataforma de desarrollo MaixHub de la empresa Sipeed es una plataforma integral que ofrece una variedad de funciones relacionadas con la inteligencia artificial y el aprendizaje automático, la plataforma nos permite realizar las siguientes funciones:

  • Acceso a una amplia gama de modelos de inteligencia artificial para utilizar en nuestros proyectos.

  • Comunidad de usuarios para compartir modelos entrenados en tareas específicas.

  • Recopilación de datos: MaixHub te permite recopilar datos de manera eficiente. Puedes cargar conjuntos de datos de entrenamiento y utilizarlos para entrenar tus modelos.

  • Entrenamiento de modelos: Con MaixHub, puedes entrenar tus propios modelos de IA de manera rápida y sencilla. Al cargar el conjunto de datos de entrenamiento, puedes entrenar el modelo y obtener resultados precisos. Esto es especialmente útil si deseas crear tu propia aplicación de IA o aprender el proceso básico de entrenamiento de modelos que te servirá para otras plataformas.

  • Despliegue de modelos en dispositivos: Una vez que hayas entrenado tu modelo de IA, MaixHub te permite implementarlo en dispositivos de manera sencilla. Esto te permite llevar tus aplicaciones de IA a la vida real y utilizarlas en diferentes dispositivos. En este ejemplo utilizaremos la Maix II DOCK pero podemos crear aplicaciones para: STM32, Arduino, ESP32, BL618(RISC-V), etc.

¿Como entrenar un modelo de IA con MaixHub?

Lo primero que tenemos que hacer es crearnos una cuenta en la plataforma MaixHub, es gratuito y lo único que nos pide es una dirección de correo electrónico valida.

Una vez logeados en MaixHub seleccionamos la pestaña Training y le damos a crear proyecto de entrenamiento. En la ventana que nos sale le ponemos un nombre a nuestro proyecto y seleccionamos si el proyecto va a ser de clasificación de objetos o detección de objetos y opcionalmente podemos poner una descripción del proyecto y hacemos clic en confirmar, según se muestra en la siguiente figura:

Creación del Dataset con los datos de entrenamiento: Dentro de pestaña Training seleccionamos Dataset y hacemos clic en crear. En la ventana que nos sale le ponemos un nombre y la etiqueta que puede ser de clasificación o detección, el tipo de dato no se puede cambiar solo admite fotos y hacemos clic en confirmar.

Recopilación de datos: para llenar el Dataset que acabamos de crear con las fotos que servirán para el entrenamiento del modelo podemos hacerlo de varias formas. Subirlas a través de nuestro ordenador, a través de un teléfono móvil o a través del sistema embebido que vayamos a utilizar en el proyecto en muestro caso la Maix II Dock. Para utilizar este último método debemos tener la aplicación cliente instalada en el dispositivo embebido, lo más fácil es descargarse la imagen del sistema operativo que viene ya con la aplicación instalada para ello iremos al siguiente repositorio de Speed y nos descargamos la última versión con el cliente MaixHub instalado, en estos momentos la versión: v831-m2dock-maixhub-0.5.2-20220726.zip una vez descargado el archivo lo descomprimimos y flasheamos la tarjeta micro-SD con la aplicación PhoenixCard-v2.4.8 de Allwinner que podemos descargar desde aquí (el proceso de flasheo es muy sencillo y se muestra en el vídeo de abajo)

Una vez instalada la tarjeta micro-SD en la Maix II Dock le damos alimentación y se nos iniciará la aplicación cliente de MaixHub, además se nos creará una unidad de disco USB en nuestro ordenador con la carpeta app donde se encuentran las aplicaciones de IA junto a sus modelos de entrenamiento y también tenemos el archivo de configuración wpa_supplicant.conf para conectar nuestro dispositivo a nuestra red wifi, lo editaremos y pondremos el ssid de nuestra red y la clave (psk), una vez reiniciado el dispositivo nuestra Maix II Dock tendrá acceso a Internet, otra forma de conectar el dispositivo a internet es acceder a la siguiente página de MaixHub y escanear el código QR con el dispositivo.

Para empezar a introducir fotos lo único que tenemos que hacer es ir a Collect --> Device y seleccionar:

  1. Board

  2. Training o Validation. Según queramos que nuestra foto pertenezca al conjunto de datos de entrenamiento o de validación.

  3. Data label. Seleccionamos la etiqueta para asociar a la imagen, en el ejemplo Naranja_Buena o Naranja_Mala.

  4. Hacemos clic en generar y aparecerá un código QR que tendremos que escanear con el dispositivo para hacer la foto y subirla a MaixHub

Crear tarea de entrenamiento: Hacemos clic en Create Task y seleccionamos la plataforma que vamos a usar, el modelo de entrenamiento y los diferentes parámetros de configuración, tal y como se muestra en la figura de abajo y hacemos clic en crear.

Nos saldrá una ventana emergente para que le pongamos un nombre a nuestra tarea de entrenamiento y hacemos clic en Start para comenzar el entrenamiento con los parámetros seleccionamos, posteriormente podremos hacer los entrenamientos que queramos modificando los parámetros de la ventana anterior.

Una vez entrenado el modelo con el Dataset aportado y los parámetros seleccionados comenzará el entrenamiento que tardará mas o menos en función del tamaño del Dataset, el modelo seleccionado y los parámetros de configuración.

Una vez terminado el proceso en la pestaña Trainig Tasks podremos ver si nuestro entrenamiento a tenido éxito o no.

Si hacemos clic sobre la tarea de entrenamiento podremos ver los resultados obtenidos en gráficas junto a la matriz de confusión, según se muestra en la figura de abajo.

Por último nos queda desplegar el modelo entrenado en el dispositivo real y comprobar los resultados, para ello hacemos clic en Deploy, tendremos dos opciones descargarnos el modelo entrenado junto a un ejemplo en Python de como usarlo tal y como se muestra en la figura de abajo.

El ejemplo en Python es sencillo de entender y modificar. Por ejemplo, podemos hacer que cuando detecte una naranja defectuosa me active un motor que mueva la cinta transportadora al cajón de naranjas malas o que solo sirven para zumo, el código generado por MaixHub es el siguiente:

# generated by maixhub, tested on maixpy3 v0.4.8
from maix import nn, camera, display, image
import serial

model = "model-108983.awnn.mud"
labels = ['Naranja_Buena', 'Naranja_Mala']

class Comm:
def init(self, uart):
self.uart = uart

def send_classify_result(self, pmax, idx, label):
msg = "{}:{:.2f}:{}\n".format(idx, pmax, label)
self.uart.write(msg.encode())

def init_uart():
uart = serial.Serial("/dev/ttyS1",115200)
return uart

def main():
camera.config(size=(224, 224))

print("-- load model:", model)
m = nn.load(model)
print("-- load ok")

uart = init_uart()
comm = Comm(uart)

while True:
img = camera.capture()
out = m.forward(img)
out = nn.F.softmax(out)
idx = out.argmax()
p = out.max()
msg = "{:.2f}: {}".format(p, labels[idx])
display.show(img.draw_string(2, 2, msg, scale = 1.2, color = (255, 0, 0), thickness = 2))
comm.send_classify_result(p, idx, labels[idx])

if name == "__main__":
try:
main()
except Exception as e:
import traceback, time
msg = traceback.format_exc()
print(msg)
img = image.new(size = (240, 240), color = (255, 0, 0), mode = "RGB")
img.draw_string(0, 0, msg, scale = 0.8, color = (255, 255, 255), thickness = 1)
display.show(img)
time.sleep(20)

La otra opción que tenemos es desplegar el modelo entrenado junto al ejemplo de uso de forma automática a través de wifi para ello seleccionamos Automatic escaneamos el código QR con la MAIX II DOCK y empezará el despliegue en el dispositivo, al terminar el dispositivo se reiniciará y empezará a ejecutarse la aplicación

En el siguiente vídeo tenéis la prueba de inferencia, así como todo el proceso realizado: