Diagnose: optionales Zaehl-Debug-Log (COUNT_DEBUG=1)

Pro verarbeitetem Frame mit Fahrzeugen: Anzahl, Abstaende zur Linie,
Band, jetzt gezaehlt, Gesamt. Hilft zu sehen, ob Fahrzeuge erkannt
werden und wie nah sie der Linie kommen (Frame-Rate-/Band-Diagnose).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 10:42:46 +02:00
parent eb589210fc
commit 356d0ce977

21
app.py
View File

@@ -82,6 +82,9 @@ COUNT_DEDUP_FRAMES = int(os.environ.get("COUNT_DEDUP_FRAMES", "12"))
# unbegrenzte Wachsen der Zustaende (Speicherleck) und falsches Unterdruecken # unbegrenzte Wachsen der Zustaende (Speicherleck) und falsches Unterdruecken
# bei spaeterer Track-ID-Wiederverwendung. Wert > Verweildauer eines Fahrzeugs. # bei spaeterer Track-ID-Wiederverwendung. Wert > Verweildauer eines Fahrzeugs.
COUNT_FORGET_FRAMES = int(os.environ.get("COUNT_FORGET_FRAMES", "150")) COUNT_FORGET_FRAMES = int(os.environ.get("COUNT_FORGET_FRAMES", "150"))
# Diagnose: pro verarbeitetem Frame mit Fahrzeugen eine Log-Zeile ausgeben
# (Bewegung? Detektionen? IDs? Abstand zur Linie? gezaehlt?). COUNT_DEBUG=1.
COUNT_DEBUG = os.environ.get("COUNT_DEBUG", "0") == "1"
# --- MQTT: ein Event pro Linienueberquerung (fuer n8n -> NocoDB) ----------- # --- MQTT: ein Event pro Linienueberquerung (fuer n8n -> NocoDB) -----------
# Komplett abschaltbar: MQTT_ENABLED=false -> App laeuft ohne Broker/Events. # Komplett abschaltbar: MQTT_ENABLED=false -> App laeuft ohne Broker/Events.
@@ -356,6 +359,10 @@ def process_frame(frame, det_model, det_names, line_start, line_end, state, sour
track_positions.pop(tid, None) track_positions.pop(tid, None)
counted_ids.discard(tid) counted_ids.discard(tid)
dbg_vehicles = 0
dbg_counted = 0
dbg_dists = []
if results and results[0].boxes is not None and results[0].boxes.id is not None: if results and results[0].boxes is not None and results[0].boxes.id is not None:
boxes = results[0].boxes.xyxy.int().cpu().tolist() boxes = results[0].boxes.xyxy.int().cpu().tolist()
class_ids = results[0].boxes.cls.int().cpu().tolist() class_ids = results[0].boxes.cls.int().cpu().tolist()
@@ -368,6 +375,11 @@ def process_frame(frame, det_model, det_names, line_start, line_end, state, sour
center_y = (y1 + y2) // 2 center_y = (y1 + y2) // 2
if label_name in VEHICLE_CLASSES: if label_name in VEHICLE_CLASSES:
if COUNT_DEBUG:
dbg_vehicles += 1
dbg_dists.append(int(point_to_segment_dist(
center_x, center_y,
line_start[0], line_start[1], line_end[0], line_end[1])))
if track_id not in counted_ids: if track_id not in counted_ids:
crossed = False crossed = False
@@ -395,6 +407,7 @@ def process_frame(frame, det_model, det_names, line_start, line_end, state, sour
types[label_name] += 1 types[label_name] += 1
publish_crossing(label_name, track_id, source) publish_crossing(label_name, track_id, source)
cv2.circle(frame, (center_x, center_y), 25, (0, 255, 0), 5) cv2.circle(frame, (center_x, center_y), 25, (0, 255, 0), 5)
dbg_counted += 1
track_positions[track_id] = (center_x, center_y, frame_idx) track_positions[track_id] = (center_x, center_y, frame_idx)
@@ -407,6 +420,14 @@ def process_frame(frame, det_model, det_names, line_start, line_end, state, sour
cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 1) cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 1)
cv2.circle(frame, (center_x, center_y), 3, (0, 255, 255), -1) cv2.circle(frame, (center_x, center_y), 3, (0, 255, 255), -1)
if COUNT_DEBUG and dbg_vehicles:
print(
f"[count-debug] frame#{frame_idx} fahrzeuge={dbg_vehicles} "
f"abstand_zur_linie={sorted(dbg_dists)} band={COUNT_BAND_PX} "
f"jetzt_gezaehlt={dbg_counted} gesamt={state['count']}",
flush=True,
)
return draw_overlay(frame, line_start, line_end, state) return draw_overlay(frame, line_start, line_end, state)