fastening, insertion, kitting — any repetitive station shot from a fixed camera. it plays locally; nothing is uploaded anywhere.
then click each fastener position to place a watch zone, and press play.
the demo is deliberately model-free — that's the point. most "AI vision QA" pilots die waiting for training data. you can get a working count from a fixed camera today, and graduate to a detector later.
a human (or a detector) marks each fastener position once. a zone is just a circle: {x, y, r}. thirty seconds of setup per station.
every frame, the engine reads two numbers per zone: motion (mean abs-diff vs the last frame) and presence (brightness vs the ring around it). that's the entire feature set.
a tool must dwell in a zone before it counts as a rundown, and must leave before it counts as done. an inserted part must persist before it latches — and once latched, a hand crossing over it can't un-count it.
the overlay is for humans; the event log is for QA: timestamped RUNDOWN START / TORQUE OK / INSERTED per position — the audit trail a traveler sheet wishes it was.
// per frame, per zone — the whole trick: const motion = meanAbsDiff(gray, prevGray, zone); // tool working here? const presence = mean(gray, zone) - mean(gray, ring); // something bright seated? // dwell: sustained motion → RUNNING; sustained quiet after a real run → TORQUED ✓ if (state === 'wait' && motion > thr && ++hi >= DWELL_ON) state = 'running'; if (state === 'running' && motion < thr * 0.6 && ++lo >= DWELL_OFF && runLength >= MIN_RUN) state = 'torqued'; // latch: presence must persist to count — and once counted, occlusion can't undo it if (state === 'empty' && presence > base + delta && ++seen >= LATCH) state = 'inserted';
handheld cameras break fixed zones. the hero cut above was rendered offline with keyframed tracking — a production version puts a tracker or a per-frame detector in front, and the state machine stays identical.
it verifies sequence, not torque. "TORQUE OK" here means the tool dwelled and finished — real torque values come from the tool's controller. the vision layer's job is which position, when, and how many — the thing paper travelers get wrong.
lighting changes need adaptive thresholds. the sensitivity slider is the manual version. all of this is solvable — that's the fun part, and it's what the community below builds together.
this demo was built in an afternoon with an AI agent doing the heavy lifting — the engineering judgment (what counts as "fastened"? what does QA actually need?) is the human part. that's the skill we practice, in public, every week.