
一台自动摄像机在整场足球赛中都在追踪光头。我构建了说“不”的物理门控。
2020年10月,在因弗内斯喀里多尼亚蓟花队(Inverness Caledonian Thistle)的一场足球比赛中,一台自动摄像机在大部分时间里追踪的都是一名边裁的光头,而不是足球。在球场泛光灯下,光头反光宛如足球,Pixellot 摄像机紧跟它接收到的最高置信度检测结果,在家观看比赛的观众不得不长时间看着镜头特写一个秃顶男人沿着边线慢跑,而真正的比赛却在画外进行(我们的 WP43 解决方案页面对此有记录)。
在整个构建过程中,这个故事一直萦绕在我的心头,因为据我所知,它是对计算机视觉领域中人人都曾体会过、却几乎无人能准确命名的故障最生动的写照。检测器并没有坏。它完全履行了检测器的职责。它对一块像素区域进行评分,光头的反光获得了高分,下游的所有系统都完全信任了这个得分。我构建的演示 Plumbline 位于 https://veriprajna.com/demos/physics-constrained-computer-vision,而这一切都围绕着一个论点:解决方案并不在检测器内部。
我不再归咎于模型的那一刻
最初的一整天我都在试图设想一个更好的检测器,但我根本无法彻底解决这个问题。目标检测器是帧独立的。它依据纹理和形状对每张图像打分,完全不记得真实的物体上一刻在哪里,或者在物理上下一步可能出现在哪里。因此,在体育场的灯光下,光头在局部特征上就是一个绝佳的足球。即使你训练出一个更敏锐的模型,在反光最强烈的那一帧,它依然会交出一个置信度高达 98% 的足球,而这个球正好长在一个人的头顶上。置信度并没有在像素层面撒谎。它只是在回答一个问题,而那个问题与那里在物理上是否可能存在一个球毫无关系。
就在那一刻,我的思考框架发生了逆转。
你的视觉系统存在的不是置信度问题。它存在的是物理学问题。
真实的足球遵循着光头所不遵循的约束,而这些约束没有一个存在于检测器的评分之中。仅仅这一个视角的重塑就决定了整个架构。我不再试图让检测器变得更聪明,而是开始构建一个位于检测器下游的层,去强制执行检测器全然不知的物理定律。
“物理上不可能”在代码中是什么样子
我想看到检测结果因我能用通俗语言读懂的理由而被拒绝,因此这便是我首先构建的内容。Plumbline 位于任何检测器的下游,在采取任何后续操作之前,对每个候选目标运行三个确定性门控。运动学门控使用 Kalman 滤波器(在合成路径上使用带有抛体运动模型的 Unscented Kalman Filter)来预测真实的球下一步可能出现在何处,然后以 Mahalanobis 距离衡量每个候选目标与该预测的偏离程度:小于 3 sigma 则接受,超过 5 sigma 则拒绝,并将 3 到 5 sigma 的区间标记以供复核。光流门控将候选目标的局部像素运动与轨迹的预期速度进行比对,并拒绝在常规比赛中光流方向错误或几乎不动的“球”。几何门控利用针孔模型计算一个 22 cm 的球在候选目标所暗含的深度下可能对向多少像素,并剔除那些在物理上绝不可能真实的尺寸。
这些门控没有一个是模型。它们是你可以逐行阅读的纯粹 numpy 和 scipy 代码,置身于任何神经网络之外,而这正是我信任它们的全部原因。在这里,信任并不依赖于黑箱在事后为自己辩解。
光头同时无法通过所有这三个门控。我是故意注入这个冒充目标的,以此复现 2020 年因弗内斯事件,而非将其视作偶然的自然错误,因为让摄像机崩溃的极端案例,恰恰是永远不会出现在检测器测试集里的那种。在合成片段表现最差的一帧中,光头偏离足球预测运动达到 82.3 sigma,这根本不是什么微弱的边缘差距,而是在运动学上荒谬绝伦。而置信度为 0.87、偏离仅 0.4 sigma 的真正的足球则顺利通过,摄像机稳稳锁定了真正的球。

每一次拒绝都会在案留存理由
我不希望这一切成为你需要盲目相信的东西,因此每一项决策都会写入一份你可以随时打开的记录。导出的决策日志在顶部记录了随机种子(seed)、测试场景、检测器 ID 和门控阈值,随后是每个候选目标在每一帧的记录行:检测器输出的类别与置信度、每个门控的数值判定及其通俗英语理由(“Mahalanobis 82 sigma >= 5 sigma: kinematically impossible”),以及最终采取的动作。在光头边裁场景中,门控拒绝了冒充目标全部 18 次高置信度的虚假检测,物理追踪器在 97.7% 的时间里都能稳稳锁定足球,相比之下,跟随最高置信度策略仅为 59.1%,而提高阈值策略仅为 20.5%(合成场景,种子 7)。
对于任何需要对自动化视觉决策承担责任的人而言,这份记录就是一份事故报告与无可奈何地耸耸肩之间的根本区别。它的设计初衷是作为摄像机为何采取相应行动的可归档证据,而不是一张合规证书——它只是将每一帧的物理原因记录在案。

