Server REST API integrieren
InsightFace Server per REST API und Python SDK integrieren: Collections anlegen, Personen registrieren, exakte 1:N-Suche ausführen und RTSP überwachen.

Was Sie umsetzen
InsightFace Server ist ein selbst gehosteter Dienst für Gesichtsanalyse und -erkennung. Web UI, versionierte /v1 REST API und leichtgewichtiges Python SDK arbeiten mit denselben Collections, Personen, FaceSamples und persistenten Kamera-Monitoren.
Diese Anleitung führt durch eine vollständige Integration: Authentifizierung und Bereitschaft prüfen, eine Collection anlegen, eine Person registrieren und suchen, die zustandslosen Funktionen Detect und Compare aufrufen und anschließend einen RTSP-Monitor anbinden. Dazu kommen die Grenzen für Wiederholungen, biometrische Daten, Modelllizenzen und Netzwerksicherheit, die außerhalb einer isolierten Evaluierungsumgebung wichtig sind.
Vor dem Start
- Ein laufender CPU-Server unter http://127.0.0.1:18097 oder die konfigurierte Adresse eines CUDA-Servers; das mitgelieferte CUDA-Beispiel nutzt Port 18098.
- Mit Einwilligung erhobene JPEG-, PNG- oder WebP-Testbilder mit einem klar erkennbaren Gesicht; das Standardlimit für komprimierte Bilder beträgt 10 MiB.
- Der API key, falls Authentifizierung aktiviert ist, eine Shell mit curl und Python 3 für den optionalen SDK-Ablauf.
- Ein lizenziertes und verifiziertes model package. Öffentliche vortrainierte InsightFace-Modelle sind ohne separate kommerzielle Lizenz auf nichtkommerzielle Forschung beschränkt.
1. Authentifizierung und Antwortvertrag prüfen
Rufen Sie zuerst GET /v1/health auf. Dieser endpoint ist immer öffentlich und meldet sowohl readiness als auch auth_enabled. Ist auth_enabled true, benötigen alle anderen endpoints Authorization: Bearer <api_key>. Bei deaktivierter Authentifizierung muss der Authorization header vollständig entfallen; senden Sie keinen leeren Header. Der erste Befehlsblock zeigt genau diese unauthentifizierte Form, der zweite gilt für authentifizierte Deployments.
Die API verwendet snake_case JSON und multipart/form-data für Bilder. Jede Antwort trägt einen x-request-id UUID header; JSON bodies wiederholen ihn als request_id. Detection- und Qualitätssignale liegen zwischen 0.0 und 1.0, die recognition similarity ist jedoch der rohe Cosinuswert in [-1.0, 1.0] und keine Wahrscheinlichkeit. threshold akzeptiert das inklusive Intervall [0.0, 1.0], hat den Standardwert 0.4, und similarity >= threshold bedeutet eine Übereinstimmung.
- Ein erfolgreiches DELETE liefert HTTP 204 ohne body.
- Kein erkanntes Gesicht kann bei Detect ein gültiges leeres Ergebnis sein; kein Suchtreffer ist ein gültiges matches: [].
- OpenAPI liegt unter /openapi.json, der interaktive same-origin Viewer unter /docs.
BASE_URL=http://127.0.0.1:18097
curl -fsS "${BASE_URL}/v1/health"
curl -sS "${BASE_URL}/v1/system"export INSIGHTFACE_API_KEY='replace-with-a-long-random-secret'
BASE_URL=http://127.0.0.1:18097
AUTH_HEADER="Authorization: Bearer ${INSIGHTFACE_API_KEY}"
curl -fsS "${BASE_URL}/v1/health"
curl -sS "${BASE_URL}/v1/system" -H "${AUTH_HEADER}"2. Eine Collection anlegen und den Vertrag fixieren
Eine Collection ist eine isolierte Identitätsdatenbank und zugleich ein Deployment-Vertrag. Bei der Erstellung bindet sie model ID, version, bundle digest, embedding dimension, preprocessing version, detection profile und exact-search profile des aktiven Modells. Die zurückgegebene embedding_contract_id ist undurchsichtig: für trusted external enrollment kopieren, niemals selbst konstruieren.
Beginnen Sie mit threshold 0.4 und kalibrieren Sie ihn anschließend auf repräsentativen Validierungsdaten. Collection-Antworten zeigen detection_revision und die aufgelösten Sucheinstellungen. Spätere Änderungen am detection profile gelten für neue Requests, extrahieren bestehende FaceSamples aber nicht erneut. Die Search-Profile führen eine exakte lineare Suche aus; niedrigere Präzision approximiert FP32-Cosinuswerte, ist aber kein ANN-Index.
- Das allgemeine Standardprofil ist fp32_v1; fp16_v1 ist nur auf CUDA verfügbar, BF16 hängt von CPU-Unterstützung oder SM80+ CUDA ab.
- Standardmäßig sind 100.000 aktive rows und 20 FaceSamples pro Person vorgesehen; dimensionieren Sie nach realem Speicher- und Aufbewahrungsbudget.
- Face-crop-Speicherung ist standardmäßig aus. Falls aktiviert, werden 112×112 bounding-box JPEG crops gespeichert, nicht Originaluploads oder aligned recognition inputs.
curl -sS "${BASE_URL}/v1/collections" -H "${AUTH_HEADER}" \
-H 'Content-Type: application/json' \
-d '{"id":"employees","name":"Employees","threshold":0.4}'3. Eine Person registrieren und anschließend suchen
Enrollment verwendet multipart und kann mehrere Bilder in einem Request aufnehmen. review_mode=off folgt der Gesichtsauswahl der Collection; standard verlangt genau ein nutzbares Gesicht und prüft konfigurierte Größe, Konfidenz, Qualität und Pose; strict ergänzt den Vergleich von Similarity innerhalb und außerhalb der Person. Ein Batch kann mit HTTP 201 teilweise erfolgreich sein, deshalb müssen faces und rejected_images geprüft werden.
Search wählt mit dem Collection-Profil ein query face, vergleicht es mit jedem aktiven FaceSample und verwendet für jede Person deren höchsten Sample-Score. Nur Ergebnisse ab dem effektiven threshold werden in absteigender Similarity zurückgegeben. Testen Sie mit einem anderen Bild als bei der Registrierung.
- Fehlt ein nutzbares Query-Gesicht, lautet die Antwort 422 face_not_found; eine gültige Anfrage ohne Treffer liefert matches: [].
- Akzeptierte Samples werden vor der Erfolgsantwort in SQLite committet und dem aktiven In-Memory-Index hinzugefügt.
- external_trusted erfordert weiterhin das gekoppelte Bild und die exakte embedding_contract_id; Vektoren müssen endlich, nicht null, korrekt dimensioniert und auf eine L2-Norm von 1.0 ± 0.0002 normalisiert sein.
curl -sS "${BASE_URL}/v1/collections/employees/persons" \
-H "${AUTH_HEADER}" \
-F 'id=employee-001' \
-F 'name=Alice' \
-F 'external_id=HR-1001' \
-F 'metadata={"department":"sales"}' \
-F 'review_mode=standard' \
-F 'images=@alice1.jpg' \
-F 'images=@alice2.jpg'curl -sS "${BASE_URL}/v1/collections/employees/search" \
-H "${AUTH_HEADER}" \
-F 'image=@alice-query.jpg' \
-F 'limit=5'4. Zustandsloses Detect und Compare verwenden
Detect liefert alle nutzbaren Gesichter nach absteigender Fläche mit Pixel- und normalisierten Boxen, fünf Landmarks, Detector-Konfidenz und lokalen Qualitätssignalen. Es gibt weder Embeddings zurück noch persistiert es Daten. Übergeben Sie collection_id, wenn statt des unveränderlichen Systemprofils das detection profile einer Collection gelten soll.
Compare wählt jeweils ein Gesicht aus source und target, berechnet die rohe Cosinus-Similarity und ermittelt matched mit dem effektiven threshold. Similarity kann negativ sein und darf nie als Confidence-Prozentwert dargestellt werden. Fehlt in einem Bild ein nutzbares Gesicht, folgt 422 face_not_found.
- max_faces akzeptiert 1–100. JPEG, PNG und WebP werden unterstützt; EXIF orientation wird vor der Inferenz angewandt.
- Das Standardlimit beträgt 64 MiB für den ganzen Request und 40 Millionen Pixel für ein decodiertes Bild.
- Detect, Compare, Enrollment, Search, Embeddings und RTSP-Erkennung teilen sich das prozessweite Inferenz-Concurrency-Budget.
curl -sS "${BASE_URL}/v1/detect" \
-H "${AUTH_HEADER}" \
-F 'image=@group.jpg' \
-F 'max_faces=10' \
-F 'collection_id=employees'curl -sS "${BASE_URL}/v1/compare" \
-H "${AUTH_HEADER}" \
-F 'source=@source.jpg' \
-F 'target=@target.jpg' \
-F 'threshold=0.4'5. Das leichtgewichtige Python SDK nutzen
Installieren Sie den Client direkt aus diesem Checkout. Er basiert auf httpx, enthält keine Inference Runtime und akzeptiert Bildpfade, Bytes oder binäre file-like objects. Der Standard-Timeout von 65 Sekunden liegt knapp über der 60-Sekunden-Deadline des Servers.
Das Beispiel nutzt die CPU-Adresse aus dem User Guide auf Port 18097 und einen authentifizierten Server. Ist die Authentifizierung aus, erzeugen Sie Client("http://localhost:18097") ohne api_key, damit kein Authorization header gesendet wird. Der Client bietet außerdem create_monitor, update_monitor, monitor_state und cursor-basiertes monitor_events.
- Der Client-Timeout sollte länger als der Server-Request-Timeout sein, sofern die Anwendung nicht bewusst früher abbricht.
- Übergeben Sie collection= an Detect oder Compare, wenn ein Collection detection profile benötigt wird.
- Schließen Sie den Client oder verwenden Sie einen Context Manager, damit gepoolte Verbindungen freigegeben werden.
python -m pip install ./server/sdk/pythonfrom insightface_server import Client
# Authenticated deployment. When authentication is disabled, omit api_key:
# with Client("http://localhost:18097") as client:
with Client("http://localhost:18097", api_key="your-key") as client:
client.create_collection(
collection_id="employees",
name="Employees",
threshold=0.4,
)
client.add_person(
"employees",
person_id="employee-001",
name="Alice",
images=["alice1.jpg", "alice2.jpg"],
review_mode="standard",
)
faces = client.detect("group.jpg", max_faces=10, collection="employees")
comparison = client.compare(
"source.jpg", "target.jpg", threshold=0.4, collection="employees"
)
matches = client.search("employees", "alice-query.jpg", limit=5)
print(faces.faces)
print(comparison.similarity, comparison.matched)
print(matches.matches)6. Fehler und Wiederholungen ohne doppelte biometrische Writes behandeln
Fehler verwenden ein gemeinsames JSON envelope mit error.code, error.message, optionalen details und request_id. Typische Zuordnungen sind 400 für ungültige Parameter, 401 für fehlenden oder falschen key, 404 für fehlende Ressourcen, 409 für Zustands- oder Modellkonflikte, 413 für Größenlimits, 422 für ungültige Bilder oder unbrauchbare Gesichter, 500 für unerwartete Fehler und 503 für Timeout oder eine nicht verfügbare Runtime bzw. einen Index.
GET darf sicher wiederholt werden. Wiederholen Sie 429 und vorübergehende 503 mit begrenztem exponential backoff und jitter; bei Validierungs-4xx muss der Request geändert werden. Nach einem Transportfehler ist die Erstellung von Person oder FaceSample mehrdeutig: lesen Sie zuerst die vom Client vorgegebene Ressourcen-ID. Enthält ein Registrierungs-503 write_committed: true, steht der Write bereits in SQLite. Nicht blind wiederholen, sondern zuerst die Person lesen.
- Protokollieren Sie x-request-id, endpoint, status und sichere Zeitwerte, aber keine Bilder, Embeddings, API keys oder RTSP-Zugangsdaten.
- DELETE erst nach Prüfung des aktuellen Zustands wiederholen.
- Undurchsichtige Pagination- und Event-Cursor unverändert mit demselben endpoint und denselben Filtern verwenden; niemals parsen oder erzeugen.
7. Einen persistenten RTSP-Monitor hinzufügen

