Proyecto de reconocimiento de dígitos escritos a mano mediante una red neuronal convolucional (CNN). El modelo está entrenado con el conjunto de datos MNIST y se puede utilizar desde una interfaz web hecha con React o directamente mediante una API Flask.
La aplicación recibe una imagen con un dígito del 0 al 9 y devuelve:
- El dígito predicho.
- El porcentaje de confianza de la predicción.
- La probabilidad calculada para cada una de las diez clases.
Antes de predecir, el servidor transforma la imagen para adaptarla al formato usado durante el entrenamiento:
- La convierte a escala de grises.
- La redimensiona a
28 x 28píxeles. - Normaliza los valores de los píxeles entre
0y1. - Invierte los colores cuando detecta un fondo claro.
numerosCNN/
├── api_server.py # API Flask para realizar predicciones
├── train_model.py # Entrenamiento del modelo con MNIST
├── modelo_digitos_postal.keras # Modelo entrenado
├── P02_CNN.ipynb # Notebook con el desarrollo paso a paso
└── frontend/
├── package.json # Dependencias y scripts de React/Vite
└── src/
└── App.jsx # Interfaz para subir imágenes y ver resultados
- Python 3.10 o superior.
- Node.js y npm.
- Un navegador web moderno.
Desde la carpeta raíz del proyecto, crea y activa un entorno virtual:
python -m venv .venv
.\.venv\Scripts\Activate.ps1Instala las dependencias del backend:
python -m pip install --upgrade pip
python -m pip install flask flask-cors numpy pillow tensorflowcd frontend
npm install
cd ..La aplicación necesita dos procesos: el servidor de la API y el frontend.
Desde la raíz del proyecto y con el entorno virtual activado:
python api_server.pyEl servidor quedará disponible en http://localhost:5000.
Puedes comprobar su estado con:
http://localhost:5000/health
La respuesta esperada es similar a:
{
"model_loaded": true,
"status": "ok"
}En otra terminal:
cd frontend
npm run devAbre en el navegador la URL que muestre Vite, normalmente http://localhost:5173.
En la interfaz puedes arrastrar una imagen o seleccionarla desde el explorador de archivos. Después, pulsa Analizar imagen para consultar la predicción.
El archivo modelo_digitos_postal.keras ya contiene un modelo entrenado. Si quieres volver a entrenarlo, ejecuta desde la raíz:
python train_model.pyEl script descarga MNIST mediante TensorFlow, divide los datos en entrenamiento y validación, entrena una CNN durante un máximo de cinco épocas y sobrescribe modelo_digitos_postal.keras.
También puedes consultar el proceso completo en P02_CNN.ipynb.
Comprueba que el servidor está activo y que el modelo se ha cargado correctamente.
Recibe una imagen usando el campo multipart/form-data image.
Ejemplo con curl:
curl -X POST -F "image=@ruta/a/imagen.png" http://localhost:5000/predictRespuesta de ejemplo:
{
"digit": 7,
"confidence": 98.42,
"probabilities": {
"0": 0.0001,
"1": 0.0002,
"2": 0.0003,
"3": 0.0004,
"4": 0.0001,
"5": 0.0002,
"6": 0.0001,
"7": 0.9842,
"8": 0.0003,
"9": 0.0141
}
}- No se puede cargar el modelo: comprueba que
modelo_digitos_postal.kerasestá en la raíz del proyecto y que ejecutaspython api_server.pydesde esa carpeta. - El frontend no conecta con la API: verifica que Flask está ejecutándose en el puerto
5000y que la API responde en/health. - La predicción es poco precisa: utiliza una imagen con un único dígito, bien visible y con buen contraste. El modelo ha sido entrenado con imágenes de estilo MNIST.
- Falla la instalación de TensorFlow: comprueba la versión de Python y consulta la compatibilidad de TensorFlow con tu sistema operativo.
- Python, TensorFlow y Keras.
- Flask y Flask-CORS.
- NumPy y Pillow.
- React y Vite.
- Dataset MNIST.