The problem
The client is a general contractor running a dozen active commercial job sites, each already fitted with security cameras. Their safety team had enabled motion-based alerts to catch people entering exclusion zones around heavy equipment, but motion detection fired on everything: wind-blown tarps, shadows, birds, and vehicles. Supervisors received hundreds of alerts a day and had started muting them, which defeated the purpose. The safety team also wanted to know when hard hats and high-visibility vests were missing in active work areas.
What we actually did
Object detection instead of motion detection
We trained an object detection model to recognize people, hard hats, high-visibility vests, and the specific heavy equipment used on site. Starting from a pretrained detection architecture, we fine-tuned on around 9,000 frames from the client's own cameras, labeled across weather, lighting, and camera angles, because generic construction datasets didn't match their camera placements.
Zones drawn per camera
For each camera, site supervisors draw exclusion zones and active work areas in a simple web tool. An alert fires only when a detected person is inside an exclusion zone while equipment is present in that zone, or when a person in an active work area is missing required protective equipment for more than a few seconds. Requiring the condition to persist across several frames removed most single-frame false positives.
Running on the edge
Inference runs on a small GPU edge device at each site, reading the existing camera streams locally. Only alerts, with a short clip, leave the site. That kept bandwidth costs low on sites with limited connectivity and meant continuous video never had to be uploaded anywhere.
Challenges and tradeoffs
- Construction sites change every week. New structures block camera views and equipment moves. Supervisors can redraw zones in minutes, and the system flags cameras whose view has changed significantly.
- Weather and night. Rain, dust, and low light reduce accuracy. We collected and labeled more of these conditions after the pilot, and the system reports its own confidence so low-visibility periods don't generate a flood of uncertain alerts.
- Alert fatigue. We tuned thresholds with supervisors against a week of reviewed alerts, prioritizing a small number of alerts people act on over catching every possible event.
Results
Compared with the previous motion-based alerts, false alarms dropped 71% on the pilot sites, measured from supervisors' alert reviews, and supervisors stopped muting them. The system now covers all twelve active sites using only the cameras that were already installed, with on-site alert latency under a second. The safety team uses weekly summaries of zone breaches by area to adjust site layouts, which turned the alerts from a nuisance into planning data.
What we'd do differently
We would involve workforce representatives before the pilot rather than just before rollout. Their input shaped the privacy design, and earlier involvement would have saved a round of changes.