提高置信度阈值是调错了旋钮
当我向工程师们展示光头被拒绝的案例时,大家的第一本能几乎总是相同的:直接调高置信度阈值,直到那个假球被过滤掉即可。我构建这个演示正是为了用数据回应这种直觉,因为这听上去很有道理,但实际上完全是错误的。在没有任何冒充目标的纯净合成场景中,提高阈值丢弃了 43.2% 真实的低置信度足球,而物理门控将纯净测试集上的漏检率控制在 2.3%,这仅仅是单帧的捕获延迟,而非真正丢球。调整阈值是用消除一个假阳性,换来了一整堆假阴性。
物理门控完全是在另一个维度上运作的。它们能够拒绝不可能的检测,同时不会丢弃微弱的真实目标,因为它们检查的事情(一个球是否可能在这里、以这种方式运动、具有这个尺寸),与检测器以多大的置信度投票毫无关系。这种正交性,正是我构建纯净场景测试所要证明的不争事实。

在测试过程中,还有一个让我格外钟爱的小细节:遮挡情况。一名球员在十几帧的画面中从足球前方穿过,所有候选目标都被拒绝了,物理追踪器并没有盲目抓住这名球员,而是依靠自身的预测惯性平稳度过这个空隙,并在足球重新出现时再次捕获。看到它宁可保持一段空白轨迹也不去糊弄一个错误的目标,这是我第一次觉得这一层不仅仅是一个过滤器,而更像是在行使判断力。
那个我差点没有展示的数字
我差点删掉了真实镜头画面的测试运行,而决定保留它是我在整个构建中最感自豪的决定。上述所有内容都运行在已知真实基准(ground truth)的合成场景上,这使得干净的基准测试成为可能,但合成场景中的胜利很容易让人产生怀疑。因此,我截取了一段真实的转播视频片段,逐帧运行真实的 YOLO11x 检测,从实际的人体检测中将边裁的光头作为假球注入,并在完全不作修改的情况下运行同样的三个门控。随后出现了两个坦诚的妥协:单一未经标定的转播片段没有公制度量深度,因此那里的运动学门控是在图像平面上作为 2-D Kalman 滤波器运行,而不是在世界空间运行,假装使用 3-D 滤波器将是一种欺骗;而且得分下降了。在真实视频片段上,物理门控在 68.3% 的时间里保持锁定足球,而跟随最高置信度策略为 43.8%,提高阈值策略为 30.0%。
面对 68.3% 这个数字我思考了良久,因为 97.7% 是能够大卖的数字,而 68.3% 才是在复杂真实视频上的真实数字。我把这个诚实的数字保留在了计分板上、放在了应用内部,任何人都可以查看。一个过度夸大自身的验证层,已经在它声称要执行的唯一任务上彻底失败了。真正能够证明价值的是它的方向:完全相同的门控代码,在未经任何修改的情况下,在真实检测和模拟检测中都击败了两个基线,并且坦率地阐明了自身的局限性。

这究竟是为什么而构建的底层基石
我最初的目的并不是要打造一款足球产品,我也希望审慎界定这个演示是什么以及不是什么。这绝非声称我们在追踪表现上超越了现有的任何量产摄像系统,因为 Pixellot 后续的固件已经解决了字面意义上的光头情况,而且检测器本身也不是产品。真正的产品是位于检测器与任何对其输出采取行动的组件之间的那层轻薄、可审查的层。这些指标衡量的是追踪质量,而非检测器的错误率,这也正是为什么无论底层检测器变得多么优秀,这层机制的价值都始终成立。
比起我刚开始构建时,这一层如今显得更加至关重要。计算机视觉正在走向智能体化(agentic),现在的系统不仅给画面打标签,还会据此采取行动;而在这一切底层尚未解答的治理难题,就是如何阻止自主智能体根据物理上不可能的检测结果采取行动。SoccerNet 仍然将多目标追踪称为“远未解决”的问题,其基准测试中尚未整合任何具备物理感知能力的方法。对我而言,光头从来都不是最有趣的部分。真正有趣的是,捕获它的那条约束——真实物体必须遵守物理定律——即使面对未来完美的检测器也同样有效,因为一个以每小时 3 英里的速度在恒定高度漂浮的球,无论置信度多高都是错误的。如果你想亲眼目睹检测结果被否决并阅读其被否决的确切原因,演示地址位于 https://veriprajna.com/demos/physics-constrained-computer-vision,它将真实视频片段与合成场景并排运行。
如果你更愿意亲眼看看而不是只听我的一家之言,这里就是整个系统端到端运行的完整演示,真实视频片段与合成场景在此并排呈现。
摄像机之所以跟着光头跑,是因为从未有人告诉过它一个球能做什么。而我所构建的一切,不过是把这条指令写在了你可以随时检查的地方。

