Cómo ejecutar un modelo de aprendizaje automático "Hello World" en microcontroladores STM32
Colaboración de Editores de DigiKey de América del Norte
2022-08-18
El aprendizaje automático (ML) ha estado de moda en aplicaciones de servidor y móviles durante años, pero ahora ha migrado y se ha convertido en algo fundamental en los dispositivos de borde. Dado que los dispositivos de borde deben ser energéticamente eficientes, los desarrolladores deben aprender y comprender cómo implementar modelos de ML en sistemas basados en microcontroladores. Los modelos ML que se ejecutan en un microcontrolador suelen denominarse tinyML. Desgraciadamente, implantar un modelo en un microcontrolador no es una tarea trivial. Aun así, cada vez es más fácil, y los desarrolladores sin formación especializada se darán cuenta de que pueden hacerlo de manera oportuna.
Este artículo explora cómo los desarrolladores embebidos pueden empezar con el ML usando los microcontroladores STM32 de STMicroelectronics. Para ello, se muestra cómo crear una aplicación "Hello World" convirtiendo un modelo de TensorFlow Lite for Microcontrollers para su uso en STM32CubeIDE utilizando X-CUBE-AI.
Introducción a los casos de uso de tinyML
El TinyML es un campo en expansión que lleva la potencia del ML a dispositivos con recursos y energía limitados, como los microcontroladores, normalmente utilizando redes neuronales profundas. Estos dispositivos microcontroladores pueden entonces ejecutar el modelo ML y realizar un valioso trabajo en el borde. Hay varios casos de uso en los que tinyML es ahora bastante interesante.
El primer caso de uso, que se ve en muchos dispositivos móviles y equipos de domótica, es la detección de palabras clave. La detección de palabras clave permite que el dispositivo integrado utilice un micrófono para capturar el habla y detectar las palabras clave entrenadas previamente. El modelo tinyML utiliza una entrada de serie temporal que representa el habla y la convierte en características del habla, normalmente un espectrograma. El espectrograma contiene información sobre la frecuencia en el tiempo. El espectrograma se introduce en una red neuronal entrenada para detectar palabras específicas y el resultado es una probabilidad de que se detecte una palabra concreta. La figura 1 muestra un ejemplo de este proceso.
Figura 1: La detección de palabras clave es un caso de uso interesante para tinyML. El discurso de entrada se convierte en un espectrograma y luego se introduce en una red neuronal entrenada para determinar si hay una palabra entrenada previamente. (Fuente de la imagen: Arm®)
El siguiente caso de uso de tinyML en el que están interesados muchos desarrolladores de sistemas integrados es el reconocimiento de imágenes. El microcontrolador capta las imágenes de una cámara, que se introducen en un modelo previamente entrenado. El modelo puede discernir lo que hay en la imagen. Por ejemplo, se puede determinar si hay un gato, un perro, un pez, etc. Un gran ejemplo de cómo se utiliza el reconocimiento de imágenes en el borde son los videoporteros. El videoportero suele detectar si hay una persona en la puerta o si se ha dejado un paquete.
Un último caso de uso con gran popularidad es el uso de tinyML para el mantenimiento predictivo. El mantenimiento predictivo utiliza el ML para predecir los estados de los equipos basándose en la detección de anomalías, algoritmos de clasificación y modelos predictivos. Una vez más, hay muchas aplicaciones disponibles, que van desde los sistemas de calefacción, ventilación y aire acondicionado hasta los equipos de la fábrica.
Aunque los tres casos de uso anteriores son actualmente populares para tinyML, sin duda hay muchos casos de uso potenciales que los desarrolladores pueden encontrar. He aquí una lista rápida:
- Clasificación de los gestos
- Detección de anomalías
- Lector de contadores analógico
- Orientación y control (GNC)
- Detección de paquetes
Independientemente del caso de uso, la mejor manera de empezar a familiarizarse con tinyML es con una aplicación "Hello World", que ayuda a los desarrolladores a aprender y comprender el proceso básico que seguirán para poner en marcha un sistema mínimo. Hay cinco pasos necesarios para ejecutar un modelo tinyML en un microcontrolador STM32:
- Captura de datos
- Datos de la etiqueta
- Entrenar la red neuronal
- Convertir el modelo
- Ejecutar el modelo en el microcontrolador
Captura, etiquetado y entrenamiento de un modelo "Hola Mundo"
Los desarrolladores suelen tener muchas opciones para capturar y etiquetar los datos necesarios para entrenar su modelo. En primer lugar, hay muchas bases de datos de formación en línea. Los desarrolladores pueden buscar datos que alguien ha recogido y etiquetado. Por ejemplo, para la detección básica de imágenes, están CIFAR-10 o ImageNet. Para entrenar un modelo que detecte sonrisas en las fotos, también hay una colección de imágenes para ello. Los repositorios de datos en línea son claramente un buen lugar para empezar.
Si los datos necesarios no se han hecho públicos en Internet, otra opción es que los desarrolladores generen sus propios datos. Se puede utilizar Matlab o alguna otra herramienta para generar los conjuntos de datos. Si la generación automática de datos no es una opción, puede hacerse manualmente. Por último, si todo esto le parece demasiado tiempo, hay algunos conjuntos de datos disponibles para su compra, también en Internet. La recopilación de datos suele ser la opción más emocionante e interesante, pero también es la que más trabajo da.
El ejemplo "Hello World" que se explora aquí muestra cómo entrenar un modelo para generar una onda sinusoidal y desplegarlo en un STM32. El ejemplo fue elaborado por Pete Warden y Daniel Situnayake como parte de su trabajo en Google sobre TensorFlow Lite para microcontroladores. Esto facilita el trabajo porque han elaborado un sencillo tutorial público sobre la captura, el etiquetado y el entrenamiento del modelo. Se puede encontrar en Github aquí; una vez allí, los desarrolladores deben hacer clic en el botón "Run in Google Colab" (Ejecutar en Google Colab). Google Colab, abreviatura de Google Collaboratory, permite a los desarrolladores escribir y ejecutar Python en su navegador sin necesidad de configuración y proporciona acceso gratuito a las GPU de Google.
El resultado de recorrer el ejemplo de entrenamiento incluirá dos archivos de modelo diferentes; un modelo TensorFlow model.tflite cuantificado para microcontroladores y un modelo model_no_quant.tflite no cuantificado. La cuantificación indica cómo se almacenan numéricamente las activaciones y el sesgo del modelo. La versión cuantificada produce un modelo más pequeño que es más adecuado para un microcontrolador. Para los lectores curiosos, los resultados del modelo entrenado frente a los resultados reales de la onda sinusoidal pueden verse en la Figura 2. El resultado del modelo está en rojo. La salida de onda sinusoidal no es perfecta, pero funciona lo suficientemente bien para un programa "Hello World".
Figura 2: Comparación entre las predicciones del modelo TensorFlow para una onda sinusoidal y los valores reales. (Fuente de la imagen: Beningo Embedded Group)
Selección de una placa de desarrollo
Antes de ver cómo convertir el modelo TensorFlow para que se ejecute en un microcontrolador, es necesario seleccionar un microcontrolador para su implementación en el modelo. Este artículo se centrará en los microcontroladores STM32 porque STMicroelectronics tiene muchas herramientas tinyML/ML que funcionan bien para convertir y ejecutar modelos. Además, STMicroelectronics dispone de una amplia variedad de piezas compatibles con sus herramientas de ML (Figura 3).
Figura 3: Se muestran los microcontroladores y la unidad de microprocesador (MPU) actualmente soportados por el ecosistema de IA de STMicroelectronics. (Fuente de la imagen: STMicroelectronics)
Si hay una de estas placas por la oficina, es perfecta para poner en marcha la aplicación "Hello World". Sin embargo, para aquellos interesados en ir más allá de este ejemplo y adentrarse en el control de gestos o la detección de palabras clave, opten por el nodo Discovery IoT STM32 B-L4S5I-IOT01A (Figura 4).
Esta placa tiene un procesador Arm Cortex®-M4 basado en la serie STM32L4+. El procesador tiene 2 megabytes (Mbytes) de memoria flash y 640 kilobytes (Kbytes) de RAM, lo que proporciona mucho espacio para los modelos tinyML. El módulo se adapta a los experimentos de casos de uso de tinyML porque también cuenta con el micrófono de sistemas microelectromecánicos (MEMS) MP34DT01 de STMicroelectronics, que puede utilizarse para el desarrollo de aplicaciones de localización de palabras clave. Además, el acelerómetro de tres ejes LIS3MDLTR incorporado, también de STMicroelectronics, puede utilizarse para la detección de gestos basada en tinyML.
Figura 4: El nodo Discovery IoT STM32 B-L4S5I-IOT01A es una plataforma de experimentación adaptable para tinyML gracias a su procesador Arm Cortex-M4 integrado, su micrófono MEMS y su acelerómetro de tres ejes. (Fuente de la imagen: STMicroelectronics)
Conversión y ejecución del modelo TensorFlow Lite con STM32Cube.AI
Armados con una placa de desarrollo que puede utilizarse para ejecutar el modelo tinyML, los desarrolladores pueden ahora empezar a convertir el modelo TensorFlow Lite en algo que pueda ejecutarse en el microcontrolador. El modelo TensorFlow Lite puede ejecutarse directamente en el microcontrolador, pero necesita un entorno de ejecución para procesarlo.
Cuando se ejecuta el modelo, hay que realizar una serie de funciones. Estas funciones empiezan por recoger los datos de los sensores, filtrarlos, extraer las características necesarias y alimentar el modelo. El modelo arrojará un resultado que puede filtrarse aún más y, a continuación, se suele tomar alguna medida. La figura 5 ofrece una visión general de este proceso.
Figura 5: Cómo fluyen los datos desde los sensores hasta el tiempo de ejecución y luego hasta la salida en una aplicación tinyML. (Fuente de la imagen: Beningo Embedded Group)
El complemento X-CUBE-AI para STM32CubeMx proporciona el entorno de ejecución para interpretar el modelo TensorFlow Lite y ofrece tiempos de ejecución alternativos y herramientas de conversión que los desarrolladores pueden aprovechar. El plug-in X-CUBE-AI no está activado por defecto en un proyecto. Sin embargo, después de crear un nuevo proyecto e inicializar la placa, en Paquetes de software-> Seleccionar componentes, hay una opción para habilitar el tiempo de ejecución de la IA. Hay varias opciones aquí; asegúrese de que se utiliza la plantilla Aplicación para este ejemplo, como se muestra en la Figura 6.
Figura 6: El complemento X-CUBE-AI debe ser habilitado usando la plantilla de aplicación para este ejemplo. (Fuente de la imagen: Beningo Embedded Group)
Una vez que el X-CUBE-AI está habilitado, una categoría de STMicroelectronics X-CUBE-AI aparecerá en la cadena de herramientas. Al hacer clic en la categoría, el desarrollador podrá seleccionar el archivo del modelo que ha creado y establecer los parámetros del modelo, como se muestra en la Figura 7. Un botón de análisis también analizará el modelo y proporcionará a los desarrolladores información sobre la RAM, la ROM y el ciclo de ejecución. Es muy recomendable que los desarrolladores comparen las opciones de los modelos Keras y TFLite. En el ejemplo del modelo sinusoidal, que es pequeño, no habrá una gran diferencia, pero se nota. A continuación, se puede generar el proyecto haciendo clic en "Generate code" (Generar código).
Figura 7: El botón de análisis proporcionará a los desarrolladores información sobre la RAM, la ROM y el ciclo de ejecución. (Fuente de la imagen: Beningo Embedded Group)
El generador de código inicializará el proyecto y construirá el entorno de ejecución para el modelo tinyML. Sin embargo, por defecto, nada alimenta el modelo. Los desarrolladores tienen que añadir código para proporcionar los valores de entrada del modelo -valores x- que el modelo interpretará y utilizará para generar los valores del seno y. Hay que añadir algunas piezas de código a las funciones acquire_and_process_data y post_process, como se muestra en la Figura 8.
Figura 8: El código mostrado conectará los valores falsos de los sensores de entrada al modelo de onda sinusoidal. (Fuente de la imagen: Beningo Embedded Group)
En este punto, el ejemplo está listo para ser ejecutado. Nota: añada algunas funciones printf para obtener la salida del modelo para una rápida verificación. Una rápida compilación y despliegue da como resultado la ejecución del modelo tinyML "Hola Mundo". Si se extrae la salida del modelo durante un ciclo completo, se obtiene la onda sinusoidal que se muestra en la figura 9. No es perfecto, pero es excelente para una primera aplicación de tinyML. A partir de aquí, los desarrolladores podrían vincular la salida a un modulador de ancho de pulso (PWM) y generar la onda sinusoidal.
Figura 9: Salida del modelo de onda sinusoidal "Hello World" cuando se ejecuta en el STM32. (Fuente de la imagen: Beningo Embedded Group)
Consejos y trucos para el ML en los sistemas embebidos
Los desarrolladores que quieran iniciarse en el uso de ML en sistemas basados en microcontroladores tendrán bastante trabajo para poner en marcha su primera aplicación tinyML. Sin embargo, hay varios "consejos y trucos" a tener en cuenta que pueden simplificar y acelerar su desarrollo:
- Recorrido por el ejemplo "Hello World" de TensorFlow Lite para microcontroladores, incluyendo el archivo Google Colab. Tómate un tiempo para ajustar los parámetros y comprender cómo afectan al modelo entrenado.
- Utilizar modelos cuantificados para aplicaciones de microcontroladores. El modelo cuantificado se comprime para trabajar con uint8_t en lugar de con números de punto flotante de 32 bits. Como resultado, el modelo será más pequeño y se ejecutará más rápido.
- Explore los ejemplos adicionales en el repositorio de TensorFlow Lite for Microcontrollers. Otros ejemplos son la detección de gestos y la detección de palabras clave.
- Toma el ejemplo de "Hello World" conectando la salida del modelo a un PWM y un filtro de paso bajo para ver la onda sinusoidal resultante. Experimenta con el tiempo de ejecución para aumentar y disminuir la frecuencia de la onda sinusoidal.
- Seleccione una placa de desarrollo que incluya sensores "extra" que permitan probar una amplia gama de aplicaciones de ML.
- Por muy divertido que sea recopilar datos, generalmente es más fácil comprar o utilizar una base de datos de código abierto para entrenar el modelo.
Los desarrolladores que sigan estos "consejos y trucos" se ahorrarán bastante tiempo y disgustos a la hora de asegurar su aplicación.
Conclusión:
El ML ha llegado al borde de la red y los sistemas basados en microcontroladores con recursos limitados son un objetivo primordial. Las herramientas más recientes permiten convertir y optimizar los modelos de ML para que funcionen en sistemas en tiempo real. Como se ha visto, poner en marcha un modelo en una placa de desarrollo STM32 es relativamente fácil, a pesar de la complejidad que conlleva. Aunque se ha examinado un modelo sencillo que genera una onda sinusoidal, es posible aplicar modelos mucho más complejos, como la detección de gestos y la localización de palabras clave.
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.




