Nodeflux Central
License Plate Recognition (LPR)

License Plate Recognition (LPR)

Panduan operator untuk mendeteksi dan membaca plat nomor kendaraan secara real-time menggunakan Visionaire4 — mulai dari pemilihan varian, persyaratan kamera, konfigurasi area, hingga interpretasi output.

License Plate Recognition (LPR) adalah modul analitik Visionaire4 yang mendeteksi kendaraan dalam video stream, melakukan OCR pada plat nomor, dan mengirimkan event berisi nomor plat beserta metadata pendukung secara real-time. Tersedia dalam empat varian pipeline yang dapat disesuaikan dengan kebutuhan lokasi dan jenis kendaraan.

Pada akhir halaman ini Anda akan tahu apa yang dilakukan LPR, kapan menggunakannya, output yang dihasilkan, dan cara mengonfigurasinya. Untuk referensi endpoint API, lihat API Reference.


Apa yang Dilakukan

LPR memproses setiap frame dari video stream untuk mendeteksi kendaraan dan plat nomornya, lalu mengeluarkan event berisi hasil OCR ketika identifikasi dianggap cukup yakin.

Yang DILAKUKAN:

  • Mendeteksi kendaraan (mobil, motor, bus, truk) dalam video stream
  • Melakukan OCR pada plat nomor Indonesia — format sipil, militer, dan diplomatik (tergantung varian)
  • Menentukan arah kendaraan (masuk/keluar) berdasarkan garis virtual yang dikonfigurasi (LPR2 dan LPRS)
  • Membatasi duplikasi dengan cache berbasis waktu per plat
  • Menyediakan MJPEG stream dengan overlay visual bounding box dan hasil OCR untuk monitoring
  • Mengklasifikasikan tipe plat (sipil, pemerintah, militer, diplomatik) pada varian LPRS dan LPR3S

Yang TIDAK dilakukan:

  • Tidak melakukan verifikasi whitelist/blacklist — logika akses harus diimplementasikan di aplikasi
  • Tidak menyimpan riwayat event secara internal — gunakan Lenz atau webhook untuk penyimpanan
  • Tidak mendukung plat nomor luar negeri
  • Tidak memberikan kecepatan kendaraan
  • LPR3/LPR3S tidak memberikan informasi arah (direction selalu unknown)

Use Cases


Cara Kerja

LPR2 / LPRS LPR3 / LPR3S ≥ 0.95 0.85–0.95 Video Stream Frame Sampling 10 FPS Varian LPR? Deteksi GabunganKendaraan + Plat Asosiasi Plat–Kendaraan Kumpulkan Sampel Terbaik OCR pada Top Sampel Grouping & Konsensus Direction Inference Output Event Deteksi KendaraanStage 1 setiap frame Throttled Plate DetectionStage 2 — default 4 FPS OCR per Kendaraan Confidence? Langsung Output Buffer hingga keluar frame

LPR2 dan LPRS menggunakan arsitektur single-stage: satu inferensi mendeteksi kendaraan dan plat bersamaan. Hasil OCR dari beberapa frame dikumpulkan dan dikelompokkan berdasarkan kemiripan teks (Levenshtein distance), lalu konsensus dari mayoritas hasil dipilih sebagai output final. Metode ini toleran terhadap noise sesaat dan cocok untuk skenario yang membutuhkan akurasi konsisten.

LPR3 dan LPR3S menggunakan arsitektur two-stage: deteksi kendaraan dijalankan setiap frame, sedangkan plate detection dan OCR di-throttle ke FPS yang lebih rendah (default 4 FPS). Setiap kendaraan ditrack secara individual, dan hasil OCR langsung di-output begitu confidence score cukup tinggi. Pendekatan ini lebih efisien untuk skenario high-throughput dengan volume kendaraan tinggi.


Persyaratan

Kamera

RequirementMinimumRekomendasi
Resolusi stream1080p (1920×1080)1440p atau lebih
Frame rate10 FPS15–30 FPS
CodecH.264H.264 / H.265
Ukuran plat dalam frame80×30 pixel120×50 pixel

