
Une caméra automatisée a suivi un crâne chauve pendant tout un match de football. J'ai conçu la porte physique qui dit non.
En octobre 2020, une caméra automatisée lors d'un match d'Inverness Caledonian Thistle a passé une grande partie de la rencontre à suivre le crâne chauve d'un juge de touche au lieu du ballon. Sous les projecteurs, la tête brillait comme un ballon, la caméra Pixellot a suivi la détection ayant le plus haut score de confiance qui lui était transmise, et les téléspectateurs chez eux ont eu droit à un long gros plan obstiné sur un homme chauve trottinant le long de la ligne de touche pendant que le match se déroulait hors champ (documenté sur notre page de solution WP43).
Cette histoire m'a accompagné tout au long de ce développement, car c'est l'illustration la plus limpide que je connaisse d'une défaillance que tous les professionnels de la vision par ordinateur ont déjà ressentie et que presque personne ne nomme correctement. Le détecteur n'était pas en panne. Il a fait exactement ce que fait un détecteur. Il a évalué une zone de pixels, le reflet sur le crâne a obtenu un score élevé, et chaque système en aval a fait confiance à ce score. Plumbline, la démo que j'ai construite, se trouve à l'adresse https://veriprajna.com/demos/physics-constrained-computer-vision, et l'ensemble ne défend qu'une seule thèse : la solution ne réside pas à l'intérieur du détecteur.
Le moment où j'ai cessé d'incriminer le modèle
J'ai passé la première journée de ce projet à tenter d'imaginer un meilleur détecteur, et je n'arrivais pas à faire disparaître le problème. Un détecteur d'objets est indépendant des images précédentes. Il évalue chaque image en fonction de la texture et de la forme, sans aucune mémoire de l'endroit où se trouvait un objet réel un instant plus tôt, ni de l'endroit où il peut physiquement se trouver ensuite. Ainsi, sous l'éclairage du stade, un crâne chauve est localement un excellent ballon. Vous pouvez entraîner un modèle plus pointu, il continuera quand même, sur l'image où le reflet est à son comble, à vous présenter un ballon avec un indice de confiance de 98 % posé sur la tête d'un homme. L'indice de confiance ne ment pas sur les pixels. Il répond à une question qui n'a rien à voir avec le fait de savoir si un ballon peut physiquement se trouver là.
C'est à cet instant que ma perspective a basculé.
Votre système de vision n'a pas un problème de confiance. Il a un problème de physique.
Un véritable ballon obéit à des contraintes auxquelles un crâne chauve n'est pas soumis, et aucune de ces contraintes ne figure dans le score du détecteur. Ce simple recadrage a déterminé l'ensemble de l'architecture. J'ai cessé d'essayer de rendre le détecteur plus intelligent et j'ai commencé à construire une couche qui se place en aval et applique les lois physiques que le détecteur n'a jamais connues.
À quoi ressemble « physiquement impossible » dans le code
Je voulais voir une détection être rejetée pour une raison lisible en langage clair ; c'est donc ce que j'ai construit en premier. Plumbline se place en aval de n'importe quel détecteur et applique trois portes déterministes à chaque candidat avant que la moindre action ne soit engagée. La porte cinématique utilise un filtre de Kalman — un Unscented Kalman Filter sur la trajectoire synthétique avec un modèle de mouvement balistique — pour prédire où un vrai ballon peut se trouver à l'instant suivant, puis mesure l'écart de chaque candidat par rapport à cette prédiction sous la forme d'une distance de Mahalanobis : accepter en dessous de 3 sigma, rejeter au-delà de 5 sigma, marquer la plage de 3 à 5 sigma pour examen. La porte de flux optique compare le mouvement local des pixels d'un candidat à la vitesse attendue de la trajectoire, et rejette un « ballon » dont le flux pointe dans la mauvaise direction ou bouge à peine en plein jeu. La porte géométrique utilise un modèle sténopé pour déterminer combien de pixels un ballon de 22 cm peut sous-tendre à la profondeur implicite du candidat, et élimine les tailles qui ne peuvent pas être réelles.
Aucune d'entre elles n'est un modèle. Il s'agit de code numpy et scipy ordinaire, lisible ligne par ligne, situé en dehors de tout réseau de neurones, ce qui explique précisément pourquoi je leur fais confiance. Ici, la confiance ne dépend pas d'une boîte noire qui s'explique après coup.
Le crâne chauve échoue simultanément aux trois portes. J'ai injecté cet imposteur délibérément, en tant que reproduction de l'incident d'Inverness de 2020 plutôt que comme une heureuse erreur organique, car le cas de figure qui met une caméra en échec est précisément celui qui n'apparaît jamais dans le jeu de test d'un détecteur. Sur la pire image du clip synthétique, la tête se situe à 82,3 sigma du mouvement prédit du ballon, ce qui n'est pas une décision serrée : c'est cinématiquement absurde. Le vrai ballon, affichant une confiance de 0,87 et un écart de 0,4 sigma, passe sans encombre et la caméra reste fixée sur lui.

