Physics-Constrained Computer Vision
Under floodlights, a shiny bald head can score a 98%-confidence "ball," and a camera that follows the highest confidence swings off the pitch. Plumbline is a deterministic physics-gate layer that sits after your detector and rejects the detection the physics forbids, while staying locked on the real ball.
It is the verification layer between your detector and your action system. Run it, then read the physics reason it wrote for every decision.
Narrated walkthrough of the running Plumbline dashboard (3:58).
97.7%
Time on target, physics gate
Synthetic benchmark, seed 7
82.3σ
Worst impostor, rejected past the 5σ line
bald_linesman audit, 44 frames
68.3%
Time on target, real broadcast clip
Real YOLO11x, 240 frames, image space
The two benchmark scopes are kept separate throughout this page. The synthetic figure is a controlled maximum against known ground truth; the real-footage figure is honestly lower on hard real video.
The failure is a physics failure, not a detection failure.
An object detector is frame-independent. It scores each image on texture and shape with no notion of where a real object can physically be in the next frame. Under stadium floodlights a bald head shines like a ball, so the detector emits a 98%-confidence "ball" on the head while the actual ball scores lower, and a camera that follows the highest confidence tracks the head instead of the game.
This is documented, not hypothetical. In October 2020 at Inverness Caledonian Thistle, a Pixellot automated camera tracked a linesman's bald head instead of the ball for an entire match (Veriprajna WP43 solution page, 2026). It is also not a one-off failure that better models retire on their own: SoccerNet's own tracking benchmark concludes that multi-object soccer tracking is "far from solved," with no physics-aware tracking integrated into benchmark methods yet, a clear gap (Veriprajna WP43 research, 2026).
The reason this does not age out as detectors improve is that a physically impossible detection is wrong at any detector accuracy. A "ball" sitting at a constant 1.7 m height and moving 3 mph is not a ball no matter how confident the model is. For a team carrying liability on an automated visual decision, edge cases are where the cost lives: an industry account puts them at "80% of engineering time, 90% of support costs, 100% of liability exposure" (Veriprajna WP43 research, 2026).
Plumbline runs downstream of the detector. It takes each candidate detection and asks whether the physics allows it, then routes the frame to accept, review, or coast, and writes the reason down.
A Kalman/UKF filter (projectile process model plus a nonlinear pinhole measurement model) predicts where a real ball can be. Each candidate's innovation becomes a Mahalanobis distance. Thresholds ship as config: accept under 3σ, reject over 5σ, flag 3 to 5σ as REVIEW. On the worst frame of the bald-linesman scene the impostor scored 82.3σ.
The gate compares the pixel velocity the track predicts against the candidate's local optical flow, and rejects on a direction or magnitude mismatch (shipped band: flow ratio in [0.35, 3.0], cosine at least 0.3). A "ball" sitting nearly still in mid-play fails it.
The pinhole model gives the pixel size a 22 cm ball can subtend at the candidate's implied depth, and the gate rejects impossible sizes (size-ratio tolerance 1.8x on the synthetic path, 1.5x on the real-footage image-space path). A roughly 50 px head cannot be a 22 cm ball at about 12 m, which subtends about 22 px.
A deterministic policy gate then decides, using the same gates.py unchanged on both input paths. It accepts only when all gates pass. It marks a borderline candidate (3 to 5σ with no hard failure) as REVIEW, and the track coasts on the prediction, escalated rather than bluffed. It enters COAST (predict-only) when every candidate is rejected, for example through a brief occlusion, and re-acquires when the ball reappears. The thresholds are configuration, not set by any model.
Every decision is written to a per-decision audit record. The header carries the seed, scenario, detector id, and gate thresholds. Each frame lists every candidate with its class and confidence, each gate's numeric verdict and plain-English reason, the final action, and the locked track. An optional audit narrator turns that telemetry into a plain-English incident summary for the export, but it is advisory only, never in the accept or reject path, and it degrades to a deterministic templated summary when no model key or bridge is present so the demo runs fully offline.
The same three-gate policy runs on two kinds of input, which is the point. On the synthetic scenes it uses the world-space Unscented Kalman Filter. On the real broadcast clip it runs in the image plane with a 2-D Kalman filter (kf2d), because a single uncalibrated clip gives no metric depth and faking a 3-D filter would be dishonest. The gates are reused unchanged; only the filter honestly changes. That is what makes the layer detector-agnostic: the value is in the gates, not the detector.
Screenshots below are of the actual running Plumbline dashboard. The bald-head impostor is an author-injected reproduction of the documented 2020 incident, stated plainly in the app.
Over the 44-frame scene the simulated detector emits 18 high-confidence false "ball" detections on the linesman's head, up to 98% confidence. The three gates reject all 18. The worst single impostor scores 82.3σ on the kinematic gate, far past the 5σ reject line, while the real ball, at about 87% confidence and 0.4σ, passes all three and stays locked. On this single scenario the physics layer held 97.7% time-on-target with 1 ID switch, against 59.1% for follow-highest-confidence and 20.5% for raised-threshold (the three-scenario synthetic aggregate is in the comparison table further down).
When a player briefly crosses the ball, the naive tracker loses it or grabs the player. The physics tracker enters COAST and rides the prediction through the gap, then re-acquires the ball when it reappears. It never invents a detection to fill the silence; it predicts, marks the state, and waits.
On a 240-frame real broadcast clip, real YOLO11x detections feed the same three gates running in image space. The gates held the ball 68.3% of frames against the naive tracker's 43.8% and the raised-threshold tracker's 30.0%, with 4 ID switches versus 7 and a mean error of 26.2 px versus 193.0 px. It is honestly lower than the synthetic ceiling because real footage is harder. The direction, physics beats both baselines, holds on real detections, not just simulated ones.
The exported decision log opens the whole trail: seed, scenario, detector id, and thresholds up top, then a per-frame record of every candidate's class and confidence, each gate's numeric verdict with its plain-English reason, the final action, and the locked track, closing with the scoreboard. For a team carrying liability on an automated visual decision, that is a filable trace of why each detection was trusted or refused.
These are tracking-quality metrics, detector-quality-independent. They are never a model-error rate and never an open-world guarantee. The two sets below are on different scopes and are not blended.
| Tracker | Time on target | ID switches | Mean err (px) | Clean-set miss |
|---|---|---|---|---|
| Veriprajna physics | 97.7% | 3 | 2.7 | 2.3% |
| B1: follow highest confidence | 80.3% | 4 | 63.0 | 0.0% |
| B2: raised confidence threshold | 40.2% | 29 | 115.0 | 43.2% |
| Tracker | Time on target | ID switches | Mean err (px) |
|---|---|---|---|
| Veriprajna physics | 68.3% | 4 | 26.2 |
| B1: follow highest confidence | 43.8% | 7 | 193.0 |
| B2: raised confidence threshold | 30.0% | 1 | 245.1 |
The number that carries the thesis is the orthogonality result. On the synthetic clean set, raising the confidence threshold (B2) drops 43.2% of the real low-confidence balls, while physics holds its clean-set miss to 2.3%, which is a one-frame acquisition latency and not a false negative. Raising the confidence knob trades one error for another. Physics works orthogonally to it. (B2's single real-footage ID switch is an artifact of it barely tracking anything at 30% on-target, not a win.)
No. Plumbline sits downstream of whatever detector you already run and decides which of its candidate detections to trust. In the demo the same gate code runs on a simulated black-box detector for the synthetic scenes and on real YOLO11x detections for the broadcast clip. We do not touch the detector's output quality. The product is the deterministic gate layer around it, so the value holds even as the underlying detector improves.
Because that is the wrong knob. On the synthetic clean set, raising the confidence threshold drops 43.2% of the real low-confidence balls while still grabbing the high-confidence impostor. The physics gates work orthogonally to confidence: they held their clean-set miss to 2.3%, which is a one-frame acquisition latency rather than a dropped ball. You cannot separate a real ball from an impostor by score alone when the impostor scores higher.
Both, and we keep the two clearly separate. On a controlled synthetic run with known ground truth (seed 7), the physics layer held 97.7% time-on-target versus 80.3% for follow-highest-confidence and 40.2% for raised-threshold. On a 240-frame real broadcast clip with real YOLO11x detections, the same gates held the ball 68.3% of frames versus 43.8% and 30.0%. The real-footage number is honestly lower because real video is harder. We never quote the synthetic figure as a real-world result.
The three gates are plain numpy and scipy code outside any model: a Kalman/UKF kinematic gate (accept under 3 sigma, reject over 5 sigma), an optical-flow consistency gate, and a geometric perspective gate. Trust does not depend on a model's self-report. There is an optional audit narrator that turns the gate telemetry into a plain-English summary, but it is advisory only and never sits in the accept or reject path, and it falls back to a deterministic templated summary when no key is present.
Yes. Every decision carries a physics reason on file. The exported decision log records the seed, scenario, detector id, and gate thresholds in the header, then per frame it lists every candidate with its class and confidence, each gate's numeric verdict and plain-English reason (for example, Mahalanobis 82 sigma over the 5 sigma line, kinematically impossible), the final action, and the locked track. It exports as JSON or HTML.
No on both. This is a runnable demo that proves the gate mechanism, not a deployed pipeline. The baselines we beat are the physics-naive failure-mode class (follow highest confidence, and raise the threshold), not any named vendor. We make no claim to out-track a shipping product, and the well-known camera vendors have already patched the specific 2020 bald-linesman case in later firmware. The bald-head impostor in the demo is an author-injected reproduction of that documented incident, not organic detector noise captured live.
The research behind this demo — the architecture, the verification design, and the enterprise blueprint.
If an automated visual decision carries liability in your world, the failure mode is physics, not confidence.
We built Plumbline to show that a deterministic gate layer can reject a physically impossible detection and leave a filable reason for it. The same framework takes a different set of physics: a parallax gate for a fab, a reflectance gate for a production line. Tell us the constraint your detector keeps violating and we will work through whether a gate layer fits.