From eb589210fcaec91f6660da94c6669f793ec1049f Mon Sep 17 00:00:00 2001 From: Joachim Hummel Date: Tue, 2 Jun 2026 09:52:03 +0200 Subject: [PATCH] Fix: Zaehlen nach Reconnect (stale persistenter Tracker zuruecksetzen) Nach langer Kamera-Pause (z.B. ueber Nacht aus) trug der persistente YOLO-Tracker alten Zustand mit: neue Fahrzeuge wurden an verlorene Alt-Tracks gekoppelt bzw. erst nach 2 Frames aktiviert -> bekamen keine/ verzoegerte ID -> wurden nicht gezaehlt. - Tracker beim (Re-)Connect via tracker.reset() leeren -> frische IDs - frame_idx beim Reconnect nullen (Gesamtzaehler bleibt) - Log-Zeile beim Verbinden (Reconnects in supervisord-Logs sichtbar) Co-Authored-By: Claude Opus 4.8 (1M context) --- app.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app.py b/app.py index 6f90b67..0084a48 100644 --- a/app.py +++ b/app.py @@ -525,6 +525,19 @@ class WebcamGrabber: """True, wenn zuletzt vor < 5s ein Frame kam (Kamera liefert).""" return self.latest_jpeg is not None and (time.time() - self.last_frame_ts) < 5.0 + def _reset_tracker(self): + """Persistenten YOLO-Tracker leeren -> frische Track-IDs nach Reconnect. + Ohne Reset traegt der Tracker nach langer Pause (z.B. Kamera ueber Nacht + aus) alte/verlorene Tracks mit; neue Fahrzeuge bekommen dann verzoegert + oder keine ID -> werden nicht gezaehlt.""" + try: + predictor = getattr(self.model, "predictor", None) + trackers = getattr(predictor, "trackers", None) if predictor else None + for tr in trackers or []: + tr.reset() + except Exception as exc: + print(f"[webcam-grabber] tracker reset skipped: {exc}", flush=True) + # -- Hintergrund-Thread (laeuft die ganze Prozess-Lebensdauer) ---------- def _run(self): state = new_state() @@ -546,7 +559,10 @@ class WebcamGrabber: state["track_positions"].clear() state["counted_ids"].clear() state["recent_counts"].clear() + state["frame_idx"] = 0 + self._reset_tracker() # stale Tracker-Zustand nach Pause verwerfen self._prev_gray = None + print("[webcam-grabber] verbunden -> Tracker/Zaehlzustand frisch", flush=True) buf = b"" for chunk in resp.iter_content(chunk_size=8192):