PPE Analytics
Analitik real-time untuk monitoring kepatuhan Personal Protective Equipment (PPE) — helmet, vest, gloves, masker, dan atribut keselamatan kerja lainnya.
PPE Analytics
PPE Analytics (NFV4-PPE) adalah modul analitik video real-time untuk memantau kepatuhan penggunaan Personal Protective Equipment (PPE) di area industri, konstruksi, manufaktur, dan lingkungan kerja berisiko. Sistem mendeteksi setiap orang dalam frame, lalu mengklasifikasikan atribut PPE yang dikenakan (head protection, gloves, safety harness, face mask, protective clothing, dan lain-lain) beserta confidence-nya. Hasilnya dikirim sebagai event sehingga sistem downstream dapat menentukan compliance dan men-trigger alert non-compliance.
Pada akhir halaman ini Anda akan memahami kemampuan PPE Analytics, atribut PPE yang dideteksi, sub-analytics yang tersedia (counting, ROI counting, dwelling, density), serta persyaratan kamera dan konfigurasi yang diperlukan.
Apa yang Dilakukan
Kemampuan
PPE Analytics menggabungkan deteksi orang dengan attribute classification khusus PPE. Atribut berikut diklasifikasikan untuk setiap orang yang terdeteksi:
| Atribut | Deskripsi |
|---|---|
| head_protection | Penggunaan pelindung kepala (helmet) |
| helmet_color | Warna helmet yang dikenakan |
| safety_glasses | Penggunaan safety glasses / kacamata pengaman |
| face_shield | Penggunaan face shield |
| face_mask | Penggunaan masker |
| gloves | Penggunaan sarung tangan |
| protective_clothing | Penggunaan pakaian pelindung (vest, coverall, dsb.) |
| protective_clothing_color | Warna protective clothing |
| safety_harness | Penggunaan safety harness (untuk pekerjaan ketinggian) |
| footwear_type | Jenis alas kaki (mis. safety boots) |
| work_context | Konteks lingkungan kerja yang terdeteksi |
Bila confidence atribut di bawah threshold yang dikonfigurasi, label otomatis berubah menjadi Unknown. Aturan compliance (misalnya "non-compliant jika head_protection.label != "Helmet"") dilakukan oleh sistem downstream berdasarkan payload event.
PPE Analytics juga mewarisi seluruh sub-analytics dari multi-logics framework:
| Sub-Analytic | Deskripsi | Contoh Penggunaan |
|---|---|---|
| Counting | Hitung orang yang melewati garis virtual beserta atribut PPE | Hitung pekerja masuk area kerja dan PPE yang dikenakan |
| ROI Counting | Hitung orang yang masuk/keluar polygon | Audit compliance per zona kerja |
| Dwelling | Deteksi orang berdiam di area | Audit compliance pekerja di stasiun kerja statis |
| Density | Estimasi periodik jumlah orang dalam ROI | Snapshot compliance occupancy area kerja |
Yang TIDAK Dilakukan
- Identifikasi atau pengenalan wajah pekerja — gunakan Face Recognition untuk itu
- Penegakan rule compliance secara langsung — modul ini menghasilkan klasifikasi atribut, bukan keputusan compliance/non-compliance
- Deteksi kecelakaan kerja, kejatuhan, atau perilaku tidak aman (slip, trip, fall)
- Pelacakan orang lintas kamera (cross-camera tracking)
- Pengenalan plat kendaraan — gunakan License Plate Recognition
Use Cases
Konstruksi — Helmet & Vest Compliance
Pastikan setiap pekerja di area konstruksi memakai head protection dan protective clothing. Generate event setiap pekerja melewati gate masuk area kerja.
Pabrik — Masker & Sarung Tangan
Monitor compliance face mask dan gloves di production line, area food processing, atau lingkungan kerja yang membutuhkan kebersihan tinggi.
Tambang & Migas — Compliance 24/7
Pantau penggunaan helmet, protective clothing, dan safety harness di area operasi tambang atau site migas berisiko tinggi.
Pekerjaan Ketinggian
Verifikasi penggunaan safety harness untuk pekerja yang beraktivitas di area ketinggian seperti scaffolding atau rooftop maintenance.
Gudang & Logistik
Pastikan visibility vest digunakan di area lalu-lintas forklift dan loading dock untuk mencegah insiden.
Lab & Fasilitas Medis
Audit penggunaan face mask, gloves, dan protective clothing untuk staff lab atau area klinis.
Cara Kerja
Setiap frame video didekode dan dilewatkan ke person detector. Tracker melacak identitas setiap individu lintas frame menggunakan bounding box dan confidence score. Untuk setiap orang yang terdeteksi, attribute classifier menghasilkan nilai untuk seluruh atribut PPE beserta confidence masing-masing.
Hasil tracking dan atribut diproses oleh sub-analytics yang aktif (counting, ROI counting, dwelling, density). Setiap event yang dihasilkan berisi atribut PPE per orang sehingga sistem downstream dapat menentukan compliance, mengirim alert, atau menyimpan untuk audit.
Persyaratan
Kamera
| Requirement | Minimum | Rekomendasi |
|---|---|---|
| Resolusi | 480 × 360 px | 720p atau lebih |
| Frame Rate | 7 fps | 15–30 fps |
| Codec | H.264 | H.264 / H.265 |
Pemasangan kamera (panduan operasional umum):
- Sudut 30–45 derajat dari horizontal — top-down penuh menyulitkan klasifikasi atribut tubuh bagian atas
- Tinggi 2,5–4 meter, sesuaikan dengan area cakupan
- Pastikan keseluruhan tubuh pekerja terlihat jika atribut seperti
protective_clothingataufootwear_typeperlu dievaluasi - Hindari backlight kuat dan posisi melawan matahari langsung
Lingkungan
- GPU NVIDIA (TensorRT) atau Intel (OpenVINO) untuk akselerasi inferensi
- RAM minimal 2 GB per pipeline
- CPU minimal 3 core per pipeline
- Pencahayaan area minimal cukup untuk deteksi warna (panduan operasional umum: ≥150 lux)
Dependencies
- Visionaire API berjalan di port default
4004 - Stream video sudah terdaftar dan dapat diakses oleh Visionaire
- Model PPE attribute classification (
ppe_attribute) ter-deploy di node yang menjalankan pipeline
Setting Up
Siapkan Stream Video
Pastikan stream video sudah terdaftar di Visionaire dan dapat diakses. Catat stream_id yang akan digunakan.
Tentukan Sub-Analytics yang Dibutuhkan
Pilih sub-analytics yang relevan dengan use case Anda:
- Counting — untuk gate masuk/keluar area kerja
- ROI Counting — untuk audit per zona kerja yang berbentuk polygon
- Dwelling — untuk stasiun kerja statis di mana pekerja diam dalam waktu lama
- Density — untuk snapshot periodik compliance pada area tertentu
Nonaktifkan sub-analytic yang tidak digunakan dengan "is_active": false untuk menghemat resource.
Tentukan Atribut PPE yang Relevan
Tidak semua atribut perlu dievaluasi pada tiap use case. Misalnya:
- Konstruksi: fokus pada
head_protection,protective_clothing,footwear_type - Lab/medis: fokus pada
face_mask,gloves,protective_clothing - Pekerjaan ketinggian: tambahkan
safety_harness
Atribut yang tidak perlu dapat di-filter di sisi sistem downstream berdasarkan field yang dihasilkan.
Buat Pipeline via API
Kirim request POST /pipeline/{node_num}/{stream_id}/NFV4-PPE dengan konfigurasi sub-analytics dan threshold atribut yang dirancang.
Verifikasi dengan MJPEG Stream
Akses endpoint /pipeline/{node_num}/{stream_id}/NFV4-PPE/mjpeg di browser untuk memverifikasi pipeline berjalan dan overlay deteksi sudah benar.
Konfigurasi
Parameter API
Global
| Setting | Apa yang Dilakukan | Default | Kapan Disesuaikan |
|---|---|---|---|
object_confidence_threshold | Confidence minimum untuk deteksi orang | 0.53 | Turunkan ke 0.4 jika banyak miss detection; naikkan ke 0.7 untuk mengurangi false positive |
colordet_crop_w | Rasio lebar crop untuk klasifikasi atribut warna | 0.4 | Jarang perlu diubah |
colordet_crop_h | Rasio tinggi crop untuk klasifikasi atribut warna | 0.4 | Jarang perlu diubah |
Counting Logic
| Setting | Apa yang Dilakukan | Default | Kapan Disesuaikan |
|---|---|---|---|
dumping_sampling_time | Interval agregasi event saat orang melewati garis (ms) | 500 | Naikkan ke 1000ms untuk traffic lambat; turunkan untuk respon lebih cepat |
dump_ignore_iou_threshold | Threshold IoU untuk deduplication crossing | 0.8 | Naikkan ke 0.9 jika terjadi double count |
enable_group_tracking | Aktifkan group/crowd tracking | false | Aktifkan untuk area padat |
minimum_tracking_height | Tinggi minimum bbox (rasio terhadap frame) | 0.05 | Turunkan jika orang terlihat kecil di frame |
maximum_tracking_objects | Jumlah maksimum objek yang di-track | 30 | Naikkan ke 50–100 untuk area ramai |
enable_visual_label | Tampilkan label pada visualisasi | false | Aktifkan untuk debugging |
Dwelling Logic
| Setting | Apa yang Dilakukan | Default | Kapan Disesuaikan |
|---|---|---|---|
dwelling_treshold_alert_sec | Durasi (detik) sebelum alert dikirim (0 = nonaktif) | 0 | Set sesuai kebutuhan loitering / static-station audit |
minimum_dwelling_sec | Durasi minimum dwelling untuk generate event | 2 | Naikkan untuk filter gerakan singkat |
idle_time_sec | Grace period setelah keluar ROI sebelum timer direset | 1 | Naikkan ke 3–5 untuk toleransi gerakan kecil |
object_intersect_threshold | Threshold interseksi orang dengan ROI | 0.85 | Turunkan ke 0.7 jika orang di tepi ROI tidak terdeteksi |
minimum_object_area_size | Area minimum bbox dalam piksel² | 2000 | Turunkan jika orang jauh dari kamera |
sharpness_filter_threshold | Threshold sharpness untuk dump dwelling | 0 | Naikkan jika banyak frame blur ter-dump |
only_dump_exit | Hanya dump saat orang keluar ROI | false | Aktifkan jika butuh laporan akhir saja |
Penulisan dwelling_treshold_alert_sec mengikuti kunci konfigurasi yang diterima oleh source code (typo treshold adalah disengaja sesuai source).
Density Logic
| Setting | Apa yang Dilakukan | Default | Kapan Disesuaikan |
|---|---|---|---|
interval | Interval pelaporan kepadatan (detik) | 5 | Naikkan ke 60 untuk audit periodik; turunkan untuk respon cepat |
inside | Hitung orang di dalam ROI (true) atau di luar (false) | true | Ubah ke false untuk menghitung orang di luar zona tertentu |
dump_attributes | Sertakan atribut PPE per orang dalam event density | true | Nonaktifkan untuk hemat bandwidth |
PPE Attribute Thresholds
Setiap atribut PPE memiliki threshold confidence-nya sendiri. Bila confidence di bawah threshold, label atribut tersebut diset menjadi Unknown.
| Setting | Apa yang Dilakukan | Default |
|---|---|---|
head_protection_confidence_threshold | Threshold deteksi pelindung kepala | 0.5 |
helmet_color_confidence_threshold | Threshold deteksi warna helmet | 0.5 |
safety_glasses_confidence_threshold | Threshold deteksi safety glasses | 0.5 |
face_shield_confidence_threshold | Threshold deteksi face shield | 0.5 |
face_mask_confidence_threshold | Threshold deteksi face mask | 0.5 |
gloves_confidence_threshold | Threshold deteksi gloves | 0.5 |
safety_harness_confidence_threshold | Threshold deteksi safety harness | 0.5 |
protective_clothing_confidence_threshold | Threshold deteksi protective clothing | 0.5 |
protective_clothing_color_confidence_threshold | Threshold warna protective clothing | 0.5 |
footwear_type_confidence_threshold | Threshold jenis alas kaki | 0.5 |
work_context_confidence_threshold | Threshold konteks lingkungan kerja | 0.5 |
Naikkan threshold ke 0.7–0.8 untuk atribut yang menjadi dasar penilaian compliance ketat (mis. head_protection_confidence_threshold di area konstruksi) untuk mengurangi false positive.
Output yang Dihasilkan
Setiap event memiliki struktur top-level berikut, dengan detail spesifik logic berada di field pipeline_data:
| Field Top-Level | Tipe | Deskripsi |
|---|---|---|
analytic_id | string | Selalu NFV4-PPE |
stream_id | string | ID stream yang diproses |
stream_name | string | Nama stream |
node_num | integer | Nomor node yang memproses |
timestamp | integer (ms) | Unix timestamp event (millisecond) |
primary_text | string | Teks utama event (mis. label objek atau nama area) |
secondary_text | string | Teks pelengkap (mis. arah atau jumlah) |
image_jpeg | string (base64) | Cuplikan frame saat event terjadi |
pipeline_data | object | Payload utama hasil sub-analytic (lihat di bawah) |
Field pipeline_data
| Field | Tipe | Tersedia Pada |
|---|---|---|
logic | string | semua (counting, roi_counting, dwelling, density) |
label | string | counting, roi_counting, dwelling (selalu "person") |
confidence | float | counting, roi_counting, dwelling |
tracker_id | integer | counting, roi_counting, dwelling |
group_id | integer | counting, roi_counting, dwelling (jika enable_group_tracking: true) |
area_name | string | counting, roi_counting, dwelling |
direction | string | counting, roi_counting ("in" / "out") |
time_in / time_out / time_alert | integer (ms) | dwelling |
duration | float (detik) | dwelling |
attributes | object | counting, roi_counting, dwelling — berisi atribut PPE per orang |
area | string | density (nama ROI) |
estimation | integer | density (jumlah orang dalam ROI) |
interval | integer (detik) | density |
detected | array | density (rincian per orang dengan tracker_id, bbox, label, confidence, dan attributes saat dump_attributes: true) |
event_id | string | semua (hash unik per event) |
Field attributes berisi map atribut PPE yang aktif. Setiap atribut adalah objek { "label": "...", "confidence": 0.0–1.0 }. Atribut dengan confidence di bawah threshold akan memiliki label: "Unknown".
Contoh Event
{
"analytic_id": "NFV4-PPE",
"stream_id": "stream_001",
"timestamp": 1705314600000,
"primary_text": "person",
"secondary_text": "in",
"pipeline_data": {
"logic": "counting",
"label": "person",
"confidence": 0.86,
"tracker_id": 5,
"group_id": 0,
"area_name": "Site Entrance",
"direction": "in",
"attributes": {
"head_protection": { "label": "Helmet", "confidence": 0.91 },
"helmet_color": { "label": "Yellow", "confidence": 0.83 },
"safety_glasses": { "label": "Unknown", "confidence": 0.42 },
"face_shield": { "label": "No Face Shield", "confidence": 0.88 },
"face_mask": { "label": "No Face Mask", "confidence": 0.81 },
"gloves": { "label": "Gloves", "confidence": 0.74 },
"safety_harness": { "label": "No Safety Harness", "confidence": 0.79 },
"protective_clothing": { "label": "Vest", "confidence": 0.87 },
"protective_clothing_color": { "label": "Orange", "confidence": 0.84 },
"footwear_type": { "label": "Safety Boots", "confidence": 0.71 },
"work_context": { "label": "Construction", "confidence": 0.66 }
},
"event_id": "1705314600000-3a1f9d4c"
}
}{
"analytic_id": "NFV4-PPE",
"stream_id": "stream_001",
"timestamp": 1705314600000,
"primary_text": "person",
"secondary_text": "in",
"pipeline_data": {
"logic": "roi_counting",
"label": "person",
"confidence": 0.82,
"tracker_id": 9,
"area_name": "Welding Bay",
"direction": "in",
"attributes": {
"head_protection": { "label": "Helmet", "confidence": 0.93 },
"face_shield": { "label": "Face Shield", "confidence": 0.89 },
"gloves": { "label": "Gloves", "confidence": 0.81 },
"protective_clothing": { "label": "Coverall", "confidence": 0.84 }
}
}
}{
"analytic_id": "NFV4-PPE",
"stream_id": "stream_001",
"timestamp": 1705314600000,
"primary_text": "Restricted Area",
"secondary_text": "120.000 s",
"pipeline_data": {
"logic": "dwelling",
"label": "person",
"confidence": 0.78,
"tracker_id": 12,
"area_name": "Restricted Area",
"time_in": 1705314480000,
"time_out": null,
"time_alert": 1705314600000,
"duration": 120.0,
"attributes": {
"head_protection": { "label": "Unknown", "confidence": 0.34 },
"protective_clothing": { "label": "Vest", "confidence": 0.82 }
}
}
}{
"analytic_id": "NFV4-PPE",
"stream_id": "stream_001",
"timestamp": 1705314600000,
"primary_text": "Loading Dock",
"secondary_text": "8",
"pipeline_data": {
"logic": "density",
"interval": 5,
"area": "Loading Dock",
"estimation": 8,
"detected": [
{
"tracker_id": 7,
"label": "person",
"confidence": 0.84,
"bbox": { "top": 150, "left": 100, "width": 80, "height": 220 },
"attributes": {
"head_protection": { "label": "Helmet", "confidence": 0.9 },
"protective_clothing": { "label": "Vest", "confidence": 0.86 }
}
}
]
}
}Best Practices
Penempatan Kamera
- Sudut 30–45 derajat dari horizontal — top-down penuh menyulitkan klasifikasi atribut tubuh bagian atas (helmet, vest)
- Pastikan keseluruhan tubuh pekerja terlihat jika atribut
footwear_typeperlu dievaluasi - Ukuran orang minimal 50×100 piksel di frame agar attribute classification berjalan andal
- Hindari backlight kuat dan posisi melawan matahari langsung
Definisi Compliance Rule di Sisi Downstream
- PPE Analytics tidak menentukan compliance/non-compliance — sistem downstream harus mendefinisikan rule berdasarkan field
attributes - Contoh rule sederhana: non-compliant jika
attributes.head_protection.label != "Helmet"ATAUattributes.protective_clothing.label == "Unknown" - Pertimbangkan threshold confidence per atribut sebelum mem-flag non-compliance untuk mengurangi false alert
Threshold Tuning
- Naikkan threshold (mis.
0.7) untuk atribut critical (head_protection, safety_harness) agarUnknownlebih konservatif daripada salah klasifikasi - Atribut sekunder (helmet_color, work_context) dapat dibiarkan di default
0.5
Konfigurasi Sub-Analytics
- Gunakan Counting di gate masuk area kerja untuk audit compliance setiap shift change
- Gunakan ROI Counting untuk audit per zona kerja (welding bay, area ketinggian, dsb.) dengan threshold PPE berbeda per zona di sisi downstream
- Gunakan Dwelling untuk stasiun kerja statis dengan
dwelling_treshold_alert_secagar dapat alert pekerja yang lama tidak compliant - Gunakan Density dengan
dump_attributes: trueuntuk snapshot compliance occupancy periodik
Limitations
- Atribut ≠ keputusan compliance: Modul ini menghasilkan klasifikasi atribut PPE; logika "compliant vs non-compliant" harus diimplementasikan di sistem downstream
- Occlusion parah: Jika lebih dari 50% tubuh tertutup, akurasi atribut PPE menurun signifikan
- Atribut warna pada motif/pattern: Warna helmet/vest bermotif akan dideteksi sebagai warna dominan yang mungkin tidak akurat
- Top-down penuh (bird's eye view): Sudut ini menyulitkan klasifikasi atribut karena bagian tubuh tertentu (vest depan, face mask, gloves) tidak terlihat jelas
- Pencahayaan rendah: Akurasi attribute classification turun drastis di kondisi gelap; pastikan area kerja cukup terang
- Footwear_type: Atribut ini hanya andal jika seluruh tubuh termasuk kaki terlihat di frame
- Tidak ada cross-camera tracking: Setiap kamera berjalan independen; identifikasi pekerja yang sama di beberapa kamera bukan kapabilitas modul ini