All products
Vision · Recognition

OptiFace

Recognise faces you can stake a decision on.

OptiFace is a face recognition engine you run yourself. Give it one image; it returns a confident identity match backed by a reliability score you can set policy on. It's engineered to stay accurate as your gallery grows from hundreds to hundreds of thousands of faces — and to keep every face inside your own walls.

Computer VisionSDKOn-prem
99.78%LFW verification accuracy, 6,000 pairs, fused 1024-D
0.0154% FMRfalse-match rate at threshold 0.45 on 198 South Asian ICAO portraits
2.24 msall 22 components in one GPU forward pass — 2,290 img/s batched (GB10, TensorRT fp16)
What it does

Capabilities.

Verify & search faces

Confirm a person is who they claim to be, or find them across an enrolled gallery — one image in, a ranked match out.

Built for the real world

Handles awkward angles, poor lighting, and low-resolution captures, with automatic enhancement of small or distant faces.

More than identity

Reads image quality and liveness so you can reject bad captures and spoofing attempts before they ever reach a decision.

Scales with your gallery

Accuracy is tuned so the match quality holds up as you enrol more people — not just in a small demo.

Measured, not claimed

The numbers.

Headline numbers

OptiFace engine · NVIDIA GB10 (TensorRT 11, fp16) · measured 2026-10-25 / 26
Metric
Result
LFW accuracy
99.78%fused 1024-D vector; EER 0.33%, TAR 99.67% @ FAR 1e-3
Face detection rate
100%198 / 198 South Asian (Bangladeshi) ICAO portraits
False-match rate @ 0.45
0.0154%3 / 19,503 impostor pairs, fused 1024-D; 0.0359% for the 512-D identity vector alone
Closed-set identification
96.47% rank-1LFW, 4,270-identity gallery, 3,404 probes; rank-5 97.15%
Model latency (batch 1)
2.24 msTensorRT fp16, 22 components, 1,848 dims — 3.5× faster than the previous 7.77 ms PyTorch figure
Model throughput
2,290 img/sbatch 64; flat at ~2,260 img/s over a 120 s sustained run, 84 °C, no throttling
1M-face search
5.5 msexact brute-force on GPU, 512-D; 10M faces in 49.8 ms (speed only, random vectors)

Everything here ran on the GPU, with OptiFace served as TensorRT engines built from the deployed ONNX. Accuracy is on public pair sets; the false-match study is impostor-side only (one image per subject), so genuine-accept / EER are not computed for the ICAO population.

Accuracy

3,000 genuine + 3,000 impostor pairs per set · 10-fold, threshold picked on 9 folds, tested on the 10th
Test set
Accuracy (EER)
LFW — standard
99.78% (0.33%)
CALFW — cross-age
95.42% (6.60%)
CPLFW — cross-pose
92.88% (9.00%)
XQLFW — cross-quality
92.70% (7.67%)
LFW end-to-end, raw images
98.49%

Speed

NVIDIA GB10 · TensorRT fp16 · p50 · ICAO-style single-face portraits
What you do
Time
Throughput
Face model — batch 1 (22 components)
2.24 ms
446 / sec
Face model — batch 64
27.95 ms
2,290 / sec
Model with host↔device copies — batch 1
2.43 ms
412 / sec
Detect a face — CUDA service, 1 client
8.3 ms
115 / sec
Detect — CUDA service, saturated (128 clients)
194 ms
581 / sec
Identify vs. 100k gallery — 1 client
13.7 ms
71 / sec
Identify — CUDA service, saturated (128 clients)
327 ms
365 / sec
Search 1M faces — 512-D, 1 query
5.5 ms
5,200 q/s batched
Search 100k faces — 1024-D, 1 query
1.29 ms
29,000 q/s batched

