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) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 09:52:03 +02:00
parent df7f9ce4df
commit eb589210fc

16
app.py
View File

@@ -525,6 +525,19 @@ class WebcamGrabber:
"""True, wenn zuletzt vor < 5s ein Frame kam (Kamera liefert).""" """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 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) ---------- # -- Hintergrund-Thread (laeuft die ganze Prozess-Lebensdauer) ----------
def _run(self): def _run(self):
state = new_state() state = new_state()
@@ -546,7 +559,10 @@ class WebcamGrabber:
state["track_positions"].clear() state["track_positions"].clear()
state["counted_ids"].clear() state["counted_ids"].clear()
state["recent_counts"].clear() state["recent_counts"].clear()
state["frame_idx"] = 0
self._reset_tracker() # stale Tracker-Zustand nach Pause verwerfen
self._prev_gray = None self._prev_gray = None
print("[webcam-grabber] verbunden -> Tracker/Zaehlzustand frisch", flush=True)
buf = b"" buf = b""
for chunk in resp.iter_content(chunk_size=8192): for chunk in resp.iter_content(chunk_size=8192):