Chaque rejet laisse un motif consigné dans les registres
Je ne voulais pas que tout cela repose sur une confiance aveugle, alors chaque décision génère un enregistrement que vous pouvez ouvrir. Le journal de décision exporté indique la graine (seed), le scénario, l'identifiant du détecteur et les seuils de portes en en-tête, puis une ligne par image et par candidat : la classe et la confiance émises par le détecteur, le verdict numérique de chaque porte et son motif en langage clair (« Mahalanobis 82 sigma >= 5 sigma : cinématiquement impossible »), ainsi que l'action finale. Sur le scénario du juge de touche chauve, les portes rejettent la totalité des 18 fausses détections à haute confiance de l'imposteur, et le suivi fondé sur la physique maintient le ballon 97,7 % du temps contre 59,1 % pour le suivi de la plus haute confiance et 20,5 % pour un seuil relevé (scène synthétique, seed 7).
Pour quiconque assume une responsabilité juridique liée à une décision visuelle automatisée, ce registre fait toute la différence entre un rapport d'incident et un simple haussement d'épaules. Il est conçu comme une preuve opposable expliquant pourquoi une caméra a agi comme elle l'a fait — pas un certificat de conformité, simplement la justification physique, consignée, image par image.

Relever le seuil de confiance n'est pas le bon levier
Lorsque je montre le rejet du crâne chauve à des ingénieurs, le premier réflexe est presque toujours le même : il suffit d'augmenter le seuil de confiance jusqu'à ce que le faux ballon disparaisse. J'ai conçu la démonstration pour répondre à ce réflexe avec des chiffres, car cela semble juste alors que c'est faux. Sur la scène synthétique propre, sans aucun imposteur, relever le seuil élimine 43,2 % des vrais ballons à faible indice de confiance, tandis que les portes physiques limitent leurs manqués sur le jeu de test propre à 2,3 %, ce qui correspond à une simple image de latence d'acquisition plutôt qu'à un ballon perdu. Le seuil échange un faux positif contre une montagne de faux négatifs.
Les portes physiques opèrent sur un axe totalement différent. Elles peuvent rejeter la détection impossible sans écarter la vraie détection de faible intensité, parce que ce qu'elles vérifient (un ballon peut-il se trouver ici, se déplacer ainsi, à cette taille ?) n'a rien à voir avec la force avec laquelle le détecteur s'est prononcé. C'est cette orthogonalité que le test sur scène propre a été conçu pour rendre incontestable.

