SVM Fashion-MNIST — API Flask

Proyecto que entrena un clasificador SVM + PCA sobre el dataset Fashion-MNIST y lo sirve como API REST con Flask.


Estructura del proyecto

svm_fashion_flask/
├── train_model.py      ← Entrena y guarda los artefactos (.pkl)
├── app.py              ← API Flask (endpoint de predicción)
├── test_api.py         ← Script de prueba de los endpoints
├── requirements.txt
└── models/             ← Generado automáticamente por train_model.py
    ├── scaler.pkl
    ├── pca.pkl
    └── svm_model.pkl

Instalación

# 1. Crear entorno virtual (recomendado)
python -m venv venv
source venv/bin/activate       # Windows: venv\Scripts\activate

# 2. Instalar dependencias
pip install -r requirements.txt

Uso

Paso 1 — Entrenar el modelo

python train_model.py

Descarga Fashion-MNIST, aplica PCA, busca hiperparámetros con GridSearchCV y guarda los artefactos en models/.
Tiempo estimado: 10-30 min según el hardware.
La precisión objetivo es ≥ 90 %.

Paso 2 — Iniciar la API

python app.py

La API queda disponible en http://127.0.0.1:5000.

Paso 3 — Probar los endpoints

python test_api.py

Endpoints

GET /health

Verifica que la API y el modelo estén operativos.

{
  "status": "ok",
  "model_loaded": true,
  "message": "API operativa"
}

GET /model/info

Metadatos del modelo cargado.

{
  "model_type": "SVC",
  "kernel": "rbf",
  "C": 50,
  "gamma": 0.01,
  "classes": ["T-shirt/top", "Trouser", "..."],
  "pca_components": 187,
  "pca_variance_ratio": 0.9502,
  "input_features": 784
}

POST /predict

Clasifica una imagen.

Body:

{
  "pixels": [0, 128, 255, ...]   // 784 valores enteros (0-255)
}

Respuesta:

{
  "class_id":   7,
  "class_name": "Sneaker",
  "confidence": 0.9423,
  "probabilities": {
    "T-shirt/top": 0.01,
    "Sneaker": 0.9423,
    "..."
  },
  "inference_ms": 12.4
}

POST /predict/batch

Clasifica múltiples imágenes en una llamada.

Body:

{
  "images": [
    [0, 128, 255, ...],
    [...]
  ]
}

Respuesta:

{
  "results": [
    {"class_id": 7, "class_name": "Sneaker", "confidence": 0.94},
    {"class_id": 1, "class_name": "Trouser", "confidence": 0.88}
  ],
  "count": 2,
  "inference_ms": 25.1
}

Clases Fashion-MNIST

ID Nombre
0 T-shirt/top
1 Trouser
2 Pullover
3 Dress
4 Coat
5 Sandal
6 Shirt
7 Sneaker
8 Bag
9 Ankle boot

Notas técnicas

  • Split 80 % entrenamiento / 20 % prueba sobre 30 000 muestras estratificadas.
  • PCA conserva el 95 % de la varianza (~180-200 componentes).
  • GridSearchCV con C ∈ {10, 50}, gamma ∈ {0.001, 0.01}, kernel rbf, cv=3.
  • SVC(probability=True) habilita scores de confianza por clase.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support