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.
139 lines
5.2 KiB
Markdown
139 lines
5.2 KiB
Markdown
# 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.
|