Projekt · 04
Status: W trakcieRozpoznawanie 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
05 · Wyzwania
Co było trudne
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%.
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.
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
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.
$ pip install "opencv-python>=4.8.0,<4.10" --no-deps
$ pip install -r requirements.txt
$ python -m uvicorn app:app --port 8002 --reload
