Nodeflux Central
Face Recognition

API Reference — Face Recognition

Endpoint REST API untuk membuat pipeline Face Recognition pada stream Visionaire4 dan event streaming hasil recognition via WebSocket.

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.

POST
/pipeline/{node_num}/{stream_id}/NFV4-FR

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

node_num*integer

Nomor node dalam cluster. Gunakan 0 untuk deployment single node.

stream_id*string

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"}
DELETE
/pipeline/{node_num}/{stream_id}/NFV4-FR

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

node_num*integer

Nomor node dalam cluster. Gunakan 0 untuk deployment single node.

stream_id*string

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"}
POST
/pipeline/{node_num}/{stream_id}/NFV4-FRA

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

node_num*integer

Nomor node dalam cluster. Gunakan 0 untuk deployment single node.

stream_id*string

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'"}
DELETE
/pipeline/{node_num}/{stream_id}/NFV4-FRA

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

node_num*integer

Nomor node dalam cluster. Gunakan 0 untuk deployment single node.

stream_id*string

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:


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-FR

Pipeline NFV4-FRA (face recognition + atribut demografis):

ws://<host>:4004/event_channel/{node_num}/{stream_id}/NFV4-FRA

Segmen 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

ParameterTipeDeskripsi
node_numintegerNomor node tempat stream berjalan (0 = master)
stream_idstringID stream yang akan dipantau

Query Parameter (Opsional)

ParameterTipeDeskripsi
logicstringFilter 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:

EndpointCakupan
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

FieldTipeDeskripsi
timestampintWaktu event dalam epoch detik (UTC).
node_numintNomor node tempat pipeline berjalan.
stream_idstringIdentifier stream sumber.
stream_namestringNama stream.
stream_addressstringURL sumber video stream.
stream_longitude, stream_latitudefloatPosisi kamera. Pada NFV4H-MOBLE-FR diperbarui secara live dari GPS perangkat.
analytic_idstringVarian 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_textstringface_id identitas yang cocok, atau "UNKNOWN" jika similarity di bawah threshold.
secondary_textstringSelalu kosong untuk Face Recognition.
pipeline_dataobjectDetail recognition — lihat tabel berikutnya.
image_jpegstring (base64)Crop JPEG wajah; cakupannya mengikuti dump_image_crop_type (default kepala & bahu). Kontrasnya dapat ditingkatkan dengan fr_enhance_contrast.

Field pipeline_data

FieldTipeDeskripsi
event_idstringID unik event berformat <timestamp>-<hash8>.
face_idstringID 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).
similarityfloatSimilarity kandidat terbaik dari keyspace utama (0.0–1.0).
statusstring"KNOWN" jika similarity ≥ similarity_threshold, selain itu "UNKNOWN".
track_idintID tracking untuk asosiasi antar frame. Pada varian Hybrid vendor (ISAPI/WizMind/Mobile) selalu 0.
variationstringID variasi enrollment yang cocok.
confidence_detectionfloatConfidence detektor wajah.
detection_sizeobjectDimensi bounding box {w, h} dalam pixel.
sharpness_scorefloatSkor ketajaman area mata (0–10); makin tinggi makin tajam.
std_devfloatStandard deviation embedding — indikator kualitas; wajah dengan nilai di bawah stddev_threshold tidak menghasilkan event.
messagestring"success" jika pencarian FREMIS-N berhasil; selain itu berisi penyebabnya (mis. "No face candidates found. Please enroll your data." atau error koneksi).
attributes.detectionobject{confidence, label: "face"}.
attributes.recognitionobject{confidence, label, face_id, variation} — salinan hasil recognition dalam format generik.
top_anonymousobjectHanya ada jika --fr-anonymous-enable (default true). Lihat Identitas Anonim.
embeddingfloat[]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_id berisi 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_anonymousDeskripsi
face_idID identitas anonim.
similaritySimilarity ke identitas anonim tersebut.
variationVariasi enrollment anonim yang cocok.
messageStatus pencarian di keyspace anonim.
new_anonymoustrue 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 }
}
AtributVarianCatatan
gender, age, glasses, mask, head_covering, upper_color, lower_colorFRA, FRA2Dihitung dari crop seluruh tubuh.
face_expressionFRA, FRA2Label: Anger, Contempt, Disgust, Fear, Happiness, Neutral, Sadness, Surprise. Dihitung dari wajah yang sudah di-align.
gloves, upper_cloth, lower_cloth, body_type, footwear_color, belongingFRA2Set 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.

On this page