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>
4.8 KiB
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.