Desplegando Reconocimiento de Dígitos Manuscritos en MCU i.MX RT1060 Usando TensorFlow Lite
Esta guía demuestra cómo implementar reconocimiento de dígitos manuscritos en el MCU crossover i.MX RT1060, aprovechando un modelo TensorFlow Lite y una GUI táctil.
El i.MX RT1060, impulsado por un núcleo Arm® Cortex®-M7, destaca en soluciones industriales rentables y dispositivos de consumo de alto rendimiento que requieren interfaces de pantalla ricas. En este tutorial recorremos la construcción de una aplicación de aprendizaje automático embebido que detecta y clasifica dígitos dibujados por el usuario usando el popular ejemplo MNIST eIQ.
Vistazo al Dataset y Modelo MNIST
Usamos el dataset MNIST estándar, consistiendo en 60,000 imágenes de entrenamiento y 10,000 de prueba de dígitos manuscritos centrados en escala de grises, cada uno de 28×28 píxeles. Los datos fueron recolectados de estudiantes de secundaria y empleados de la Oficina del Censo en EE. UU., por lo que refleja estilos de escritura norteamericanos. Las redes neuronales convolucionales (CNN) funcionan excepcionalmente bien en este dataset, y arquitecturas incluso modestas pueden alcanzar alta precisión, haciendo TensorFlow Lite una opción ideal para despliegue en hardware embebido.

Figura 1. Ejemplo del dataset MNIST
El repositorio oficial de GitHub de TensorFlow proporciona una implementación Python del modelo MNIST, construida con Keras, tf.data y tf.estimator. La CNN alcanza excelente rendimiento en el conjunto de prueba y sirve como referencia para nuestro proceso de conversión.

Figura 2. Visualización de arquitectura del modelo
A continuación se muestra la definición del modelo crudo que corresponde a la visualización anterior.

Figura 3. Definición del modelo TensorFlow
¿Qué es TensorFlow Lite y Cómo se Usa Aquí?
TensorFlow es un marco de aprendizaje profundo de código abierto ampliamente adoptado, mantenido por Google. Para llevar inferencia de TensorFlow a dispositivos con recursos limitados, Google introdujo TensorFlow Lite, un runtime ligero que soporta un subconjunto de operaciones de TensorFlow. Aunque los modelos TensorFlow Lite no pueden entrenarse más en el dispositivo, pueden optimizarse con cuantización, poda y otras técnicas post-entrenamiento para reducir tamaño y mejorar velocidad de inferencia.
Convirtiendo el Modelo a TensorFlow Lite
Primero entrenamos el modelo usando TensorFlow 1.13.2 para asegurar compatibilidad con las herramientas de conversión. El modelo se convierte luego al formato .tflite con el siguiente comando:
tflite_convert --saved_model_dir= --output_file=converted_model.tflite --input_shape=1,28,28 --input_array=Placeholder --output_array=Softmax --inference_type=FLOAT --input_data_type=FLOAT --post_training_quantize --target_ops TFLITE_BUILTINS
Después de la conversión, usamos xxd para embeber el modelo binario en nuestra aplicación:
xxd -i converted_model.tflite > converted_model.h
La utilidad xxd produce un header C/C++ que contiene el modelo como array de bytes, permitiendo al proyecto eIQ cargarlo directamente en tiempo de compilación. Instrucciones detalladas pueden encontrarse en las guías de usuario eIQ y la documentación oficial de TensorFlow Lite.
Introducción Rápida a Embedded Wizard Studio
Para aprovechar las capacidades gráficas del MIMXRT1060-EVK, incorporamos una GUI táctil construida con Embedded Wizard Studio. El IDE genera proyectos MCUXpresso e IAR desde el SDK de XNP, permitiendo a desarrolladores probar la interfaz inmediatamente en hardware. La versión de evaluación limita complejidad de GUI y añade marca de agua, pero la licencia completa desbloquea características ilimitadas.
Como el código GUI generado está en C mientras que los ejemplos eIQ están en C/C++, envolvemos todos los headers incluidos con:
#ifdef __cplusplus extern "C" { #endif /* C code */ #ifdef __cplusplus } #endif
También reubicamos archivos fuente y header en la carpeta middleware del SDK y ajustamos rutas de inclusión. Archivos de configuración específicos del dispositivo se fusionan para asegurar una compilación fluida.
La Aplicación Terminada y Sus Características
La GUI presenta un área de entrada táctil para dibujar dígitos y un campo de salida que muestra el resultado de clasificación. Dos botones permiten al usuario ejecutar inferencia o limpiar el lienzo. Después de la inferencia, la aplicación imprime el dígito predicho y puntuación de confianza a la salida estándar para propósitos de depuración.