The model alone is 2,290 img/s, but a full request also decodes, detects, aligns and searches. The CUDA serving path (nvJPEG decode → TensorRT SCRFD detection → GPU alignment → OptiFace → 1:N search, micro-batched) runs those stages on the GPU and raised saturation from ~243 to ~581 detections/s and from ~123 to ~365 identifications/s over the earlier CPU-bound pipeline. With random (Poisson) arrivals one GB10 holds p95 ≈ 100 ms up to ~300 detections/s and p95 ≈ 150 ms up to ~250 identifications/s, i.e. roughly 3,000 and 2,500 users at one request per 10 s. The load generator shared the same host, so these are conservative; multi-face images were not measured. The face detector is a separate third-party model (InsightFace SCRFD).

Full report · 2026-10-25 / 26

Test setup and status

Host: DGX Spark, NVIDIA GB10 (sm_121), driver 580.173.02, torch 2.11.0+cu128, TensorRT 11.2.1.2, 20 CPU cores. Model under test: the OptiFace engine, deployed ONNX sha256 81f98f43… (matches the shipped SHA256SUMS), and its EMA weights. Everything ran on the GPU as TensorRT engines built from the ONNX — ONNX Runtime has no CUDA provider for the GB10. trt_fp32 is built directly from the deployed ONNX; trt_fp16 is built from an FP16 ONNX exported from the same EMA weights (TensorRT 11 has no FP16 builder flag), matching fp32 with cosine ≥ 0.99997 and identical accuracy on every set below.

What ran, what failed, what has not been run

Area
Status
OptiFace latency / throughput, batch 1–256, 4 backends
Done
Sustained load (120 s, thermals)
Done (re-run after fixing a sampler bug)
Accuracy: LFW, CPLFW, XQLFW, CALFW
Done
LFW closed-set identification
Done
ICAO false-match rate (198 subjects)
Done
OptiFace end-to-end pipeline with stage breakdown
Done
1:N gallery search scaling, 1k–10M
Done (random vectors, speed only)
Concurrency, detection and identification, 1–32 clients (old CPU-bound harness)
Done
CUDA serving path: parity, accuracy, closed- and open-loop load
Done
Cost / efficiency
Partial — derived from run telemetry; no price data
H100 scaling
Estimate only — scaled from GB10 measurements
Model speed

GPU latency and throughput

OptiFace engine, all 22 components (1,848 dims)

Device-resident input · p50 latency, throughput in img/s
Batch
trt_fp16
trt_fp32
torch_fp16
torch_fp32
1
2.24 ms (446)
6.90 ms (145)
4.37 ms (229)
6.06 ms (165)
2
2.32 ms (862)
7.18 ms (278)
11.75 ms (170)
6.88 ms (291)
4
3.12 ms (1,282)
7.72 ms (518)
13.55 ms (295)
10.07 ms (397)
8
4.74 ms (1,689)
10.24 ms (782)
15.21 ms (526)
17.11 ms (468)
16
7.84 ms (2,041)
18.79 ms (851)
19.60 ms (816)
39.38 ms (406)
32
14.13 ms (2,265)
35.18 ms (910)
30.02 ms (1,066)
80.26 ms (399)
64
27.95 ms (2,290)
67.74 ms (945)
54.16 ms (1,182)
178.5 ms (358)
128
56.68 ms (2,258)
131.8 ms (971)
104.0 ms (1,230)
263.1 ms (486)
256
116.9 ms (2,190)
255.5 ms (1,002)
201.4 ms (1,271)
492.3 ms (520)
  • Batch 1 with host-to-device and device-to-host copies of all 22 outputs: 2.43 ms p50 (trt_fp16).
  • Previously published figure: 7.77 ms single, 556 img/s batched, PyTorch fp32 backbone only. trt_fp16 is about 3.5× faster at batch 1 and about 4× at peak throughput.
  • Peak torch-allocated memory at batch 32: about 424 MB.
  • The torch_fp16 numbers at batch 2–4 are non-monotonic (kernel selection); not investigated. p99 and host-transfer variants are in the raw JSON.

Sustained load (120 s, batch 64)

