← Volver a las guías
InsightFace ServerAPI RESTSDK de PythonReconocimiento facialRTSP

Integrar la API REST del Server

Integra InsightFace Server mediante API REST y SDK Python: crea Collections, registra personas, ejecuta búsquedas 1:N exactas y añade monitorización RTSP.

16 min de lectura
Pantalla Collections de InsightFace Server con bases de identidades faciales aisladas
Cada Collection fija su contrato de modelo, detección, umbral y búsqueda exacta.

Qué vas a construir

InsightFace Server es un servicio autohospedado de análisis y reconocimiento facial. La interfaz web, la API REST /v1 versionada y el SDK ligero de Python trabajan sobre las mismas Collections, personas, FaceSamples y monitores de cámara persistentes.

Esta guía recorre una integración completa desde el límite de la API: comprobar autenticación y disponibilidad, crear una Collection, registrar y buscar una persona, invocar Detect y Compare sin estado y conectar un Monitor RTSP. También explica los límites de reintento, datos biométricos, licencias de modelos y red que importan fuera de una evaluación aislada.

Antes de empezar

  • Un servidor CPU activo en http://127.0.0.1:18097, o la dirección configurada de un servidor CUDA; el ejemplo CUDA incluido usa el puerto 18098.
  • Imágenes de prueba JPEG, PNG o WebP obtenidas con consentimiento y con un rostro claro; el límite predeterminado de imagen comprimida es 10 MiB.
  • La API key si la autenticación está activa, una shell con curl y Python 3 para el flujo opcional del SDK.
  • Un paquete de modelos licenciado y verificado. Los modelos públicos preentrenados de InsightFace se limitan a investigación no comercial salvo licencia comercial independiente.

1. Confirmar la autenticación y el contrato de respuesta

Invoca primero GET /v1/health. Este endpoint siempre es público e informa tanto readiness como auth_enabled. Si auth_enabled es true, todos los demás endpoints requieren Authorization: Bearer <api_key>. Si la autenticación está desactivada, omite por completo el header Authorization; no envíes un header vacío. El primer bloque muestra exactamente la forma sin autenticación y el segundo corresponde a despliegues autenticados.

La API usa JSON snake_case y multipart/form-data para imágenes. Cada respuesta incluye un header UUID x-request-id y los bodies JSON lo repiten como request_id. Las señales de detección y calidad usan 0.0–1.0, pero recognition similarity es el coseno bruto en [-1.0, 1.0], no una probabilidad. threshold acepta el intervalo inclusivo [0.0, 1.0], vale 0.4 por defecto y hay coincidencia cuando similarity >= threshold.

  • Un DELETE correcto devuelve HTTP 204 sin body.
  • Detect sin rostros puede ser un resultado vacío válido; Search sin coincidencias devuelve válidamente matches: [].
  • OpenAPI está en /openapi.json y el visor interactivo del mismo origen, en /docs.
Autenticación desactivada: omitir Authorization por completo
BASE_URL=http://127.0.0.1:18097
curl -fsS "${BASE_URL}/v1/health"
curl -sS "${BASE_URL}/v1/system"
Autenticación activada: enviar token Bearer
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. Crear una Collection y fijar el contrato

Una Collection es una base de identidades aislada y un contrato de despliegue. Al crearla fija ID y versión del modelo activo, bundle digest, dimensión del embedding, versión de preprocesado, detection profile y exact-search profile. La embedding_contract_id devuelta es opaca: cópiala para trusted external enrollment y nunca la construyas.

Empieza con threshold 0.4 y calíbralo con datos de validación representativos. Las respuestas de Collection exponen detection_revision y la configuración efectiva de búsqueda. Los cambios posteriores del detection profile se aplican a nuevas peticiones, pero no vuelven a extraer FaceSamples existentes. Los perfiles realizan búsqueda plana exhaustiva; los de menor precisión aproximan el coseno FP32, pero no son índices ANN.

  • El perfil general predeterminado es fp32_v1; fp16_v1 solo funciona con CUDA y BF16 depende de una CPU compatible o CUDA SM80+.
  • La capacidad predeterminada es 100.000 filas activas y max_faces_per_person es 20; dimensiona ambos desde un presupuesto real de memoria y retención.
  • El guardado de crops está desactivado por defecto. Al activarlo se guardan crops JPEG de bounding box 112×112, no originales ni aligned recognition inputs.
