1:N Search
Identifikasi wajah dari seluruh database keyspace dengan top-k kandidat dan similarity score.
1:N Search adalah kemampuan identifikasi wajah FREMIS-N: diberikan satu foto query, sistem mencari seluruh database keyspace dan mengembalikan daftar kandidat yang paling cocok beserta similarity score-nya. Berbeda dari verifikasi, di sini identitas orang dalam foto belum diketahui — pertanyaannya adalah "Siapa orang ini?"
Apa itu 1:N Search
1:N Search (face identification) membandingkan satu foto query terhadap seluruh enrollment yang tersimpan di keyspace yang ditentukan. Sistem menghitung kemiripan embedding foto query dengan setiap identitas yang terdaftar, lalu mengurutkan hasilnya berdasarkan similarity score dari yang tertinggi ke terendah.
Output utama adalah daftar top-k kandidat — masing-masing berisi face_id, similarity score, dan variasi enrollment yang cocok.
Perbedaan dengan 1:1 Match
| Aspek | 1:N Search | 1:1 Match |
|---|---|---|
| Pertanyaan | "Siapa orang ini?" | "Apakah A dan B orang yang sama?" |
| Input | 1 foto query + keyspace | 2 foto (atau embedding / face_id) |
| Database diperlukan | Ya — enrollment harus ada | Tidak — perbandingan langsung |
| Output | Daftar top-k kandidat | 1 nilai similarity (+ flag match di v1) |
| Use case utama | Identifikasi identitas unknown | Verifikasi identitas yang sudah diketahui |
Untuk skenario verifikasi (misalnya foto selfie vs. foto KTP), gunakan 1:1 Match.
Pipeline 1:N Recognition
Setiap request ke /v1/face/recognition melewati satu jalur ekstraksi melalui antrian kerja internal, lalu satu pencarian similarity terhadap keyspace yang diminta. Untuk detail cara kerja antrian internal, lihat Internal Work Queue.
Total inferensi neural network per request: 2 (deteksi + ekstraksi) + 1 pencarian similarity. Di mode cluster, coordinator meneruskan pencarian ke semua worker node secara paralel, lalu menggabungkan dan mengurutkan ulang hasilnya. Bentuk response ke client tetap identik dengan mode standalone.
Indeks pencarian default melakukan pencarian eksak terhadap seluruh keyspace, sehingga akurasi dijaga tetapi waktu pencarian tumbuh dengan jumlah enrollment. Untuk keyspace yang sangat besar, gunakan --index-mode compressed untuk beralih ke pencarian compressed yang di-akselerasi GPU.
Bentuk Response
{
"result": {
"face_recognition": {
"candidates": [
{ "face_id": "emp_001", "similarity": 0.91, "variation": "1234567890123456789" },
{ "face_id": "emp_017", "similarity": 0.74, "variation": "1234567890123459111" }
]
},
"face_detected": [
{ "top": 0.18, "left": 0.22, "height": 0.42, "width": 0.40 }
]
}
}Catatan penting:
candidatesdiurutkan dari similarity tertinggi (best-first).variationadalah ID variasi enrollment yang cocok dengan query — bukanface_iditu sendiri. Setiapface_iddapat memiliki beberapa variasi; jika salah satu variasi cocok, kandidat tersebut dikembalikan.face_detectedhanya disertakan jika environment variableFREMISN_RETURN_FACE_DETECTIONdiaktifkan. Koordinat bersifat ternormalisasi dalam rentang[0, 1].- Array
candidateskosong berarti tidak ada enrollment di keyspace yang melewati threshold untuk query ini. Aplikasi memutuskan langkah selanjutnya — misalnya, memperlakukan sebagai identitas tidak dikenal atau meminta enrollment baru.
Konsep Top-k dan candidateCount
Saat melakukan 1:N search, FREMIS-N tidak harus mengembalikan satu kandidat saja. Anda dapat mengambil beberapa kandidat sekaligus melalui parameter candidateCount di dalam additional_params:
{
"image": "<base64>",
"keyspace": "watchlist",
"additional_params": {
"candidateCount": 5
}
}candidateCount (top-k) berguna ketika:
- Anda membangun antarmuka review manual di mana operator memilih dari beberapa kandidat
- Sistem downstream perlu mempertimbangkan beberapa kemungkinan sebelum membuat keputusan akhir
- Anda sedang melakukan investigasi atau audit dan ingin melihat alternatif selain kandidat teratas
Jika candidateCount tidak diisi, FREMIS-N mengembalikan 1 kandidat saja secara default.
Nilai candidateCount dibatasi (di-clip) di sisi coordinator oleh konfigurasi FREMISN_MAX_CANDIDATE_COUNT. Jika Anda meminta lebih banyak kandidat dari batas ini, jumlah kandidat yang dikembalikan akan dibatasi secara otomatis.
Threshold dan Similarity untuk Filter False Match
Setiap kandidat yang dikembalikan menyertakan similarity score antara 0.0 dan 1.0. Nilai ini menunjukkan seberapa mirip foto query dengan enrollment di database:
- Nilai mendekati
1.0— sangat mirip - Nilai mendekati
0.0— sangat berbeda
Threshold adalah batas minimum similarity yang Anda gunakan di sisi aplikasi untuk menyaring false match. FREMIS-N mengembalikan kandidat tanpa melakukan filtering berdasarkan threshold — keputusan apakah kandidat "cukup mirip" diserahkan ke aplikasi pemanggil.
Tidak ada nilai threshold universal. Lakukan evaluasi dengan data nyata dari lingkungan deployment Anda. Panduan awal: nilai 0.80–0.87 adalah titik tengah yang baik untuk sebagian besar deployment standar. Untuk panduan lebih lengkap, lihat Developer Guide.
Workflow: Enroll → Query → Ranking
1:N search memerlukan enrollment terlebih dahulu. Alurnya adalah:
- Buat keyspace — siapkan namespace untuk kelompok identitas (Keyspace)
- Enroll identitas — daftarkan foto wajah setiap identitas ke keyspace (Enrollment)
- Query foto — kirim foto yang ingin diidentifikasi ke endpoint recognition
- Terima ranking — FREMIS-N mengembalikan daftar top-k kandidat terurut dari similarity tertinggi
Enrollment dan recognition adalah dua alur yang sepenuhnya terpisah. Enrollment dilakukan satu kali (atau kapan pun ada identitas baru), sementara recognition dapat terjadi ribuan kali tanpa mengubah database.
Untuk panduan enrollment dan manajemen keyspace, lihat Enrollment dan Keyspace.
Recognition by Embedding: Extract Dulu, Query Nanti
Selain menerima gambar langsung, FREMIS-N mendukung alur dua langkah:
- Ekstrak embedding dari foto menggunakan
/v1/face/extract-embedding - Query embedding menggunakan
/v1/face/recognition-by-embedding
Kapan menggunakan alur ini:
- Batch processing — jika Anda perlu mengidentifikasi banyak foto sekaligus, ekstrak semua embedding terlebih dahulu (bisa diparalelkan), lalu query satu per satu atau dalam pipeline terpisah
- Hemat komputasi — jika foto yang sama perlu di-query ke beberapa keyspace berbeda, ekstrak embedding sekali dan gunakan berulang kali
- Persistensi embedding di sisi klien — simpan hasil embedding di sistem Anda untuk keperluan audit, deduplication, atau query ulang tanpa perlu menyimpan foto asli
Extract Embedding sebagai Utility
Endpoint /v1/face/extract-embedding dapat digunakan secara independen dari alur recognition. Respons menyertakan dua versi embedding:
embeddings— hasil kuantisasi, lebih kompak untuk penyimpananoriginal— presisi penuh (tersedia jika dikonfigurasi), untuk keperluan yang membutuhkan akurasi tinggi
Embedding yang diekstrak dapat disimpan di sistem klien dan digunakan untuk:
- Enrollment via
/v1/face/enrollment-by-embedding - Recognition via
/v1/face/recognition-by-embedding - Match via
/v2/face/match(input vektor)
Use Cases
- Pencarian DPO — identifikasi individu dalam daftar buronan dari foto CCTV atau foto yang dilaporkan
- Watchlist matching — deteksi real-time individu dalam daftar pengawasan keamanan
- Batch deduplication — temukan identitas duplikat dalam database enrollment yang besar
- Access control berbasis pengenalan — identifikasi karyawan atau tamu tanpa kartu fisik
- Event retrospektif — cari siapa saja yang hadir di suatu lokasi berdasarkan rekaman historis
Tips & Troubleshooting
Tiga gejala paling umum saat 1:N recognition tidak menghasilkan jawaban yang Anda harapkan, beserta langkah diagnosanya.
"No Match Found" Padahal Seharusnya Cocok
Sistem mengembalikan candidates kosong meskipun identitas target sudah di-enroll.
- Threshold di sisi aplikasi terlalu tinggi. Ingat, FREMIS-N tidak melakukan filtering — aplikasi Anda yang membandingkan
similaritydengan threshold. Coba turunkan sementara dari0.85ke0.75. Jika kandidat sekarang muncul, threshold perlu disesuaikan dengan data deployment. - Keyspace berbeda. Pastikan request enrollment dan request recognition menggunakan nilai
keyspaceyang sama persis. - Identitas belum di-enroll. Verifikasi via
GET /v1/face/keyspace/{keyspace}/enrollmentbahwaface_idbenar-benar terdaftar. - Query image kualitas rendah. Foto blur, sudut ekstrem, atau wajah terlalu kecil membuat embedding query menjauh dari embedding enrollment. Aktifkan IQA di sisi enrollment dan re-test dengan foto query yang lebih baik.
- Enrollment hanya satu variasi. Tambahkan 2–3 variasi per identitas dengan sudut dan pencahayaan berbeda — multi-variasi adalah cara paling efektif menutupi gap kondisi pengambilan foto query.
False Match — Cocok dengan Orang Lain
Sistem mengembalikan kandidat dengan similarity tinggi tetapi orangnya berbeda.
- Naikkan threshold. Coba
0.88dan monitor false positive rate. Untuk audit forensik, naikkan ke0.90+. - Audit data enrollment. Cari duplikat atau identitas yang salah label menggunakan
get-duplicate-variations. Hapus variasi berkualitas rendah, masker, kacamata gelap, atau crop wajah parsial. - Catat kasus untuk review. Simpan
face_idyang salah dikenali besertasimilarityyang dikembalikan — pola false match sering menunjukkan bahwa enrollment satu identitas perlu diperbaiki.
Similarity Score Selalu Rendah
Setiap recognition mengembalikan similarity konsisten rendah (< 0.60) bahkan untuk foto yang jelas cocok.
- Bandingkan dengan referensi terkontrol. Ambil dua foto frontal berkualitas baik dari orang yang sama, jalankan 1:1 match — similarity harus berada di range
0.80–0.95. Jika masih rendah, suspect model mismatch. - Cek versi FREMIS-N di seluruh node. Untuk cluster, semua worker dan coordinator harus menjalankan versi yang sama. Setelah upgrade major, sample re-enroll mungkin diperlukan agar embedding kompatibel.
- Verifikasi preprocessing klien. Jika klien Anda melakukan resize/crop/kompresi sebelum kirim, kirim foto raw langsung sebagai test untuk menyingkirkan preprocessing sebagai penyebab.
- Konsistensi flag sigmoid. Jika
FREMISN_SIGMOID_SIMILARITY_ENABLEdiubah, threshold lama tidak setara — lakukan tuning ulang.
Untuk diagnosa cluster (coordinator error, partial response, partition imbalance), lihat Cluster Sharding — Troubleshooting Cluster. Untuk masalah throughput dan latency, lihat Developer Guide — Performance Issues.