Wróć do projektów
Deep Learning · Praca akademicka
2026 Akademia Tarnowska · ML II 7 klas emocji

Rozpoznawanie Emocji
z Wyrazu Twarzy

End-to-end pipeline deep learningu na zbiorze FER-2013 — od eksploracji danych i augmentacji, przez CNN i automatyczne strojenie hiperparametrów (Keras Tuner Hyperband), po wdrożenie w aplikacji Gradio z wizualizacją Grad-CAM.

35 887
Obrazów FER-2013
CNN + Hyperband
Architektura
Grad-CAM
Interpretowalność
2 osoby
Zespół
happy
sad
angry
fear
disgust
surprise
neutral

Praca zaliczeniowa
z uczenia maszynowego II

Celem projektu było zaprojektowanie i wytrenowanie konwolucyjnej sieci neuronowej klasyfikującej siedem kategorii emocji na podstawie zdjęć twarzy ze zbioru FER-2013, a następnie wdrożenie modelu jako interaktywnej aplikacji webowej.

Pipeline obejmuje eksploracyjną analizę danych, augmentację w locie, bazową architekturę CNN, automatyczne strojenie hiperparametrów algorytmem Hyperband oraz wizualną interpretowalność predykcji techniką Grad-CAM.

📊
EDA i niezbalansowanie klas
Analiza struktury FER-2013 — klasa happy zdecydowanie najliczniejsza, disgust wielokrotnie rzadszy
🔄
Augmentacja w locie
Rotacja, przesunięcie, odbicie lustrzane, zoom i jasność — ImageDataGenerator redukujący overfitting
🧠
CNN — 3 bloki konwolucyjne
Conv2D + BatchNorm + MaxPool + Dropout, klasyfikator Dense 256 jednostek, wyjście Softmax 7 klas
🎛️
Keras Tuner Hyperband
Automatyczne przeszukiwanie hiperparametrów metodą successive halving — 5–10× mniej epok niż Grid Search
🔥
Grad-CAM
Mapy cieplne Inferno wskazujące, które obszary twarzy decydują o predykcji emocji
🌐
Wdrożenie w Gradio
Interaktywna aplikacja webowa z obsługą kamery, wykresem Softmax i adnotacją bounding boxa

FER-2013

35 887
Obrazów łącznie
28 709
Zbiór treningowy
7 178
Zbiór testowy
48 × 48 px
Skala szarości
train_datagen = ImageDataGenerator(
    rescale            = 1./255,   # Normalizacja pikseli do [0,1]
    rotation_range     = 15,       # Losowa rotacja +-15 stopni
    width_shift_range  = 0.1,      # Przesuniecie poziome do 10%
    height_shift_range = 0.1,      # Przesuniecie pionowe do 10%
    horizontal_flip    = True,     # Odbicie lustrzane
    zoom_range         = 0.1,      # Losowy zoom 90-110%
    brightness_range   = [0.8, 1.2]  # Losowa jasnosc 80-120%
)

Potok inferencji emocji

🖼️
Obraz wejściowy
RGB / PIL
🔲
Detekcja twarzy
Haar Cascade
⚙️
Preprocessing
resize 48×48, /255.0
🧠
CNN predict()
Softmax, 7 klas
🔥
Grad-CAM
+ wykres + adnotacja
01
Blok konwolucyjny 1

2× Conv2D(32) z aktywacją ReLU, BatchNormalization, MaxPooling2D i Dropout(0.25). Wyjście: 12×12×32.

Conv2D(32) x2 + BN
MaxPool2D + Dropout(0.25)
-> 12x12x32
02
Blok konwolucyjny 2

2× Conv2D(64), BatchNormalization, MaxPooling2D i Dropout(0.25). Wyjście: 6×6×64.

Conv2D(64) x2 + BN
MaxPool2D + Dropout(0.25)
-> 6x6x64
03
Blok konwolucyjny 3

2× Conv2D(128), BatchNormalization, MaxPooling2D i Dropout(0.40). Wyjście: 3×3×128, dalej Flatten → 1152.

Conv2D(128) x2 + BN
MaxPool2D + Dropout(0.40)
-> 3x3x128 -> Flatten 1152
04
Klasyfikator Dense

Warstwa Dense 256 jednostek z ReLU, BatchNormalization i Dropout(0.50), zakończona warstwą Softmax na 7 klas.

Dense(256, relu) + BN
Dropout(0.50)
-> Dense(7, softmax)
05
Hyperband — przestrzeń przeszukiwania

Filtry Conv2D, dropout konwolucyjny i klasyfikatora, liczba neuronów Dense oraz learning rate Adama strojone automatycznie.

kt.Hyperband(
  build_model,
  objective='val_accuracy',
  max_epochs=15, factor=3)
06
Grad-CAM — hooki gradientowe

Automatyczne wykrywanie ostatniej warstwy Conv2D modelu — odporne na zmiany architektury bez ręcznej aktualizacji.

for layer in reversed(model.layers):
  if isinstance(layer, Conv2D):
    return layer.name

Model bazowy vs Hyperband

Model Val Accuracy Val Loss
Model bazowy ~60–65% ~1.05–1.20
Model po Hyperband ~63–68% ~0.95–1.10
Poprawa +3–5% ~−0.10

Wyniki mieszczą się w typowym zakresie dla CNN trenowanych bezpośrednio na FER-2013 bez transfer learningu (state-of-the-art ok. 73–75% przy dużych architekturach pretrenowanych). Strojenie Hyperband potwierdziło mierzalną poprawę dokładności walidacyjnej przy akceptowalnym koszcie obliczeniowym.

Stack technologiczny

🧮
TensorFlow / Keras
Budowa i trening konwolucyjnej sieci neuronowej, warstwy Conv2D, BatchNorm, Dropout.
🎛️
Keras Tuner
Algorytm Hyperband do automatycznego strojenia hiperparametrów modelu.
🌐
Gradio
Interaktywna aplikacja webowa — Premium Dark UI, obsługa kamery i wykresów.
👁️
OpenCV
Detekcja twarzy Haar Cascade, nakładanie map cieplnych Grad-CAM (alpha blending).
📈
Matplotlib / Seaborn
Wizualizacje EDA, krzywe uczenia, wykresy rozkładu Softmax.
🐍
Python / NumPy / Pandas
Przetwarzanie danych, pipeline augmentacji i analiza wyników.

Struktura projektu

📊
zajecia2_data_analysis.py
EDA: analiza struktury FER-2013, wykresy, augmentacja
🔄
zajecia2_deep_learning.py
Data pipeline, konfiguracja generatora danych
🧠
zajecia2_cnn.py
Budowa CNN, trening bazowy, Keras Tuner Hyperband
📉
zajecia4_klasyfikacja.py
Macierz pomyłek, ROC, permutation importance
🌐
app.py
Aplikacja Gradio — detekcja emocji + wizualizacja Grad-CAM
💾
best_model.keras
Najlepszy wytrenowany model (plik binarny Keras)

Autorzy projektu

AT
Andrii Torianyk
CNN, Keras Tuner Hyperband, Grad-CAM, aplikacja Gradio
github.com/Andrii418
BT
Bohdan Tsybulenko
EDA, pipeline danych, augmentacja, ewaluacja modelu
github.com/jpDG1
Wszystkie projekty