Figura 4. GUI de aplicación con entrada, salida y botones de control
Precisión del Modelo TensorFlow Lite
Mientras la CNN alcanza alta precisión en muestras MNIST basadas en papel, los dígitos manuscritos dibujados en una pantalla táctil difieren significativamente. Esta discrepancia subraya la importancia de entrenar con datos de grado de producción que coincidan con la modalidad de entrada objetivo. Para mejorar rendimiento, recolecte un nuevo dataset usando la pantalla táctil y aplique transfer learning, como se detalla en el walk-through de la Comunidad NXP.
Detalles de Implementación
Embedded Wizard usa slots para reaccionar a interacciones de usuario. El slot de dibujo captura movimientos táctiles, renderizando una línea de 1-píxel en el color principal. El slot de limpieza restablece tanto campos de entrada como salida al color de fondo. Cuando se dispara el slot run-inference, recupera los datos del bitmap, lo redimensiona a 28×28 y lo alimenta al intérprete TensorFlow Lite.
Como el lienzo de entrada es 112×112, preprocesamos la imagen de la siguiente manera:
- Asignar un array de 8 bits de tamaño 112×112 e inicializarlo a cero.
- Copiar cada píxel dibujado (valor 0xFF) en el array.
- Expandir cada píxel en un bloque 3×3 para engrosar trazos.
- Recortar y centrar el dibujo para igualar preprocesamiento MNIST.
- Redimensionar la imagen 112×112 a 28×28, convirtiendo cada píxel a valor punto flotante para el modelo.
La Figura 5 ilustra el array intermedio después del preprocesamiento.

Figura 5. Array de entrada preprocesado listo para inferencia
El intérprete TensorFlow Lite se inicializa una vez al inicio. Para cada solicitud de inferencia, el tensor de entrada preprocesado se copia píxel a píxel en el buffer de entrada del intérprete. La huella de memoria y características de runtime están documentadas en la nota de aplicación de NXP.
TensorFlow Lite: Una Solución Viable
Desplegar reconocimiento de dígitos manuscritos en dispositivos embebidos plantea desafíos como recursos computacionales limitados y modalidades de entrada variadas. TensorFlow Lite mitiga estos problemas proporcionando un runtime ligero y un rico ecosistema de herramientas de optimización. El núcleo M7 del i.MX RT1060, combinado con el middleware del SDK, hace factible implementar casos de uso complejos como un teclado numérico seguro para una cerradura digital.
Entrenar modelos con datos de producción reales —dígitos dibujados con dedo en pantalla táctil— sigue siendo esencial para mantener alta precisión. Además, variaciones regionales de escritura a mano deben considerarse al diseñar el dataset.
La serie MCU crossover i.MX RT ofrece una mezcla balanceada de rendimiento y costo, haciéndola adecuada para una amplia gama de aplicaciones embebidas. Para más detalles, visite la página de producto i.MX RT.
Los Artículos de la Industria son una forma de contenido que permite a los socios industriales compartir noticias útiles, mensajes y tecnología con los lectores de All About Circuits de una manera que el contenido editorial no está bien adaptado. Todos los Artículos de la Industria están sujetos a estrictas directrices editoriales con la intención de ofrecer a los lectores noticias útiles, experiencia técnica o historias. Los puntos de vista y opiniones expresados en los Artículos de la Industria son los del socio y no necesariamente los de All About Circuits o sus escritores.
Robot industrial
- Construye un Reconocedor de Dígitos con Raspberry Pi, TensorFlow y OpenCV
- Invocar bloques de función PLC vía clientes OPC UA: Guía práctica
- Reduciendo Desperdicios y Costes Energéticos con Robots Autónomos
- Construyendo un Autoencoder Variacional con TensorFlow: Guía Práctica
- Automatice el cuidado de máquinas CNC con cobots: Aumente la eficiencia y la precisión
- Guía para principiantes: Programación de robots Yaskawa Motoman: Aumente velocidad y precisión
- Guía para Principiantes: Configurando RoboDK en Raspberry Pi
- Dominando la Gestión de Potencia con MCUs Crossover NXP i.MX RT500
- Aprovechamiento del i.MX RT500 de NXP para Dispositivos Inteligentes con DSP: Multihilo, XOS y Cadence Fusion F1 Audio DSP
- Guía profesional para usar resina epoxi en preservación de obras de arte
- Interfaces en Java explicadas: Cómo definirlas e implementarlas con ejemplos prácticos