HEIC annehmen, und "Vogel ohne Art" nicht als "kein Vogel" melden
ZWEI FEHLER, BEIDE HEUTE ENTSTANDEN, BEIDE BEIM BENUTZEN GEFUNDEN. 1. 🔴 HEIC. Minuten nach dem Ausrollen der Bildpruefung wies die Instanz jedes Foto von Christians iPhone mit 400 ab. Die Pruefung war richtig -- sie kannte nur das Format nicht, das die Haelfte aller Telefone erzeugt. Eine App fuer iOS, die kein HEIC annimmt, nimmt nichts an. pillow-heif in requirements-web.txt, Opener registriert, AVIF gleich mit. Fehlt das Paket, sagt die Meldung das jetzt ausdruecklich -- sonst sucht man den Fehler beim Telefon, und er liegt an einem fehlenden Paket auf dem Server. 2. 🔴 "VOGEL JA, ART NEIN" KAM ALS "KEIN VOGEL" AN. Pipeline.run gibt in drei Faellen kein Ergebnis zurueck: nichts gefunden, Beinahe-Treffer, und -- der interessante -- ein sicher erkannter Vogel, dessen Art keine heimische ist. Die Box unterscheidet die Faelle; die Warteschlange hat sie weggeworfen und 0.0 gemeldet. Folge: Ein Foto mit einem Vogel, den der Detektor mit 93 % gefunden hatte, kam in der App als "Kein Vogel erkannt. Auf dem Foto war nichts zu finden" an. Christian hat daraufhin zugeschnitten, wieder und wieder -- gegen ein Problem, das nie der Zuschnitt war. 🔑 EINE FALSCHE AUSKUNFT IST TEURER ALS GAR KEINE. Sie schickt jemanden mit voller Ueberzeugung in die falsche Richtung. Jetzt traegt mean_bird_score den Wert der Box, und frames_with_bird haengt am Vogel statt an der Art. 7 neue Tests. 235 Web + 131 Detector gruen.
This commit is contained in:
1 parent
dbec78aa7a
commit
f7184d193c
6 files changed
+161
-6
No files matched your search
@@ -88,17 +88,41 @@ class Warteschlange:
|
||||
|
||||
# -- Bearbeiten -------------------------------------------------------
|
||||
|
||||
def _melden(self, foto_id: int, ausschnitt, result) -> None:
|
||||
def _melden(self, foto_id: int, ausschnitt, result, box=None) -> None:
|
||||
import requests
|
||||
|
||||
# ⚠️ ``Result.best`` ist eine Property, kein Aufruf — ``result.best()``
|
||||
# scheitert erst zur Laufzeit und genau dann, wenn ein Vogel
|
||||
# erkannt wurde.
|
||||
bester = result.best if result else None
|
||||
|
||||
# 🔴 **„Vogel ja, Art nein" ist etwas anderes als „kein Vogel" — und
|
||||
# ging hier verloren.**
|
||||
#
|
||||
# ``Pipeline.run`` gibt in DREI Fällen ``result = None`` zurück: kein
|
||||
# Fund, Beinahe-Treffer unter der Schwelle, und — der interessante —
|
||||
# ein sicher erkannter Vogel, dessen Art keine heimische ist. Die Box
|
||||
# unterscheidet die Fälle, nur hat sie vorher niemand angesehen.
|
||||
#
|
||||
# Folge am 14.10.2026: Ein Foto mit einer Meise im Gegenlicht wurde
|
||||
# mit 93 % als Vogel erkannt und kam in der App als „Kein Vogel
|
||||
# erkannt. Auf dem Foto war nichts zu finden" an. Christian hat
|
||||
# daraufhin zugeschnitten — gegen ein Problem, das nie der Zuschnitt
|
||||
# war. **Eine falsche Auskunft ist teurer als keine.**
|
||||
#
|
||||
# ``box.score`` ist genau die Zahl, die „da ist ein Vogel" bedeutet;
|
||||
# sie gehört in ``mean_bird_score``, dessen Sinn der Server selbst so
|
||||
# beschreibt: Vogelwert 0 heißt „auf keinem Bild war ein Vogel".
|
||||
vogelwert = 0.0
|
||||
if result is not None:
|
||||
vogelwert = result.bird_score
|
||||
elif box is not None and self.pipeline.zaehlt_als_vogel(box):
|
||||
vogelwert = box.score
|
||||
|
||||
nutzlast = {
|
||||
"species": bester.species.slug if bester else None,
|
||||
"confidence": round(bester.confidence, 4) if bester else 0.0,
|
||||
"mean_bird_score": round(result.bird_score, 4) if result else 0.0,
|
||||
"mean_bird_score": round(vogelwert, 4),
|
||||
"votes": {g.species.slug: round(g.confidence, 4)
|
||||
for g in (result.guesses[:5] if result else [])},
|
||||
}
|
||||
@@ -162,7 +186,7 @@ class Warteschlange:
|
||||
# Den Ausschnitt mitschicken, damit die Sammlung dasselbe Bild
|
||||
# zeigt wie bei einer Sichtung von der Kamera.
|
||||
ausschnitt = box.crop(bild) if box is not None else None
|
||||
self._melden(foto["id"], ausschnitt, result)
|
||||
self._melden(foto["id"], ausschnitt, result, box)
|
||||
fertig += 1
|
||||
except Exception as exc: # absichtlich breit, siehe Docstring
|
||||
print(f"[warteschlange] Foto {foto['id']} übersprungen: {exc}")
|
||||
|
||||
Reference in new issue
Block a user