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.
This commit is contained in:
christian committed 2026-10-14 18:55:23 +00:00
commit cc9e0786c2
189 files changed
+29792

No files matched your search

+138
View File
@@ -0,0 +1,138 @@
# Wie gut ist das wirklich
<sub>[← zurück zum Überblick](../README.md) · [alle Kapitel](README.md)</sub>
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:
```bash
./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:**
```bash
./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.