Advanced CVPR for Biometrics

Facial Emotion Recognition using EfficientNetB3, VGG16, and classical CV pipelines

Facial biometric analysis pipeline combining deep learning classifiers, classical feature extraction (CLAHE + PCA), and a Flask inference API — trained on the FER dataset across 7 emotion classes.



Tech Stack

Python   PyTorch   torchdiffeq   Flask   OpenCV   sklearn

🧠 Models

EfficientNetB3 (Transfer Learning)

Pre-trained on ImageNet and fine-tuned on the FER dataset (28,709 training images, 7 classes). The classifier head uses dual BatchNorm layers and staged dropout to stabilize training on the imbalanced FER distribution.

EfficientNetB3 → BN → Dense(256, L2) → BN → Dropout(0.4) → Dense(128) → Dropout(0.3) → Softmax(7)
Split Accuracy
Train 53.5%
Validation 47.1%
Test 69% (after full fine-tune)

Training used ReduceLROnPlateau, EarlyStopping, and ModelCheckpoint with Adamax optimizer.

VGG16

Compared against EfficientNetB3 on the same FER pipeline. Used as a baseline to evaluate transfer learning depth vs. breadth trade-offs for low-resolution facial images (96×96).

🖼️ Classical CV Pipeline

  • CLAHE (Contrast Limited Adaptive Histogram Equalization) via OpenCV for preprocessing low-contrast facial images before feature extraction
  • PCA for dimensionality reduction of handcrafted features, used as a lightweight baseline alongside the deep models

🚀 Flask Inference API

A REST endpoint wraps the trained model for real-time emotion prediction from uploaded images:

POST /predict  →  { "emotion": "happy", "confidence": 0.87 }

📓 Notebook