Resolusi minimal 1080p sangat wajib untuk hasil OCR yang akurat. Resolusi lebih rendah menghasilkan ukuran plat yang terlalu kecil dalam frame sehingga karakter tidak terbaca dengan benar.

Pemasangan dan Lingkungan

AspekRekomendasiCatatan
Sudut vertikal15–30 derajat dari horizontalTerlalu curam mendistorsi perspektif plat
Jarak ke plat3–8 meterSesuaikan dengan focal length lensa
Tinggi pemasangan1–1,5 meter dari permukaan jalanPosisi optimal untuk membaca plat
PencahayaanMinimal 300 lux di area platTambahkan IR illuminator untuk operasi 24/7
HindariKamera menghadap langsung ke matahariBacklight menyebabkan plat tampak gelap

Dependensi

  • Visionaire4 terinstal dan berjalan di node target
  • GPU dengan VRAM minimal 800 MB (LPR2/LPRS) atau 1 GB (LPR3/LPR3S)
  • RAM minimal 2 GB per pipeline
  • CPU minimal 3 core per pipeline
  • Stream video aktif dapat diakses oleh node Visionaire

Setting Up

Tentukan Varian Pipeline

Pilih varian berdasarkan kebutuhan lokasi:

KebutuhanPilihan
Plat sipil standar, butuh arah masuk/keluarNFV4-LPR2
Campuran sipil + militer/diplomatik, butuh klasifikasiNFV4-LPRS
Volume tinggi, latensi rendah, tanpa arahNFV4-LPR3
Volume tinggi + klasifikasi multi-classNFV4-LPR3S

Pasang Kamera dan Verifikasi Feed

Pastikan kamera terpasang pada sudut dan jarak yang tepat (lihat bagian Persyaratan). Verifikasi feed video aktif dan dapat diakses oleh Visionaire4 melalui URL RTSP atau sumber stream yang dikonfigurasi.

Tentukan Area dan Garis Deteksi

Gambar polygon ROI (Region of Interest) yang mencakup area tempat plat paling jelas terbaca. Untuk LPR2 dan LPRS, tambahkan garis virtual untuk menentukan arah masuk/keluar. Semua koordinat menggunakan sistem yang dinormalisasi [0,1] relatif terhadap dimensi frame.

Spawn Pipeline via API

Kirim POST /pipeline/{node_num}/{stream_id}/{analytic_id} dengan konfigurasi area dan threshold yang sesuai. Lihat API Reference untuk detail parameter dan contoh request body.

Verifikasi dengan Snapshot atau MJPEG

Gunakan endpoint /snapshot untuk mengambil satu frame dan memverifikasi bahwa overlay bounding box dan ROI sudah benar. Atau buka /mjpeg untuk melihat stream real-time dengan overlay.

Konfigurasi Penerima Event

Pastikan sistem Anda (Lenz, webhook, atau aplikasi langsung) terhubung untuk menerima event payload LPR. Event dikirim setiap kali kendaraan dengan plat berhasil diidentifikasi.


Konfigurasi

Parameter API

Parameter ini dikirim dalam request body saat spawn pipeline atau diperbarui via endpoint config.

