集成 InsightFace Server REST API
通过 REST API 或 Python SDK 创建 Collection、注册身份、执行精确 1:N 搜索、处理重试并接入持久化 RTSP 监控。

你将完成什么
InsightFace Server 是可自行部署的人脸分析与识别服务。Web UI、带版本的 /v1 REST API 和轻量 Python SDK 操作的是同一组 Collection、Person、FaceSample 与持久化摄像头 Monitor。
本指南从 API 边界出发,走通完整链路:确认认证和就绪状态,创建 Collection,注册 Person,检索该 Person,调用无状态 Detect 与 Compare,再接入 RTSP Monitor;同时说明隔离评估环境之外必须处理的重试、生物特征数据、模型授权和网络安全边界。
开始之前
- 已在 http://127.0.0.1:18097 运行 CPU Server;或已知 CUDA Server 地址(随附 CUDA 示例使用 18098 端口)。
- 经合法同意取得、包含清晰人脸的 JPEG、PNG 或 WebP 测试图片;默认压缩图片上限为 10 MiB。
- 若已启用认证,需要 API key;还需可运行 curl 的 shell,以及用于可选 SDK 流程的 Python 3。
- 已授权并验证的模型包。除非另有商业许可,InsightFace 公开预训练模型仅限非商业研究使用。
1. 确认认证状态与响应契约
先调用 GET /v1/health。该端点始终公开,并同时返回就绪状态和 auth_enabled。auth_enabled 为 true 时,其他所有端点都需要 Authorization: Bearer <api_key>。认证关闭时必须完全省略 Authorization header,不能发送空 header。第一段命令正是无认证写法;第二段用于已启用认证的部署。
API 使用 snake_case JSON,图片通过 multipart/form-data 上传。每个响应都带 x-request-id UUID header,JSON body 中还会以 request_id 重复返回。检测和质量信号范围为 0.0–1.0,但识别 similarity 是 [-1.0, 1.0] 的原始余弦值,不是概率。threshold 接受闭区间 [0.0, 1.0],默认 0.4,similarity >= threshold 才算匹配。
- 成功的 DELETE 返回 HTTP 204,且没有 body。
- Detect 未检测到人脸可以是正常空结果;Search 未命中则正常返回 matches: []。
- OpenAPI 位于 /openapi.json,同源交互查看器位于 /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 既是隔离的身份库,也是部署契约。创建时会绑定当前模型 ID、版本、bundle digest、embedding 维度、预处理版本、检测 profile 和精确检索 profile。返回的 embedding_contract_id 是不透明值:可信外部特征注册时原样复制,绝不能自行构造。
先从 threshold 0.4 开始,再用代表性验证集校准。Collection 响应会给出 detection_revision 和最终 search 设置。之后修改检测 profile 只影响新请求,不会重新提取已有 FaceSample。各 search profile 都是精确的平面穷举检索;低精度 profile 近似 FP32 余弦分数,但不是 ANN 索引。
- 总体默认 search profile 是 fp32_v1;fp16_v1 仅支持 CUDA,BF16 则取决于 CPU 能力或 SM80+ CUDA。
- 默认容量为 100,000 个活跃 row,max_faces_per_person 默认为 20;应按真实内存与保留预算设置。
- 人脸 crop 默认不保存。启用后仅存储 112×112 bounding-box JPEG crop,不保存原始上传或对齐后的识别输入。
curl -sS "${BASE_URL}/v1/collections" -H "${AUTH_HEADER}" \
-H 'Content-Type: application/json' \
-d '{"id":"employees","name":"Employees","threshold":0.4}'3. 注册 Person 并执行检索
注册请求使用 multipart,可一次上传多张图片。review_mode=off 按 Collection 的选脸策略处理;standard 要求恰好一张可用人脸,并执行已配置的尺寸、置信度、质量和姿态检查;strict 还会比较类内与类外相似度。批次可能以 HTTP 201 部分成功,因此必须同时检查 faces 和 rejected_images。
Search 用 Collection profile 选出一张 query 人脸,与所有活跃 FaceSample 比较;每个 Person 取其所有样本中的最高分,只返回达到有效 threshold 的结果,并按 similarity 降序排列。验证流程时应使用不同于注册图片的查询图。
- query 中没有可用人脸会返回 422 face_not_found;query 有效但无人达到阈值时返回 matches: []。
- 成功响应前,已接受样本会先写入 SQLite,再加入当前内存索引。
- external_trusted 仍需配对图片和精确的 embedding_contract_id;向量必须有限、维度正确、非零,并在 1.0 ± 0.0002 范围内完成 L2 归一化。
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. 使用无状态 Detect 与 Compare
Detect 按面积降序返回全部可用人脸,包括像素与归一化框、五点关键点、检测置信度和本地质量信号;不会返回 embedding,也不会写入数据。若要使用某个 Collection 的检测 profile,而不是不可变的系统 profile,请传 collection_id。
Compare 分别从 source 和 target 选一张人脸,计算原始余弦 similarity,并按有效 threshold 返回 matched。相似度可以为负,绝不能显示为“置信度百分比”。任一图片没有可用人脸都会返回 422 face_not_found。
- max_faces 接受 1–100。支持 JPEG、PNG、WebP,推理前会应用 EXIF orientation。
- 默认完整请求上限为 64 MiB,解码后图片上限为 4,000 万像素。
- Detect、Compare、注册、Search、embedding 与 RTSP 识别共享进程级推理并发预算。
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
直接从当前 checkout 安装 client。它基于 httpx,不包含推理 runtime,可接收图片路径、bytes 或二进制 file-like object;默认等待 65 秒,略长于 Server 的 60 秒请求 deadline。
示例使用用户指南中的 CPU 地址 18097,并假定认证已开启。认证关闭时应构造 Client("http://localhost:18097"),完全省略 api_key,以免发送 Authorization header。同一 client 还提供 create_monitor、update_monitor、monitor_state 和基于 cursor 的 monitor_events。
- 除非应用有意更早失败,client timeout 应长于 Server 配置的请求 timeout。
- Detect 或 Compare 需要 Collection 检测 profile 时传 collection=。
- 使用 context manager 或显式 close,确保释放连接池。
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 资源不存在、409 状态或模型冲突、413 超出大小限制、422 图片无效或无人脸可用、500 未预期错误、503 超时或 runtime/index 不可用。
GET 可安全重试。429 和暂时性 503 可采用带 jitter、次数和上限受控的指数退避;校验类 4xx 必须先修改请求。网络故障后,Person 或 FaceSample 的创建结果可能不明确:应先读取 client 提供的资源 ID。如果注册 503 的 details 含 write_committed: true,SQLite 已经写入,绝不能盲目重试;先读取 Person 再决定后续动作。
- 记录 x-request-id、endpoint、status 和安全的耗时信息;不要记录图片、embedding、API key 或 RTSP 凭据。
- DELETE 只有在读取当前状态后才能重试。
- 分页与事件 cursor 是不透明值,只能在相同 endpoint 和 filter 下原样复用,不能解析或自行生成。
7. 接入持久化 RTSP Monitor

