Przejdź do treści
Wszystkie projekty

Projekt · 04

Status: W trakcie

Rozpoznawanie emocji na twarzy

Klasyfikator emocji na twarzy: sieć CNN wytrenowana od zera na wycinkach twarzy 48×48 w skali szarości, oceniona na osobnym zbiorze testowym i podpięta do aplikacji na FastAPI, która czyta obraz z kamery.

65%trafność · 7 klas

01 · Problem

Co trzeba było rozwiązać

Twarz w rozdzielczości 48×48 ma mało szczegółów, a klasy są bardzo nierówne: zbiór testowy ma 111 zdjęć „obrzydzenia” i 1774 „radości”. Jedna liczba trafności ukrywa, jak model radzi sobie z rzadkimi klasami.

02 · Rozwiązanie

Jak to działa

Średniej wielkości CNN (bloki Conv2D z BatchNormalization, MaxPooling, Dropout i GlobalAveragePooling), część walidacyjna wydzielana automatycznie z danych treningowych, ostateczna ocena tylko na nietkniętym zbiorze testowym i jedno przygotowanie obrazu dla treningu, ewaluacji i predykcji na żywo.

03 · Funkcje

Co potrafi

  • Wykrywanie twarzy klasyfikatorem Haara z OpenCV, potem wycięcie, skala szarości i 48×48
  • 65,0% trafności na 7 klasach; F1 0,87 dla radości i 0,77 dla zaskoczenia
  • Wykresy treningu, raport dla każdej klasy i macierz pomyłek zapisane w repo
  • Skrypt do predykcji na jednym zdjęciu i aplikacja na FastAPI z kamerą

04 · Technologie

Zbudowane z

  • Python
  • Keras
  • OpenCV
  • FastAPI
Status
W trakcie
Kod
github.com/KacperBlok1/face-emotion-recognition-cnn
Demo
Nie ma wersji online · uruchom lokalnie

05 · Wyzwania

Co było trudne

  1. Rzadkie klasy

    Czułość dla „obrzydzenia” to 22%, a dla „strachu” 30%: przy tak małej liczbie przykładów model słabo się ich uczy. Raport dla każdej klasy i macierz pomyłek pokazują to zamiast chować za ogólnymi 65%.

  2. To samo przygotowanie obrazu wszędzie

    Gdyby aplikacja z kamerą przygotowywała twarze inaczej niż przy treningu, trafność spadłaby bez żadnego błędu. Jedna wspólna funkcja jest używana przy treningu, ewaluacji i predykcji.

  3. Wersje zależności

    TensorFlow 2.10 wymaga numpy<2 i protobuf<3.20, więc wersje są przypięte, a OpenCV instaluje się z --no-deps, żeby pip nie podbił numpy.

06 · Zrzuty ekranu

Jak to wygląda

Strata i trafność na zbiorze treningowym i walidacyjnym w kolejnych epokach
Historia treningu: strata i trafność w kolejnych epokachOtwórz obraz w pełnym rozmiarze ↗
Macierz pomyłek siedmiu emocji na zbiorze testowym
Macierz pomyłek na zbiorze testowymOtwórz obraz w pełnym rozmiarze ↗

Wypróbuj

Uruchom lokalnie

Nie ma jeszcze wersji online. Kod i README są na GitHubie, a te polecenia uruchamiają projekt z głównego katalogu repozytorium.

terminal
$ pip install "opencv-python>=4.8.0,<4.10" --no-deps
$ pip install -r requirements.txt
$ python -m uvicorn app:app --port 8002 --reload