Crear la Collection employees
curl -sS "${BASE_URL}/v1/collections" -H "${AUTH_HEADER}" \
  -H 'Content-Type: application/json' \
  -d '{"id":"employees","name":"Employees","threshold":0.4}'

3. Registrar una persona y buscarla

El registro usa multipart y admite varias imágenes en una petición. review_mode=off sigue la estrategia de selección de la Collection; standard exige exactamente un rostro utilizable y aplica controles configurados de tamaño, confianza, calidad y pose; strict añade comparaciones de similitud dentro y fuera de la persona. Un lote puede tener éxito parcial con HTTP 201, así que revisa faces y rejected_images.

Search selecciona un query face con el perfil de la Collection, lo compara con cada FaceSample activo y asigna a cada persona la mejor puntuación de sus muestras. Solo devuelve resultados iguales o superiores al threshold efectivo, ordenados por similarity descendente. Valida el flujo con una imagen distinta de las usadas al registrar.

  • Sin rostro de consulta utilizable se devuelve 422 face_not_found; una consulta válida sin identidades sobre el umbral devuelve matches: [].
  • Las muestras aceptadas se confirman en SQLite y se añaden al índice activo en memoria antes de responder con éxito.
  • external_trusted sigue exigiendo imagen asociada y embedding_contract_id exacta; los vectores deben ser finitos, no nulos, tener la dimensión correcta y norma L2 dentro de 1.0 ± 0.0002.
Registrar a Alice con dos imágenes
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'
Buscar con una imagen distinta
curl -sS "${BASE_URL}/v1/collections/employees/search" \
  -H "${AUTH_HEADER}" \
  -F 'image=@alice-query.jpg' \
  -F 'limit=5'

4. Usar Detect y Compare sin estado

Detect devuelve todos los rostros utilizables ordenados por área, con cajas en píxeles y normalizadas, cinco landmarks, confianza del detector y señales locales de calidad. No devuelve embeddings ni persiste datos. Pasa collection_id para usar el detection profile de esa Collection en lugar del perfil inmutable del sistema.

Compare selecciona un rostro de source y otro de target, calcula la similarity de coseno bruta y devuelve matched según el threshold efectivo. La similarity puede ser negativa y nunca debe presentarse como porcentaje de confianza. Si una imagen no contiene un rostro utilizable, devuelve 422 face_not_found.

  • max_faces acepta 1–100. Se admiten JPEG, PNG y WebP, y se aplica la orientación EXIF antes de inferencia.
  • El límite predeterminado es 64 MiB para la petición completa y 40 millones de píxeles para la imagen decodificada.
  • Detect, Compare, registro, Search, embeddings y reconocimiento RTSP comparten el presupuesto global de concurrencia de inferencia.
Detectar rostros sin persistencia
curl -sS "${BASE_URL}/v1/detect" \
  -H "${AUTH_HEADER}" \
  -F 'image=@group.jpg' \
  -F 'max_faces=10' \
  -F 'collection_id=employees'
Comparar dos rostros seleccionados
curl -sS "${BASE_URL}/v1/compare" \
  -H "${AUTH_HEADER}" \
  -F 'source=@source.jpg' \
  -F 'target=@target.jpg' \
  -F 'threshold=0.4'

5. Usar el SDK ligero de Python

Instala el cliente directamente desde este checkout. Usa httpx, no contiene runtime de inferencia y acepta rutas, bytes u objetos binarios de tipo archivo. Espera 65 segundos por defecto, un poco más que el deadline de 60 segundos del servidor.

El ejemplo usa la dirección CPU de la guía, en el puerto 18097, y un servidor autenticado. Con autenticación desactivada, crea Client("http://localhost:18097") sin api_key para no enviar ningún Authorization header. El mismo cliente ofrece create_monitor, update_monitor, monitor_state y monitor_events basado en cursor.

  • Mantén el timeout del cliente por encima del timeout configurado del servidor salvo que la aplicación deba fallar antes.
  • Pasa collection= a Detect o Compare si necesitas el detection profile de una Collection.
  • Cierra el cliente o úsalo como context manager para liberar las conexiones agrupadas.