Backend
Throughput
p50
p99
First 10% → last 10% p50
GPU at end
trt_fp16
2,264 img/s
28.3 ms
30.5 ms
27.9 → 28.3 ms
84 °C, 2,275 MHz, 92 W, 96% util
trt_fp32
927 img/s
69.0 ms
72.3 ms
68.9 → 69.0 ms
81 °C, 2,392 MHz, 85 W

Latency stays flat over 120 s with no visible throttling. This is a 2-minute run, not a soak test.

Efficiency (derived from the sustained-load telemetry; no pricing data)

Backend
Throughput
GPU power at end
img/s per W (model only)
trt_fp16
2,264
92 W
about 24.6
trt_fp32
927
85 W
about 10.9

Power is the single nvidia-smi reading at the end of the run, not an average, and covers GPU draw only. Per-dollar and per-server figures need hardware pricing, which is not available.

Recognition quality

Accuracy, identification and false-match rate

Verification accuracy — all vectors

3,000 genuine + 3,000 impostor pairs · 10 folds · threshold picked on 9 folds, tested on the 10th
Set
Model / vector
Accuracy
EER
TAR @ FAR 1e-3
AUC
LFW (pre-aligned 112 crops)
OptiFace fused 1024-D, flip
99.78%
0.33%
99.67%
0.9996
OptiFace 512-D identity
99.68%
0.37%
99.60%
0.9996
CPLFW (cross-pose)
OptiFace fused 1024-D, flip
92.88%
9.00%
82.43%
0.9612
OptiFace 512-D identity
92.12%
9.80%
68.30%
0.9545
CALFW (cross-age, official folds)
OptiFace fused 1024-D, no flip
95.42%
6.60%
TAR@1e-2: 91.80%
n/a
OptiFace 512-D identity, no flip
94.57%
6.93%
TAR@1e-2: 90.30%
n/a
XQLFW (cross-quality)
OptiFace fused 1024-D, flip
92.70%
7.67%
54.93%
0.9762
OptiFace 512-D identity
92.08%
8.00%
47.57%
0.9736

Closed-set identification (LFW aligned crops)

OptiFace 512-D identity vector
Gallery
Probes
Rank-1
Rank-5
First image of each of 4,270 identities
3,404 remaining images
96.47%
97.15%

ICAO false-match rate

198 Bangladeshi portraits · 19,503 impostor pairs · GPU
Vector
FMR @ 0.45
Pairs ≥ 0.45
Max impostor cosine
Fused 1024-D (deployed vector)
0.0154%
3
0.668
512-D identity
0.0359%
7
0.642
  • Detection rate 198/198.
  • Threshold sweep (fused): 0.30 → 1.68%, 0.35 → 0.328%, 0.40 → 0.072%, 0.45 → 0.0154%, 0.50 → 0.0103%, 0.60 → 0.0051%.
  • Earlier CPU report: 0.0205% (4 pairs). The difference is from the GPU detection and alignment path, same weights.
  • Impostor-side only. TAR / EER cannot be computed from a single-shot set.
End to end

Pipeline: decode → detect → align → embed

Original pipeline, per image (CPU-bound)

OptiFace trt_fp16 · 128 ICAO images · one process
Batch
Throughput
ms / image
Decode
Detect (GPU + CPU post-proc)
Align (CPU)
Embed
1
40.5 img/s
24.7
1.5 ms
9.5
10.5
3.1
8
51.5 img/s
19.4
1.1
8.7
8.9
0.7
32
53.0 img/s
18.9
0.9
8.6
8.9
0.5

The pipeline was CPU-bound: the model is about 0.5–3 ms of a 19–25 ms image; detection post-processing (NMS, anchors) and the alignment warp plus JPEG round-trip account for about 90%. That is what the CUDA serving path below removes.

CUDA serving path (serving/cuda_face/)

