| --- |
| language: es |
| tags: |
| - svm |
| - fashion-mnist |
| - flask |
| - api |
| - machine-learning |
| license: mit |
| datasets: |
| - fashion-mnist |
| metrics: |
| - accuracy |
| --- |
| |
| # 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 |
|
|
| ```bash |
| # 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 |
|
|
| ```bash |
| 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 |
|
|
| ```bash |
| python app.py |
| ``` |
|
|
| La API queda disponible en `http://127.0.0.1:5000`. |
|
|
| ### Paso 3 — Probar los endpoints |
|
|
| ```bash |
| python test_api.py |
| ``` |
|
|
| --- |
|
|
| ## Endpoints |
|
|
| ### `GET /health` |
| Verifica que la API y el modelo estén operativos. |
|
|
| ```json |
| { |
| "status": "ok", |
| "model_loaded": true, |
| "message": "API operativa" |
| } |
| ``` |
|
|
| --- |
|
|
| ### `GET /model/info` |
| Metadatos del modelo cargado. |
|
|
| ```json |
| { |
| "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:** |
| ```json |
| { |
| "pixels": [0, 128, 255, ...] // 784 valores enteros (0-255) |
| } |
| ``` |
|
|
| **Respuesta:** |
| ```json |
| { |
| "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:** |
| ```json |
| { |
| "images": [ |
| [0, 128, 255, ...], |
| [...] |
| ] |
| } |
| ``` |
|
|
| **Respuesta:** |
| ```json |
| { |
| "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. |
|
|