Ein Monitor ist ein serverseitiger RTSP-Erkennungsjob, dessen Konfiguration in SQLite liegt. Ein aktivierter Job wird nach einem Serverneustart fortgesetzt und läuft unabhängig vom Browser. Der Decoder hält nur den neuesten Frame; langsame Inferenz senkt daher die effektive Rate, statt veraltete Frames aufzustauen. match_threshold: null übernimmt den Collection threshold.
Die Vorschau ist absichtlich standardmäßig aus und für die Erkennung nicht erforderlich. Wenn aktiviert, streamt /preview.mjpeg rohe, unbeschriftete JPEG-Frames; Clients zeichnen mit /state die Boxen. Einen API key niemals in die Preview-URL schreiben. /events mit dem undurchsichtigen Cursor auf enter-, exit-, error- und recovery-Ereignisse abfragen und truncated bzw. stream_reset explizit behandeln.
- RTSP-Zugangsdaten werden mit AES-GCM unter /data verschlüsselt und von der API nur redigiert zurückgegeben.
- Videoframes werden nie gespeichert. Neuere Events liegen nur in einem begrenzten In-Memory-Ring und gehen beim Prozessneustart verloren.
- Monitor-Verwaltung auf vertrauenswürdige Operatoren begrenzen; Phase eins hat einen undifferenzierten API key und keine Tenant-Autorisierung.
{
"id": "front-gate",
"name": "Front gate",
"description": "Main entrance",
"enabled": true,
"source": {
"type": "rtsp",
"url": "rtsp://viewer:secret@camera.example/live"
},
"collection_id": "employees",
"inference_fps": 2.0,
"match_threshold": null,
"event_buffer_size": 1000,
"event_policy": {
"confirm_frames": 3,
"absence_timeout_seconds": 3.0,
"cooldown_seconds": 10.0,
"emit_unknown": true
},
"preview_enabled": false
}curl -sS "${BASE_URL}/v1/monitors" -H "${AUTH_HEADER}" \
-H 'Content-Type: application/json' \
-d @monitor.json
curl -sS "${BASE_URL}/v1/monitors/front-gate/state" \
-H "${AUTH_HEADER}"
curl -sS "${BASE_URL}/v1/monitors/front-gate/events?limit=100" \
-H "${AUTH_HEADER}"8. Daten, Netzwerk, Backups und Modellrechte schützen
Persistieren Sie /data, mounten Sie /models read-only und sichern Sie SQLite zusammen mit konfiguriertem Crop-Speicher bei gestoppten Writes oder mit einem SQLite-sicheren Snapshot. Volume und Backups sind als biometrische Daten zu schützen. HTTPS an einem vertrauenswürdigen Reverse Proxy terminieren, nur notwendige CORS origins erlauben und am Edge Rate-, Body- und Zeitlimits setzen. Eine Evaluierungsinstanz ohne Authentifizierung darf nicht ins Netz.
Der Server-Quellcode und das Python SDK stehen unter MIT; Modelle sind ausdrücklich nicht von dieser Lizenz umfasst. Das Container-Image enthält keine Modelle. Der Installer zeigt die Modelllizenz, verify prüft Paketidentität, signierte Lizenz, Gültigkeit und aktuelle Autorisierung. Öffentliche InsightFace-Modellpakete wie buffalo_l sind üblicherweise nur für nichtkommerzielle akademische Forschung freigegeben, solange keine separate kommerzielle Lizenz vorliegt.
- API keys werden als Hashes gespeichert; eine spätere Änderung von INSIGHTFACE_API_KEY rotiert absichtlich den aktiven key für dieses Datenvolume.
- docker compose down ohne -v verwenden; -v löscht das named data volume dauerhaft.
- Vor Produktionsdaten Regeln für Einwilligung, Aufbewahrung, Löschung, Vorfallreaktion und zulässige Nutzung festlegen.
docker compose -f server/deploy/compose.cpu.yml \
run --rm models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cpu.yml \
run --rm models verify buffalo_lBenötigen Sie Hilfe beim Produktions-Deployment?
Kontaktieren Sie InsightFace für Modelllizenzen, Runtime-Optimierung und Deployment-Support für Ihre Zielhardware.
Enterprise-Anfrage senden