Measured 2026-10-26
  • Runs JPEG decode (nvJPEG) → SCRFD detection (TensorRT fp16, dynamic batch) → NMS and largest-face selection → similarity alignment (GPU warp) → JPEG round-trip → OptiFace TensorRT fp16 (all 22 components) → 1:N search, all on the GPU.
  • Micro-batching up to 32 images or 3 ms, with 2 GPU worker threads.
  • The Node service calls it over a Unix socket when a CUDA socket is configured and falls back to the CPU ONNX path otherwise.
  • Models in the service: the OptiFace engine and the SCRFD detector only. The detector is a separate, third-party InsightFace model.

Parity with the existing Node CPU path

Same Node service, same 198 ICAO images
Metric
Result
Faces found by both paths
198 / 198 (none found by only one)
1024-D retrieval vector cosine, CPU vs CUDA
mean 0.9936, p50 0.9945, p1 0.980, min 0.957
Box IoU
mean 0.995, min 0.979
Landmark deviation
p50 0.31 px, p99 1.5 px, max 4.2 px
Per-component cosine (mean)
identity 0.993, identity2 0.995, periocular 0.997, bfm_shape 0.999, geometry3d 1.0, most others ≥ 0.99; lowest: skintone 0.978, gender 0.859

The gender figure is a cosine over a 2-logit vector, a poor measure for it; class agreement was not computed. The liveness decision agreed on 198/198, but both paths take liveness from the same Node-side PAD model, so that line says nothing about the CUDA path. The residual difference comes from sub-pixel landmark differences (GPU Lanczos resize and fp16 detector vs. libvips and fp32); the alignment warp itself matches the CPU one to 6e-5 mean absolute pixel difference on identical landmarks.

Accuracy through the GPU pipeline

Test
GPU pipeline
CPU reference
LFW end-to-end (raw images, 6,000 pairs), 512-D
98.42%, 43 pairs without a detection
98.42%, 43
LFW end-to-end, fused 1024-D
98.49%
98.46%
ICAO false-match rate at 0.45, fused
0.031% (6 / 19,503)
0.0154% (3 / 19,503)

The ICAO difference is 3 pairs out of 19,503 and comes from the sub-pixel alignment difference; both are small, but the GPU pipeline is not bit-identical to the CPU one.

Single-worker stage cost at batch 32

Stage
ms per image
JPEG decode
0.57
Detector input resize
0.39
Detector + post-processing
about 1.65
Align + JPEG round-trip
0.25
OptiFace engine
0.44
Total
about 3 ms (about 337 img/s for one worker)

The detector is now the largest GPU cost (fp32 detector: 3.85 ms per image; fp16 halves it with no change in landmark deviation).

Parallel detection and identification

Concurrency and capacity on one GB10

Identify = decode + detect + align + OptiFace (22 components) + exact top-5 search against a 100,000-identity synthetic 1024-D gallery on the GPU. No request failures at any level.

CUDA service — closed loop

2 workers · 4 client processes on the same host · HTTP and JSON included
Clients
Detect req/s
Detect p50 / p95
Identify req/s
Identify p50 / p95
1
115
8.3 / 9.6 ms
71
13.7 / 15.2 ms
4
270
13.5 / 17.8 ms
189
19.4 / 26.1 ms
8
349
21.1 / 28.7 ms
244
30.1 / 40.0 ms
32
430
71.2 / 132.5 ms
344
84.1 / 162.7 ms
128
581
194 / 345 ms
365
327 / 546 ms

CUDA service — open loop

Poisson arrivals · latency includes queueing · 20 s per rate · zero failures
Operation
Offered /s
p50 / p95 / p99 (ms)
Detect
100
10.9 / 16.5 / 77
Detect
200
12.5 / 69.6 / 97
Detect
300
15.5 / 101 / 134
Detect
400
72.6 / 168 / 195
Detect
500
145 / 230 / 258
Detect
600
1,152 / 2,140 / 2,200
Identify
100
17.7 / 31.9 / 88
Identify
200
25.6 / 102 / 148
Identify
250
38.1 / 142 / 180
Identify
300
74.7 / 202 / 238
Identify
350
295 / 488 / 544
Identify
400
1,474 / 2,816 / 2,907

