Eine Kamera am Vogelhaus, ein Rechner der erkennt wer da war — und eine Sammlung, die sich von allein fuellt. Zwei neuronale Netze: eines findet den Vogel im Bild, eines bestimmt die Art. 148 heimische Arten, auf Deutschland eingeschraenkt und neu normiert — ohne diese Einschraenkung wird aus einer Kohlmeise eine nordamerikanische Schwesterart. Daraus entsteht ein Sammelalbum: nummerierte Seiten, gefundene Arten in Farbe, fehlende als Schatten, dazu Erstfang, Punkte, Stufen und 15 Abzeichen. Laeuft vollstaendig auf eigener Hardware. Kein Cloud-Dienst, kein Konto, keine Telemetrie; die Bilder verlassen das eigene Netz nicht. Zwei getrennt deploybare Teile: die Sammlung als Django-Anwendung, die Erkennung als eigener Dienst. Der Erkennungs-Dienst fragt selbst an und braucht deshalb weder eine erreichbare Adresse noch einen offenen Port — er laeuft hinter einem gewoehnlichen Router. Dabei: Firmware fuer Raspberry Pi und ESP32-S3, Anbindung an Home Assistant ueber MQTT, Oberflaeche auf Deutsch und Englisch, Einstellungen je Kamera aus dem Browser, und ein Weg fuer Fotos von unterwegs. AGPL-3.0.
5.2 KiB
Wie gut ist das wirklich
← zurück zum Überblick · alle Kapitel
Gemessene Zahlen statt Versprechen: 43 von 44 Arten richtig, keine falsch bestimmt — und daneben das, was im Feld tatsächlich passiert ist, nämlich wochenlang nichts. Beides gehört zusammen.
scripts/benchmark.py jagt echte Vogelfotos durch dieselbe Pipeline, die auch
an der Kamera läuft, und vergleicht mit der bekannten Art:
./venv/bin/python scripts/benchmark.py --referenz web/media/referenz
./venv/bin/python scripts/benchmark.py --hole # mehr Bilder von Commons
Über 44 Referenzfotos, ein Bild je Gartenvogelart:
| Richtig bestimmt | 43 / 44 — 97,7 % |
| Als unbestimmt verworfen | 1 (Mauersegler, füllt 6 % des Bildes) |
| Falsch bestimmt | 0 |
Die Null bei den Falschbestimmungen ist das eigentliche Ergebnis. Bei Unsicherheit schweigt das System, statt zu raten.
Diese Zahl ist eine Obergrenze, keine Prognose. Commons-Fotos sind gut belichtete Nahaufnahmen von Fotografen, die den Vogel im Sucher hatten. Eine feste Kamera am Futterhaus liefert Gegenlicht, Bewegungsunschärfe und halb verdeckte Vögel.
Was im Feld tatsächlich passiert ist
Die Null oben stammt aus Referenzfotos. Am eigenen Futterhaus sieht es anders aus — hier die Fälle, die bis zum 30.09.2026 aufgetreten sind.
🔴 Eine Falschbestimmung mit 94,5 % Sicherheit
Am 30.09.2026 bestimmte das Modell eine Kohlmeise als Blaumeise — und war sich dabei sicherer als bei jeder richtigen Bestimmung davor.
| Sicherheit | 0,945 |
| Bilder mit Vogel | 5 von 31 |
| Der Grund | Der Kopf war verwischt |
Die gelbe Brust mit dem dunklen Längsstreifen war zu sehen, die blaue Kappe nicht — und genau die unterscheidet die beiden Arten. Das Modell musste ohne das entscheidende Merkmal entscheiden und tat es trotzdem mit voller Überzeugung.
🔑 Die Sicherheit misst nicht, ob genug zu sehen war. Sie sagt nur, wie gut das Sichtbare zu einer Art passt. Bei Bewegungsunschärfe kann sie hoch sein und trotzdem falsch liegen — genau der Fall, den der Absatz über die Obergrenze vorhersagt.
Korrigieren:
./venv/bin/python web/manage.py sichtung_bestimmen 228 kohlmeise --trocken
./venv/bin/python web/manage.py sichtung_bestimmen 228 kohlmeise
⚠️ Nicht einfach das Feld im Admin ändern. An einer Bestimmung hängt der Dex-Eintrag der falschen Art, der Erstfang und die dreifachen Punkte. Der Befehl räumt das mit auf und rechnet die Punkte mit derselben Formel neu, die auch bei der Vergabe gilt.
🔴 24 Sichtungen von Spiegelungen auf Wasser
Am 27.09.2026 lieferte die Kamera an der Vogeltränke zwischen 19:01 und 19:40 vierundzwanzig Sichtungen. Keine einzige davon war ein Vogel.
| Tränke | Futterhaus | |
|---|---|---|
| mittlerer Vogel-Wert | 0,000 | 0,431 |
| Bilder mit Vogel | 3,5 % | 25,7 % |
Die Diagnose am selben Tag: „Die Fehlmeldungen sind Spiegelungen vom Mond auf der Wasseroberfläche." Die Uhrzeiten bestätigen es — alle 24 in derselben Stunde, keine einzige tagsüber.
⚠️ Die Vogelerkennung hat korrekt gearbeitet: Sie meldete null. Gespeichert wurde trotzdem. Das ist der eigentliche Fehler — ein Besuch wird angelegt, obwohl die Erkennung ausdrücklich „kein Vogel" sagt.
📌 Noch offen: eine Untergrenze für den mittleren Vogel-Wert. --min-bird-frames
steht auf 1, min_bird_score auf 0,05 — aber nichts prüft den Durchschnitt über
den ganzen Besuch. Bei 0,000 dürfte nichts entstehen.
🔑 Wasser ist ein anderer Fall als ein Futterhaus. Eine Tränke spiegelt Himmel, Sonne und Mond, und eine wandernde Lichtfläche sieht für eine Bewegungserkennung aus wie ein Tier.
Das „beste Foto" ist nicht das mit der höchsten Sicherheit
Beim Korrigieren der Falschbestimmung fiel auf, dass dieselbe verwischte Aufnahme zum besten Foto der Art geworden war:
#228 Sicherheit 0,945 5/31 Bilder ← war "bestes Foto"
#200 Sicherheit 0,936 23/67 Bilder ← die scharfe Aufnahme
Die Sicherheit sagt, wie sicher sich das Modell bei der Art ist — nicht, ob
das Bild etwas taugt. Seitdem entscheidet scoring.bildguete:
Anteil der Bilder mit Vogel × mittlerer Vogel-Wert
Beides misst dasselbe: Der Vogel war wirklich und deutlich da. Wer lange klar im Bild stand, hat auch ein gutes Einzelbild.
⚠️ Das ist ein Hilfsmaß, keine Schärfemessung. Richtig wäre die Laplace-Varianz des gespeicherten Bildes, gemessen im Detector. Das hier kommt ohne Bildverarbeitung aus und trifft in der Praxis dieselbe Wahl.
Warum --min-bird-score bei 5 % steht
Gemessen, nicht geraten:
--min-bird-score |
richtig |
|---|---|
| 0.02 – 0.05 | 43 / 44 |
| 0.10 | 40 / 44 |
| 0.20 | 38 / 44 |
Ein zu hoher Wert wirft richtige Bestimmungen weg. Beim Mäusebussard gewinnt
global der amerikanische Buteo lineatus mit 57 %, unser Buteo buteo kommt
auf 5 % — innerhalb der deutschen Arten liegt er trotzdem klar vorn. Genau das
ist die Nordamerika-Schlagseite, und genau deshalb ist bird_score ein Maß
für „kenne ich diese Weltgegend", nicht für „ist das ein Vogel".
Der Katalogumfang kostet dabei nichts: 47 oder 148 Arten in der Whitelist liefern dasselbe Ergebnis.