forked from zakaria/chicken-counting-sukawarna-det
Dashboard: auto-focus running camera, show date + all-camera totals
- Auto-detect active camera by polling frame_index - Show All Cameras Total accumulation in sidebar - Show per-camera totals in camera list - Add run_date to stats.json and display in dashboard - Pipeline: thread run_date through build/run/batch
This commit is contained in:
1 parent
a54d0e6b2c
commit
6dbaa517dc
3 files changed
+71
-10
No files matched your search
@@ -58,7 +58,7 @@ def run_daily_batch(settings: BatchSettings, date: str | None = None, *, verbose
|
||||
checkpoint_dir=checkpoint_dir,
|
||||
)
|
||||
camera_config.performance.verbose = verbose
|
||||
pipeline_result = run_pipeline(camera_config, show_progress=show_progress)
|
||||
pipeline_result = run_pipeline(camera_config, show_progress=show_progress, run_date=run_date)
|
||||
camera_results.append(
|
||||
CameraBatchResult(
|
||||
camera_id=camera_id,
|
||||
|
||||
@@ -90,11 +90,14 @@ class PipelineArtifacts:
|
||||
total_source_frames: int | None
|
||||
owns_tracker: bool
|
||||
detection_zone_rect: tuple[int, int, int, int] | None = None
|
||||
run_date: str = ""
|
||||
|
||||
|
||||
def build_pipeline(
|
||||
config: CameraConfig,
|
||||
tracker: DetectionTracker | None = None,
|
||||
*,
|
||||
run_date: str = "",
|
||||
) -> PipelineArtifacts:
|
||||
capture = open_capture(config.source)
|
||||
owns_tracker = tracker is None
|
||||
@@ -157,6 +160,7 @@ def build_pipeline(
|
||||
total_source_frames=total_source_frames,
|
||||
owns_tracker=owns_tracker,
|
||||
detection_zone_rect=detection_zone_rect,
|
||||
run_date=run_date,
|
||||
)
|
||||
|
||||
|
||||
@@ -165,12 +169,13 @@ def run_pipeline(
|
||||
tracker: DetectionTracker | None = None,
|
||||
*,
|
||||
show_progress: bool = False,
|
||||
run_date: str = "",
|
||||
) -> PipelineResult:
|
||||
if tracker is not None:
|
||||
tracker.config = config
|
||||
tracker.reset_tracking()
|
||||
|
||||
artifacts = build_pipeline(config, tracker=tracker)
|
||||
artifacts = build_pipeline(config, tracker=tracker, run_date=run_date)
|
||||
inference_stride = max(1, config.performance.inference_stride)
|
||||
print(
|
||||
f"[perf] inference_stride={inference_stride} "
|
||||
@@ -252,7 +257,7 @@ def run_pipeline(
|
||||
last_annotated = annotated
|
||||
|
||||
if config.stream.enabled and frame_index % max(1, config.stream.interval_frames) == 0:
|
||||
_write_stream_frame(config.stream.shm_dir, config.camera_id, annotated, result)
|
||||
_write_stream_frame(config.stream.shm_dir, config.camera_id, annotated, result, run_date=artifacts.run_date)
|
||||
|
||||
if verbose:
|
||||
t_write = time.monotonic()
|
||||
@@ -366,7 +371,7 @@ def _consume_result(
|
||||
_emit_periodic_feedback(config, artifacts, annotated, result, progress)
|
||||
|
||||
|
||||
def _write_stream_frame(shm_dir: str, camera_id: str, frame: np.ndarray, result: FrameResult) -> None:
|
||||
def _write_stream_frame(shm_dir: str, camera_id: str, frame: np.ndarray, result: FrameResult, *, run_date: str = "") -> None:
|
||||
cam_dir = Path(shm_dir) / f"chicken_counter_{camera_id}"
|
||||
cam_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
@@ -383,6 +388,7 @@ def _write_stream_frame(shm_dir: str, camera_id: str, frame: np.ndarray, result:
|
||||
"backward_active": result.motion_state.backward_active,
|
||||
"smoothed_speed": round(result.motion_state.smoothed_speed, 1),
|
||||
"count_events": len(result.count_events),
|
||||
"run_date": run_date,
|
||||
}
|
||||
stats_path = cam_dir / "stats.json"
|
||||
stats_tmp = cam_dir / ".stats_tmp.json"
|
||||
|
||||
Reference in new issue
Block a user