Earlier CPU-bound harness — closed loop

30 s per level · one OS process per client, each with its own TensorRT contexts on the one GPU
Clients
Detect req/s
Detect p50 / p95 / p99 (ms)
Identify req/s
Identify p50 / p95 / p99 (ms)
1
89.6
8.7 / 14.4 / 18.8
40.6
22.5 / 29.4 / 33.5
2
158.0
10.6 / 15.4 / 19.2
81.9
22.3 / 28.3 / 31.4
4
223.1
16.1 / 21.4 / 25.2
119.3
31.9 / 38.3 / 43.9
8
243.5
32.2 / 32.8 / 46.6
123.2
63.3 / 74.8 / 79.7
16
238.4
65.4 / 67.3 / 97.4
120.2
127.8 / 154.6 / 170.8
32
222.7
122.3 / 182.8 / 189.6
116.6
254.3 / 308.5 / 352.8
  • Throughput scales near-linearly to 2 clients and saturates at about 8 clients: ~243 detections/s and ~123 identifications/s. Beyond that only latency grows.
  • The cause of saturation (CPU post-processing, GPU time-slicing between processes, or both) was not determined. No server-side request batching was used, so these are conservative.
  • The 100k gallery is random vectors: it measures search cost, not accuracy at that size.

Earlier CPU-bound harness — open loop

Poisson arrivals · 8 worker processes · 30 s per rate · latency from scheduled arrival
Operation
Offered /s
Achieved /s
p50 / p95 / p99 (ms)
Detect
50
49.1
12.3 / 19.0 / 24.1
Detect
100
98.1
12.9 / 22.0 / 30.3
Detect
150
147.3
14.8 / 31.9 / 45.8
Detect
200
198.5
20.5 / 47.8 / 63.3
Detect
240
237.5
59.9 / 243.3 / 272.5
Detect
280
243.6
1,997 / 4,100 / 4,317
Identify
30
29.9
25.8 / 34.4 / 42.4
Identify
60
58.4
27.1 / 44.2 / 62.3
Identify
90
88.3
33.3 / 77.1 / 112.5
Identify
110
108.0
55.3 / 142.3 / 184.5
Identify
125
121.7
217.6 / 510.4 / 547.2
Identify
150
122.0
3,107 / 6,000 / 6,158

Measured capacity with random arrivals: detection held p95 under 50 ms up to about 200 req/s and under 250 ms up to about 240 req/s; identification (100k gallery) held p95 under 80 ms up to about 90 req/s and under 150 ms up to about 110 req/s. At one request per 10 s per user that was about 2,000 users for detection and about 900 for identification (about 1,100 at p95 under 150 ms); at one request per 60 s, about 12,000 and about 5,400.

Concurrent in-flight requests within a latency budget (earlier harness, closed loop)

p95 budget
Detection
Identification (100k gallery)
≤ 50 ms
4 clients (p95 21.4 ms)
2 clients (p95 28.3 ms)
≤ 100 ms
16 clients (p95 67.3 ms)
8 clients (p95 74.8 ms)
≤ 200 ms
32 clients (p95 182.8 ms)
16 clients (p95 154.6 ms)
≤ 350 ms
beyond 32 (not tested)
32 clients (p95 308.5 ms)

“Concurrent users” here means simultaneous in-flight requests; each client sends its next request as soon as the previous one returns. Throughput did not rise past 8 clients, so more concurrency only added queueing delay — the efficient operating point was about 8 concurrent requests.

Registered users supported at the saturated rate (earlier harness, derived)

users = sustained req/s ÷ requests per user per second
Each user makes a request every…
Detection (243 req/s)
Identification (123 req/s)
1 s (continuous, e.g. live camera at 1 fps)
~240
~120
5 s
~1,200
~610
10 s
~2,400
~1,200
60 s (e.g. door access, login)
~14,500
~7,400
  • These assume evenly spaced arrivals at full saturation. With bursty traffic or a latency target, plan for roughly half; the open-loop figures above replace them for planning.
  • Each request is one image with one face, measured on ICAO portraits. Group photos with many faces cost more per request and were not measured.
  • Identification used a 100,000-identity gallery. Search at 1M identities takes 12 ms per query, so expect a lower rate at that size.
