Construye un Reconocedor de Dígitos con Raspberry Pi, TensorFlow y OpenCV
Descubre cómo entrenar una red neuronal convolucional profunda para transcribir dígitos manuscritos y desplegarla en una Raspberry Pi usando la cámara Pi, OpenCV y TensorFlow.
Visión General
En este proyecto recorreremos todo el pipeline de IA: desde la preparación de datos y el entrenamiento del modelo en un portátil, hasta el reconocimiento de dígitos en tiempo real con la cámara de la Pi. La solución se basa en Scikit-Learn y OpenCV 3.3 para manipulación de imágenes, y Keras (con backend TensorFlow) para el componente de aprendizaje profundo.
Utilizamos el dataset MNIST —60.000 imágenes de entrenamiento y 10.000 de prueba de dígitos en escala de grises de 28×28 píxeles. Las imágenes capturadas por la cámara de la Pi se preprocesan para adaptarlas a este formato antes de alimentar la red entrenada.
La arquitectura de la red es una pila convolucional estándar seguida de una capa totalmente conectada de salida con diez neuronas, cada una representando un dígito (0-9).
Una vez entrenado el modelo, los pesos se transfieren a la Raspberry Pi. Un script ligero en Python captura un fotograma, aplica conversión a escala de grises, umbralizado, redimensionado, inversión y luego realiza la inferencia.
Configuración del Hardware
Para la demostración monté la cámara Pi en un soporte improvisado —un sencillo rig manual que mantenía la cámara enfocada en un solo dígito. En la práctica, un soporte fijo o una pequeña carcasa pueden mejorar la estabilidad.
Instalación de Software
Crea un entorno virtual de Python en la Pi e instala las librerías requeridas. Los comandos siguientes asumen que tienes Raspberry Pi OS funcionando y Python 3.7+.
source ~/.profile workon cv python PiCameraApp.py --picamera 1
Instalar TensorFlow
pip install tensorflow
Instalar Keras
pip install keras
Instalar OpenCV 3.3
OpenCV debe compilarse desde el código fuente para habilitar optimizaciones completas en la Pi. Hay una guía paso a paso disponible en PyImageSearch.
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/
Finalmente, instala la librería PiCamera con optimizaciones de NumPy:
pip install "picamera[array]"
Entrenamiento del Modelo
Ejecuta el script de entrenamiento en un portátil (preferiblemente con GPU). El script define la CNN en Keras, la compila, la entrena con los datos MNIST, valida el rendimiento y guarda los pesos en model_weights.h5.
python Train_MNIST.py
Si tienes una GPU NVIDIA, instala TensorFlow con soporte GPU y los drivers CUDA para acelerar el entrenamiento. Sin GPU el proceso seguirá completándose, aunque tardará más.
Después del entrenamiento, transfiere model_weights.h5 a la Pi mediante scp o WinSCP.
Reconocimiento de Dígitos en Tiempo Real
Lanza el script de reconocimiento en la Pi. El programa captura un fotograma al pulsar t y termina con q. La precisión depende en gran medida de la iluminación, el ángulo y la claridad de la escritura. Los resultados típicos superan el 95% de precisión en dígitos limpios y de alto contraste.
Pipeline de Preprocesamiento de Imagen
- Captura fotograma RGB como array NumPy.
- Convierte a escala de grises (elimina dos canales de color).
- Escala valores de píxel a enteros sin signo de 8 bits (0-255).
- Aplica umbralizado de Otsu para obtener una imagen limpia en blanco y negro.
- Redimensiona a 28×28 píxeles —la forma de entrada de MNIST.
- Invierte colores para que los dígitos sean blancos sobre fondo negro, coincidiendo con los datos de entrenamiento.
- Aplana la imagen y aliméntala al modelo cargado.
El modelo genera un vector de probabilidad de longitud diez. El índice con mayor probabilidad es el dígito predicho.
Conclusiones Clave
Este ejemplo demuestra un flujo de trabajo completo de extremo a extremo: preparación de datos, entrenamiento del modelo, despliegue e inferencia en un ordenador de placa única. El código está disponible en GitHub para quien quiera experimentar o extender el sistema.
Referencias
Fuente: AI Digit Recognition with PiCamera
Proceso de manufactura
- Cómo leer temperatura con un DS18B20 en Raspberry Pi 2
- Medición de temperatura en Raspberry Pi con sensores 1-Wire Maxim y puente I2C DS2482
- Monitorización precisa de temperatura en armario de servidores con Raspberry Pi
- Posture Pal con Walabot: monitor distancia tiempo real para evitar dolor cuello y espalda
- Primeros Pasos con TJBot: Construye, Configura y Controla por Voz tu Robot IA
- Construye un Segway Autoequilibrado con Raspberry Pi
- Extensión de GoPiGo v2 en Windows 10 IoT Core para Raspberry Pi 3
- Acceed IGS-9822DGP: Switch Gigabit 12 Puertos con 4 SFP – Solución Industrial de Alto Rendimiento
- AAEON e Intel Entregan FWS-8600: Network Appliance 2U 40-Core con 400 Gbps Throughput
- Lanner mejora sus appliances de red con procesadores Intel Xeon Scalable de 2ª generación
- Combatir inundaciones urbanas con soluciones de red IoT