# Wie die Erkennung funktioniert [← zurück zum Überblick](../README.md) · [alle Kapitel](README.md) Drei Stufen, ein Artenfilter und eine Abstimmung über den ganzen Besuch. Wer nur wissen will, *ob* es funktioniert, ist in [Wie gut ist das wirklich](genauigkeit.md) besser bedient — hier steht, *warum* es funktioniert. Drei Stufen, jede filtert für die nächste vor. **1. Bewegung** (`motion.py`, <1 ms) — Frame-Differencing gegen einen gleitenden Hintergrund. Der zieht langsam nach, damit Sonnenstand und Wolken keine Dauerbewegung auslösen; bei erkannter Bewegung *langsamer*, sonst frisst sich ein still sitzender Vogel binnen Sekunden in den Hintergrund ein. Diese Stufe lässt sich abschalten (`--gate detector`), und an unserer Kamera ist das nötig: Sie schaut aus dem Futterhaus in eine Hecke, die im Wind steht. Gemessen sind dort 6,9 % bewegte Pixel im Median und 95 % aller Bilder über der Schwelle — als Vorfilter damit wertlos. **2. Vogel ja/nein** (`classify.py`, ~15 ms) — SSD-MobileNet auf COCO. Sagt nur, ob und wo ein Vogel im Bild ist. Verhindert, dass ein wackelnder Ast als Kohlmeise in der Sammlung landet, und liefert den Ausschnitt für Stufe 3. **3. Welche Art** (`classify.py`, ~25 ms) — MobileNetV2 auf iNaturalist, 965 Vogelarten, angewendet auf den zugeschnittenen Vogel statt aufs ganze Bild. ### Der Kniff mit dem Artenfilter Das iNat-Modell ist Nordamerika-lastig. Ungefiltert wird aus einer Kohlmeise gern eine *Carolina Chickadee* — die sieht ähnlich aus und ist im Trainingsmaterial häufiger. Der Katalog schränkt die Modellausgabe deshalb auf Arten ein, die hier realistisch vorkommen, und normiert die Wahrscheinlichkeit neu. Der Anteil der Wahrscheinlichkeitsmasse, der überhaupt auf heimische Arten fällt (`bird_score`), ist dabei das eigentliche Gütemaß — nicht die Confidence des Top-Treffers, denn die ist nach der Neunormierung per Konstruktion hoch. Liegt `bird_score` unter `--min-bird-score`, sieht das Modell zwar sicher einen Vogel, aber keinen von hier; die Sichtung wird dann als *unbestimmt* gespeichert statt geraten. `--habitats` engt weiter ein. Eine Kamera am Futterhaus soll gar nicht erst erwägen, ob der Fleck auf dem Ast ein Kranich ist. ### Abstimmung über den ganzen Besuch Eine einzelne Klassifikation ist wackelig: Von hinten ist eine Kohlmeise nur eine olivgrüne Kugel. Die Einheit ist deshalb nicht das Bild, sondern der **Besuch** — von der ersten Erkennung bis zu einigen Sekunden Ruhe. Über den Besuch hinweg wird abgestimmt, gewichtet nach Detektor-Sicherheit, Größe des Vogels im Bild und `bird_score`. Parallel wird das schärfste Foto behalten (Varianz der Laplace-Antwort), damit in der Sammlung kein verwackeltes Bild landet. Kippt die Abstimmung, wird die Sichtung als unbestimmt gespeichert — eine Lücke im Dex ist besser als ein falscher Eintrag, aus dem ein Kind etwas Falsches lernt. ### Was das Modell nicht kann Sechs in Deutschland vorkommende Arten fehlen im Trainingsmaterial und werden zwangsläufig auf verwandte Arten gemappt: Sumpfmeise · Weidenmeise · Haubenmeise · Gartenbaumläufer · Kleinspecht · Waldkauz `python -m detector species` listet das mit auf. Der Weg dahin: eigene Bilder sammeln (`--save-to` tut genau das), im Admin von Hand bestätigen (Feld *Von Hand bestätigt als*) und später ein eigenes Modell nachtrainieren. Dann lernt es gleich die Beleuchtung und den Blickwinkel der eigenen Kamera mit. > **Beim Nachschlagen im Label-File aufpassen:** Es benutzt teils veraltete > wissenschaftliche Namen. Der Bluthänfling steht dort als *Carduelis > cannabina*, nicht als *Linaria cannabina* — wer nach dem heutigen Namen > sucht, hält die Art fälschlich für eine Lücke.