← Назад к руководствам
InsightFace ServerREST APIPython SDKРаспознавание лицRTSP

Интеграция REST API Server

Интегрируйте InsightFace Server через REST API и Python SDK: создавайте Collections, регистрируйте людей, выполняйте точный поиск 1:N и подключайте RTSP.

16 мин чтения
Экран Collections InsightFace Server с изолированными базами лиц
Каждая Collection закрепляет model, detection, threshold и exact-search contract.

Что вы настроите

InsightFace Server — самостоятельно размещаемый сервис анализа и распознавания лиц. Web UI, версионированный REST API /v1 и легковесный Python SDK работают с одними и теми же Collections, людьми, FaceSamples и постоянными camera Monitors.

В руководстве разобрана полная интеграция от границы API: проверка аутентификации и готовности, создание Collection, регистрация и поиск человека, вызов stateless Detect и Compare, подключение RTSP Monitor. Также описаны правила повторов, защиты биометрических данных, лицензирования моделей и сети, необходимые за пределами изолированной оценки.

Перед началом

  • Работающий CPU Server по адресу http://127.0.0.1:18097 либо настроенный адрес CUDA Server; комплектный пример CUDA использует порт 18098.
  • Полученные с надлежащим согласием тестовые JPEG, PNG или WebP с хорошо видимым лицом; стандартный предел сжатого изображения — 10 MiB.
  • API key при включенной аутентификации, shell с curl и Python 3 для необязательного сценария SDK.
  • Лицензированный и проверенный пакет моделей. Публичные pretrained models InsightFace без отдельной коммерческой лицензии разрешены только для некоммерческих исследований.

1. Проверить аутентификацию и контракт ответа

Сначала вызовите GET /v1/health. Этот endpoint всегда публичен и сообщает readiness и auth_enabled. Если auth_enabled равен true, всем остальным endpoints нужен Authorization: Bearer <api_key>. При отключенной аутентификации header Authorization следует полностью убрать — нельзя отправлять пустой header. Первый блок команд показывает правильный вариант без аутентификации, второй предназначен для защищенного deployment.

API использует snake_case JSON и multipart/form-data для изображений. Каждый ответ содержит UUID header x-request-id, а JSON body повторяет его как request_id. Сигналы detection и качества имеют диапазон 0.0–1.0, но recognition similarity — это необработанный cosine в [-1.0, 1.0], а не вероятность. threshold принимает включительный диапазон [0.0, 1.0], по умолчанию равен 0.4, совпадение означает similarity >= threshold.

  • Успешный DELETE возвращает HTTP 204 без body.
  • Отсутствие лиц может быть корректным пустым Detect; отсутствие совпадений — корректный matches: [].
  • OpenAPI доступен по /openapi.json, same-origin интерактивный viewer — по /docs.
Аутентификация выключена: полностью убрать Authorization
BASE_URL=http://127.0.0.1:18097
curl -fsS "${BASE_URL}/v1/health"
curl -sS "${BASE_URL}/v1/system"
Аутентификация включена: отправить Bearer token
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. Создать Collection и закрепить контракт

Collection — изолированная база идентичностей и одновременно deployment contract. При создании закрепляются model ID, version, bundle digest, embedding dimension, preprocessing version, detection profile и exact-search profile активной модели. Возвращаемый embedding_contract_id непрозрачен: копируйте его для trusted external enrollment и никогда не конструируйте самостоятельно.

Начните с threshold 0.4 и откалибруйте его на репрезентативных validation data. Ответ Collection содержит detection_revision и итоговые search settings. Последующие изменения detection profile применяются к новым запросам, но не извлекают заново существующие FaceSamples. Search profiles выполняют точный полный линейный поиск; режимы низкой точности приближают FP32 cosine, но не являются ANN indexes.

  • Общий профиль по умолчанию — fp32_v1; fp16_v1 доступен только на CUDA, BF16 зависит от возможностей CPU или CUDA SM80+.
  • Стандартная capacity — 100 000 активных rows, max_faces_per_person — 20; задавайте их по реальному бюджету памяти и хранения.
  • Хранение face crops по умолчанию выключено. При включении сохраняются JPEG bounding-box crops 112×112, а не исходные uploads и не aligned recognition inputs.
Создать 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. Зарегистрировать человека и выполнить поиск

Enrollment использует multipart и принимает несколько изображений за запрос. review_mode=off следует стратегии выбора лица Collection; standard требует ровно одно пригодное лицо и применяет настроенные проверки размера, confidence, качества и pose; strict добавляет сравнение similarity внутри и вне класса человека. Batch может частично завершиться с HTTP 201, поэтому всегда проверяйте faces и rejected_images.

Search выбирает query face по профилю Collection, сравнивает со всеми активными FaceSamples и назначает каждому человеку максимальный score его samples. Возвращаются только результаты не ниже effective threshold, в порядке убывания similarity. Для проверки используйте изображение, отличное от регистрационного.

  • Если подходящего query face нет, возвращается 422 face_not_found; корректный запрос без совпадений возвращает matches: [].
  • Принятые samples commit в SQLite и добавляются в активный in-memory index до успешного ответа.
  • external_trusted по-прежнему требует связанное изображение и точный embedding_contract_id; вектор должен быть конечным, ненулевым, нужной размерности и иметь L2 norm в пределах 1.0 ± 0.0002.
Зарегистрировать Alice по двум изображениям
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. Использовать stateless Detect и Compare