Il y a un détail plus subtil auquel je me suis attaché en testant cela : le cas de l'occlusion. Un joueur passe devant le ballon pendant une douzaine d'images, chaque candidat est rejeté, et au lieu de s'accrocher au joueur, le suivi physique poursuit sur sa propre prédiction à travers l'intervalle et réacquiert le ballon dès qu'il réapparaît. Le voir préserver une trajectoire vide plutôt que de bluffer sur une mauvaise trajectoire m'a donné pour la première fois le sentiment que cette couche était moins un simple filtre qu'une véritable forme de discernement.
Le chiffre que j'ai failli ne pas montrer
J'ai failli supprimer le test sur séquences réelles, et l'avoir conservé est la décision dont je suis le plus fier dans tout ce travail. Tout ce qui précède fonctionne sur une scène synthétique avec une vérité terrain connue, ce qui permet un benchmark rigoureux, mais une victoire synthétique suscite facilement la méfiance. J'ai donc pris un véritable extrait de diffusion télévisée, j'y ai appliqué de réelles détections YOLO11x image par image, j'ai injecté la tête du juge de touche comme faux ballon à partir de la détection réelle de la personne, et j'ai appliqué les trois mêmes portes sans modification. Deux compromis honnêtes en ont découlé. Un extrait de diffusion unique non calibré ne comporte pas de profondeur métrique, de sorte que la porte cinématique s'exécute ici dans le plan image sous la forme d'un filtre de Kalman 2D, et non dans l'espace monde, feindre un filtre 3D aurait été un mensonge. Et le score a baissé. Sur la séquence réelle, les portes physiques conservent le ballon 68,3 % du temps, contre 43,8 % pour le suivi de la plus haute confiance et 30,0 % pour le seuil relevé.
J'ai longuement réfléchi à ces 68,3 %, car 97,7 % est le chiffre qui fait vendre, alors que 68,3 % est le chiffre qui est vrai sur une vidéo difficile. J'ai conservé le chiffre honnête sur le tableau d'affichage, au cœur de l'application, où chacun peut le lire. Une couche de vérification qui survend ses performances a déjà échoué dans l'unique mission qu'elle revendique. Ce qui emporte la conviction, c'est la tendance : le même code de portes, inchangé, surpasse les deux références de base aussi bien sur des détections réelles que sur des simulations, tout en affichant clairement ses propres limites.

Ce dont ceci constitue réellement le socle
Je n'avais pas pour ambition de concevoir un produit dédié au football, et je tiens à préciser ce que cette démo est et ce qu'elle n'est pas. Elle ne prétend pas faire un meilleur suivi que n'importe quel système de caméras en production, d'autant que le firmware ultérieur de Pixellot gère déjà le cas précis du crâne chauve, et le détecteur n'est pas le produit. Le produit est cette couche mince et inspectable intercalée entre un détecteur et l'élément qui agit à partir de ses sorties. Ces métriques mesurent la qualité du suivi et non le taux d'erreur du détecteur, c'est pourquoi la valeur ajoutée persiste quelle que soit la précision atteinte par le détecteur sous-jacent.
Cette couche est plus cruciale aujourd'hui que lorsque j'ai commencé. La vision par ordinateur devient agentique, avec des systèmes qui ne se contentent plus d'étiqueter une image mais agissent en fonction d'elle, et la question de gouvernance non résolue qui sous-tend l'ensemble consiste à savoir comment empêcher un agent autonome d'agir sur la base d'une détection physiquement impossible. SoccerNet qualifie toujours le suivi multi-objets de problème « loin d'être résolu », sans qu'aucune méthode intégrant les lois de la physique ne soit encore intégrée à ses benchmarks. Le crâne chauve n'a jamais été l'aspect le plus captivant pour moi. Ce qui est captivant, c'est que la contrainte qui le prend en défaut — le fait qu'un objet réel doive obéir à la physique — reste tout aussi valable face à un détecteur futur parfait, car un ballon flottant à hauteur constante en avançant à trois miles à l'heure est aberrant, quel que soit le score de confiance. Si vous souhaitez voir une détection se faire rejeter et lire la raison exacte de ce rejet, la démo est accessible à l'adresse https://veriprajna.com/demos/physics-constrained-computer-vision, exécutant côte à côte le clip réel et les scènes synthétiques.
Et si vous préférez le voir de vos propres yeux plutôt que de me croire sur parole, voici l'ensemble fonctionnant de bout en bout, le clip réel et les scènes synthétiques côte à côte.
La caméra a suivi un crâne chauve parce que personne ne lui avait jamais expliqué ce qu'un ballon peut faire. Tout ce que j'ai construit n'est rien d'autre que cette instruction, formulée là où vous pouvez la vérifier.

