API Reference — Face Recognition
Endpoint REST API untuk membuat pipeline Face Recognition pada stream Visionaire4 dan event streaming hasil recognition via WebSocket.
← Kembali ke Face Recognition
Pengenalan, varian, setup, konfigurasi, dan output event.
FREMIS-N API
Endpoint enrollment, recognition, dan keyspace pada layanan FREMIS-N.
Konfigurasi Face Recognition
Referensi lengkap parameter body pipeline, preset, dan environment variable.
Endpoint pipeline (/pipeline/...) memanggil Visionaire4 API — basis URL dikonfigurasi melalui variabel VISIONAIRE_API_URL (default: http://localhost:4004). Untuk endpoint enrollment, pencarian, dan manajemen keyspace pada layanan FREMIS-N, lihat API Reference FREMIS-N.
Autentikasi mengikuti konfigurasi deployment Visionaire4 Anda. Untuk detail instalasi dan konfigurasi layanan, lihat halaman Instalasi Dependensi.
Manajemen Pipeline
Endpoint untuk membuat dan menghapus pipeline Face Recognition pada stream video. Pipeline NFV4-FR menjalankan deteksi dan recognition standar; NFV4-FRA menambahkan analisis atribut demografis dan ekspresi wajah. Varian lain (NFV4-FRA2, NFV4-LFR, NFV4H-*) memakai endpoint dengan bentuk yang sama — ganti segmen terakhir path dengan analytic_id yang diinginkan; lihat Varian & Cara Kerja.
Endpoint yang sama juga mendukung PUT untuk mengubah parameter pipeline yang sedang berjalan tanpa restart (respons "pipeline successfully updated") dan GET untuk membaca konfigurasi aktif beserta nilai default dan preset. Body request untuk POST/PUT dijelaskan di Konfigurasi.
Authorization
bearerAuth In: header
Path Parameters
Nomor node dalam cluster. Gunakan 0 untuk deployment single node.
Identifier unik untuk stream video. Digunakan sebagai referensi pada event output.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "http://localhost:4004/pipeline/0/5136c6c0916cd30c/NFV4-FR" \ -H "Content-Type: application/json" \ -d '{ "fr_primary_threshold": 0.8, "fr_secondary_threshold": 0.4, "mode": 0, "similarity_threshold": 0.85, "fr_min_face_size": 20, "frontal_only": true, "sampling_time_ms": 50, "fr_timeout_dump": 1500, "fr_sampling_size": 10, "static_object_sensitivity": 5, "fr_blur_filter_threshold": 3 }'{ "analytic_id": "NFV4-FR", "code": 200, "message": "pipeline successfully created", "node_num": 0, "stream_id": "5136c6c0916cd30c"}{ "code": 400, "message": "Invalid request"}{ "code": 409, "message": "Pipeline already exists"}{ "code": 500, "message": "Internal server error"}Authorization
bearerAuth In: header
Path Parameters
Nomor node dalam cluster. Gunakan 0 untuk deployment single node.
Identifier unik untuk stream video. Digunakan sebagai referensi pada event output.
Response Body
application/json
application/json
curl -X DELETE "http://localhost:4004/pipeline/0/5136c6c0916cd30c/NFV4-FR"{ "analytic_id": "NFV4-FR", "code": 200, "message": "pipeline successfully deleted", "node_num": 0, "stream_id": "5136c6c0916cd30c"}{ "code": 404, "message": "Stream not found"}Authorization
bearerAuth In: header
Path Parameters
Nomor node dalam cluster. Gunakan 0 untuk deployment single node.
Identifier unik untuk stream video.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "http://localhost:4004/pipeline/0/5136c6c0916cd30c/NFV4-FRA" \ -H "Content-Type: application/json" \ -d '{ "mode": 1, "similarity_threshold": 0.75, "fr_primary_threshold": 0.7, "frontal_only": false, "fr_min_face_size": 20, "fr_max_fps": 5, "fr_sampling_size": 10, "fr_blur_filter_threshold": 3 }'{ "analytic_id": "NFV4-FRA", "code": 200, "message": "pipeline successfully created", "node_num": 0, "stream_id": "5136c6c0916cd30c"}{ "code": 400, "message": "Invalid request: missing required field 'keyspace'"}{ "code": 400, "message": "Invalid request: missing required field 'keyspace'"}Authorization
bearerAuth In: header
Path Parameters
Nomor node dalam cluster. Gunakan 0 untuk deployment single node.
Identifier unik untuk stream video.
Response Body
application/json
application/json
curl -X DELETE "http://localhost:4004/pipeline/0/5136c6c0916cd30c/NFV4-FRA"{ "analytic_id": "NFV4-FRA", "code": 200, "message": "pipeline successfully deleted"}{ "code": 400, "message": "Invalid request: missing required field 'keyspace'"}Enrollment & Pencarian Wajah
Operasi enrollment, recognition, dan pencarian embedding kini didokumentasikan secara penuh di section FREMIS-N. Visionaire4 meneruskan request ke service FREMIS-N — gunakan basis URL FREMIS-N (FREMIS_N_API_URL) untuk memanggil endpoint berikut secara langsung:
Recognition & Match
Pencarian 1:N dari foto, pencarian dari embedding, dan pencocokan 1:1 dua foto.
Enrollment
Pendaftaran identitas, manajemen variasi, dan akses metadata identitas.
Keyspace
Membuat, menghapus, dan menelusuri keyspace untuk multi-tenant.
Event Streaming (WebSocket)
Visionaire4 mengirim setiap event hasil deteksi/inferensi melalui WebSocket. Untuk berlangganan event yang dihasilkan oleh pipeline Face Recognition pada stream tertentu, buka koneksi WebSocket ke endpoint berikut:
Pipeline NFV4-FR (face recognition standar):
ws://<host>:4004/event_channel/{node_num}/{stream_id}/NFV4-FRPipeline NFV4-FRA (face recognition + atribut demografis):
ws://<host>:4004/event_channel/{node_num}/{stream_id}/NFV4-FRASegmen terakhir harus sama dengan analytic_id pipeline yang dibuat. Event NFV4-FRA/NFV4-FRA2 menyertakan field atribut di dalam pipeline_data.attributes.
Setelah koneksi terbuka, server akan langsung mendorong (push) setiap event ke client tanpa perlu handshake atau pesan subscribe. Tutup koneksi untuk berhenti menerima event.
Parameter Path
| Parameter | Tipe | Deskripsi |
|---|---|---|
node_num | integer | Nomor node tempat stream berjalan (0 = master) |
stream_id | string | ID stream yang akan dipantau |
Query Parameter (Opsional)
| Parameter | Tipe | Deskripsi |
|---|---|---|
logic | string | Filter event berdasarkan nama logic rule yang aktif pada pipeline. Tanpa parameter ini, semua event dari analitik akan dikirim. |
Format Pesan
Setiap event berbentuk JSON dengan envelope standar Visionaire dan field spesifik Face Recognition di pipeline_data. Struktur lengkapnya dijelaskan di Struktur Event di bawah.
Contoh Koneksi
const ws = new WebSocket(
'ws://localhost:4004/event_channel/0/<stream_id>/NFV4-FR'
);
ws.onmessage = (msg) => {
const event = JSON.parse(msg.data);
console.log(event.primary_text, event.pipeline_data);
};
ws.onerror = (err) => console.error('WebSocket error', err);
ws.onclose = () => console.log('Disconnected');import asyncio
import json
import websockets
async def listen():
url = "ws://localhost:4004/event_channel/0/<stream_id>/NFV4-FR"
async with websockets.connect(url) as ws:
async for msg in ws:
event = json.loads(msg)
print(event["primary_text"], event["pipeline_data"])
asyncio.run(listen())Filter Berdasarkan Logic
Jika pipeline menjalankan beberapa logic rule, Anda dapat memfilter event hanya untuk satu logic dengan menambahkan query parameter:
ws://<host>:4004/event_channel/{node_num}/{stream_id}/NFV4-FR?logic=<logic_name>Endpoint Channel Lainnya
Untuk mendengarkan event yang lebih luas (lintas analitik atau lintas stream), gunakan endpoint berikut yang dijelaskan pada Developer Guide:
| Endpoint | Cakupan |
|---|---|
WS /event_channel/ | Semua event dari seluruh node |
WS /event_channel/{node_num}/ | Semua event dari satu node |
WS /event_channel/{node_num}/{stream_id} | Semua event dari satu stream (semua analitik) |
Struktur Event
Pipeline memancarkan satu event setiap kali sebuah wajah selesai diproses dan lolos semua filter. Event dikirim melalui event channel WebSocket (/event_channel/{node_num}/{stream_id}/{analytic_id}) dan disimpan ke database node kecuali --db-disable-event-store aktif. Cara berlangganan dijelaskan pada Event Streaming di atas.
Semua modul analitik Visionaire memakai envelope yang sama; bagian yang spesifik Face Recognition ada di pipeline_data.
{
"timestamp": 1705314600,
"node_num": 0,
"stream_id": "5136c6c0916cd30c",
"stream_name": "Lobby Utama",
"stream_address": "rtsp://10.7.2.50:554/stream",
"stream_longitude": 106.823649,
"stream_latitude": -6.261376,
"analytic_id": "NFV4-FR",
"primary_text": "employee_456",
"secondary_text": "",
"pipeline_data": {
"event_id": "1705314600-1a2b3c4d",
"face_id": "employee_456",
"similarity": 0.92,
"status": "KNOWN",
"track_id": 1,
"variation": "var_1",
"confidence_detection": 0.98,
"detection_size": { "w": 120, "h": 150 },
"sharpness_score": 8.5,
"std_dev": 0.97,
"message": "success",
"attributes": {
"detection": { "confidence": 0.98, "label": "face" },
"recognition": {
"confidence": 0.92,
"label": "employee_456",
"face_id": "employee_456",
"variation": "var_1"
}
},
"top_anonymous": {
"face_id": "",
"similarity": 0,
"variation": "",
"message": "",
"new_anonymous": false
}
},
"image_jpeg": "<base64 JPEG>"
}Field Envelope
| Field | Tipe | Deskripsi |
|---|---|---|
timestamp | int | Waktu event dalam epoch detik (UTC). |
node_num | int | Nomor node tempat pipeline berjalan. |
stream_id | string | Identifier stream sumber. |
stream_name | string | Nama stream. |
stream_address | string | URL sumber video stream. |
stream_longitude, stream_latitude | float | Posisi kamera. Pada NFV4H-MOBLE-FR diperbarui secara live dari GPS perangkat. |
analytic_id | string | Varian pipeline yang memancarkan event — NFV4-FR, NFV4-FRA, NFV4-FRA2, NFV4-LFR, NFV4H-FR, NFV4H-ISAPI-FR, NFV4H-WZMND-FR, atau NFV4H-MOBLE-FR. |
primary_text | string | face_id identitas yang cocok, atau "UNKNOWN" jika similarity di bawah threshold. |
secondary_text | string | Selalu kosong untuk Face Recognition. |
pipeline_data | object | Detail recognition — lihat tabel berikutnya. |
image_jpeg | string (base64) | Crop JPEG wajah; cakupannya mengikuti dump_image_crop_type (default kepala & bahu). Kontrasnya dapat ditingkatkan dengan fr_enhance_contrast. |
Field pipeline_data
| Field | Tipe | Deskripsi |
|---|---|---|
event_id | string | ID unik event berformat <timestamp>-<hash8>. |
face_id | string | ID identitas yang cocok. Jika status UNKNOWN dan fitur anonim aktif, berisi ID identitas anonim; jika fitur anonim nonaktif, berisi ID kandidat terdekat (bisa kosong jika keyspace kosong). |
similarity | float | Similarity kandidat terbaik dari keyspace utama (0.0–1.0). |
status | string | "KNOWN" jika similarity ≥ similarity_threshold, selain itu "UNKNOWN". |
track_id | int | ID tracking untuk asosiasi antar frame. Pada varian Hybrid vendor (ISAPI/WizMind/Mobile) selalu 0. |
variation | string | ID variasi enrollment yang cocok. |
confidence_detection | float | Confidence detektor wajah. |
detection_size | object | Dimensi bounding box {w, h} dalam pixel. |
sharpness_score | float | Skor ketajaman area mata (0–10); makin tinggi makin tajam. |
std_dev | float | Standard deviation embedding — indikator kualitas; wajah dengan nilai di bawah stddev_threshold tidak menghasilkan event. |
message | string | "success" jika pencarian FREMIS-N berhasil; selain itu berisi penyebabnya (mis. "No face candidates found. Please enroll your data." atau error koneksi). |
attributes.detection | object | {confidence, label: "face"}. |
attributes.recognition | object | {confidence, label, face_id, variation} — salinan hasil recognition dalam format generik. |
top_anonymous | object | Hanya ada jika --fr-anonymous-enable (default true). Lihat Identitas Anonim. |
embedding | float[] | Hanya ada jika --fr-embedding-event-enable. Vektor embedding wajah yang sudah dinormalisasi. |
Bagi integrator: gunakan pipeline_data.status untuk keputusan (buka pintu, catat absensi), bukan hanya face_id — karena saat fitur anonim aktif, face_id selalu terisi meskipun wajah tidak dikenal.
Identitas Anonim
Saat similarity tertinggi di keyspace utama berada di bawah similarity_threshold, pipeline mencari wajah tersebut di keyspace anonim (--fr-anynomous-keyspace-name, default anonymous):
- Jika ditemukan dengan similarity di atas threshold →
top_anonymous.face_idberisi ID anonim yang sudah ada,new_anonymous: false. - Jika tidak ditemukan → wajah didaftarkan ke keyspace anonim melalui enrollment-by-embedding, dan event membawa ID anonim baru dengan
new_anonymous: true.
Dengan cara ini, orang yang belum di-enroll tetap mendapat ID konsisten antar kemunculan — berguna untuk menghitung pengunjung unik atau menandai orang yang berulang kali muncul. Pada event UNKNOWN, pipeline_data.face_id juga diisi dengan ID anonim ini.
Field top_anonymous | Deskripsi |
|---|---|
face_id | ID identitas anonim. |
similarity | Similarity ke identitas anonim tersebut. |
variation | Variasi enrollment anonim yang cocok. |
message | Status pencarian di keyspace anonim. |
new_anonymous | true jika identitas anonim baru saja dibuat dari event ini. |
Matikan fitur ini dengan --fr-anonymous-enable=false jika Anda tidak ingin wajah tak dikenal disimpan ke FREMIS-N.
Atribut Demografis (NFV4-FRA, NFV4-FRA2)
Pada varian dengan atribut, objek attributes diperluas dengan hasil klasifikasi. Setiap atribut berbentuk { "label": "...", "confidence": 0.xx }; atribut yang confidence-nya di bawah threshold diberi label: "unknown", dan atribut yang dinonaktifkan tidak muncul.
"attributes": {
"detection": { "confidence": 0.98, "label": "face" },
"recognition": { "confidence": 0.92, "label": "employee_456", "face_id": "employee_456", "variation": "var_1" },
"gender": { "label": "male", "confidence": 0.93 },
"age": { "label": "adult", "confidence": 0.81 },
"glasses": { "label": "no_glasses", "confidence": 0.88 },
"mask": { "label": "no_mask", "confidence": 0.95 },
"head_covering": { "label": "none", "confidence": 0.90 },
"upper_color": { "label": "black", "confidence": 0.77 },
"lower_color": { "label": "blue", "confidence": 0.71 },
"face_expression": { "label": "Neutral", "confidence": 0.84 }
}| Atribut | Varian | Catatan |
|---|---|---|
gender, age, glasses, mask, head_covering, upper_color, lower_color | FRA, FRA2 | Dihitung dari crop seluruh tubuh. |
face_expression | FRA, FRA2 | Label: Anger, Contempt, Disgust, Fear, Happiness, Neutral, Sadness, Surprise. Dihitung dari wajah yang sudah di-align. |
gloves, upper_cloth, lower_cloth, body_type, footwear_color, belonging | FRA2 | Set atribut diperluas. |
Label persis setiap atribut (mis. nilai age atau upper_color) ditentukan oleh model yang dibundel dalam rilis Visionaire dan dapat berbeda antar versi. Perlakukan label sebagai string bebas di sisi integrasi.
Varian Hybrid tidak mengisi atribut ini meskipun service atribut teregistrasi — lihat Varian & Cara Kerja.
Best Practices & Troubleshooting
Panduan penempatan kamera, kualitas enrollment, tuning threshold, keterbatasan sistem, dan runbook untuk pesan error Face Recognition.
License Plate Recognition
Deteksi kendaraan dan pengenalan plat nomor (OCR) secara real-time untuk access control, manajemen parkir, dan monitoring lalu lintas.