Detect возвращает все пригодные лица по убыванию площади: pixel/normalized boxes, пять landmarks, detector confidence и локальные quality signals. Embeddings не возвращаются, данные не сохраняются. Передайте collection_id, чтобы использовать detection profile Collection вместо неизменного системного профиля.

Compare выбирает по одному лицу из source и target, вычисляет raw cosine similarity и возвращает matched по effective threshold. Similarity может быть отрицательной, ее нельзя показывать как процент confidence. Если на одном из изображений нет пригодного лица, возвращается 422 face_not_found.

  • max_faces принимает 1–100. Поддерживаются JPEG, PNG и WebP; EXIF orientation применяется до inference.
  • Стандартный предел всего request — 64 MiB, декодированного изображения — 40 миллионов pixels.
  • Detect, Compare, enrollment, Search, embeddings и RTSP recognition делят общий process-wide inference 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. Использовать легковесный Python SDK

Установите client непосредственно из этого checkout. Он основан на httpx, не содержит inference runtime и принимает пути, bytes или бинарные file-like objects. Стандартный timeout 65 секунд немного превышает 60-секундный request deadline Server.

Пример использует CPU-адрес из User Guide с портом 18097 и аутентифицированный Server. Если аутентификация отключена, создайте Client("http://localhost:18097") без api_key, чтобы Authorization header не отправлялся. Client также предоставляет create_monitor, update_monitor, monitor_state и cursor-based monitor_events.

  • Timeout клиента должен быть больше server request timeout, если приложению не требуется намеренно завершаться раньше.
  • Передайте collection= в Detect или Compare, когда нужен detection profile Collection.
  • Закрывайте client или используйте context manager для освобождения pooled connections.
Установить локальный Python SDK
python -m pip install ./server/sdk/python
Создание, регистрация, detection, compare и search на 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. Обрабатывать ошибки и повторы без дублирования биометрических записей

Ошибки используют единый JSON envelope с error.code, error.message, необязательными details и request_id. Типичные соответствия: 400 неверные параметры, 401 отсутствующий/неверный key, 404 отсутствующий resource, 409 state/model conflict, 413 превышение размера, 422 неверное изображение или непригодное лицо, 500 неожиданная ошибка, 503 timeout либо недоступная runtime/index.

GET безопасно повторять. 429 и временные 503 повторяйте с ограниченным exponential backoff и jitter; validation 4xx требуют исправить запрос. После transport failure результат создания Person/FaceSample неоднозначен: сначала прочитайте resource ID, заданный client. Если registration 503 содержит write_committed: true, запись уже находится в SQLite. Не повторяйте вслепую — сначала прочитайте Person.

  • Логируйте x-request-id, endpoint, status и безопасные timing data, но не изображения, embeddings, API keys или RTSP credentials.
  • Повторяйте DELETE только после чтения текущего состояния.
  • Opaque pagination/event cursors повторно используйте без изменений с теми же endpoint и filters; не разбирайте и не создавайте их.

7. Добавить постоянный RTSP Monitor

Экран мониторинга камер InsightFace Server с постоянной RTSP-задачей распознавания
Постоянный RTSP Monitor продолжает работу на сервере после закрытия браузера.

Monitor — server-side RTSP recognition task, конфигурация которой хранится в SQLite. Enabled task возобновляется после перезапуска Server и работает после закрытия браузера. Decoder хранит только самый новый frame, поэтому медленная inference снижает фактическую частоту, а не создает очередь старых кадров. match_threshold: null наследует threshold Collection.

Preview намеренно выключен по умолчанию, recognition от него не зависит. При включении /preview.mjpeg передает raw JPEG frames без разметки, а client рисует boxes по /state. Никогда не помещайте API key в preview URL. Опрашивайте /events с opaque cursor для enter, exit, error и recovery events и явно обрабатывайте truncated и stream_reset.

  • RTSP credentials шифруются AES-GCM в /data, API возвращает только отредактированный source.
  • Video frames никогда не сохраняются. Недавние events находятся лишь в ограниченном in-memory ring и теряются при перезапуске процесса.
  • Управление Monitors разрешайте только доверенным операторам; в первой фазе одна неразделенная API key, а не tenant-level authorization.
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
}
Создать Monitor и опрашивать состояние и события
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. Защитить данные, сеть, резервные копии и права на модели

Сохраняйте /data, подключайте /models read-only и создавайте backup SQLite вместе с crop storage при остановленных writes либо через SQLite-safe snapshot. Volume и backup являются биометрическими данными. Завершайте HTTPS на доверенном reverse proxy, разрешайте только необходимые CORS origins и задавайте edge rate/body/time limits. Не выставляйте в сеть evaluation deployment без аутентификации.

Исходный код Server и Python SDK распространяются по MIT; модели этой лицензией явно не покрываются. Container image не содержит моделей. Installer показывает model license, а verify проверяет package identity, signed license, срок действия и текущую authorization. Публичные пакеты InsightFace, включая buffalo_l, обычно разрешены только для некоммерческих академических исследований без отдельной коммерческой лицензии.

  • API keys хранятся как hashes; замена INSIGHTFACE_API_KEY при последующем старте намеренно ротирует active key этого data volume.
  • Используйте docker compose down без -v; -v навсегда удаляет named data volume.
  • До обработки реальных identities определите consent, retention, deletion, incident response и authorized-use policies.
Установить и проверить лицензированный пакет модели
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

Нужна помощь с production-развертыванием?

Свяжитесь с InsightFace по вопросам лицензирования моделей, оптимизации runtime и поддержки целевого hardware.

Отправить корпоративный запрос