← Zurück zu den Leitfäden
Privater ModelltestFace RecognitionEvaluationMOUDatenschutz

Privater InsightFace-Erkennungsmodelltest – Schritt-für-Schritt

Praktische Anleitung für Evaluatoren, um Open-Source- und private InsightFace-Erkennungsmodelle auf eigenen Daten zu benchmarken: MOU-Voraussetzungen, Bildaufbereitung, Python-Client und Datenschutzregeln.

8 Min. Lesezeit

Was Sie umsetzen

InsightFace stellt seine Open-Source- und privaten Erkennungsmodelle als gehostete Feature-Extraction-API bereit, damit Kunden vor einem kommerziellen Vertrag selbst eine Genauigkeitsbewertung auf eigenen Validierungsdaten durchführen können.

Dieser Guide beschreibt den vollständigen Ablauf: Erhalt des Endpunkts, Bildaufbereitung, ein minimaler Python-Client, unsere Datenschutz- und Datenverarbeitungsregeln sowie der vertragliche Rahmen des kostenlosen Testfensters.

Vor dem Start

  • Ein unterzeichnetes Memorandum of Understanding (MOU) zur Kooperationsabsicht, dem Evaluationszeitraum und dem Vertraulichkeitsumfang der Modellbezeichnungen, die wir teilen. Die Endpunkt-URL wird erst nach Unterzeichnung freigegeben.
  • Python 3.9 oder neuer mit numpy, requests und OpenCV (opencv-python).
  • Ein repräsentativer Validierungssatz mit Detektionsergebnissen (Bounding Boxes aus RetinaFace, SCRFD oder Ihrem eigenen Detektor).
  • Ein klar definierter Evaluationsdatensatz mit Ground-Truth-Labels und eine wissenschaftliche Evaluationsmethodik.

1. MOU unterzeichnen und Zugang anfordern

Jeder private Modelltest beginnt mit einem unterzeichneten MOU zwischen Ihrem Unternehmen und InsightFace. Das MOU regelt die Kooperationsabsicht, den Evaluationszeitraum und den Vertraulichkeitsumfang rund um die Modellbezeichnungen, die wir mit Ihnen teilen.

Die Endpunkt-URL, die Liste der für Sie freigeschalteten Modellnamen (die im MOU autorisierten Open-Source- oder Privatmodelle) und etwaige Account-Ratelimits werden per E-Mail an die im MOU benannte technische Kontaktperson geliefert. Der Endpunkt ist nicht öffentlich und darf nicht außerhalb der autorisierten Kontakte geteilt werden.

  • Das maximale Testfenster beträgt zwei Wochen ab Bereitstellung des Endpunkts. Längere Nutzung erfordert einen kommerziellen Vertrag.
  • Pro MOU werden ausschließlich die dort genannten Modellnamen freigeschaltet; andere Namen werden vom Server abgewiesen.
  • Falls die URL rotiert werden muss (z. B. nach Ablauf des Testfensters), versenden wir die neue URL an dieselben Kontakte.

2. Repräsentativen Validierungssatz vorbereiten

Die Privatmodelle sind Erkennungs-Backbones, keine Detektoren. Jeder Request akzeptiert genau ein eng zugeschnittenes Einzelporträt und liefert ein Embedding zurück. Führen Sie Ihre eigene Detektion zuerst aus und schicken Sie die Crops einzeln.

Der Server führt jedoch auf dem eingereichten Headshot eine sekundäre Detektion und Ausrichtung durch, bevor das Embedding extrahiert wird, sodass kleine Framing-Ungenauigkeiten toleriert werden.

  • Genau ein Gesicht pro Bild. Bei Mehrpersonenbildern jeden Crop separat speichern.
  • Dokumentieren Sie Einwilligung und Rechtsgrundlage für jedes verwendete Bild gemäß der Datenklausel des MOU.

3. Gesichts-Crops vorbereiten und kodieren

Erweitern Sie die Detektor-Box leicht, bevor Sie senden. Ein Expansion-Faktor von ca. 0,2 (10 % je Seite) liefert dem Erkennungs-Backbone genug Haaransatz-, Kiefer- und Ohrkontext. Optional begrenzen Sie die längste Seite (z. B. 256 Pixel), damit Uploads klein bleiben.

Senden Sie ausschließlich verlustfreie Formate wie PNG. JPEG und WebP mit niedriger Qualität erzeugen Kompressionsartefakte rund um Augen und Mund, die die Embedding-Qualität messbar verschlechtern. Die Hilfsfunktion unten ist als Ausgangspunkt gedacht und an die Box-Konvention Ihres Detektors anzupassen.

  • Verwenden Sie einen Margin (Expansion-Faktor); ein zu enger Crop senkt die Genauigkeit.
  • Speichern Sie Crops als PNG. Erneutes JPEG-Encoding vor dem Upload ist die häufigste Ursache unerwartet niedriger Scores.
Einzel-Headshot mit Margin zuschneiden (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. Feature-Extraction-API aufrufen

Die API erwartet einen multipart/form-data-POST: ein Bild im Feld image und den String model_name. Die Antwort ist JSON mit model_name und feature (dem L2-normalisierten Embedding). Speichern Sie jedes Embedding als numpy-.npy, um Cosinus-Ähnlichkeiten offline zu berechnen.

Der Beispielclient unten entspricht exakt dem Produktionsprotokoll. Übergeben Sie die per E-Mail erhaltene URL über --server-url; codieren Sie sie nicht hart in Skripten, die in geteilte Repositories committet werden.

  • model_name muss einer der im MOU gelisteten Werte sein; andere werden abgewiesen.
  • Eine leere feature-Liste bedeutet, dass im Crop kein Gesicht erkannt wurde – Box und Margin prüfen.
  • Vergleichen Sie Embeddings per Cosinus-Ähnlichkeit über die L2-normalisierten Vektoren; nicht client-seitig erneut normalisieren.
Minimaler Python-Client für den privaten Endpunkt
"""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. Datenschutz und Datenverarbeitung

Hochgeladene Bilder werden ausschließlich für die Berechnung und Rückgabe des Embeddings für die Dauer des Requests verwendet. Wir behalten keine Rohbilder nach der Antwort und nutzen Test-Traffic nicht für Training oder Fine-Tuning.

  • URL, Modellnamen oder Scores nicht außerhalb der im MOU benannten Personen teilen.
  • Vermutete Leaks von URL oder Zugangsdaten innerhalb von 24 Stunden an Ihren InsightFace-Kontakt melden.

6. Evaluationsumfang und nächste Schritte

Das kostenlose Testfenster ist auf zwei Wochen ab Bereitstellung der URL begrenzt. Innerhalb dieser Zeit können Sie im Rahmen des Rate-Limits beliebig viele Vergleiche fahren – wir empfehlen, Testset, Vorverarbeitung und Metriken vorab festzulegen, damit das Fenster für die Messung selbst frei bleibt.

Bewerten Sie Ihre Ergebnisse nach Abschluss des Tests bitte zügig und teilen Sie uns Ihr Fazit zu einer kommerziellen Zusammenarbeit baldmöglichst mit.

Benötigen Sie Hilfe beim Produktions-Deployment?

Kontaktieren Sie InsightFace für Modelllizenzen, Runtime-Optimierung und Deployment-Support für Ihre Zielhardware.

Kontakt aufnehmen