← Retour aux guides
Test modèle privéFace RecognitionÉvaluationMOUConfidentialité

Comment exécuter un test privé d'un modèle de reconnaissance InsightFace

Guide étape par étape pour évaluer les modèles open-source et privés InsightFace sur vos propres données : prérequis MOU, préparation des images, client Python et contrôles de confidentialité.

8 min de lecture

Ce que vous allez mettre en place

InsightFace expose ses modèles de reconnaissance open-source et privés via une API gérée d'extraction de features pour que les clients puissent réaliser une mesure d'exactitude sur leurs propres données de validation avant tout accord commercial.

Ce guide décrit le flux complet : réception du endpoint, préparation des images, appel via un client Python minimal, règles de confidentialité et de traitement des données, et cadre contractuel de la fenêtre d'évaluation gratuite.

Avant de commencer

  • Un Memorandum of Understanding (MOU) signé couvrant l'intention de coopération, la période d'évaluation et le périmètre de confidentialité des identifiants de modèle que nous partageons. L'URL n'est délivrée qu'après signature.
  • Python 3.9 ou supérieur avec numpy, requests et OpenCV (opencv-python).
  • Un jeu de validation représentatif avec résultats de détection (boîtes RetinaFace, SCRFD ou votre détecteur).
  • Un jeu de données d'évaluation clairement défini avec des labels de vérité terrain, et une méthodologie d'évaluation scientifique.

1. Signer le MOU et demander l'accès

Tout test privé démarre par un MOU signé entre votre organisation et InsightFace. Il définit l'intention de coopération, la période d'évaluation et le périmètre de confidentialité des identifiants de modèle que nous partageons avec vous.

L'URL du endpoint, la liste des modèles activés pour vous (les modèles open-source ou privés autorisés dans votre MOU) et les éventuels rate-limits sont envoyés par e-mail au contact technique nommé dans le MOU. Le endpoint n'est pas public et ne doit pas être partagé hors des contacts autorisés.

  • La fenêtre maximale est de deux semaines à compter de la livraison du endpoint. Toute prolongation requiert un accord commercial.
  • Chaque MOU n'active que les modèles listés ; les autres noms sont refusés par le serveur.
  • Si l'URL doit être renouvelée, la nouvelle valeur est envoyée à la même liste de contacts.

2. Préparer un jeu de validation représentatif

Les modèles privés sont des backbones de reconnaissance, pas des détecteurs. Chaque requête prend un recadrage serré d'un seul visage et renvoie un embedding. Lancez d'abord votre propre détecteur, puis envoyez les recadrages un par un.

Cela dit, le serveur effectue également une détection et un alignement secondaires sur le portrait soumis avant d'extraire l'embedding, ce qui tolère de petites imperfections de cadrage.

  • Un visage par image. Si la source contient plusieurs personnes, recadrez-les dans des fichiers distincts.
  • Documentez consentement et base légale pour chaque image, conformément à la clause données du MOU.

3. Recadrer et encoder chaque image de visage

Ajoutez une légère marge autour de la boîte du détecteur avant l'envoi. Un expansion factor d'environ 0,2 (10 % par côté) préserve un peu de cheveux, de mâchoire et d'oreilles, ce qui aide la reconnaissance. Vous pouvez borner le plus grand côté (par exemple 256 px) pour limiter la taille.

Envoyez toujours un format sans perte (PNG). Les formats avec compression (JPEG, WebP basse qualité) génèrent des artefacts autour des yeux et de la bouche qui dégradent mesurablement la qualité des embeddings. Le helper fourni est un point de départ à adapter à votre convention de boîte.

  • Ajoutez une marge (expansion factor) ; un recadrage trop serré abaisse la précision.
  • Sauvegardez les recadrages en PNG. Réencoder en JPEG juste avant l'appel API est la première cause de scores anormalement bas.
Recadrer un portrait individuel avec marge (Python)
import cv2


def crop_face_with_expansion(image, bbox, expansion_factor=0.2, max_side=256):
    """
    Crop a single-person headshot with a small margin around the detected
    face box, and optionally downscale so the longest side is <= max_side.

    image:             input image as a numpy array (BGR or RGB).
    bbox:              face bounding box [x, y, width, height] from your
                       detector of choice (RetinaFace, SCRFD, etc.).
    expansion_factor:  total margin ratio (0.2 means +10% on each side).
    max_side:          if set, the longest side of the result is bounded.
    """
    img_h, img_w = image.shape[:2]
    x, y, w, h = bbox

    # 1. Margin distributed evenly to both sides.
    dw = int(w * expansion_factor / 2)
    dh = int(h * expansion_factor / 2)

    # 2. Expanded box, clamped to image bounds.
    x1 = max(0, x - dw)
    y1 = max(0, y - dh)
    x2 = min(img_w, x + w + dw)
    y2 = min(img_h, y + h + dh)

    face_img = image[y1:y2, x1:x2]

    # 3. Optional bounded downscale with a high-quality filter.
    if max_side is not None:
        curr_h, curr_w = face_img.shape[:2]
        longest = max(curr_h, curr_w)
        if longest > max_side:
            scale = max_side / longest
            new_w = int(curr_w * scale)
            new_h = int(curr_h * scale)
            face_img = cv2.resize(
                face_img, (new_w, new_h), interpolation=cv2.INTER_AREA,
            )

    return face_img