SettingApa yang dilakukanDefaultKapan disesuaikan
plate_confidence_thresholdMinimum confidence score untuk plat diterima0.6Turunkan ke 0.4–0.5 untuk kondisi cahaya rendah; naikkan ke 0.7–0.8 untuk area keamanan tinggi
vehicle_confidence_thresholdMinimum confidence score untuk kendaraan diterima0.6Turunkan bersamaan dengan plate threshold untuk kondisi sulit
similarity_score_thresholdToleransi perbedaan karakter antar sampel OCR (LPR2/LPRS)0.7Naikkan ke 0.8 untuk hasil lebih konsisten; turunkan ke 0.6 untuk toleransi typo
min_group_memberMinimum sampel per grup sebelum output (LPR2/LPRS)2Naikkan ke 3–5 untuk keamanan tinggi; turunkan ke 1 untuk throughput maksimal
max_group_memberBatas maksimum sampel per grup (LPR2/LPRS)30Kurangi ke 15–20 untuk hemat memori
no_input_period_thresholdFrame tanpa input sebelum grup timeout (LPR2/LPRS)2Naikkan untuk kendaraan yang berhenti lama di area
plate_cache_lifetimeDurasi cache plat dalam detik — mencegah duplikasi5Naikkan ke 10–15 untuk parking; turunkan ke 2–3 untuk toll dengan volume tinggi
plate_recognition_fpsFPS plate detection (LPR3/LPR3S throttling)4Naikkan ke 6–8 untuk kendaraan cepat (toll/highway); turunkan ke 2–3 untuk parking
bbox_offsetToleransi offset asosiasi plat–kendaraan (0–max_bbox_offset)0.1Jarang perlu diubah; clamp otomatis di [0, max_bbox_offset]
enable_dump_non_plateOutput event untuk kendaraan tanpa plat terdeteksifalseAktifkan untuk monitoring seluruh kendaraan tanpa terkecuali
vehicle_score_thresholdConfidence minimum kendaraan saat dump non-plate aktif0.51Naikkan untuk mengurangi false positive non-plate vehicle event

Tipe area (whitelist atau blacklist) ditentukan per-ROI lewat field roi_type di dalam definisi area, bukan parameter top-level. Untuk LPR2/LPRS, jika tidak ada area whitelist yang dikonfigurasi atau semua area bertipe blacklist, sistem otomatis membuat subset default yang memproses seluruh frame di luar zona blacklist.

Variabel Lingkungan

Variabel ini dikonfigurasi di level sistem Visionaire4, bukan per pipeline.

SettingApa yang dilakukanDefaultKapan disesuaikan
VISIONAIRE_API_URLBase URL Visionaire4 APIhttp://localhost:4004Sesuaikan dengan alamat dan port deployment Anda
VISIONAIRE_NODE_NUMNomor node untuk identifikasi pipeline0Sesuaikan untuk deployment multi-node

Output yang Dihasilkan

LPR mengirimkan event payload setiap kali kendaraan dengan plat nomor berhasil diidentifikasi. Event dikirimkan sekali per kendaraan per periode cache (dikontrol oleh plate_cache_lifetime).

Field Utama

FieldTipeDeskripsiTersedia di
analytic_idstringVarian pipeline yang menghasilkan eventSemua
stream_idstringID stream sumberSemua
timestampstring (ISO 8601)Waktu event dalam UTCSemua
detections[].plate_numberstringHasil OCR nomor platSemua
detections[].plate_typestringTipe plat (lihat tabel di bawah)Semua
detections[].confidencefloatConfidence OCR (0–1)Semua
detections[].labelstringJenis kendaraan (car, motorcycle, dll.)Semua
detections[].area_namestringNama ROI area tempat terdeteksiSemua
detections[].directionstringin, out, atau unknownLPR2, LPRS (LPR3 selalu unknown)
detections[].bounding_boxobjectPosisi kendaraan dalam koordinat [0,1]Semua
detections[].attributesobjectConfidence detail per komponenSemua

Tipe Plat

NilaiDeskripsiTersedia di
platePlat kendaraan sipil standarLPR2, LPR3
privateKendaraan pribadiLPRS, LPR3S
publicKendaraan umumLPRS, LPR3S
governmentKendaraan pemerintahLPRS, LPR3S
embassyKendaraan diplomatikLPRS, LPR3S
new_vehicleKendaraan baru (plat merah sementara)LPRS, LPR3S
policeKepolisianLPRS, LPR3S
tni_1-AUTNI Angkatan UdaraLPRS, LPR3S
tni_2-ADTNI Angkatan DaratLPRS, LPR3S
tni_3-ALTNI Angkatan LautLPRS, LPR3S
kemenhanKementerian PertahananLPRS, LPR3S
mabes_tniMarkas Besar TNILPRS, LPR3S