Search at scale

1:N gallery search scaling

Exact brute-force, fp16, top-10, GPU

Gallery size
512-D, 1 query
512-D, 256 queries
1024-D, 1 query
1024-D, 256 queries
1,000
0.025 ms
0.12 ms
0.025 ms
0.17 ms
10,000
0.051 ms
0.33 ms
0.066 ms
0.60 ms
100,000
0.63 ms
5.0 ms (51k q/s)
1.29 ms
8.8 ms (29k q/s)
1,000,000
5.5 ms
49.4 ms (5.2k q/s)
12.2 ms
88.5 ms (2.9k q/s)
10,000,000
49.8 ms
497 ms (515 q/s)
not run
not run

Planted-match check at 1M (256 queries): top-1 correct 100%. Random Gaussian vectors, so speed only — no accuracy claim.

H100 · estimate, not measured

NVIDIA H100 projection

Nothing in this section was measured on an H100. It is derived from the GB10 measurements plus public GPU specifications quoted from memory — verify against NVIDIA's datasheets before using any of it externally. Reference specs: H100 SXM 80 GB, about 3.35 TB/s memory bandwidth, about 989 TFLOPS dense FP16 tensor; GB10, about 273 GB/s unified LPDDR5X memory. There is no reliable dense-FP16 figure for the GB10, so the compute ratio is a range, not a computed value.

Which resource limits each workload (from the GB10 data)

Workload
Evidence from this run
Limiting resource
Gallery search
1M × 512-D fp16 = 1.0 GB scanned in 5.5 ms → about 180 GB/s; 10M in 49.8 ms → about 200 GB/s, roughly 65–75% of the GB10's 273 GB/s
Memory bandwidth
OptiFace model, batch ≥ 32
Throughput flat at 2,190–2,290 img/s from batch 32 to 256
GPU compute
OptiFace model, batch 1
2.24 ms, little change from batch 1 to 2
Launch / fixed overhead, not arithmetic
Original end-to-end pipeline
90% of time on CPU stages; detection throughput saturates at 8 clients
Host CPU

Projected H100 numbers

Metric
GB10 (measured)
H100 projection
Basis
OptiFace throughput, batch 64, fp16 TRT
2,290 img/s
about 9,000–18,000 img/s (4–8×)
Assumed 4–8× compute scaling; the upper end needs similar utilization on a 112×112 network, not guaranteed
OptiFace latency, batch 1
2.24 ms
about 1.0–1.6 ms
Overhead-bound, so it scales far less than throughput
Gallery search, 1M × 512-D, 1 query
5.5 ms
about 0.4–0.6 ms
1.0 GB ÷ (65–75% × 3.35 TB/s)
Gallery search, 10M × 512-D, 1 query
49.8 ms
about 4–6 ms
Same method
Largest 1024-D fp16 gallery in one GPU's memory
128 GB unified, shared with the OS
about 35–38M identities in 80 GB
2 KB per identity, minus model and workspace
Original CPU-bound pipeline
~50 img/s per process; ~243 detections/s, ~123 identifications/s
about the same
CPU-bound; a faster GPU does not help — it scales only with host CPU cores

Per-GPU ceiling with a GPU-resident pipeline (upper bound)

Scenario
Ceiling (img/s)
GB10, GPU-resident pipeline
below 2,290
H100, GPU-resident pipeline
below about 9,000–18,000

The GB10 OptiFace model alone is 2,290 img/s, an upper bound that the detector and alignment reduce. The CUDA serving path above measured 581 detections/s and 365 identifications/s on the GB10, well below that bound. Do not quote the H100 ceiling as capacity — measure it. Users supported follow users = sustained req/s ÷ requests per user per second.

Market readiness