# Save the crop with a lossless format (PNG) before sending it to the API.
# Lossy formats (JPEG, WebP at low quality) introduce compression artifacts
# that can measurably reduce face recognition accuracy.
# cv2.imwrite("probe.png", crop)

4. Appeler l'API d'extraction de features

L'API attend un POST multipart/form-data : un fichier image dans image et la chaîne model_name. La réponse JSON contient model_name et feature (l'embedding L2-normalisé). Enregistrez chaque embedding en .npy pour calculer la similarité cosinus hors-ligne.

Le client d'exemple ci-dessous reproduit fidèlement le protocole de production. Vous pouvez l'exécuter tel quel ou importer extract_feature dans votre pipeline. Passez l'URL reçue par e-mail via --server-url et ne la codez pas en dur dans des scripts versionnés en partage.

  • model_name doit appartenir à la liste du MOU ; les autres valeurs sont refusées.
  • Une liste feature vide signifie qu'aucun visage n'a été détecté dans le recadrage – vérifiez la boîte et la marge.
  • Comparez les embeddings via similarité cosinus sur les vecteurs L2-normalisés ; ne renormalisez pas côté client.
Client Python minimal pour le endpoint privé
"""Example client for the private InsightFace feature extraction service.

Uploads a single-person face image to the test endpoint, reads the returned
embedding, and saves it locally with np.save for offline evaluation.
"""

import argparse
import os.path as osp

import numpy as np
import requests


def extract_feature(image_path, output_path, url, model_name, timeout=120.0):
    filename = osp.basename(image_path)
    data = {"model_name": model_name}

    with open(image_path, "rb") as infile:
        files = {
            "image": (filename, infile, "application/octet-stream"),
        }
        try:
            resp = requests.post(
                url=url, files=files, data=data, timeout=timeout,
            )
            resp.raise_for_status()
        except requests.RequestException as ex:
            raise SystemExit(
                "request failed: %s: %s" % (type(ex).__name__, str(ex))
            )

    payload = resp.json()
    feature = payload.get("feature")
    if not isinstance(feature, list):
        raise SystemExit("server response feature must be a list")
    if len(feature) == 0:
        raise SystemExit(
            "server returned no features; verify the image contains a "
            "detectable face"
        )

    feat = np.asarray(feature, dtype=np.float32)
    np.save(output_path, feat)
    print("saved feature:", output_path, feat.shape, payload.get("model_name"))
    return feat


def main():
    parser = argparse.ArgumentParser(
        description=(
            "Upload a face image to the private InsightFace test server and "
            "save the embedding with np.save."
        ),
    )
    # The --server-url value is delivered to evaluators by email.
    parser.add_argument(
        "--server-url", required=True,
        help="Feature extraction API URL (sent privately by InsightFace)",
    )
    # The set of choices below is illustrative; the models actually unlocked
    # for your account are listed in your MOU and may evolve over time.
    parser.add_argument(
        "--model-name", required=True,
        choices=["buffalo", "dingo", "eagle"],
        help="Recognition model to evaluate (must match an entry in your MOU)",
    )
    parser.add_argument("--image", required=True, help="Input face image path (PNG recommended)")
    parser.add_argument("--output", required=True, help="Output .npy file path")
    parser.add_argument("--timeout", type=float, default=120.0, help="HTTP timeout in seconds")
    args = parser.parse_args()

    extract_feature(
        args.image, args.output, args.server_url, args.model_name,
        timeout=args.timeout,
    )


if __name__ == "__main__":
    main()

5. Confidentialité et traitement des données

Les images téléversées servent uniquement au calcul et au renvoi de l'embedding pendant la requête. Aucune image brute n'est conservée après la réponse, et le trafic d'évaluation ne sert ni à l'entraînement ni au fine-tuning.

  • Ne partagez ni l'URL, ni les noms de modèle, ni les scores hors des contacts du MOU.
  • Signalez toute fuite suspectée du endpoint ou des identifiants à votre contact InsightFace sous 24 heures.

6. Périmètre d'évaluation et suite

La fenêtre gratuite est plafonnée à deux semaines à partir de la livraison de l'URL. Sur cette période, vous pouvez lancer autant de comparaisons que votre rate limit le permet ; nous recommandons de figer le jeu de test, le prétraitement et les métriques avant la demande, pour consacrer la fenêtre aux mesures.

Une fois le test terminé, évaluez vos résultats et partagez au plus vite votre conclusion concernant une coopération commerciale.

Besoin d’aide pour le déploiement en production ?

Contactez InsightFace pour les licences de modèles, l’optimisation runtime et le support de déploiement sur votre matériel cible.

Nous contacter