Biais de reconnaissance faciale : anatomie d'un faux positif judiciaire
Quand un système de reconnaissance faciale foire, c’est une vie brisée. Pour vous, c’est un cas d’école en robustesse ML. Benchmarks et architectures à l’appui.
Adapter le niveau de lecture
L'IA a envoyé une femme en prison… et c’est votre futur bug en prod
Scène d’ouverture : une quinquagénaire américaine se retrouve en cellule pour un vol qu’elle n’a pas commis. Le coupable ? Un algorithme de reconnaissance faciale qui a confondu son visage avec celui d’une suspecte. Spoiler : elle a passé cinq mois en prison avant qu’un humain ne réalise l’erreur. Pour vous, ingénieurs ML, c’est l’équivalent d’un segfault en production — sauf que là, des vies sont en jeu.
Ce n’est pas un bug anecdotique. C’est un échec systémique qui révèle trois problèmes majeurs :
- La robustesse des modèles en conditions réelles (indice : elle est souvent merdique).
- L’absence de garde-fous techniques dans les pipelines de décision automatisée.
- L’illusion du "99% d’accuracy" — un chiffre qui ne veut rien dire sans contexte.
On va disséquer ça comme un vrai post-mortem. Avec du code, des benchmarks, et surtout, les questions que vous devriez poser à votre prochain client qui veut déployer de la computer vision "pour automatiser la sécurité".
1. Fondements techniques : quand la reconnaissance faciale se plante (et pourquoi c’est normal)
Le pipeline qui a merdé
D’après les rapports (et l’article de Paris Match qui a popularisé l’affaire), le système utilisé était un système de matching facial commercial — probablement basé sur une architecture du type ArcFace ou FaceNet, avec les étapes classiques :
- Détection du visage (via MTCNN ou SSD).
- Alignement (affine transformation pour normaliser la pose).
- Extraction d’embeddings (128 ou 512 dimensions, selon le modèle).
- Comparaison par cosine similarity entre la photo de la suspecte et la base de données.
Problème n°1 : ces systèmes sont optimisés pour des conditions labo — éclairage contrôlé, visages frontaux, haute résolution. Dans la vraie vie ? Bonne chance avec ça.
Problème n°2 : les benchmarks mentent. Un modèle peut afficher 99,8% d’accuracy sur LFW (Labeled Faces in the Wild) mais s’effondrer à 60% sur des visages non-blancs ou avec des occlusions (masques, lunettes, mauvaise qualité). Cette étude de NIST le confirme : les erreurs sont 10 à 100 fois plus fréquentes sur les femmes noires que sur les hommes blancs.
"Mais on a un seuil de confiance à 95% !" — Un PM qui n’a jamais vu un faux positif en prod.
Le biais dans les données : un problème de distribution
Les datasets d’entraînement (comme MS-Celeb-1M ou VGGFace2) sont biasés démographiquement :
- 75% de visages masculins (selon ce papier de 2019).
- 80% de peaux claires (because la plupart des photos viennent d’Europe/Amérique du Nord).
- Âge moyen : 30-40 ans (les seniors et enfants sont sous-représentés).
Résultat ? Le modèle est spécialisé dans la reconnaissance de mecs blancs de 35 ans. Pour le reste, c’est de la roulette russe.
Exemple concret : dans le cas de notre quinquagénaire, le système a probablement :
- Sous-estimé la variance intra-classe (les visages changent avec l’âge, l’éclairage, les expressions).
- Surestimé la variance inter-classe entre deux femmes noires de 50 ans (parce que le modèle n’en a presque jamais vu pendant l’entraînement).
2. Implémentation : comment (ne pas) déployer un système de reconnaissance faciale
Architecture type d’un système de matching (et où ça coince)
Voici un schéma simplifié de ce à quoi ressemble un pipeline en prod :
# Pseudocode d'un système de reconnaissance faciale (inspiré de FaceNet)
def recognize_face(query_img, database_embeddings, threshold=0.7):
# 1. Détection + alignement (MTCNN)
face = detect_and_align(query_img)
if not face:
return None # Échec silencieux = danger
# 2. Extraction d'embedding (ResNet50/IR-SE-50)
embedding = model(face)
# 3. Comparaison avec la base (cosine similarity)
similarities = cosine_similarity(embedding, database_embeddings)
best_match = np.argmax(similarities)
# 4. Décision binaire (seuil fixe = recette pour le désastre)
if similarities[best_match] > threshold:
return database_ids[best_match] # Match trouvé !
else:
return None
Points de failure critiques :
- Seuil fixe (
threshold=0.7) : un seuil optimisé pour minimiser les faux négatifs (ne pas rater un criminel) maximise les faux positifs (accuser un innocent). - Pas de calibration par cohortes : le seuil devrait être dynamique selon l’âge, l’ethnie, la qualité de l’image.
- Aucun mécanisme de "second opinion" : un humain ou un autre modèle devrait valider les matches à risque.
Ce que font (ou devraient faire) les pros
Quelques bonnes pratiques rarement appliquées :
-
Benchmark sur des datasets diversifiés :
- Tester sur RFW (Racial Faces in the Wild) pour évaluer les biais ethniques.
- Utiliser AgeDB pour les variations liées à l’âge.
- Ne jamais se fier à LFW seul (trop facile, trop biaisé).
-
Implémenter un système de confiance adaptative :
def adaptive_threshold(embedding, metadata): # Exemple : ajuster le seuil selon l'âge et l'ethnie estimée age = metadata["age"] ethnicity = metadata["ethnicity"] base_threshold = 0.7 if ethnicity == "black" and age > 50: base_threshold += 0.15 # Plus strict pour les groupes à haut risque de faux positifs return base_threshold -
Logging et auditabilité :
- Enregistrer tous les matches (même les négatifs) pour analyse post-hoc.
- Ne jamais supprimer les embeddings des faux positifs — ils sont précieux pour le débogage.
3. Benchmarks : quand le "state-of-the-art" devient un piège
Performance vs. Robustesse : le grand mensonge
Voici un tableau comparatif de modèles populaires sur différents benchmarks (source : NIST FRVT) :
| Modèle | LFW Accuracy | RFW (Black) | RFW (Asian) | AgeDB (50+) |
|---|---|---|---|---|
| ArcFace | 99.83% | 95.2% | 97.1% | 92.8% |
| FaceNet | 99.65% | 93.8% | 96.4% | 91.5% |
| DeepFace | 99.71% | 94.5% | 96.8% | 92.1% |
| Humain | ~97.5% | ~96% | ~97% | ~95% |
Observations :
- Les modèles surperforment les humains sur LFW… mais sous-performent sur les groupes minoritaires.
- ArcFace est souvent présenté comme le "meilleur" — mais son écart de performance entre LFW et RFW (Black) est de 4,6%. C’est énorme.
- Un humain moyen est plus robuste que la plupart des algorithmes sur les cas difficiles.
Le coût des faux positifs
Dans le cas de notre quinquagénaire :
- Coût humain : 5 mois de prison, stress post-traumatique, perte d’emploi.
- Coût technique :
- Précision @ 99% sur LFW → Précision @ ~90% sur son cas réel.
- 1 faux positif = 1 vie brisée (et un procès en responsabilité pour l’entreprise).
"Mais on a un taux d’erreur global de 1% !" — Un data scientist qui n’a jamais entendu parler de distribution des erreurs.
4. Limitations : pourquoi ça va continuer à merder
Problème n°1 : les datasets sont pourris (et personne ne veut payer pour les nettoyer)
- MS-Celeb-1M : 10M d’images… dont 30% sont mal labellisées (selon cette analyse).
- VGGFace2 : 3,3M d’images, mais 90% des sujets sont blancs ou asiatiques.
- Les datasets "diversifiés" comme DiveFace ou FairFace existent… mais sont 10x plus petits et donc moins utilisés.
Résultat : les modèles sont entraînés sur des données non représentatives, puis benchmarkés sur des datasets tout aussi biaisés.
Problème n°2 : l’optimisation locale > la robustesse globale
Les équipes ML optimisent pour : ✅ Maximiser l’accuracy sur LFW (pour le marketing). ✅ Minimiser la latence (pour les coûts cloud). ❌ Gérer les edge cases (trop cher, trop long).
Exemple : un modèle peut avoir 99,9% d’accuracy si on lui donne des images nettoyées, recadrées, en haute résolution. Dans la vraie vie ? 85%.
Problème n°3 : l’absence de régulation technique
Aux États-Unis, aucun standard technique n’impose :
- Des seuils de confiance dynamiques.
- Des tests obligatoires sur des datasets diversifiés.
- Une transparence sur les taux d’erreur par sous-groupe.
En Europe, le RGPD impose des garde-fous… mais peu d’entreprises les appliquent vraiment (parce que c’est compliqué et coûteux).
5. Recherche & évolutions futures : peut-on faire mieux ?
Pistes techniques (qui existent déjà, mais sont peu utilisées)
-
Fairness-aware training :
- Pondérer les losses par groupe démographique pendant l’entraînement.
- Exemple : ce papier de IBM montre comment réduire les biais avec adversarial debiasing.
-
Ensemble methods :
- Combiner plusieurs modèles (ex : ArcFace + FaceNet + un classique comme Eigenfaces) et voter.
- Avantage : réduit la variance des erreurs.
-
Uncertainty estimation :
- Utiliser des Bayesian Neural Networks pour estimer l’incertitude du match.
- Exemple avec PyTorch :
# Exemple simplifié avec Monte Carlo Dropout model.train() # Mode dropout activé même à l'inférence embeddings = [model(face) for _ in range(100)] # 100 forward passes mean_embedding = torch.mean(torch.stack(embeddings), dim=0) uncertainty = torch.std(torch.stack(embeddings), dim=0).mean().item() if uncertainty > 0.1: # Seuil d'incertitude élevé return "Match incertain - vérification humaine requise"
-
Hybrid human-AI systems :
- Toujours inclure une revue humaine pour les matches à haut risque.
- Exemple : le système de la police japonaise utilise l’IA pour pré-sélectionner, mais un humain valide tous les matches.
Pistes réglementaires (qui vont vous faire râler)
- Obligation de publier les taux d’erreur par sous-groupe (comme le propose le Algorithmic Accountability Act aux USA).
- Interdiction des seuils fixes dans les systèmes critiques (justice, emploi, crédit).
- Auditabilité obligatoire : pouvoir retracer pourquoi un match a été proposé.
FAQ
[Pourquoi les systèmes de reconnaissance faciale se plantent-ils plus sur les femmes noires ?] Parce que les datasets d’entraînement sont majoritairement composés de visages masculins et blancs. Les modèles apprennent mieux à distinguer les traits qu’ils ont le plus vus. Résultat : la variance intra-classe (différences entre deux visages noirs) est sous-estimée, ce qui augmente les faux positifs.
[Comment tester la robustesse de mon modèle de reconnaissance faciale ?] Utilisez des benchmarks diversifiés comme RFW (pour l’ethnie), AgeDB (pour l’âge), et IJB-C (pour les conditions réelles : occlusions, basse résolution). Ne vous fiez pas à LFW seul. Et surtout : testez avec des images de mauvaise qualité (comme en conditions réelles).
[Existe-t-il des alternatives plus fiables que la reconnaissance faciale ?] Oui : les systèmes multi-modaux (visage + voix + comportement) réduisent les erreurs. Par exemple, les détecteurs de deepfakes politiques combinent plusieurs signaux. Autre piste : l’authentification par comportement (rythme de frappe, mouvements de souris), moins biaisée mais plus intrusive.
🎓 Formation sur ce sujet
Construire des agents IA
5 leçons · 55 min · gratuit
Articles liés
Prévention numérique à Vitré : architectures IA pour détecter les risques en temps réel
Vitré teste des systèmes IA pour prévenir les dérives numériques. On décortique les architectures, benchmarks et limites des solutions déployées sur le terrain.
Pourquoi les GAN galèrent à créer des visages moches : anatomie du biais
Les modèles génératifs échouent systématiquement sur les visages non-conventionnels. Deep dive dans les datasets, architectures et biais latents.
Architecture de la videosurveillance algorithmique : deep dive technique
Détection d'anomalies, action recognition, tracking multi-objets : dissection complète des architectures de VSA pour ingénieurs ML.