Begleitender Prototyp zum Position Paper Emotionserkennung in Video-Calls mit Künstlicher Intelligenz. Das System besteht aus vier eigenständig startbaren Komponenten, die per HTTP kommunizieren.
[Desktop App: Python/Tkinter]
| POST /frame (JPEG, ~1 fps)
v
[Backend: Node.js + Express] ---- POST /predict (JPEG) ----> [ML Service: Python/FastAPI + YOLO]
^ (best.pt)
| GET /status (poll 1.5 s)
|
[Frontend: React/Vite – Ampel mit Smileys]
| Ordner | Aufgabe | Port |
|---|---|---|
ml-service/ |
YOLO-Inferenz (FastAPI), lädt best.pt |
8001 |
backend/ |
Express-Proxy, Emotion→Ampel-Mapping, In-Memory-Status | 3000 |
desktop/ |
Screen Capture, sendet Frames an das Backend | – |
frontend/ |
React-Ampel, pollt /status alle 1,5 s |
5173 |
Das trainierte Modell liegt in
Facial Emotion Detection/best.pt
und wird im Setup nach ml-service/best.pt kopiert.
Das YOLO-Modell unterscheidet sieben Klassen. Die zentrale Zuordnung lebt in
backend/src/emotionMapping.js:
| Emotion | Ampel |
|---|---|
happy, surprise |
grün |
neutral |
gelb |
sad, angry, fear, disgust |
rot |
Zusätzlich liefert das Backend einen smoothedLight-Wert, der die häufigste
Ampelfarbe über die letzten fünf Frames repräsentiert, damit die Anzeige
nicht flackert.
Alle drei serverseitigen Dienste mit einem Befehl bauen und starten:
docker compose up --build- Frontend: http://localhost:5173
- Backend: http://localhost:3000
- ML Service: http://localhost:8001 (intern; nur für Debug exponiert)
Stoppen mit docker compose down. Beim ersten Build dauert der ML-Service
etwas länger, weil PyTorch/Ultralytics installiert wird (≈ 1.5 GB Image).
Die Desktop-App läuft NICHT im Container – sie braucht den echten Host-Bildschirm. Wie gewohnt starten:
cd desktop
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.py # postet an http://localhost:3000Vier Terminals – jeweils ein Dienst:
cd ml-service
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# best.pt einmalig hineinkopieren:
cp "../Facial Emotion Detection/best.pt" ./best.pt
uvicorn app:app --host 0.0.0.0 --port 8001cd backend
npm install
npm run dev # http://localhost:3000cd frontend
npm install
npm run dev # http://localhost:5173cd desktop
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.pyIm UI „Start" drücken – die Ampel im Browser sollte innerhalb von ein bis zwei Sekunden reagieren.
Alle Komponenten haben sinnvolle Defaults, lassen sich aber per Umgebungs- variable umlenken (Ports anders belegt, Hosts gewechselt usw.):
| Komponente | Variable | Default |
|---|---|---|
| ml-service | MODEL_PATH |
./best.pt |
| ml-service | MIN_CONFIDENCE |
0.25 |
| backend | PORT |
3000 |
| backend | ML_SERVICE_URL |
http://localhost:8001 |
| backend | ML_TIMEOUT_MS |
10000 |
| frontend | VITE_BACKEND_URL |
http://localhost:3000 |
| desktop (UI) | Backend-URL Feld | http://localhost:3000 |
| desktop | REQUEST_TIMEOUT_S |
8 lokal, 30 bei https:// |
- macOS Screen Recording Permission – beim ersten Capture-Start fragt macOS nach der Berechtigung. Unter Systemeinstellungen → Datenschutz & Sicherheit → Bildschirmaufnahme freigeben und die Desktop-App neu starten.
- CORS / Frontend findet Backend nicht – sicherstellen, dass das Backend auf Port 3000 läuft und CORS aktiv ist (Default).
face_found: falseim Backend-Response – kein Gesicht im aktuellen Frame erkannt. Mit dem Mauszeiger das Videofenster des Gesprächspartners in den Vordergrund holen oder größer ziehen.- Hohe CPU-Last im ML-Service – Intervall in der Desktop-App auf
z. B. 2 s hochsetzen oder
MIN_CONFIDENCEanheben.
Die Cloud-Variante aus dem Position Paper ist unter terraform/
umgesetzt: S3 + CloudFront (Frontend), API Gateway, zwei Lambda-Container
(App-Backend + Emotions-ML).
Kurzablauf:
cp "Facial Emotion Detection/best.pt" ml-service/best.pt
cd terraform && cp terraform.tfvars.example terraform.tfvars && terraform init
terraform apply -target=module.ecr -target=module.iam
./scripts/build-and-push.sh
terraform apply
./scripts/upload-frontend.shDetails, Warm-up-Hinweis und Desktop-URL: terraform/README.md.
- Browser:
terraform output cloudfront_url - Desktop-App: Backend-URL =
terraform output desktop_backend_url(endet auf/api) - GitHub: optional; lokales Deploy reicht. Keine AWS-Keys ins Repo.
Kein terraform apply nötig — nur bauen und nach S3 hochladen:
cd terraform
eval "$(aws configure export-credentials --profile default --format env)" # falls aws login
./scripts/upload-frontend.shDanach Browser hard-refreshen (oder 1–2 Min. warten bis CloudFront-Invalidation durch ist).
Lokal und in AWS bleibt der Datenfluss gleich: Desktop-App → HTTP-API
(Express unter /api) → Inferenz (FastAPI/YOLO) → Webanwendung (/api/status).
In AWS ist keine persistente Datenbank vorgesehen; der Ampel-Status lebt
kurzzeitig im Speicher der App-Lambda (Provisioned Concurrency = 1).
cp "Facial Emotion Detection/best.pt" ml-service/best.pt cd terraform && cp terraform.tfvars.example terraform.tfvars && terraform init terraform apply -target=module.ecr -target=module.iam ./scripts/build-and-push.sh terraform apply ./scripts/upload-frontend.sh