Add an RTSP or HTTP camera, attach recorded footage, or stand up a synthetic fleet with zones already drawn — every rule runs identically on all three.
Drop a clip on the right, or run the synthetic scene — every analytic works identically on both.
A camera is a durable thing with a name and a place on site; the connection is not. Streams drop all day — switches brown out, contractors unplug things, wifi bridges fail in rain — so a camera that fails backs off and retries forever rather than ending. Rules can be turned off per camera without touching the site-wide default: the car park does not need a harness rule.
| Camera | Area | Source | State | Live | Rules |
|---|
These are the site-wide defaults. Confirm and window are the k-of-n filter: the condition must hold for that many of the last N analysed frames before an alert reaches an operator, which is what keeps one noisy detection from becoming four hundred alarms. Per-camera exceptions live on the Cameras tab.
Zones belong to one camera — a polygon drawn on one view means nothing on another. They are stored as fractions of the frame so they survive a resolution change, and ground tests use each worker's feet rather than their centre: on a camera looking across a site, a centroid test reports everyone standing beside an excavation as being inside it.
| Name | Type | Permit | Hours | Notes |
|---|
Most false-alarm complaints have a structural cause rather than a threshold one, and the structural ones are invisible from the alert feed — you cannot tell by reading a stream of "no harness" alerts that nothing in the pipeline can see a harness. This checks for those first, then shows what your own operators have actually rejected.
Cones, bollards and signs are the classic false worker: they never move, never wear a helmet, and eventually trip the man-down rule. Four checks catch them — an operator mask, keypoint support, plausible size for their position on the ground, and having never moved since they appeared. Shape alone is not one of them: a traffic cone and a worker crouching over rebar have almost the same box.
From operator verdicts, not guesswork. Rules are not desensitised automatically — a safety alarm that quietly turns itself down because it fired too often is how a system ends up silent on the day it mattered. The numbers are measured here; the decision stays yours.
| Rule | Camera | Confirmed | False | Rate | Volume |
|---|
Two detectors run side by side. The trained checkpoint is fast and precise on whatever you have labelled and blind to everything else. The prompt detector is driven by plain text, knows nothing about your site, and needs no data — so it covers every class you have not trained yet. A class moves prompt → both → trained only when validation says it earned the promotion, and every step is reversible here.
Frames are chosen by what a labeller would learn from them: where the two detectors disagree, where confidence sits on the decision boundary, and where a class is still thin. What comes out are pseudo-labels — a large head start, not a substitute for review.
Fine-tunes on what you have collected, validates, reports per-class mAP, then promotes what cleared the bar and loads the new weights into every camera at once — the model bank is shared, so there is no restart and no per-camera reload.
| Class | Group | Source | Text prompts | mAP50 | Live |
|---|
Heat strain has no visual signature, so it is not guessed from pixels. WBGT is computed from the conditions you set here, then combined with each worker's continuous exposure time and their movement against their own baseline. The result is a prompt to send someone over with water — never a clearance. Conditions apply to every camera on site.
Set the conditions to compute a work/rest allocation.