Contoh Payload

{
  "analytic_id": "NFV4-LPR2",
  "stream_id": "gate_entry_001",
  "timestamp": "2024-01-15T10:30:00Z",
  "detections": [
    {
      "confidence": 0.95,
      "label": "car",
      "area_name": "Gate A",
      "plate_number": "B1234ABC",
      "plate_type": "plate",
      "direction": "in",
      "bounding_box": {
        "left": 0.2,
        "top": 0.3,
        "width": 0.3,
        "height": 0.4
      },
      "attributes": {
        "vehicle": { "label": "car", "confidence": 0.92 },
        "plate": { "label": "plate", "confidence": 0.88 },
        "character": { "label": "B1234ABC", "confidence": 0.95 }
      }
    }
  ]
}

Best Practices

Penempatan Kamera

  • Posisikan kamera pada sudut 15–30 derajat dari horizontal agar plat nomor tidak terdistorsi perspektif
  • Jarak optimal ke titik baca plat adalah 3–8 meter — terlalu dekat mempersingkat waktu deteksi, terlalu jauh mengurangi resolusi plat
  • Tinggi pemasangan 1–1,5 meter dari permukaan jalan memberikan sudut pandang terbaik untuk plat kendaraan roda empat
  • Hindari menempatkan kamera yang langsung menghadap matahari — gunakan sunshield atau pilih posisi berlawanan dengan arah matahari utama

Pencahayaan

  • Pastikan minimal 300 lux di area tempat plat terbaca
  • Pasang IR illuminator untuk operasi malam hari atau area dengan pencahayaan tidak merata
  • Pertimbangkan polarizing filter untuk mengurangi glare dari permukaan plat metalik
  • Hindari sumber cahaya langsung yang mengarah ke lensa kamera

Tuning Area ROI

  • Letakkan polygon ROI di area di mana plat paling jelas terbaca, bukan di seluruh jalur kendaraan
  • Untuk direction inference (LPR2/LPRS), posisikan garis virtual di titik di mana kendaraan bergerak tegak lurus — biasanya tengah jalur
  • Gunakan endpoint /snapshot untuk memverifikasi posisi ROI sebelum deployment
  • Jangan buat area yang terlalu lebar — memperbesar kemungkinan false positive dari kendaraan di lane berbeda

Threshold Tuning

  • Mulai dengan nilai default, kemudian sesuaikan berdasarkan hasil observasi
  • Untuk high-security (parkir apartemen, checkpoint): naikkan threshold dan min_group_member, terima miss rate lebih tinggi
  • Untuk high-throughput (toll, highway): turunkan threshold sedikit, tangani duplikasi dan false positive di level aplikasi
  • Monitor rasio false positive vs false negative secara berkala dan sesuaikan threshold

Limitations

  • Motion blur dari kendaraan berkecepatan tinggi dapat menyebabkan karakter plat tidak terbaca — atasi dengan shutter speed kamera yang lebih tinggi (>1/500s) atau tambahkan pencahayaan
  • Glare dan refleksi pada permukaan plat metalik dapat mengaburkan karakter — gunakan polarizing filter atau sesuaikan sudut kamera
  • Plat kotor atau rusak mengurangi akurasi OCR secara signifikan dan tidak dapat diatasi dari sisi konfigurasi
  • Plat non-Indonesia (luar negeri) tidak didukung oleh model saat ini
  • LPR3/LPR3S tidak memberikan direction inference — implementasikan logika arah di level aplikasi jika dibutuhkan
  • Resolusi di bawah 1080p akan menghasilkan banyak kesalahan OCR karena ukuran plat terlalu kecil dalam frame
  • Plat dengan karakter tidak standar (modifikasi, stiker, font custom) dapat menyebabkan OCR menghasilkan karakter yang salah
  • Setiap pipeline membutuhkan resource GPU dan CPU yang terpisah — pertimbangkan kapasitas hardware sebelum menambah banyak pipeline di satu node

Modul Terkait

On this page