Verborgene Signale · Begleitseite ← Alle Aktivitäten DE·EN
Kapitel 9 · Das Gesicht als Lesegerät · Aktivität 9.2

Stimmung über eine Stunde

Ein gedächtnisloses Modell, viele Male angewandt: Du zeichnest deinen Emotionsverlauf über längere Zeit auf und plottest ihn — und siehst, wie sich Stimmung über den Tag bewegt.

Dauer 90 Min + Aufzeichnung Schwierigkeit mittel Gruppe allein Rein digital S

Kurz gesagt

Was: Du baust den Mimik-Spiegel aus 9.1 zu einem stillen Rekorder um. Er misst nicht laufend am Bildschirm, sondern speichert alle paar Sekunden eine Zeile: Zeitstempel und die erkannten Gefühls-Wahrscheinlichkeiten. Danach plottest du daraus eine Kurve deiner Stimmung.

Der Kerngedanke: Die Zeit steckt nicht im Modell — das kennt nur den Augenblick —, sondern in deiner Auswertung. Das ist oft der billigste Weg zu einer zeitlichen Analyse: ein leichtes Modell, viele Male angewandt.

Du brauchst: das Setup aus 9.1 (Webcam, hsemotion, OpenCV) sowie pandas und matplotlib fürs Auswerten.

Worum es geht

In der KI-Landkarte dieses Buches gibt es einen feinen, aber wichtigen Unterschied. Ein Momentaufnahme-Modell entscheidet für jede Eingabe einzeln, ohne Gedächtnis: ein Gesicht — eine Stimmung. Du kannst so ein Modell aber im Sekundentakt laufen lassen und erst hinterher den Verlauf betrachten. Dann steckt die Zeit in deiner Auswertung, nicht im Modell. Genau das tust du hier: aus vielen Momentaufnahmen wird eine Stimmungskurve.

Das ist keine Spielerei, sondern die Grundidee hinter dem virtuellen Spiegeln aus Kapitel 5. Als in einer Hamburger Bank Mitarbeitende täglich eine Rückmeldung über ihre Stimmung bekamen, wurden sie messbar glücklicher und aktiver — allein dadurch, dass ihr Befinden sichtbar wurde. Wer sich selbst ehrlich sieht, kann sich ändern. Deine Stundenkurve ist dieser Spiegel im Kleinen.

Ein bisschen Hintergrund

Warum mitteln? Ein gedächtnisloses Modell springt von Bild zu Bild. Ein einzelnes Bild, in dem du gerade gähnst oder wegschaust, würde die Kurve verfälschen. Deshalb glätten wir: Wir sammeln die Vorhersagen über ein Zeitfenster (etwa zehn Sekunden) und nehmen den Durchschnitt. So wird aus zappeligem Rauschen ein lesbarer Trend — dieselbe Idee wie das gleitende Mittel in der Pflanzen-Aktivität 13.1.

Eine Zahl für „Stimmung“. Statt sieben Emotionen zugleich zu verfolgen, ist es oft anschaulich, eine einzige Wohlfühl-Achse zu bilden: positive Anteile (Freude, angenehme Überraschung) minus negative (Ärger, Trauer, Angst, Ekel). Das ist eine grobe Vereinfachung — aber eine ehrliche, solange man weiss, dass man vereinfacht.

Deine Daten bleiben deine

Der Rekorder speichert keine Bilder, nur Zahlen — Zeitstempel und Wahrscheinlichkeiten. Trotzdem ist eine Stunde deines Gesichts sehr persönlich. Lass die Datei auf deinem Rechner, teile sie nicht ungefragt, und wenn die Klasse Ergebnisse bespricht, dann anonym und freiwillig. Das ist die goldene Regel dieses Buches: Was über dich herausgefunden wird, gehört dir.

Teil A — Aufzeichnen

  1. Pakete ergänzen. pip install pandas matplotlib (zusätzlich zu hsemotion opencv-python aus 9.1).
  2. Rekorder starten. Skript unten ausführen. Es öffnet kein grosses Vorschaufenster, sondern schreibt still alle paar Sekunden eine Zeile in stimmung.csv.
  3. Etwas tun. Arbeite eine Weile normal — lies, löse Aufgaben, schau ein kurzes lustiges und ein ernstes Video. Je abwechslungsreicher, desto interessanter die Kurve. Für den Unterricht reichen 15–20 Minuten; „eine Stunde“ ist das schönere Ziel für zu Hause.
  4. Beenden. Mit Strg+C in der Konsole. Die CSV-Datei bleibt liegen.
import cv2, time, csv
from datetime import datetime
from hsemotion.facial_emotions import HSEmotionRecognizer

fer = HSEmotionRecognizer(model_name="enet_b0_8_best_afew")
detector = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
cam = cv2.VideoCapture(0)

INTERVALL = 3          # alle 3 Sekunden eine Messung
labels = ["Anger","Contempt","Disgust","Fear","Happiness","Neutral","Sadness","Surprise"]

with open("stimmung.csv", "w", newline="") as f:
    schreiber = csv.writer(f)
    schreiber.writerow(["zeit"] + labels)      # Kopfzeile
    print("Rekorder laeuft — Strg+C beendet.")
    try:
        while True:
            ok, frame = cam.read()
            if ok:
                grau = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                gesichter = detector.detectMultiScale(grau, 1.3, 5)
                if len(gesichter):
                    x, y, w, h = gesichter[0]
                    _, scores = fer.predict_emotions(frame[y:y+h, x:x+w], logits=False)
                    zeile = [datetime.now().isoformat(timespec="seconds")] + list(scores)
                    schreiber.writerow(zeile)
                    f.flush()
            time.sleep(INTERVALL)
    except KeyboardInterrupt:
        pass

