Non-Maximum Suppression (NMS) – Cos’è e come funziona?

Non-Maximum Suppression (NMS) - Object Detection

🚀 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?

  1. Si ordinano le bounding box in base al punteggio di confidenza.
  2. Si prende la box con il punteggio più alto e la si mantiene.
  3. Si calcola l’IoU (Intersection over Union) tra questa box e le altre.
  4. Si eliminano le box con IoU superiore a una soglia (es. 0.5).
  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

Post popolari in questo blog

SSD (Single Shot MultiBox Detector)

Instance Segmentation: Cos'è e Come Funziona

U-Net: Architettura per la Segmentazione di Immagini