7.13. Non-max suppression¶
Jaringan deteksi biasanya menghasilkan beberapa kotak kandidat yang saling tumpang tindih di sekitar objek dunia nyata yang sama: setiap jangkar di dekat objek tersebut aktif dengan skor yang serupa, dan post-processor melihat semuanya. Non-max suppression (NMS) adalah langkah yang mengubah kluster tersebut menjadi satu kotak.
Algoritmanya singkat: urutkan kotak kandidat berdasarkan skor, ambil yang skornya tertinggi, tekan setiap kotak lain yang tumpang tindih dengannya melewati ambang batas yang dipilih, lalu ambil yang berikutnya tertinggi dari yang tersisa, dan ulangi. Metrik tumpang tindih adalah intersection-over-union (IoU) -- area bersama dua kotak dibagi dengan area gabungannya, nilai antara 0 (tidak ada tumpang tindih) dan 1 (kotak identik). Argumen konstruktor nms_threshold pada setiap post-processor yang tersedia adalah batas di mana kotak dianggap sebagai duplikat dari kotak yang sudah disimpan.
NMS menciutkan kluster deteksi yang saling tumpang tindih menjadi yang skornya tertinggi.¶
7.13.1. Soft-NMS¶
Kelas ml.utils.NMS yang tersedia mengimplementasikan Soft-NMS, sebuah penyempurnaan yang meluruhkan skor kotak yang tumpang tindih berdasarkan seberapa besar tumpang tindihnya, daripada langsung membuang kotak tersebut. Jika skor yang diturunkan jatuh di bawah ambang batas, kotak dibuang; jika tidak, kotak tersebut bertahan dengan skor yang dikurangi dan bersaing di putaran berikutnya.
Parameter nms_sigma mengontrol seberapa agresif peluruhan tersebut. Dengan nms_sigma yang kecil (default yang tersedia adalah 0.1), peluruhan sangat tajam: kotak yang sangat tumpang tindih mendapatkan skornya yang hampir nol dan Soft-NMS menyerupai NMS klasik. Dengan nms_sigma yang lebih besar, peluruhan lebih lembut dan kotak yang tumpang tindih dari objek berbeda lebih sering bertahan, yang penting ketika objek dunia nyata dari kelas yang sama benar-benar tumpang tindih (kerumunan wajah, kluster telapak tangan).
Mengatur nms_sigma ke <= 0 menonaktifkan peluruhan sepenuhnya: kotak yang tumpang tindih melewati dengan skor aslinya, dan hanya ambang batas skor yang menyaringnya.
7.13.2. Membangun langsung¶
Setiap post-processor yang tersedia membangun NMS baru per inferensi, menambahkan setiap kandidat ke dalamnya, dan memanggil get_bounding_boxes() di akhir. Post-processor kustom mengikuti pola yang sama:
from ml.utils import NMS
iw = model.input_shape[0][2]
ih = model.input_shape[0][1]
nms = NMS(iw, ih, inputs[0].roi)
for box, score, class_idx in candidates:
nms.add_bounding_box(box.xmin, box.ymin,
box.xmax, box.ymax,
score, class_idx)
result = nms.get_bounding_boxes(threshold=nms_threshold,
sigma=nms_sigma)
Konstruktor mengambil lebar dan tinggi input jaringan dalam piksel dan ROI dari citra asli yang dijalankan model; add_bounding_box() mengambil koordinat kotak dalam ruang piksel input jaringan tersebut, dan get_bounding_boxes() memetakan ulang para penyintas kembali ke koordinat citra menggunakan ROI. Pemetaan ulang memperhitungkan peregangan Normalisasi secara otomatis -- ROI yang sama yang dilihat prediktor digunakan untuk memproyeksikan kotak kembali -- sehingga kotak yang dikembalikan siap digambar pada bingkai yang ditangkap.
Bentuk kembalian adalah daftar daftar per-kelas, diindeks oleh label_index yang diteruskan ke add_bounding_box. Daftar kelas yang kosong dipertahankan sehingga indeks sesuai dengan indeks kelas model; enumerate(result) menelusuri kelas bersama dengan deteksinya.