Comprendere il rilevamento end-to-end in Ultralytics YOLO26#
YOLO26 addestra sia una testa one-to-many sia una testa one-to-one. Per impostazione predefinita, la predizione e la convalida usano la testa one-to-many con la soppressione dei massimi locali (NMS). Questo privilegia la precisione usando gli stessi pesi addestrati. Imposta nms=False per usare invece la testa one-to-one, più veloce e senza NMS.
Un unico argomento controlla questa scelta durante la predizione, la convalida, il tracciamento, l'esportazione e il benchmarking:
nms | Predizione e convalida | Esporta |
|---|---|---|
None (predefinito) | Testa one-to-many; Ultralytics esegue NMS | Output grezzi one-to-many; il componente utilizzatore esegue NMS |
True | Come None | Testa one-to-many con NMS integrata, se supportata |
False | Testa one-to-one senza soppressione IoU | Output one-to-one senza NMS, se supportati |
None indica che nel modello non è integrato alcun post-processing facoltativo. Non elimina la normale elaborazione che converte gli output del modello in risultati di predizione o metriche di convalida. La classificazione, la segmentazione semantica, la profondità e i modelli senza teste di rilevamento selezionabili mantengono il comportamento nativo della rispettiva attività.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.predict("image.jpg") # one-to-many + NMS
metrics = model.val(data="coco.yaml") # one-to-many + NMS
results = model.predict("image.jpg", nms=False) # attiva l'inferenza senza NMS
results = model.predict("image.jpg", nms=None) # torna a one-to-many + NMS
model.export(format="onnx") # output grezzi one-to-many
model.export(format="onnx", nms=True) # integra NMS
model.export(format="onnx", nms=False) # output one-to-one senza NMSCome funziona il rilevamento end-to-end#
Entrambe le teste condividono il backbone e il neck e vengono ottimizzate durante l'addestramento. La testa one-to-many fornisce più predizioni candidate per oggetto; NMS rimuove i rilevamenti sovrapposti. La testa one-to-one impara a produrre una sola predizione per oggetto. La selezione del percorso di inferenza non disattiva la supervisione a doppia testa. Durante l'addestramento, la convalida usa la testa di inferenza selezionata, quindi la scelta del checkpoint e l'arresto anticipato si basano sulle stesse predizioni usate in distribuzione.
| Testa | Output di rilevamento prima dell'elaborazione esterna | Elaborazione |
|---|---|---|
| One-to-many (predefinito) | (N, nc + 4, 8400) | Filtraggio per confidenza e NMS |
| One-to-one | (N, 300, 6) | Filtraggio per confidenza; nessuna soppressione IoU |
Qui N è la dimensione del batch, nc è il numero di classi e 8400 è il numero di candidati in imgsz=640. Le righe di rilevamento one-to-one contengono [x1, y1, x2, y2, confidence, class_id]. Altre attività di rilevamento includono dati aggiuntivi:
| Attività | Output end-to-end | Dati aggiuntivi |
|---|---|---|
| Rilevamento | (N, 300, 6) | — |
| Segmentazione di istanze | (N, 300, 6 + nm) e (N, nm, H, W) | Coefficienti delle maschere e prototipi |
| Stima della posa | (N, 300, 57) | 17 keypoint × 3 valori |
| OBB | (N, 300, 7) | Angolo di rotazione |
La fusione rimuove i rami di inferenza inutilizzati e accorpa i layer Conv e BatchNorm. Conserva il checkpoint di training originale se devi cambiare head: la fusione non può ricostruire un ramo già rimosso. Un modello con il solo head one-to-one mantiene il percorso disponibile.
Output esportati#
Per impostazione predefinita, i modelli di rilevamento YOLOv8, YOLO11 e YOLO26 esportano predizioni grezze one-to-many. Esporta YOLO26 con nms=False per ottenere rilevamenti senza NMS.
nms=None | nms=False | |
|---|---|---|
| Output del rilevamento | (N, nc + 4, 8400) | (N, 300, 6) |
| Formato delle bounding box | xywh | xyxy |
| Punteggi | Un punteggio per classe per candidato | Confidenza e ID di classe per rilevamento |
| Elaborazione esterna | Filtraggio per confidenza e NMS | Filtro della confidenza |
Anche nms=True produce rilevamenti elaborati, ma utilizza l'head one-to-many e integra la NMS tradizionale. È utile quando vuoi che il runtime di deployment riceva i rilevamenti senza dover implementare autonomamente la soppressione.
Il grafo di un modello esportato determina i suoi output. Passare nms al momento del caricamento non ricostruisce il grafo; esporta il checkpoint sorgente con il valore nms desiderato per selezionare il relativo percorso di output. Ultralytics usa i metadati dell'artefatto per evitare di applicare la NMS due volte.
Compatibilità dei formati di esportazione#
ONNX, TensorRT, CoreML, OpenVINO e diversi altri formati supportano esportazioni senza NMS. NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU e Qualcomm QNN ripiegano sul percorso one-to-many quando i relativi operatori non supportano l'output end-to-end. Gli avvisi sul formato spiegano il ripiego.
- NMS integrata:
nms=Trueè soggetto alle restrizioni di ciascun formato relative a task, precisione e forme dinamiche. I formati senza supporto per la NMS integrata esportano gli output nativi per l'elaborazione esterna. - CoreML: la NMS integrata supporta detect, segment e pose con forme statiche. Usa
nms=Trueper i modelli di rilevamento che richiedono la pipeline NMS di Xcode Preview. - MNN: la NMS integrata supporta detect e pose con
dynamic=False. - IMX: il rilevamento, la segmentazione di istanze e pose richiedono la NMS integrata, selezionata automaticamente.
- Hailo: per impostazione predefinita, YOLO26 usa tensori grezzi con NMS sull'host;
nms=Falseseleziona il percorso one-to-one. Il rilevamento YOLOv8/YOLO11 usa la NMS di HailoRT. - Quantizzazione: le versioni di TensorRT precedenti alla 8.5.0, TensorRT 10.3.0 INT8 su JetPack 6 e LiteRT INT8 o
w8a16ripiegano sugli output one-to-many.
Consulta le singole guide alle integrazioni per i requisiti hardware. Per ottenere tensori di output FP16 completi, usa nms=None; gli indici di classe end-to-end possono mantenere i tensori di output in FP32 anche quando il modello è quantizzato.
Compromessi tra accuratezza e velocità#
I risultati YOLO26 su COCO pubblicati mostrano che l'head one-to-many migliora la mAP di rilevamento di 0,6–0,8 punti su tutte e cinque le scale: ad esempio, 40,9 contro 40,1 per YOLO26n e 57,5 contro 56,9 per YOLO26x. L'head one-to-one evita il passaggio NMS e privilegia la latenza. Questi risultati motivano l'impostazione predefinita, ma non garantiscono un miglioramento su ogni dataset.
Le misurazioni di velocità pubblicate per l'inferenza senza NMS usano nms=False. Confronta accuratezza e latenza usando la stessa selezione dell'head, dimensione dell'immagine, precisione e hardware.
Domande frequenti#
Limita i rilevamenti restituiti dalla predizione e dalla validazione. Per le esportazioni end-to-end e con NMS integrata, il limite fa parte del grafo: per modificarlo, esporta di nuovo il modello; fa eccezione la NMS integrata di rilevamento di CoreML, che non prevede un limite ai rilevamenti. L'output end-to-end può contenere meno candidati se l'immagine fornisce un numero di ancore inferiore a
max_det.Sì, per
nms=Falseonms=Truecon il limite di rilevamento predefinito. La forma da sola non permette di identificare quale head è stato esportato. Un'esportazione predefinita del rilevamento COCO grezzo ha invece normalmente forma(1, 84, 8400)aimgsz=640.Sì. Lo stesso argomento
nmsseleziona l'head di rilevamento disponibile per detect, segmentazione di istanze, pose e OBB. Non sostituisce la ricostruzione delle maschere, la decodifica dei keypoint, la gestione delle bounding box ruotate, le probabilità di classificazione, le mappe di classi semantiche o la decodifica della profondità.