cam.release()
print("Fertig — Daten in stimmung.csv")

Teil B — Auswerten und Plotten

Der zweite Teil liest die CSV, glättet sie und zeichnet deine Stimmungskurve. Läuft auch im Browser (Pyodide); vollständiger Code auf GitHub.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("stimmung.csv", parse_dates=["zeit"]).set_index("zeit")

# Eine einzige "Wohlfuehl"-Achse: positiv minus negativ
positiv = df["Happiness"] + df["Surprise"]
negativ = df["Anger"] + df["Sadness"] + df["Fear"] + df["Disgust"]
df["wohl"] = positiv - negativ

# Glaetten: gleitendes Mittel ueber ~30 Sekunden (bei 3s-Takt = 10 Messungen)
df["wohl_glatt"] = df["wohl"].rolling(window=10, center=True, min_periods=3).mean()

plt.figure(figsize=(10, 4))
plt.plot(df.index, df["wohl"], color="#cfc6b4", label="roh")
plt.plot(df.index, df["wohl_glatt"], color="#2F5D3A", lw=2, label="geglaettet")
plt.axhline(0, color="#999", lw=0.8)
plt.ylabel("Wohlfuehl-Achse  (positiv − negativ)")
plt.title("Meine Stimmung ueber die Zeit")
plt.legend(); plt.tight_layout(); plt.show()

Was du sehen solltest

Eine zappelige rohe Linie und darüber eine ruhige grüne Trendkurve. Sie steigt in Momenten, in denen du gelacht oder etwas Schönes gesehen hast, und sinkt bei Ärger oder Langeweile. Oft erkennst du Ereignisse wieder: „Da lief das lustige Video.“ Wenn deine Kurve fast flach bleibt, war die Stunde entweder ruhig — oder das Modell hat dich meist als „Neutral“ gelesen, was bei konzentrierter Arbeit normal ist.

Arbeitsblatt

Aus Momenten wird ein Verlauf

  1. Markiere in deiner Kurve zwei Stellen und beschreibe, was du in diesem Moment getan hast. Passt der Ausschlag zu deiner Erinnerung?
  2. Was ändert sich, wenn du das Glättungsfenster von 10 auf 3 (oder auf 30) Messungen stellst? Was gewinnst du, was verlierst du bei starker Glättung?
  3. Wo genau steckt in diesem Versuch die „Zeit“ — im Modell oder in deiner Auswertung? Begründe.
  4. Nenne einen Grund, warum die „Wohlfühl-Achse“ (positiv minus negativ) eine grobe Vereinfachung ist. Wann könnte sie in die Irre führen?
  5. Dieser Versuch ist „virtuelles Spiegeln“ im Kleinen. Wieso kann allein das Sichtbarmachen der eigenen Stimmung etwas verändern — auch ganz ohne Ratschlag?
Lösung anzeigen

1. Individuell. Ziel ist, dass die Lernenden Ausschläge mit realen Ereignissen verknüpfen und dabei merken, dass die Kurve grob passt, aber nicht jeden inneren Zustand trifft.

2. Ein kleines Fenster (3) folgt der rohen Linie eng — empfindlich, aber verrauscht. Ein grosses Fenster (30) zeigt nur noch den groben Trend — ruhig, aber kurze, echte Ausschläge verschwinden. Glätten ist immer ein Tausch: Ruhe gegen Auflösung.

3. Im der Auswertung. Das Modell ist ein Momentaufnahme-Modell ohne Gedächtnis; es entscheidet jedes Bild einzeln. Erst dass wir viele Vorhersagen mit Zeitstempel sammeln und aneinanderreihen, erzeugt einen Verlauf.

4. Sie wirft sehr verschiedene Zustände in einen Topf: Überraschung kann positiv (Freude) oder negativ (Schreck) sein, wird hier aber immer positiv gezählt. Und „neutral“ — oft der häufigste Zustand — verschwindet ganz. Die Achse verdichtet, aber sie verliert Bedeutung.

5. Weil Selbstwahrnehmung ungenau ist: Man merkt oft gar nicht, wie sich die eigene Stimmung über den Tag bewegt. Ein sichtbarer Verlauf gibt einen ehrlichen Bezugspunkt, an dem man Muster erkennt („nach dem Mittag kippt es immer“) — und Erkennen ist die Vorstufe zum Ändern.

Wenn's klemmt

ProblemWahrscheinliche Ursache & Lösung
CSV bleibt leerKein Gesicht gefunden (Licht, Position) oder Kamera belegt. Erst 9.1 zum Laufen bringen, dann hier weiter.
Kurve ist fast nur „Neutral“Bei konzentrierter Arbeit normal. Bewusst abwechslungsreiche Reize einbauen (lustiges/ernstes Video), oder länger aufzeichnen.
rolling-Kurve voller Lückenmin_periods zu hoch für kurze Aufnahmen. Auf min_periods=1 senken oder länger messen.
Zeitachse unleserlich gestauchtSehr viele Punkte. In matplotlib die Achse mit fig.autofmt_xdate() drehen oder auf Minuten heruntersampeln (df.resample("1min").mean()).
Rekorder frisst viel RechenleistungIntervall grösser wählen (z. B. INTERVALL = 5) — für einen Stundenverlauf reicht das völlig.

Zum Nachdenken

Erweiterung

← 9.1 Der Mimik-Spiegel 9.3 Persönlichkeit aus Mimik →