La reconnaissance faciale sur une archive familiale semble être un problème résolu jusqu'à ce qu'on se rappelle que les visages, dans cette archive, changent de forme. Un nouveau-né et l'enfant de dix ans qu'il devient ne se ressemblent pas seulement peu pour un humain : leurs empreintes de visage, les vecteurs numériques qu'un modèle de reconnaissance produit, dérivent assez loin l'une de l'autre pour qu'un seuil de similarité unique ne puisse pas tenir les deux bouts de ce trajet. Fais tourner une seule passe de regroupement global sur toute l'archive avec un seuil assez souple pour reconnaître un nouveau-né et un enfant de dix ans comme la même personne, et il commence aussi à confondre des personnes différentes. Resserre-le assez pour garder des inconnus séparés, et chaque enfant se retrouve scindé en plusieurs « personnes » à mesure qu'il grandit.
Cet article porte sur ce problème. Reconnaître un visage est en grande partie résolu par des modèles matures. Suivre une identité à travers le changement qu'un visage traverse sur deux décennies d'enfance est un problème différent, et beaucoup moins documenté.
D'abord des fenêtres, puis on les chaîne
L'approche qui a fonctionné consiste à arrêter de demander à une seule passe de regroupement de couvrir vingt ans, et à demander plutôt à un grand nombre de petites passes de regroupement faciles de couvrir chacune six mois, puis à chaîner les résultats ensemble.
Étape un : un regroupement glouton à l'intérieur de fenêtres de six mois, avec une barre de similarité stricte de 0,50 en cosinus. À l'intérieur d'une fenêtre de six mois, la dérive due à l'âge est faible. Un enfant ne change pas assez en six mois pour menacer une passe de regroupement bien calibrée, donc une barre stricte reste fiable.
L'étape deux est la vraie astuce. Prendre les groupes de chaque fenêtre de six mois et les chaîner à travers jusqu'à quatre fenêtres adjacentes, avec une barre bien plus souple de 0,42 en cosinus, en utilisant un « union-find » pour fusionner les chaînes de façon transitive. La logique : la dérive due à l'âge qui casserait une correspondance directe sur une décennie est assez faible pour être franchie d'un seul saut d'une fenêtre de six mois à la suivante. Le système n'a jamais besoin d'une seule vérification de similarité pour couvrir « du nouveau-né à dix ans ». Il lui faut une chaîne de petits sauts, chacun facile en soi, qui s'additionnent jusqu'à la longue distance. Le « union-find » convient parce que l'identité est transitive : si le groupe de la fenêtre A se relie à celui de B, et que celui de B se relie à celui de C, A et C finissent dans le même ensemble même s'ils n'ont jamais été comparés directement.
Limiter la chaîne à quatre fenêtres adjacentes (deux ans, étant donné la taille des fenêtres de six mois) est délibéré. Si la barre souple de 0,42 chaînait indéfiniment, les erreurs s'accumuleraient : une fusion légèrement trop généreuse à deux sauts devient le fondement d'une autre à quatre sauts, et finalement deux enfants différents partagent une identité. Limiter la portée borne le pire cas d'erreur de chaque chaîne.
Des groupes de mauvaise qualité sont pires que moins de groupes
Le chaînage génère des groupes-personnes candidats, et ils ne valent pas tous la peine d'être montrés à quelqu'un. Un filtre de pureté s'exécute après le chaînage et rejette les groupes qui ne semblent pas assez cohérents en interne pour qu'on leur fasse confiance, et il est agressif : sur l'archive fondatrice, il a fait chuter les groupes listés de 545 à 281, soit plus de la moitié de la sortie brute écartée. Montrer à une personne 545 « personnes » candidates, dont un tiers de fragments ou de fausses fusions, est pire que d'en montrer moins, mais plus propres. Personne ne veut nettoyer derrière un algorithme de regroupement ; on veut une liste courte qui est en grande partie juste.
Les corrections doivent survivre à un nouveau regroupement
Le regroupement se refait à mesure qu'une archive grandit ou qu'un modèle s'améliore, et il ne doit pas perdre les corrections déjà apportées : renommer un groupe, fusionner deux qui étaient la même personne, en scinder un qui ne l'était pas. Chaque correction est donc écrite dans une table de substitution durable, indexée par nom, séparée de la sortie du regroupement, et réappliquée après chaque nouveau regroupement. L'algorithme propose ; la table de substitution a le dernier mot. Le principe est le même que pour du code généré : ne jamais laisser une sortie régénérable écraser ce qu'une personne a modifié à la main.
La limite : les frères et sœurs
C'est là que le système n'essaie pas d'être malin. Les frères et sœurs, dans cette archive, affichent une similarité en cosinus d'environ 0,33 entre eux, plus proche que deux inconnus au hasard, mais nettement en dessous des barres de 0,50 et 0,42 du regroupement. C'est assez proche pour qu'un système plus agressif les fusionne, et assez loin pour qu'il ait parfois tort. Une similarité presque suffisante est donc traitée comme une raison de demander : ces cas apparaissent comme une fusion suggérée qu'un humain doit confirmer, jamais une fusion automatique. Une fausse fusion automatique corrompt silencieusement les chronologies de deux personnes à la fois ; une suggestion refusée ne coûte rien.