Instalar el SDK local de Python
python -m pip install ./server/sdk/python
Crear, registrar, detectar, comparar y buscar con Python
from 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. Gestionar errores y reintentos sin duplicar escrituras biométricas

Los errores comparten un envelope JSON con error.code, error.message, details opcionales y request_id. Las asignaciones comunes son 400 parámetros inválidos, 401 key ausente o incorrecta, 404 recurso inexistente, 409 conflicto de estado o modelo, 413 límite de tamaño, 422 imagen inválida o rostro no utilizable, 500 error inesperado y 503 timeout o indisponibilidad del runtime/índice.

GET se puede reintentar con seguridad. Reintenta 429 y 503 transitorios con backoff exponencial acotado y jitter; un 4xx de validación exige cambiar la petición. Tras un fallo de transporte, crear Person o FaceSample queda en estado ambiguo: lee primero el ID que proporcionó el cliente. Si un 503 de registro contiene write_committed: true, la escritura ya está en SQLite; no reintentes a ciegas, lee antes la persona.

  • Registra x-request-id, endpoint, status y tiempos seguros; nunca imágenes, embeddings, API keys ni credenciales RTSP.
  • Solo reintenta DELETE tras consultar el estado actual.
  • Reutiliza cursores opacos sin cambios con el mismo endpoint y filtros; no los analices ni fabriques.

7. Añadir un Monitor RTSP persistente

Pantalla de monitorización de cámaras de InsightFace Server con una tarea RTSP persistente
Un Monitor RTSP persistente sigue activo en el servidor aunque se cierre el navegador.

Un Monitor es una tarea de reconocimiento RTSP del servidor cuya configuración se guarda en SQLite. Si está enabled se reanuda tras reiniciar el Server y sigue activo al cerrar el navegador. El decoder conserva solo el frame más reciente, de modo que una inferencia lenta reduce la frecuencia efectiva en lugar de acumular retraso. match_threshold: null hereda el threshold de la Collection.

La preview está desactivada deliberadamente por defecto y el reconocimiento no depende de ella. Al activarla, /preview.mjpeg transmite frames JPEG sin anotación y el cliente dibuja cajas usando /state. Nunca pongas la API key en la URL de preview. Consulta /events con su cursor opaco para eventos enter, exit, error y recovery, tratando explícitamente truncated y stream_reset.

  • Las credenciales RTSP se cifran con AES-GCM bajo /data y la API solo devuelve una fuente redactada.
  • Los frames de vídeo nunca se guardan. Los eventos recientes solo viven en un ring de memoria acotado y se pierden al reiniciar el proceso.
  • Limita la administración de Monitors a operadores de confianza; la primera fase tiene una única API key sin roles, no autorización por tenant.
monitor.json
{
  "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
}
Crear un Monitor y consultar estado y eventos
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. Proteger datos, red, copias y derechos de los modelos

Persiste /data, monta /models en solo lectura y respalda SQLite junto con el crop storage configurado mientras las escrituras estén detenidas o mediante un snapshot seguro para SQLite. Trata el volumen y las copias como datos biométricos. Termina HTTPS en un reverse proxy de confianza, permite solo los orígenes CORS necesarios y aplica límites de tasa, cuerpo y tiempo en el borde. Nunca expongas una evaluación con autenticación desactivada.

El código fuente del Server y el SDK de Python usan licencia MIT; los modelos quedan expresamente fuera de ella. La imagen del contenedor no incluye modelos. El instalador muestra su licencia y verify comprueba identidad del paquete, licencia firmada, vigencia y autorización. Los paquetes públicos de InsightFace, incluido buffalo_l, suelen limitarse a investigación académica no comercial salvo licencia comercial independiente.

  • Las API keys se almacenan como hashes; cambiar INSIGHTFACE_API_KEY en un inicio posterior rota intencionadamente la key activa del volumen.
  • Usa docker compose down sin -v; añadir -v elimina permanentemente el volumen con nombre.
  • Define consentimiento, retención, borrado, respuesta a incidentes y usos autorizados antes de procesar identidades reales.
Instalar y verificar un paquete de modelo licenciado
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_l

¿Necesitas ayuda con el despliegue en producción?

Contacta con InsightFace para licencias de modelos, optimización de runtime y soporte de despliegue en tu hardware objetivo.

Enviar consulta empresarial