Monitor 是服务端 RTSP 识别任务,配置保存在 SQLite。enabled 任务会在 Server 重启后恢复,即使浏览器关闭也继续运行。decoder 只保留最新 frame,因此推理变慢只会降低实际频率,不会堆积延迟帧。match_threshold: null 表示继承 Collection threshold。
preview 特意默认关闭,识别无需预览即可运行。启用后,/preview.mjpeg 传输未经标注的原始 JPEG frame,client 使用 /state 绘制框。绝不能把 API key 放入预览 URL。用不透明 cursor 轮询 /events 获取 enter、exit、error 和 recovery 事件,并显式处理 truncated 与 stream_reset。
- RTSP 凭据在 /data 下以 AES-GCM 加密,API 只返回脱敏地址。
- 视频帧永不保存;近期事件仅存在有界内存 ring 中,进程重启后丢失。
- 仅允许可信 operator 管理 Monitor;第一阶段只有一把不区分权限的 API key,不提供租户级授权。
{
"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;停止写入后,或用 SQLite-safe snapshot,同步备份 SQLite 与已配置的 crop storage。数据卷和所有备份都应按生物特征数据保护。由可信 reverse proxy 终止 HTTPS,只允许必要的 CORS origin,并在边缘增加 rate/body/time limit;绝不能把关闭认证的评估部署暴露到网络。
Server source 与 Python SDK 采用 MIT 许可;模型明确不在该许可范围内。容器镜像不包含模型。安装器会展示模型许可,verify 会校验 package identity、签名 license、有效期和当前授权。包括 buffalo_l 在内的 InsightFace 公开模型包,除非另有商业许可,通常仅限非商业学术研究。代码可获取或模型下载成功都不等于获得商业部署许可。
- API key 以 hash 保存;后续启动时更换 INSIGHTFACE_API_KEY 会有意轮换该数据卷的 active key。
- 使用 docker compose down 时不要加 -v;-v 会永久删除 named data volume。
- 处理生产身份前,明确 consent、retention、deletion、incident response 和 authorized-use policy。
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