Rilevamento di Bounding Box Orientati con YOLO di Ultralytics#
Il rilevamento orientato degli oggetti fa un passo oltre il rilevamento standard degli oggetti introducendo un angolo aggiuntivo per localizzare gli oggetti con maggiore precisione in un'immagine.
L'output di un rilevatore orientato di oggetti è un insieme di riquadri delimitatori ruotati che racchiudono con precisione gli oggetti nell'immagine, insieme alle etichette delle classi e ai punteggi di confidenza per ogni riquadro. I riquadri delimitatori orientati sono particolarmente utili quando gli oggetti appaiono secondo angolazioni diverse, ad esempio nelle immagini aeree, dove i tradizionali riquadri delimitatori allineati agli assi possono includere sfondo non necessario.
I modelli YOLO26 OBB utilizzano il suffisso -obb, ovvero yolo26n-obb.pt, e sono preaddestrati su DOTAv1.
Watch: How to Detect & Track Objects with Ultralytics YOLO26 Oriented Bounding Boxes (OBB) | Ship Tracking 🚢
Esempi visivi#
| Rilevamento di navi con OBB | Rilevamento di veicoli con OBB |
|---|---|
![]() | ![]() |
Modelli#
Qui sono mostrati i modelli OBB preaddestrati YOLO26, preaddestrati sul dataset DOTAv1.
I modelli vengono scaricati automaticamente dall'ultima release di Ultralytics al primo utilizzo.
| Modello | dimensione (pixel) | mAPtest 50-95(e2e) | mAPtest 50(e2e) | Velocità CPU ONNX (ms) | Velocità T4 TensorRT10 (ms) | parametri (M) | FLOPs (B) |
|---|---|---|---|---|---|---|---|
| YOLO26n-obb | 1024 | 52.4 | 78.9 | 97.7 ± 0.9 | 2.8 ± 0.0 | 2.4 | 14.8 |
| YOLO26s-obb | 1024 | 54.8 | 80.9 | 218.0 ± 1.4 | 4.9 ± 0.1 | 9.8 | 56.7 |
| YOLO26m-obb | 1024 | 55.3 | 81.0 | 579.2 ± 3.8 | 10.2 ± 0.3 | 21.2 | 184.9 |
| YOLO26l-obb | 1024 | 56.2 | 81.6 | 735.6 ± 3.1 | 13.0 ± 0.2 | 25.6 | 232.4 |
| YOLO26x-obb | 1024 | 56.7 | 81.7 | 1485.7 ± 11.5 | 30.5 ± 0.9 | 57.6 | 520.1 |
- I valori mAPtest si riferiscono al multiscala con un singolo modello sulle immagini del dataset DOTAv1.
Riproduci usandoyolo val obb data=DOTAv1.yaml device=0 split=test nms=Falsee invia i risultati uniti a DOTA evaluation. - La velocità è calcolata come media sulle immagini di validazione di DOTAv1 utilizzando un'istanza Amazon EC2 P4d.
Riproduci usandoyolo val obb data=DOTAv1.yaml batch=1 device=0|cpu nms=False - I valori di Params e FLOPs si riferiscono a modelli fusi dopo il folding di Conv/BatchNorm e la rimozione del ramo di rilevamento non utilizzato. I checkpoint preaddestrati mantengono l'intera architettura di addestramento e potrebbero mostrare conteggi superiori.
Consulta l'anteprima non rilasciata di YOLO27 per i risultati preliminari su DOTAv1.
Addestramento#
Addestra YOLO26n-obb sul dataset DOTA8 per 100 epoche con una dimensione delle immagini pari a 640. Per un elenco completo degli argomenti disponibili, consulta la pagina Configurazione.
Un OBB e la sua rotazione di 180° sono identici, quindi la rotazione è definita modulo 180° e il riquadro non ha una direzione. Le etichette di addestramento vengono canonicalizzate secondo la forma con lato lungo: la larghezza del riquadro w è il lato più lungo, l'angolo viene misurato in senso orario dall'asse x positivo all'orientamento del lato w e viene memorizzato in radianti in [-π/4, 3π/4) ([-45°, 135°)). Le predizioni non vengono canonicalizzate, quindi un riquadro predetto può indicare il lato corto come w; consulta Output dei risultati. La forma [0°, 90°) è la convenzione DOTA regolarizzata e non viene applicata durante l'addestramento o l'inferenza.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.yaml") # build a new model from YAML
model = YOLO("yolo26n-obb.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)Watch: How to Train Ultralytics YOLO-OBB (Oriented Bounding Boxes) Models on DOTA Dataset using Ultralytics Platform
Formato del dataset#
Il formato dei dataset OBB è descritto in dettaglio nella Guida ai dataset. Il formato YOLO OBB definisce i riquadri delimitatori tramite i quattro punti degli angoli, con coordinate normalizzate tra 0 e 1, secondo questa struttura. L'annotazione sulla piattaforma Ultralytics supporta le etichette OBB con uno strumento dedicato per disegnare i riquadri delimitatori orientati:
class_index x1 y1 x2 y2 x3 y3 x4 y4Internamente, YOLO elabora le loss e gli output nel formato xywhr, che rappresenta il punto centrale del riquadro di delimitazione (xy), la larghezza, l'altezza e la rotazione.
Val#
Convalida l'accuratezza del modello addestrato YOLO26n-obb sul dataset DOTA8. Non sono necessari argomenti perché model conserva i dati di addestramento data e gli argomenti come attributi del modello.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="dota8.yaml") # validate on the DOTA8 dataset
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # a list containing mAP50-95(B) for each category
metrics.box.image_metrics # per-image metrics dictionary with precision, recall, F1, TP, FP, and FNPredizione#
Utilizza un modello YOLO26n-obb addestrato per eseguire predizioni sulle immagini.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/boats.jpg") # predict on an image
# Access the results
for result in results:
xywhr = result.obb.xywhr # center-x, center-y, width, height, angle (radians)
xyxyxyxy = result.obb.xyxyxyxy # polygon format with 4-points
names = [result.names[cls.item()] for cls in result.obb.cls.int()] # class name of each box
confs = result.obb.conf # confidence score of each boxWatch: How to Detect and Track Storage Tanks using Ultralytics YOLO-OBB | Oriented Bounding Boxes | DOTA
Consulta la pagina Predict per tutti i dettagli sulla modalità predict.
Output dei risultati#
Il rilevamento con riquadri delimitatori orientati restituisce un oggetto Results per immagine. Il campo principale della predizione è result.obb,
che contiene i riquadri ruotati, gli ID delle classi e i punteggi di confidenza per ogni oggetto rilevato.
| Attributo | Tipo | Forma | Descrizione |
|---|---|---|---|
result.obb | OBB | (N) | Box orientate. |
result.obb.data | torch.float32 | (N,7/8) | Box ruotate grezze con confidenza/classe. |
result.obb.xywhr | torch.float32 | (N,5) | Box ruotate xywhr. |
result.obb.xyxyxyxy | torch.float32 | (N,4,2) | Punti dei quattro angoli. |
result.obb.conf | torch.float32 | (N,) | Punteggi di confidenza. |
Le etichette vengono canonicalizzate secondo la convenzione del lato lungo, ma le predizioni no, quindi result.obb.xywhr può indicare w più piccolo di h, con la rotazione misurata dal lato corto. Entrambe le forme descrivono lo stesso rettangolo, quindi result.obb.xyxyxyxy è corretto in entrambi i casi. Converti nuovamente gli angoli quando il codice a valle richiede la forma con lato lungo, tenendo presente che la riscrittura dei parametri del riquadro può modificare ciclicamente l'ordine degli angoli:
from ultralytics.utils.ops import xyxyxyxy2xywhr
xywhr = xyxyxyxy2xywhr(result.obb.xyxyxyxy) # w >= h, rotation in [-pi/4, 3pi/4)Per i campi Results specifici dell'attività in tutte le attività, consulta la sezione Risultati delle predizioni per attività.
Esportazione#
Esporta un modello YOLO26n-obb in un formato diverso, ad esempio ONNX, CoreML, ecc.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")I formati di esportazione YOLO26-obb disponibili sono riportati nella tabella seguente. Puoi esportare in qualsiasi formato utilizzando l'argomento format, ovvero format='onnx' o format='engine'. Puoi eseguire predizioni o convalide direttamente sui modelli esportati, ovvero yolo predict model=yolo26n-obb.onnx. Al termine dell'esportazione vengono mostrati esempi di utilizzo per il tuo modello.
| Formato | Argomento format | Modello | Metadati | Argomenti |
|---|---|---|---|---|
| PyTorch | - | yolo26n-obb.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-obb.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-obb.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-obb_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-obb.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-obb.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-obb.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-obb_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-obb_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-obb.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-obb_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-obb_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-obb_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-obb_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-obb_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-obb_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-obb_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz, batch, quantize |
nms=None utilizza i valori predefiniti per gli output grezzi per la NMS esterna. Imposta nms=False per selezionare una testa senza NMS disponibile; i formati non supportati ricorrono al loro percorso di output nativo. Le voci nms sopra indicano i formati che possono incorporare la NMS con nms=True.
Consulta la pagina Export per tutti i dettagli su export.
Applicazioni nel mondo reale#
Il rilevamento OBB con YOLO26 ha numerose applicazioni pratiche in diversi settori:
- Gestione marittima e portuale: rilevamento di navi e imbarcazioni secondo angolazioni diverse per la gestione della flotta e il monitoraggio.
- Pianificazione urbana: analisi di edifici e infrastrutture a partire da immagini aeree.
- Agricoltura: monitoraggio delle colture e delle attrezzature agricole da riprese effettuate con droni.
- Settore energetico: ispezione di pannelli solari e turbine eoliche con orientamenti diversi.
- Trasporti: monitoraggio dei veicoli su strade e parcheggi da diverse prospettive.
Queste applicazioni traggono vantaggio dalla capacità degli OBB di adattarsi con precisione agli oggetti a qualsiasi angolazione, offrendo un rilevamento più accurato rispetto ai riquadri delimitatori tradizionali.
FAQ#
I riquadri delimitatori orientati (OBB) includono un angolo aggiuntivo per migliorare la precisione della localizzazione degli oggetti nelle immagini. A differenza dei normali riquadri delimitatori, che sono rettangoli allineati agli assi, gli OBB possono ruotare per adattarsi meglio all'orientamento dell'oggetto. Ciò è particolarmente utile per le applicazioni che richiedono un posizionamento preciso degli oggetti, come le immagini aeree o satellitari (Guida ai dataset).
Per addestrare un modello YOLO26n-obb con un dataset personalizzato, segui l'esempio seguente utilizzando Python o CLI:
Esempiofrom ultralytics import YOLO # Load a pretrained model model = YOLO("yolo26n-obb.pt") # Train the model results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)Per ulteriori argomenti di addestramento, consulta la sezione Configurazione.
I modelli YOLO26-OBB sono preaddestrati su dataset come DOTAv1, ma puoi utilizzare qualsiasi dataset formattato per OBB. Informazioni dettagliate sui formati dei dataset OBB sono disponibili nella Guida ai dataset.
Esportare un modello YOLO26-OBB nel formato ONNX è semplice utilizzando Python o CLI:
Esempiofrom ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Export the model model.export(format="onnx")Per ulteriori formati di esportazione e dettagli, consulta la pagina Esportazione.
Per convalidare un modello YOLO26n-obb, puoi utilizzare i comandi Python o CLI come mostrato di seguito:
Esempiofrom ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Validate the model metrics = model.val(data="dota8.yaml")Consulta tutti i dettagli sulla convalida nella sezione Val.

