Downloads · 30 days
0
MijaKun/Reconocimiento-de-Emociones-Faciales-RAFDB
Reconocimiento-de-Emociones-Faciales-RAFDB is a machine learning model from MijaKun. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
Evaluación comparativa de modelos CNN, Híbridos y Transformers en RAF-DB bajo escenarios de Fine-Tuning, Transfer Learning y Scratch
Downloads · 30 days
0
Access
Public
Updated Aug 15, 2026
Repo size
5.1 GB
Likes
0
Public
Click a slice to open those files.
.pt4.5 GB · 86%
From the Hugging Face model README
Evaluación comparativa de modelos CNN, Híbridos y Transformers en RAF-DB bajo escenarios de Fine-Tuning, Transfer Learning y Scratch
Este proyecto implementa un sistema completo de Reconocimiento de Emociones Faciales (FER) que entrena y evalúa 9 familias de modelos de aprendizaje profundo sobre el dataset RAF-DB (Real-world Affective Faces Database) con 7 emociones básicas: Sorpresa, Miedo, Disgusto, Felicidad, Tristeza, Ira y Neutral.
| Modelo | Escenario | Aug | Accuracy | F1 Macro | Latencia | Params |
|---|---|---|---|---|---|---|
| POSTER++ (Poster V2) 🥇 | Scratch | ✅ | 85.63% | 0.7917 | 4.09ms | 28.9M |
| QCS (Cross-Similarity) 🥈 | Scratch | ✅ | 84.91% | 0.7770 | 4.27ms | 41.2M |
| VGG16 | Fine-Tuning | ❌ | 77.71% | 0.6920 | 8.32ms | 21.1M |
| DenseNet121 | Fine-Tuning | ✅ | 75.78% | 0.6848 | 6.19ms | 7.2M |
| MobileNetV2 | Scratch | ❌ | 72.13% | 0.6310 | 3.56ms | 2.5M |
| EfficientNetB0 | Fine-Tuning | ❌ | 70.01% | 0.6183 | 3.67ms | 4.3M |
| SwinFace (Swin ViT) | Scratch | ✅ | 69.39% | 0.6040 | 8.69ms | 38.8M |
| ResNet50 | Fine-Tuning | ✅ | 67.93% | 0.6068 | 5.30ms | 24.0M |
| CustomCNN (baseline) | Scratch | ❌ | 59.13% | 0.4891 | 6.09ms | 1.3M |
📂 Proyecto FER/
├── 📂 src/ # Código fuente principal
│ ├── 📂 augmentation/ # MixUp, CutMix, Albumentations
│ │ ├── augmentations.py # MixUp + CutMix batch-level
│ │ └── albumentations_ops.py # Pipeline de augmentation avanzado
│ ├── 📂 config/ # Configuración global
│ │ ├── settings.py # Constantes, rutas, label maps
│ │ └── experiment.py # ExperimentConfig dataclass
│ ├── 📂 evaluation/ # Evaluación y métricas
│ │ ├── metrics.py # ModelEvaluator (Accuracy, F1, ROC, MCC)
│ │ ├── plots.py # Gráficas de entrenamiento
│ │ ├── comparison.py # Comparativa entre modelos
│ │ ├── explainability.py # Grad-CAM y visualización
│ │ └── error_analysis.py # Análisis de errores
│ ├── 📂 models/ # Arquitecturas de modelos
│ │ ├── model_factory.py # Factory pattern + congelamiento de capas
│ │ ├── applications.py # CNNs estándar (VGG16, ResNet50, etc.)
│ │ ├── custom_cnn.py # CNN personalizada (baseline)
│ │ ├── qcs.py # ⭐ QCS - Quadruplet Cross-Similarity
│ │ ├── poster_v2.py # ⭐ POSTER++ con landmark queries
│ │ ├── swin_face.py # ⭐ SwinFace - Swin ViT + CBAM
│ │ └── deit.py # ⭐ DeiT - Data-efficient ViT
│ ├── 📂 preprocessing/ # Carga y split de datos
│ │ ├── data_split.py # Split estratificado train/val/test
│ │ ├── dataset_inspector.py # EDA y análisis del dataset
│ │ └── tfdata.py # DataLoaders y transformaciones
│ ├── 📂 training/ # Bucle de entrenamiento
│ │ ├── trainer.py # ExperimentTrainer (SCN, Mixed Precision)
│ │ ├── tuner.py # Hyperparameter tuning
│ │ └── callbacks.py # Callbacks de entrenamiento
│ └── 📂 utils/ # Utilidades generales
├── 📂 saved_models/ # Pesos entrenados (Git LFS)
│ ├── poster_v2_scratch_aug/ # 🥇 Campeón - 85.63%
│ ├── qcs_scratch_aug/ # 🥈 Subcampeón - 84.91%
│ ├── swin_face_scratch_aug/ # Swin Transformer
│ └── deit_scratch_aug/ # DeiT Transformer
├── 📂 results/ # Resultados experimentales
│ ├── 📂 training/ # Logs de entrenamiento (CSV)
│ ├── 📂 evaluation/ # Métricas, confusion matrices, ROC
│ └── model_comparison.csv # Tabla comparativa global
├── 📂 figures/ # Gráficas generadas
│ ├── 📂 report/ # Figuras del artículo
│ └── 📂 evaluation/ # Comparativas de evaluación
├── 📂 DOCUMENTACION/ # Documentación científica (.docx)
├── 📂 PARA_ANDROID_STUDIO/ # Modelos exportados para Android
├── main.py # Punto de entrada CLI
├── requirements.txt # Dependencias
└── README.md # Este archivo
git clone https://github.com/MijaGod-Creator/Entrenamiento-de-Redes-Neuronales-en-escenarios-FineTuning-TransferLearning-Scratch-.git
cd Entrenamiento-de-Redes-Neuronales-en-escenarios-FineTuning-TransferLearning-Scratch-
Opción A: Usando Conda / Anaconda (Recomendado - Evita errores en Windows) Si utilizas Anaconda o Miniconda, ejecuta el siguiente comando en tu terminal (Anaconda Prompt) para crear un entorno virtual e instalar todas las dependencias pre-compiladas (incluyendo controladores CUDA de GPU):
conda env create -f environment.yml
conda activate fer_env
Opción B: Usando pip estándar
Si prefieres usar pip de Python directo:
pip install -r requirements.txt
💡 Solución de problemas (Windows): Si al instalar por
pipobtienes un error relacionado con la compilación destringzilla(comoMicrosoft Visual C++ 14.0 or greater is required), puedes solucionarlo ejecutando:pip install "stringzilla<3.10"
El dataset ya viene incluido en el repositorio en dataset/Archive(2).zip (~39.5 MB). Solo debes descomprimirlo dentro de la carpeta dataset/raw/.
En Windows (PowerShell):
Expand-Archive -Path dataset/Archive(2).zip -DestinationPath dataset/raw
En Linux / macOS:
unzip dataset/Archive(2).zip -d dataset/raw
La estructura final de la carpeta debe quedar de la siguiente forma:
dataset/raw/
├── DATASET/
│ ├── train/
│ │ ├── 1/ (surprise)
│ │ ├── 2/ (fear)
│ │ ├── ...
│ │ └── 7/ (neutral)
│ └── test/
│ ├── 1/
│ └── ...
python main.py --stage setup
python main.py --stage eda
python main.py --stage preprocess
# POSTER++ (Campeón) - Scratch con augmentation
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --augmentation --mixup --cutmix --patience 30 --self-cure
# QCS (Subcampeón) - Scratch con augmentation
python main.py --stage train --architecture qcs --scenario scratch --epochs 100 --learning-rate 0.000035 --augmentation --mixup --cutmix --patience 30 --self-cure
# SwinFace - Scratch con augmentation
python main.py --stage train --architecture swin_face --scenario scratch --epochs 100 --learning-rate 0.000035 --augmentation --mixup --cutmix --patience 30 --self-cure
# DeiT - Scratch con augmentation
python main.py --stage train --architecture deit --scenario scratch --epochs 100 --learning-rate 0.000035 --augmentation --mixup --cutmix --patience 30 --self-cure
# VGG16 - Fine-Tuning estándar
python main.py --stage train --architecture vgg16 --scenario fine_tuning --epochs 30 --augmentation
python main.py --stage train-grid
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --resume
Para evaluar cuantitativamente el impacto de cada componente metodológico sobre el modelo líder (POSTER++), se pueden ejecutar secuencialmente los siguientes 6 experimentos de ablación controlada:
| Experimento | Configuración Metodológica | Accuracy (%) | $\Delta$ Acc | F1-Score Macro | $\Delta$ F1 |
|---|---|---|---|---|---|
| E1 | Línea Base (Sin Regularización) | 78.20 ± 0.45% | Línea Base | 0.6950 ± 0.012 | Línea Base |
| E2 | + Alineación Geométrica MTCNN | 80.12 ± 0.40% | +1.92% | 0.7210 ± 0.010 | +0.0260 |
| E3 | + Pesos de Clase Balanceados | 81.05 ± 0.42% | +0.93% | 0.7380 ± 0.011 | +0.0170 |
| E4 | + MixUp ($\alpha=0.2$) | 83.20 ± 0.38% | +2.15% | 0.7610 ± 0.009 | +0.0230 |
| E5 | + CutMix ($\alpha=0.35$) | 84.50 ± 0.35% | +1.30% | 0.7790 ± 0.008 | +0.0180 |
| E6 | + Mecanismo SCN (Atenuación Ruido) | 85.63 ± 0.38% | +1.13% | 0.7917 ± 0.008 | +0.0127 |
# E1: Línea Base (Sin alineación, sin pesos balanceados, sin MixUp/CutMix/SCN)
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30 --no-class-weight
# E2: + Alineación Geométrica MTCNN (Preprocesamiento canónico a 0° interocular)
python main.py --stage preprocess
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30 --no-class-weight
# E3: + Pesos de Clase Balanceados (Ponderación inversa frente al desbalance 16.78:1)
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30
# E4: + MixUp (Interpolación convexa en lote con distribución Beta α=0.2)
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30 --augmentation --mixup
# E5: + CutMix (Reemplazo rectangular de parches faciales α=0.35)
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30 --augmentation --mixup --cutmix
# E6: + Mecanismo SCN (Atenuación de ruido en etiquetas y regularización completa)
python main.py --stage train --architecture poster_v2 --scenario scratch --epochs 100 --learning-rate 0.000035 --patience 30 --augmentation --mixup --cutmix --self-cure
# Evaluar un modelo específico
python main.py --stage evaluate --architecture poster_v2 --scenario scratch --augmentation
# Comparar todos los modelos entrenados
python main.py --stage compare
compute_class_weight('balanced') para mitigar el desbalance| Escenario | Descripción |
|---|---|
| Scratch | Todas las capas entrenables. Pesos iniciales de VGGFace2 (modelos faciales) o ImageNet (CNNs) |
| Transfer Learning | Backbone completamente congelado. Solo se entrena la cabeza clasificadora |
| Fine-Tuning | Backbone congelado excepto el último bloque (block8/layers[-1]/blocks[-1]) |
Los modelos exportados para Android se encuentran en PARA_ANDROID_STUDIO/:
.ptl (PyTorch Lite) para PyTorch Mobile.onnx para ONNX Runtime// Ejemplo de uso en Android (Kotlin)
val module = LiteModuleLoader.load("poster_v2.ptl")
val inputTensor = TensorImageUtils.bitmapToFloat32Tensor(
bitmap, floatArrayOf(0.485f, 0.456f, 0.406f),
floatArrayOf(0.229f, 0.224f, 0.225f)
)
val output = module.forward(IValue.from(inputTensor)).toTensor()
Red híbrida que usa 68 landmark queries aprendibles (sin detector explícito) y atención bidireccional (Image→Landmarks→Image) sobre un backbone InceptionResnetV1 pre-entrenado en VGGFace2.
Usa Cross-Similarity Attention que durante el entrenamiento cruza features de diferentes muestras del batch mediante torch.roll(), forzando representaciones discriminativas. En inferencia usa self-attention.
Backbone Swin Transformer con ventanas desplazadas (W-MSA/SW-MSA), extracción multi-escala (local 1344ch + global 768ch = 2112ch), CBAM (Channel + Spatial attention) y TaskSpecificSubnet.
Vision Transformer con destilación via timm. Usa deit_tiny_patch16_224 (5.7M params) optimizado para datasets pequeños.
Este proyecto fue diseñado para funcionar en GPUs de gama portátil (RTX 3050 con 4GB VRAM):
| Técnica | Ahorro |
|---|---|
| Congelamiento selectivo de capas | VRAM: 3.2GB → 1.2GB (62%) |
| Mixed Precision (FP16) | Velocidad: 3x más rápido |
| Batch size optimizado (32) | Estabilidad de gradientes |
| DataLoader sin workers (Windows) | Compatibilidad sin deadlocks |
El directorio DOCUMENTACION/ contiene:
torch >= 2.0
torchvision >= 0.15
timm >= 0.9
facenet-pytorch >= 2.5
scikit-learn >= 1.3
pandas >= 2.0
numpy >= 1.24
Pillow >= 10.0
matplotlib >= 3.7
tqdm >= 4.65
python-docx >= 0.8
Mijamin Taipe - Proyecto de Inteligencia Artificial
Universidad - Reconocimiento de Emociones Faciales