Le Labo AI
Biais de reconnaissance faciale : anatomie d'un faux positif judiciaire

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

9 min3 niveaux disponibles

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 :

  1. La robustesse des modèles en conditions réelles (indice : elle est souvent merdique).
  2. L’absence de garde-fous techniques dans les pipelines de décision automatisée.
  3. 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 :

  1. Sous-estimé la variance intra-classe (les visages changent avec l’âge, l’éclairage, les expressions).
  2. 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 :

  1. 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é).
  2. 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
    
  3. 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èleLFW AccuracyRFW (Black)RFW (Asian)AgeDB (50+)
ArcFace99.83%95.2%97.1%92.8%
FaceNet99.65%93.8%96.4%91.5%
DeepFace99.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)

  1. 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.
  2. Ensemble methods :

    • Combiner plusieurs modèles (ex : ArcFace + FaceNet + un classique comme Eigenfaces) et voter.
    • Avantage : réduit la variance des erreurs.
  3. 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"
      
  4. 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.

Articles liés