Anchor Boxes
Le anchor box sono riquadri predefiniti di dimensioni e proporzioni fisse che un rilevatore sposta e ridimensiona per adattarli agli oggetti. Come vengono dimensionati, abbinati e usati.
Le anchor box sono rettangoli predefiniti di dimensioni e proporzioni fisse, disposti in ogni posizione delle mappe di caratteristiche di un rilevatore, che fungono da stime iniziali della posizione e della forma degli oggetti. Un rilevatore basato su anchor assegna a ogni anchor un punteggio per ciascuna classe e prevede piccoli offset che la spostano e ridimensionano per adattarla all'oggetto: è più semplice da apprendere che prevedere una box dal nulla. Faster R-CNN colloca 9 anchor in ogni posizione: tre aree (128², 256² e 512² pixel) per tre proporzioni (1:1, 1:2 e 2:1), per un totale di circa 20.000 anchor in un'immagine da 1000 × 600.
Come vengono definite le anchor#
Un insieme di anchor è un elenco di dimensioni e proporzioni ripetuto in ogni cella di una mappa di caratteristiche; il numero di anchor equivale quindi a celle × forme per cella. I rilevatori con una rete piramidale di caratteristiche (FPN) assegnano anchor piccole ai livelli ad alta risoluzione e anchor grandi ai livelli più grossolani: RetinaNet usa 9 anchor per posizione su ciascuno dei cinque livelli, circa 100.000 per immagine. SSD le chiama box predefinite e SSD300 ne dispone 8.732.
Le forme scelte manualmente si adattano male ad alcuni set di dati, quindi YOLOv2 ha eseguito il clustering k-means sulle larghezze e altezze delle box di addestramento, usando 1 − IoU come distanza, e ha mantenuto 5 centri di cluster come anchor. YOLOv3 ha raggruppato 9 anchor e le ha distribuite equamente tra i tre stride di output, da 10 × 13 pixel al livello con stride 8 a 373 × 326 al livello con stride 32.
Abbinamento delle anchor agli oggetti#
Durante l'addestramento, ogni anchor viene confrontata con tutte le box etichettate usando l'intersezione sull'unione (IoU). Le anchor che si sovrappongono abbastanza a un oggetto diventano campioni positivi e apprendono la classe dell'oggetto e gli offset per la sua bounding box; quelle con scarsa sovrapposizione diventano negative e apprendono «sfondo», mentre quelle intermedie vengono ignorate. La rete di proposte di regioni di Faster R-CNN considera positive le anchor con IoU pari o superiore a 0,7 e negative quelle sotto 0,3; inoltre, rende positiva l'anchor con l'abbinamento migliore per ciascun oggetto, così nessun oggetto rimane senza un'anchor.
import torch
from torchvision.ops import box_iou
# Nine anchors centered on one feature-map cell at (200, 200): 3 sizes x 3 aspect ratios (height / width)
shapes = [(size, ratio) for size in (64, 128, 256) for ratio in (0.5, 1.0, 2.0)]
anchors = []
for size, ratio in shapes:
w, h = size / ratio**0.5, size * ratio**0.5
anchors.append([200 - w / 2, 200 - h / 2, 200 + w / 2, 200 + h / 2])
# A labeled pedestrian box (x1, y1, x2, y2): tall and narrow
person = torch.tensor([[160.0, 110.0, 240.0, 290.0]])
# Faster R-CNN RPN rule: IoU >= 0.7 is positive, below 0.3 is negative, anything between is ignored
iou = box_iou(torch.tensor(anchors), person).squeeze(1)
for (size, ratio), value in zip(shapes, iou.tolist()):
label = "positive" if value >= 0.7 else "negative" if value < 0.3 else "ignored"
print(f"size {size}, ratio {ratio}: IoU {value:.2f} -> {label}")Solo l'anchor alta da 128 pixel (rapporto 2.0) si sovrappone abbastanza al pedone da risultare positiva, con IoU 0,88. Due altre anchor da 128 pixel, con IoU 0,31 e 0,50, vengono ignorate, mentre le sei anchor di dimensioni errate sono negative. L'anchor positiva apprende quindi gli offset secondo la parametrizzazione standard: il centro si sposta di frazioni della larghezza e dell'altezza dell'anchor, mentre larghezza e altezza vengono scalate in base agli esponenziali dei valori previsti.
Scelta delle dimensioni delle anchor per un set di dati#
Le ancore che corrispondono alle forme degli oggetti di un dataset fanno sì che più oggetti abbiano un'ancora positiva, aumentando il richiamo raggiungibile da un rilevatore. Ultralytics YOLOv5 parte da quelle 9 ancore di YOLOv3 e le verifica prima dell'addestramento con AutoAnchor: misura il richiamo massimo ottenibile dalle sue ancore sulle etichette di addestramento e, se il valore non supera 0.98, le adatta nuovamente con k-means e 1.000 generazioni di evoluzione genetica, mantenendo le nuove ancore solo se il richiamo migliora.
Limiti e rilevatori senza anchor#
Le anchor comportano tre costi. Quasi tutte le decine di migliaia di anchor presenti in un'immagine coprono lo sfondo, sovraccaricando la loss di esempi negativi facili; RetinaNet ha introdotto la focal loss per ridurne il peso. Diverse anchor vicine si adattano allo stesso oggetto, quindi l'output richiede la soppressione dei massimi non locali (NMS) per mantenere una sola box per oggetto. Anche dimensioni, proporzioni e soglie IoU sono iperparametri che cambiano in base a ciascun set di dati e alla dimensione dell'immagine.
I rilevatori senza anchor eliminano questi iperparametri prevedendo box a partire da punti o keypoint; la maggior parte dei rilevatori in tempo reale rilasciati dopo YOLOX nel 2021 è priva di anchor. Le anchor sono ancora presenti nei rilevatori basati su anchor, come Faster R-CNN, Mask R-CNN e RetinaNet. Confrontando RetinaNet con FCOS, privo di anchor, ATSS ha rilevato che, una volta adottato lo stesso metodo per scegliere i campioni positivi, RetinaNet con 9 anchor per posizione non era più accurato di RetinaNet con 1.










