The problem
One person watching sixteen camera feeds will miss things. Detection on single frames floods them with false alarms, and in one frame a handshake can look like a strike.
What I built
I led a team of five developers and designed the system as a chain of models, each handling one part of the problem. Every tier passes structured evidence to the next, so any alert can be traced back to the stage that raised it.
- Tier 0: a frame-difference motion gate that opens inference only when something moves.
- Tier 1: dual RT-DETR detection, a fine-tuned weapon detector for guns and knives beside a person detector.
- Tier 2: BoT-SORT tracking with RTMPose skeletons, 17 keypoints for every tracked person.
- Tier 3: ST-GCN action classification over 30-frame skeleton windows, ending in an auditable JSON evidence chain.
How it was checked
These are the figures reported in the paper.
- Per-frame weapon false positives fell from 8.49% to 0.75%.
- Benign videos flagged fell from 6 of 25 to 2 of 25.
- End-to-end F1 of 0.745 on UCF-Crime shooting, assault and fighting (precision 0.812, recall 0.688).
- 10.1 FPS and 154.5 ms P95 latency on an RTX 3070.
The dataset
Along the way we found that public weapon-detection benchmarks share images across datasets, which inflates their accuracy. We published a 6,102-image dataset from 7 sources, with GroupKFold splits checked for that leakage, under CC BY 4.0 with a DOI, on Kaggle and Hugging Face. A paper on it is under review at IEEE Access.
Built for the operator
The dashboard is made for the person on shift: a continuous body overlay, a live slider for the weapon threshold, a threat-density heatmap along the scrub bar, each weapon linked to the person holding it, and alerts that come with their evidence.
In person
Stack
- Field
- Computer vision
- Stack
- Links
- View HARISDataset







