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

Что вы настроите
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.
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. Создать 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.
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.
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 -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. Обрабатывать ошибки и повторы без дублирования биометрических записей
Ошибки используют единый 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

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.
{
"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. Защитить данные, сеть, резервные копии и права на модели
Сохраняйте /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.
Отправить корпоративный запрос