What can and cannot be claimed today

No competitor figures are included. None were retrieved or verified; vendor and NIST numbers should be taken from their current published sources.

Claims vs. evidence

Claim
Supported by this data?
99.7–99.8% on LFW
Yes — but LFW is saturated; every serious system is at or above this
Beats top commercial vendors on accuracy
No evidence. No IJB-C and no NIST results yet
22-component analysis in one 2.2 ms forward pass
Yes (model only; end-to-end is 3 ms per image per worker on the CUDA path)
Low false-match rate on a South Asian population
Partly — impostor-side only, 198 subjects
Scales to large galleries
Search speed only. Recognition accuracy at 100k+ is untested
Liveness / anti-spoofing accuracy
No evidence. Not measured

What is still needed to compete

Benchmark
Blocker
Priority
IJB-B / IJB-C (TAR @ FAR 1e-4, 1e-5)
Access request
High — the figure buyers compare
Training-identity overlap check
None; can be run now
High — gates publishing the accuracy figures
CFP-FP, AgeDB-30
Locate pair files (InsightFace release)
Medium
RFW
Access request
Medium — fairness, includes South Asian
Multi-shot ICAO captures → TAR / EER
Real second captures
High for the target market
PAD APCER / BPCER
Spoof dataset
High if liveness is advertised
1:N accuracy at 1M with real faces
Distractor set with no training overlap
Medium
NIST FRTE
Submission
Long term

The earlier “GPU alignment + NMS, then re-run the pipeline” item is done — see the CUDA serving path.

What the product depends on at runtime

  • OptiFace engine: the one trained model that produces all 22 components and the retrieval vector.

Required for market comparison — checklist

done · partial · planned
Item
State
Blocker / note
LFW (pre-aligned crops)
Done
CPLFW (cross-pose), XQLFW (cross-quality)
Done
CALFW (cross-age)
Done
ICAO-quality population
Partial
False-match rate done; genuine-pair TAR / EER needs a second real capture per subject
Single-request latency and throughput by batch size
Done
Sustained load with thermals (120 s)
Done
Concurrency, detection and identification, 1–32 clients
Done
Gallery search scaling, 1k–10M
Done
Cost / efficiency
Partial
Images per watt derived; no price data
Open-loop load test with random arrivals
Done
Server-side request batching
Done
CUDA serving path
Re-measure end-to-end throughput after moving detection post-processing and alignment to the GPU
Done
CUDA serving path
Reproducibility
Partial
Scripts and model hash recorded; no pinned dataset hashes
NIST FRTE 1:1 and 1:N (FNMR at FMR 1e-5 and 1e-6)
Planned
NIST submission

Rule for external use: no comparison table against named vendors until IJB-C and NIST figures exist for both sides and come from their current published sources.

Why it matters

What it changes.

Stays on your infrastructure

Faces are processed on your servers. Nothing is sent to a third party — a hard requirement for many security and compliance teams.

A decision, not a guess

Every match comes with a calibrated confidence you can build rules and thresholds around, instead of an unexplained raw number.

Integrate once

A single, stable SDK contract drops into your product — enrol, verify, and search behind one clean interface.

Everything it does

One API.

EnrolVerify (1-to-1)Identify (1-to-many)SearchAnalyze (22 components)QualityLivenessAttributes3D reconstructionGroup / gallery management

One single-pass engine behind one API, with each organisation's data kept fully separate. In the deployed engine, quality, liveness, and attributes are produced inside analyze in the same forward pass.

The short version

99.78% on LFW, 100% face detection and a 0.0154% false-match rate on a South Asian (Bangladeshi) ICAO population, with all 22 facial components computed in a 2.24 ms GPU pass. Recognition runs entirely on your own infrastructure, in a single model that enrols, searches, and analyses. IJB-C, NIST FRTE and presentation-attack (liveness) accuracy have not yet been measured.

Own the AI. Keep the data.

Tell us what you're building. No sales pitch — just an honest conversation about the shortest path to shipping it.