Files
vogelalbum/docs/genauigkeit.md
T
christian cc9e0786c2 Vogelalbum 1.0.0
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.
2026-10-14 18:55:23 +00:00

5.2 KiB
Raw Blame History

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.