Non-Maximum Suppression (NMS) – Cos’è e come funziona?
🚀 Non-Maximum Suppression (NMS) – Cos’è e come funziona?
Quando un modello di object detection (come SSD, YOLO, Faster R-CNN) analizza un'immagine, può generare più bounding box per lo stesso oggetto, spesso con valori di confidenza diversi. Il compito della Non-Maximum Suppression (NMS) è eliminare i riquadri inutili, mantenendo solo quelli più affidabili.
🔹 Come funziona la NMS?
- Si ordinano le bounding box in base al punteggio di confidenza.
- Si prende la box con il punteggio più alto e la si mantiene.
- Si calcola l’IoU (Intersection over Union) tra questa box e le altre.
- Si eliminano le box con IoU superiore a una soglia (es. 0.5).
- Si ripete il processo fino a esaurire le box.
📌 Algoritmo della NMS in Python
import torch
def nms(boxes, scores, iou_threshold=0.5):
indices = scores.argsort(descending=True)
keep = []
while indices.numel() > 0:
best_index = indices[0]
keep.append(best_index.item())
if indices.numel() == 1:
break
best_box = boxes[best_index].unsqueeze(0)
other_boxes = boxes[indices[1:]]
iou = compute_iou(best_box, other_boxes)
indices = indices[1:][iou < iou_threshold]
return keep
def compute_iou(box1, boxes):
x1 = torch.max(box1[:, 0], boxes[:, 0])
y1 = torch.max(box1[:, 1], boxes[:, 1])
x2 = torch.min(box1[:, 2], boxes[:, 2])
y2 = torch.min(box1[:, 3], boxes[:, 3])
inter_area = (x2 - x1).clamp(0) * (y2 - y1).clamp(0)
box1_area = (box1[:, 2] - box1[:, 0]) * (box1[:, 3] - box1[:, 1])
box2_area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])
union_area = box1_area + box2_area - inter_area
return inter_area / union_area
📊 Esempio di utilizzo
# Esempio di bounding box [x1, y1, x2, y2]
boxes = torch.tensor([[10, 20, 50, 60], [15, 25, 55, 65], [100, 100, 150, 150]])
scores = torch.tensor([0.9, 0.8, 0.7])
# Applica NMS
filtered_indices = nms(boxes, scores, iou_threshold=0.5)
# Mostra le box finali
filtered_boxes = boxes[filtered_indices]
print(filtered_boxes)
✅ Vantaggi della NMS
| Vantaggi | Svantaggi |
|---|---|
| Rimuove bounding box duplicate | Può eliminare oggetti vicini erroneamente |
| Migliora la precisione dell'object detection | Soft-NMS può ridurre questo problema |
| Veloce ed efficiente |
🎯 Conclusione
La Non-Maximum Suppression (NMS) è uno step fondamentale nei modelli di object detection per eliminare le bounding box duplicate e migliorare la precisione del rilevamento. 🚀
Commenti
Posta un commento