Ein Handyfoto ist das Gegenteil einer Kameraaufnahme: Jemand zielt auf den Vogel. Unterhalb von rund einem Viertel Bildflaeche findet SSD-MobileNet ihn nicht mehr (12 % Flaeche: 38 % gefunden, 6 %: 10 %, 2 %: 0 %) — und auf einem Zuschnitt, der nur noch aus Vogel besteht, meldet es sich ueberhaupt nicht. run_zuschnitt() ueberspringt den Sucher. Gemessen an schwierigen Aufnahmen: aus 'nichts gefunden' wird Haussperling 93 %. Dabei faellt der Sucher als Torwaechter weg. Die erste Fassung liess min_bird_score (0.05) entscheiden und gab fuer eine graue Wand Fischadler 20 % zurueck; ueber 148 Vogelbilder und 71 Hintergrundausschnitte kommen bei dieser Schwelle 82 % der Hintergruende durch. Das Tor ist jetzt die Sicherheit des besten Treffers (0.45: 96 % der Voegel, 14 % Hintergrund) zusammen mit min_bird_score. Alle Messungen stehen in docs/handyfotos.md, auch die dort als verworfen dokumentierte Kachelsuche. Die Pruefbilder liegen bewusst NICHT hier: Dieses Repo ist oeffentlich, die Aufnahmen sind privat. Sie liegen in der Nextcloud unter Projekte/Vogelalbum/Pruefbilder; 'pruefbilder/' steht in der .gitignore. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
122 lines
4.8 KiB
Markdown
122 lines
4.8 KiB
Markdown
# Handyfotos: was gemessen wurde
|
||
|
||
Stand 24.10.2026. Anlass war Christians Befürchtung, die Erkennungsrate bei
|
||
Handyaufnahmen werde „grauenhaft schlecht". Sie war berechtigt — nur aus
|
||
einem anderen Grund als zunächst vermutet.
|
||
|
||
🔴 **Die Prüfbilder liegen NICHT im Repo** — es ist öffentlich, die
|
||
Aufnahmen sind private Fotos (Garten, Reisen, Zoo). Sie liegen in der
|
||
Nextcloud unter `Projekte/Vogelalbum/Pruefbilder`: `handy/` (18 Aufnahmen)
|
||
und `handy-schwer/` (4 bewusst schwierige). Zum Messen dorthin kopieren;
|
||
`pruefbilder/` steht in der `.gitignore`, damit sie nicht versehentlich
|
||
mitwandern.
|
||
|
||
Wer an der Erkennung etwas ändert, misst gegen diesen Satz.
|
||
|
||
## Was die Kette heute leistet
|
||
|
||
18 echte Handyaufnahmen, Sollwerte von Hand gesetzt:
|
||
|
||
| Verfahren | richtig | falsch | verpasst |
|
||
|---|---|---|---|
|
||
| Kette wie sie ist | 15/18 | 2 | 1 |
|
||
| nur ganzes Bild bestimmen | 14/18 | 4 | 0 |
|
||
| besser von beidem | 15/18 | 3 | 0 |
|
||
|
||
Sechs der achtzehn zeigen Arten, die nicht im Katalog stehen (Pfau, Pelikan,
|
||
zwei Hähne, Huhn, eine amerikanische Möwe). Fünf davon lehnt die Kette
|
||
richtig ab — das ist kein Fehlschlag, sondern die gewünschte Zurückhaltung.
|
||
|
||
🔑 **Der Sucher vor der Bestimmung ist kein Ballast.** Ihn wegzulassen und
|
||
immer das ganze Bild zu bestimmen macht das Ergebnis schlechter, nicht
|
||
besser. Beim Höckerschwan auf dem Teich wird daraus ein Silberreiher.
|
||
|
||
## Wo es wirklich bricht: die Bildfläche
|
||
|
||
Dieselben Referenzvögel, künstlich verkleinert in eine Szene gesetzt:
|
||
|
||
| Vogel füllt | Sucher findet ihn |
|
||
|---|---|
|
||
| 81 % der Fläche | 98 % |
|
||
| 49 % | 93 % |
|
||
| 25 % | 75 % |
|
||
| 12 % | 38 % |
|
||
| 6 % | 10 % |
|
||
| 2 % | 0 % |
|
||
|
||
Unterhalb von etwa einem Viertel Bildfläche bricht es weg. Der Grund ist
|
||
mechanisch: Der Sucher skaliert jedes Bild auf 300 × 300 Pixel. Ein Vogel bei
|
||
12 % der Breite ist danach 36 Pixel groß.
|
||
|
||
**Das ist der Normalfall für Gartenvögel.** Eine Blaumeise aus fünf Metern
|
||
füllt ein bis zwei Prozent.
|
||
|
||
## Die Lösung: zuschneiden und den Sucher überspringen
|
||
|
||
Von Hand auf den Vogel gezogen, an den schwierigen Aufnahmen gemessen:
|
||
|
||
| Bild | Kette heute | zugeschnitten |
|
||
|---|---|---|
|
||
| schwer-03 | nichts gefunden | **Haussperling 93 %** |
|
||
| schwer-04 | nichts gefunden | Haussperling 50 % |
|
||
| schwer-01 | Haussperling 17 % | Feldsperling, weiterhin wackelig |
|
||
| schwer-02 | nichts gefunden | nichts — Silhouette gegen Himmel, da ist keine Information drin |
|
||
|
||
🔴 **Auf keinem dieser Zuschnitte meldet sich der Sucher.** SSD-MobileNet ist
|
||
auf Objekte in einer Szene trainiert, nicht auf formatfüllende Tiere. Ein
|
||
perfekt zugeschnittenes Bild bekäme also weiterhin „kein Vogel gefunden" —
|
||
deshalb `Pipeline.run_zuschnitt`, das ihn übergeht.
|
||
|
||
### Und warum das ein eigenes Tor braucht
|
||
|
||
Ohne Sucher fehlt dessen Torwächterrolle. Die erste Fassung ließ
|
||
`min_bird_score` (0,05) entscheiden und gab für eine **graue Wand**
|
||
„Fischadler 20 %" zurück. Über 148 Vogelbilder und 71 Hintergrundausschnitte
|
||
gemessen:
|
||
|
||
| Schwelle auf die Sicherheit | Vögel durch | Hintergrund fälschlich durch |
|
||
|---|---|---|
|
||
| 0,33 | 100 % | 34 % |
|
||
| 0,40 | 97 % | 17 % |
|
||
| **0,45** | **96 %** | **14 %** |
|
||
| 0,50 | 93 % | 8 % |
|
||
|
||
`min_bird_score` allein bei 0,05: 97 % der Vögel — aber auch **82 % der
|
||
Hintergründe**. Als Tor taugt er nicht; er beantwortet „welche Art", nicht
|
||
„überhaupt ein Vogel".
|
||
|
||
Gewählt ist 0,45 **und** `bird_score ≥ 0,05`, weil die beiden Verschiedenes
|
||
prüfen. Die verbleibenden 14 % sind Laub und Geäst, das bei dieser Auflösung
|
||
wirklich wie ein Vogel aussieht — deshalb zeigt die App die Alternativen mit
|
||
an.
|
||
|
||
## Verworfen: Kacheln
|
||
|
||
Die Idee, das Bild in überlappende Kacheln zu zerlegen und in jeder zu
|
||
suchen, sah zunächst sehr gut aus:
|
||
|
||
| Vogel füllt | heute | 2×2 | 3×3 |
|
||
|---|---|---|---|
|
||
| 12 % | 38 % | 85 % | 92 % |
|
||
| 6 % | 10 % | 72 % | 75 % |
|
||
| 2 % | 0 % | 5 % | 22 % |
|
||
|
||
⚠️ **Diese Zahlen hingen am Hintergrund.** Die Vögel saßen auf neutralem
|
||
Grau; zoomt man dort hinein, steht der Vogel allein und scharf da. Vor echten
|
||
Hintergründen schrumpft der Gewinn auf ein schmales Band (bei 6 % Fläche
|
||
3 % → 40 %, darunter nichts), und an den 22 echten Fotos änderte sich **ein**
|
||
Ergebnis — zum Schlechteren: Die Kacheln zerschneiden eine Gänsegruppe und
|
||
machen daraus eine Straßentaube.
|
||
|
||
Dazu zehnfache Rechenzeit (118 ms → 1362 ms).
|
||
|
||
**Christians Entscheidung am 24.10.2026: nicht einbauen.** Der Weg über den
|
||
Zuschnitt von Hand deckt denselben Fall ab, ohne zu raten. Der Code ist
|
||
wieder entfernt; diese Notiz steht hier, damit die Idee nicht in einem halben
|
||
Jahr noch einmal von vorn ausprobiert wird.
|
||
|
||
🔑 **Die Lehre, die über dieses Projekt hinausgeht:** Ein synthetischer
|
||
Prüfstand, der den Hintergrund wegvereinfacht, misst die Aufgabe nicht mehr,
|
||
die gelöst werden soll. Ich hatte aus ihm einen Gewinn von 38 auf 92 Prozent
|
||
abgeleitet und war bereit, danach zu bauen.
|