Benchmark dei modelli con Ultralytics YOLO#
Visualizzazione dei benchmark#
Introduzione#
Una volta addestrato e convalidato il modello, il passaggio successivo consiste nel valutare le sue prestazioni in fase di deployment. La modalità Benchmark di Ultralytics YOLO26 misura la velocità e la precisione del modello in diversi formati di esportazione.
Consulta l'anteprima non ancora rilasciata di YOLO27 per i benchmark preliminari della velocità.
Guarda: Benchmark dei modelli Ultralytics YOLO26 | Come confrontare le prestazioni dei modelli su hardware diversi?
Perché i benchmark sono fondamentali?#
- Decisioni consapevoli: Comprendi i compromessi tra velocità e precisione.
- Allocazione delle risorse: Scopri come si comportano i diversi formati di esportazione su hardware differenti.
- Ottimizzazione: Scopri quale formato di esportazione offre le migliori prestazioni per il tuo caso d'uso specifico.
- Efficienza dei costi: Sfrutta le risorse hardware in modo più efficiente in base ai risultati dei benchmark.
Metriche chiave nella modalità Benchmark#
- mAP50-95: per il rilevamento di oggetti, la segmentazione di istanze, la stima della posa e OBB.
- mIoU: per la segmentazione semantica.
- δ1: per la stima della profondità.
- accuracy_top1: Per la classificazione delle immagini.
- Tempo di inferenza: Tempo impiegato per ciascuna immagine, in millisecondi.
Formati di esportazione supportati#
- ONNX: Per prestazioni ottimali su CPU
- TensorRT: Per la massima efficienza su GPU
- OpenVINO: Per l'ottimizzazione su hardware Intel
- CoreML, TensorFlow SavedModel e altri: Per diverse esigenze di distribuzione.
- Esporta in ONNX o OpenVINO per accelerare la CPU fino a 3 volte.
- Esporta in TensorRT per accelerare la GPU fino a 5 volte.
Esempi d'uso#
Installa Ultralytics con le dipendenze per l'esportazione prima di eseguire i benchmark, così da evitare pacchetti mancanti.
pip install "ultralytics[export]"Esegui i benchmark di YOLO26n con tutti i formati di esportazione supportati (ONNX, TensorRT e così via).
from ultralytics.utils.benchmarks import benchmark
# Esegui il benchmark su GPU
benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, device=0)
# Esegui il benchmark su un formato di esportazione specifico
benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, format="onnx")Argomenti#
Argomenti come model, data, imgsz, quantize, device, verbose e format ti consentono di adattare i benchmark alle tue esigenze e confrontare le prestazioni dei diversi formati di esportazione.
| Chiave | Valore predefinito | Descrizione |
|---|---|---|
model | None | Specifica il percorso del file del modello. Accetta sia i formati .pt che .yaml, ad esempio "yolo26n.pt" per i modelli preaddestrati o i file di configurazione. |
data | None | Percorso del file YAML del dataset per i benchmark, che in genere include i percorsi e le impostazioni dei dati di convalida. Esempio: "coco8.yaml". Per la classificazione, invece, accetta una directory del dataset o il nome di un dataset integrato (ad es. imagenet10). |
imgsz | 640 | Dimensione dell'immagine di input per il modello. Deve essere un singolo intero per le immagini quadrate (ad es. 640); benchmark() supporta solo dimensioni quadrate. |
quantize | None | Precisione richiesta: 16 (FP16) o 8 (INT8; gli schemi PTQ richiedono i dati di calibrazione data/fraction, quelli basati solo sui pesi no); 32/non impostato corrisponde a FP32 quando il formato lo supporta: un formato che non può esportare in FP32 rifiuta un 32 esplicito oppure ripiega sulla precisione richiesta. La riga PyTorch nativa non viene esportata: solo 16 la influenza, selezionando l'inferenza FP16 al di fuori della CPU; altrimenti, viene eseguita in FP32. Ogni formato esegue quindi l'inferenza alla propria precisione di runtime. Sostituisce i flag deprecati half/int8. |
device | None | Definisce il dispositivo di calcolo per i benchmark, ad esempio "cpu" o "cuda:0"; se non è impostato, viene usata la prima GPU disponibile, oppure la CPU. |
verbose | False | Se è impostato True o un valore float, gli errori dei benchmark (tranne le asserzioni) vengono sollevati invece di essere registrati come errori; un valore float come 0.25 verifica inoltre che la metrica di ogni formato eseguito correttamente superi tale soglia. |
eps | 0.001 | Piccolo epsilon (in millisecondi) aggiunto al tempo di inferenza per immagine prima di convertirlo in FPS, per evitare la divisione per zero. Modificato raramente. |
format | '' | Esegue il benchmark solo sul formato di esportazione specificato (ad es. format=onnx). Lascialo vuoto per testare automaticamente tutti i formati supportati. |
La funzione autonoma benchmark() (from ultralytics.utils.benchmarks import benchmark) usa i valori predefiniti della propria firma anziché quelli della tabella sopra, in particolare model="yolo26n.pt", imgsz=160 e device="cpu"; passa esplicitamente imgsz e device per ottenere gli stessi valori predefiniti della CLI yolo benchmark.
Formati di esportazione#
I benchmark proveranno a essere eseguiti automaticamente su tutti i formati di esportazione possibili elencati qui sotto. In alternativa, puoi eseguire i benchmark per un formato specifico usando l'argomento format, che accetta uno qualsiasi dei formati indicati qui sotto.
| Formato | Argomento format | Modello | Metadati | Argomenti |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo11n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None restituisce per impostazione predefinita output grezzi per la NMS esterna (YOLO26 mantiene la propria head senza NMS su Axelera). Imposta nms=False per selezionare una head senza NMS disponibile; i formati non supportati usano il proprio percorso di output nativo. Le voci nms qui sopra identificano i formati che possono incorporare la NMS con nms=True.
Consulta i dettagli completi di export nella pagina Esportazione.
Domande frequenti#
Ultralytics YOLO26 offre una modalità benchmark per valutare le prestazioni del tuo modello con diversi formati di esportazione. Questa modalità riporta metriche chiave come la precisione media media (mAP50-95), la precisione e il tempo di inferenza in millisecondi. Per eseguire i benchmark, puoi usare Python oppure i comandi CLI. Ad esempio, per eseguire un benchmark su una GPU:
Esempiofrom ultralytics.utils.benchmarks import benchmark # Esegui il benchmark su GPU benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, device=0)Per maggiori dettagli sugli argomenti dei benchmark, consulta la sezione Argomenti.
Esportare i modelli YOLO26 in formati diversi, come ONNX, TensorRT e OpenVINO, ti consente di ottimizzare le prestazioni in base all'ambiente di distribuzione. Per esempio:
- ONNX: Offre fino a 3 volte più velocità sulla CPU.
- TensorRT: Offre fino a 5 volte più velocità sulla GPU.
- OpenVINO: Ottimizzato specificamente per l'hardware Intel.
Questi formati migliorano la velocità di inferenza sull'hardware di destinazione, rendendo i modelli più efficienti per varie applicazioni reali. Visita la pagina Esportazione per tutti i dettagli.
Eseguire benchmark sui modelli YOLO26 è essenziale per diversi motivi:
- Decisioni consapevoli: Comprendi i compromessi tra velocità e precisione.
- Allocazione delle risorse: Valuta le prestazioni sulle diverse opzioni hardware.
- Ottimizzazione: Individua il formato di esportazione che offre le migliori prestazioni per casi d'uso specifici.
- Efficienza dei costi: Ottimizza l'uso dell'hardware in base ai risultati dei benchmark.
Metriche chiave come mAP50-95, la precisione Top-1 e il tempo di inferenza aiutano a effettuare queste valutazioni. Consulta la sezione Metriche chiave per saperne di più.
YOLO26 supporta diversi formati di esportazione, ciascuno pensato per specifici hardware e casi d'uso:
- ONNX: Ideale per le prestazioni su CPU.
- TensorRT: Ideale per l'efficienza su GPU.
- OpenVINO: Ottimizzato per l'hardware Intel.
- CoreML e TensorFlow: CoreML per i dispositivi Apple; i formati TensorFlow per il deployment su dispositivi mobili, sul Web e per l'ML in generale.
Per l'elenco completo dei formati supportati e dei rispettivi vantaggi, consulta la sezione Formati di esportazione supportati.
Quando esegui i benchmark, puoi personalizzare diversi argomenti in base alle tue esigenze:
- model: Percorso del file del modello (ad es. "yolo26n.pt").
- data: Percorso del file YAML del dataset (ad es.
"coco8.yaml"); per la classificazione, invece, accetta una directory del dataset o il nome di un dataset integrato (ad es.imagenet10). - imgsz: Dimensione quadrata dell'immagine di input, espressa come singolo intero, ad esempio
640. La modalità Benchmark usa la stessa dimensione quadrata per le immagini in PyTorch e nei formati esportati, per garantire un confronto equo. - quantize: Precisione richiesta:
16per FP16,8per INT8 (utile per i dispositivi edge);32/non impostato corrisponde a FP32 quando il formato lo supporta: un formato che non può esportare in FP32 rifiuta un32esplicito oppure ripiega sulla precisione richiesta. La riga PyTorch nativa non viene esportata: solo16la influenza, selezionando l'inferenza FP16 al di fuori della CPU; altrimenti, viene eseguita in FP32. Ogni formato esegue quindi l'inferenza alla propria precisione di runtime. - device: Specifica il dispositivo di calcolo (ad es. "cpu", "cuda:0").
- verbose: Solleva un errore in caso di problemi con i benchmark anziché registrarli; passa un valore float per richiedere anche che la metrica di ciascun formato superi tale soglia.
Per l'elenco completo degli argomenti, consulta la sezione Argomenti.
Commenti39
Fai una domanda, condividi i tuoi risultati o aiuta qualcun altro.
bayda369
Hi, I want to customize the yolov8 to detect and track only the objects determined by the user, like selecting 3 persons in different positions out of 10 persons in the video appears in the first frame of the video and ignore any other persons, what are your suggestions?
1
Paula DerrengerUltralytics@bayda369 hello,
For customizing YOLOv8 to detect and track specific objects (like selecting certain individuals from a video), you can approach this by integrating a pre-processing step to identify and tag the objects of interest in the first frame. Here’s a brief outline on how you might proceed:
- Object Detection: Use YOLOv8 to detect all persons in the first frame.
- Object Selection: Implement a method to select the desired objects. This could be manual selection via bounding box coordinates or an automated method based on certain criteria.
- Tracking: Once the objects are tagged, you can use the tracking functionality to follow these objects across frames. You might need to modify the tracking logic to focus only on the tagged objects.
For the tracking part, you can utilize the existing tracking capabilities of YOLOv8, which supports multiple tracking algorithms. You may need to customize the tracking code to ensure it only tracks the initially selected objects.
This approach requires some custom coding, especially for the selection and modified tracking logic. If you need further guidance on the specific code modifications, feel free to ask!
bayda369
yes please, I need further guidance on the specific code modifications
Paula DerrengerUltralytics(modificato)Hello @bayda369,
Absolutely, I'd be happy to guide you through the code needed to track only selected objects in a video. The simplest way is to use the built-in tracker, which gives every person a persistent ID, and then keep only the IDs you selected in the first frame.
Step-by-Step Guide
- Track persons: run tracking with
classes=[0](person). - Select IDs: choose the IDs of the persons you want from the first frame (manually or by criteria).
- Filter: ignore every other ID in later frames.
Code Example
from ultralytics import YOLO model = YOLO("yolo26n.pt") selected_ids = None for r in model.track("path/to/your/video/file.mp4", classes=[0], persist=True, stream=True): if r.boxes.id is None: continue ids = r.boxes.id.int().tolist() if selected_ids is None: # For simplicity, select the first 3 persons; replace with your own selection method selected_ids = set(ids[:3]) keep = [i for i, t in enumerate(ids) if t in selected_ids] boxes = r.boxes.xyxy[keep] # boxes of the selected persons only track_ids = [ids[i] for i in keep] print(track_ids, boxes)Feel free to customize the selection method as per your requirements. If you need further assistance, don't hesitate to ask! 😊
- Track persons: run tracking with
AA278-HUB
it seems benchmark only run on Linux System ,It couldn't run on Window Enviroment?
Glenn JocherUltralytics(modificato)It runs on Windows too—only some export formats are OS‑specific (e.g., CoreML, EdgeTPU and RKNN aren’t supported on Windows); try a single supported format to verify your setup:
yolo benchmark model=yolo26n.pt data=coco8.yaml format=onnx device=cpuIf it still fails, please paste the
yolo checksoutput and the full traceback here; format/OS notes are summarized in the benchmarks reference at ultralytics.utils.benchmarks.AA278-HUB
thank you,Very appreciate to your help .
Glenn JocherUltralytics(modificato)Glad it helped! On Windows you can also benchmark a fast CPU path with OpenVINO:
yolo benchmark model=yolo26n.pt data=coco8.yaml format=openvinoSetup and tips are in the OpenVINO export guide.
andyg2
Which GPUs are used in these benchmarks? I imagine the result would be different between a GTX 1650 and an H100?
Glenn JocherUltralytics(modificato)@andyg2 you're absolutely right that benchmark results vary significantly between different GPU models. The documentation doesn't specify which exact GPUs were used for the benchmark results shown. For accurate performance metrics on your specific hardware, I'd recommend running the benchmarks directly on your system using:
from ultralytics.utils.benchmarks import benchmark benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, device=0)This will give you hardware-specific results for your GTX 1650 or any other GPU you're using, which will be much more relevant for your deployment needs than generic benchmark numbers.
andyg2
What's the use of a benchmark that doesn't have a bench?
Glenn JocherUltralytics@andyg2 that's a very valid point! Benchmark results without hardware specifications are indeed not very meaningful for comparison purposes. You're absolutely right that performance metrics should always include the testing hardware context. For meaningful benchmarks, it's best to run tests on your specific hardware setup to get accurate performance expectations for your deployment environment.
andyg2(modificato)
@glenn-jocher Thanks for the reply. My problem is I need to purchase over 120 small GPUs for a computer vision project.
I guess I need to buy 10 GPUs and see how each of them do, because nobody at Ultralytics can remember how they tested their own code.
Sorry if I'm coming across a little sarcastic here, I'm just so flabbergasted, not that this information is not included - everyone makes mistakes in documentation, but that nobody there thinks it should be included.
Glenn JocherUltralytics@andyg2 you're absolutely right, and I completely understand your frustration. This is a valid oversight on our part - benchmark results without hardware specifications are essentially meaningless for making informed purchasing decisions, especially at your scale.
For your project requiring 120 GPUs, I'd suggest focusing on a few key considerations: look for GPUs with sufficient VRAM for your model size (typically 8GB+ for larger YOLO models), prioritize newer architectures that support TensorRT optimization well (RTX 30/40 series, A-series), and consider power efficiency for large-scale deployments.
Your approach of testing with 10 GPUs first is actually the most reliable path forward given the current documentation gap. This will give you real-world performance data specific to your models, datasets, and deployment constraints.
Thank you for the feedback - this highlights an important area where our documentation needs improvement to better serve users making hardware decisions.
1
josiahkim29
How do i proceed to calculate the mean Average Precision of the predictions? I have noted the predictions = model(10 sample images from COCO val2017 dataset)
is a bit different especially when you want to get the classes and scores of the predictions
for pred in predictions[0]:
x, y, w, h, class_id, score = pred[:6]
Glenn JocherUltralyticsTo calculate mean Average Precision (mAP) for your predictions, you can use the
valmethod in Ultralytics YOLO, which evaluates the model on a dataset and provides mAP metrics. For more details, refer to the benchmarking guide.josiahkim29
@glenn-jocher thank you for the response. Based on the benchmarking guide I see that I need a custom.yaml file for this specific images I am using. Is this the case? If so how do you proceed to create a custom.yaml file.
Glenn JocherUltralyticsTo create a custom
yamlfile for your specific images, you'll need to define the dataset paths and class names. You can start by copying an existing dataset file likecoco128.yamland modifying it to suit your dataset structure. For detailed guidance, please refer to the dataset preparation section in the documentation.
xpeedent289
Hi there, I have a question that, which dataset is use to benchmark, train, val or test ?
Glenn JocherUltralytics@Xpeedent the benchmark mode uses the validation dataset specified in the
dataargument, typically defined in a YAML file likecoco8.yaml. For more details, please visit the Benchmarking Documentation.
xpeedent289
Hi sir! when I use benchmark for "yolov8n.pt", it auto exports TorchScript, ONNX,... and auto benchmark for these too, but I just wanna benchmark for yolov8n.pt, so how can I adjust it ?
Glenn JocherUltralytics(modificato)To benchmark only the
yolov8n.ptmodel without exporting to other formats, you can use theformatargument to limit the benchmark to the PyTorch model. Here's how you can do it:from ultralytics.utils.benchmarks import benchmark # Benchmark only the PyTorch model ("-" is the PyTorch format) benchmark(model="yolov8n.pt", data="coco8.yaml", imgsz=640, device=0, format="-")Or using the CLI:
yolo benchmark model=yolov8n.pt data=coco8.yaml imgsz=640 device=0 format=-This will ensure that only the PyTorch model is benchmarked. For more details, you can visit the benchmark documentation.
themeowsketeer
@glenn-jocher I got this error. TypeError: benchmark() got an unexpected keyword argument 'format' I don't think by default benchmark can accept custom format argument?
Glenn JocherUltralytics(modificato)The
benchmarkfunction supports aformatargument that limits the run to one export format, e.g.format=onnx. To benchmark only the PyTorch model, useformat="-", for exampleyolo benchmark model=yolov8n.pt data=coco8.yaml format=-. Leaveformatunset to benchmark all formats. See the benchmark documentation for details.
themeowsketeer
Greetings, I'm facing the following error when trying to benchmark using trained weight from RT-DeTR-L model, which is known to be fully supported by Ultralytics:
KeyError Traceback (most recent call last) File /opt/conda/lib/python3.10/site-packages/ultralytics/utils/benchmarks.py:133, in benchmark(model, data, imgsz, half, int8, device, verbose) 132 assert i != 5 or platform.system() == "Darwin", "inference only supported on macOS>=10.13" # CoreML --> 133 exported_model.predict(ASSETS / "bus.jpg", imgsz=imgsz, device=device, half=half) 135 # Validate
File /opt/conda/lib/python3.10/site-packages/ultralytics/engine/model.py:563, in Model.predict(self, source, stream, predictor, **kwargs) 562 self.predictor.set_prompts(prompts) --> 563 return self.predictor.predict_cli(source=source) if is_cli else self.predictor(source=source, stream=stream)
File /opt/conda/lib/python3.10/site-packages/ultralytics/engine/predictor.py:168, in BasePredictor.call(self, source, model, stream, *args, **kwargs) 167 else: --> 168 return list(self.stream_inference(source, model, *args, **kwargs))
File /opt/conda/lib/python3.10/site-packages/torch/utils/_contextlib.py:36, in _wrap_generator..generator_context(*args, **kwargs) 35 with ctx_factory(): ---> 36 response = gen.send(None) 38 while True:
File /opt/conda/lib/python3.10/site-packages/ultralytics/engine/predictor.py:274, in BasePredictor.stream_inference(self, source, model, *args, **kwargs) 273 if self.args.verbose or self.args.save or self.args.save_txt or self.args.show: --> 274 s[i] += self.write_results(i, Path(paths[i]), im, s) 276 # Print batch results
File /opt/conda/lib/python3.10/site-packages/ultralytics/engine/predictor.py:334, in BasePredictor.write_results(self, i, p, im, s) 333 result.save_dir = self.save_dir.str() # used in other locations --> 334 string += f"{result.verbose()}{result.speed['inference']:.1f}ms" 336 # Add predictions to image
File /opt/conda/lib/python3.10/site-packages/ultralytics/engine/results.py:633, in Results.verbose(self) 632 n = (boxes.cls == c).sum() # detections per class --> 633 log_string += f"{n} {self.names[int(c)]}{'s' * (n > 1)}, " 634 return log_string
KeyError: 25
During handling of the above exception, another exception occurred:
AssertionError Traceback (most recent call last) Cell In[11], line 3 1 from ultralytics.utils.benchmarks import benchmark ----> 3 benchmark( 4 model = "/kaggle/working/weight_rtdetr/last_rtdetr.pt", 5 data = "Yolo_path_fixed.yaml", 6 imgsz = 640, 7 device = 0, 8 half = False, 9 verbose = True 10 )
File /opt/conda/lib/python3.10/site-packages/ultralytics/utils/benchmarks.py:146, in benchmark(model, data, imgsz, half, int8, device, verbose) 144 except Exception as e: 145 if verbose: --> 146 assert type(e) is AssertionError, f"Benchmark failure for {name}: {e}" 147 LOGGER.warning(f"ERROR ❌️ Benchmark failure for {name}: {e}") 148 y.append([name, emoji, round(file_size(filename), 1), None, None, None]) # mAP, t_inference
AssertionError: Benchmark failure for PyTorch: 25
Any idea how this exception is caused? My code snippet is as follows: from ultralytics.utils.benchmarks import benchmark
benchmark( model = "/kaggle/working/weight_rtdetr/last_rtdetr.pt", data = "Yolo_path_fixed.yaml", imgsz = 640, device = 0, half = False, verbose = True )
Glenn JocherUltralytics@themeowsketeer thank you for reporting this issue. It seems like the error is related to a missing class name in the model's
namesattribute. Please ensure that your model and dataset are correctly configured and that the latest versions of the Ultralytics package are installed. If the issue persists, try running the benchmark with a different model or dataset to isolate the problem. For more details on benchmarking, you can refer to our documentation.themeowsketeer
YOLO model works flawlessly with the command, while RT-DeTR models just do not work at all. AssertionError returns different error code everytime: 8, 13 or 25. Any other method I could try?
Glenn JocherUltralyticsIt seems like the issue might be related to the RT-DeTR model's class names. Please ensure your dataset and model are correctly configured, and try running the benchmark with the latest version of the Ultralytics package. If the problem persists, consider testing with a different model or dataset to isolate the issue. For more details, refer to our benchmarking documentation.
WooFy11
@title Speed Tracker
import cv2 import numpy as np from ultralytics import YOLO
from ultralytics.utils.checks import check_imshow from ultralytics.utils.plotting import Annotator, colors
from collections import defaultdict
track_history = defaultdict(lambda: []) model = YOLO("/content/drive/MyDrive/DATASET_TUGASAKHIR/PlayerResults/weights/best.pt") names = model.model.names video_path = "/content/drive/MyDrive/DATASET_TUGASAKHIR/testvid/BDEvid1.mp4" cap = cv2.VideoCapture(video_path) assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
result = cv2.VideoWriter("SpeedTracker.avi", cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
time_per_frame = 1.0 / fps real_world_scale = 0.05 # Example: 0.05 meters per pixel
while cap.isOpened(): success, frame = cap.read() if success: results = model.track(frame, persist=True, verbose=False, tracker="/content/drive/MyDrive/DATASET_TUGASAKHIR/Tracker/bytetrack.yaml") boxes = results[0].boxes.xyxy.cpu()
if results[0].boxes.id is not None: # Extract prediction results clss = results[0].boxes.cls.cpu().tolist() track_ids = results[0].boxes.id.int().cpu().tolist() confs = results[0].boxes.conf.float().cpu().tolist() # Annotator Init annotator = Annotator(frame, line_width=2) for box, cls, track_id in zip(boxes, clss, track_ids): # Store tracking history track = track_history[track_id] track.append((int((box[0] + box[2]) / 2), int((box[1] + box[3]) / 2))) if len(track) > 30: track.pop(0) if len(track) >= 2: # Calculate pixel distance between the last and second to last points dx = track[-1][0] - track[-2][0] dy = track[-1][1] - track[-2][1] pixel_distance = (dx ** 2 + dy ** 2) ** 0.5 real_distance = pixel_distance * real_world_scale speed = real_distance / time_per_frame # speed in meters per second label = f"{names[int(cls)]} {track_id} {speed:.2f} m/s" annotator.box_label(box, color=colors(int(cls), True), label=label) # Plot tracks points = np.array(track, dtype=np.int32).reshape((-1, 1, 2)) cv2.circle(frame, (track[-1]), 7, colors(int(cls), True), -1) cv2.polylines(frame, [points], isClosed=False, color=colors(int(cls), True), thickness=2) else: label = f"{names[int(cls)]} {track_id}" annotator.box_label(box, color=colors(int(cls), True), label=label) result.write(frame) if cv2.waitKey(1) & 0xFF == ord("q"): break else: breakresult.release() cap.release() cv2.destroyAllWindows()
how to collect the ground truth ID's from this code
WooFy11
@title Speed Tracker
import cv2 import numpy as np from ultralytics import YOLO
from ultralytics.utils.checks import check_imshow from ultralytics.utils.plotting import Annotator, colors
from collections import defaultdict
track_history = defaultdict(lambda: []) model = YOLO("/content/drive/MyDrive/DATASET_TUGASAKHIR/PlayerResults/weights/best.pt") names = model.model.names video_path = "/content/drive/MyDrive/DATASET_TUGASAKHIR/testvid/BDEvid1.mp4" cap = cv2.VideoCapture(video_path) assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
result = cv2.VideoWriter("SpeedTracker.avi", cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
time_per_frame = 1.0 / fps real_world_scale = 0.05 # Example: 0.05 meters per pixel
while cap.isOpened(): success, frame = cap.read() if success: results = model.track(frame, persist=True, verbose=False, tracker="/content/drive/MyDrive/DATASET_TUGASAKHIR/Tracker/bytetrack.yaml") boxes = results[0].boxes.xyxy.cpu()
if results[0].boxes.id is not None: # Extract prediction results clss = results[0].boxes.cls.cpu().tolist() track_ids = results[0].boxes.id.int().cpu().tolist() confs = results[0].boxes.conf.float().cpu().tolist() # Annotator Init annotator = Annotator(frame, line_width=2) for box, cls, track_id in zip(boxes, clss, track_ids): # Store tracking history track = track_history[track_id] track.append((int((box[0] + box[2]) / 2), int((box[1] + box[3]) / 2))) if len(track) > 30: track.pop(0) if len(track) >= 2: # Calculate pixel distance between the last and second to last points dx = track[-1][0] - track[-2][0] dy = track[-1][1] - track[-2][1] pixel_distance = (dx ** 2 + dy ** 2) ** 0.5 real_distance = pixel_distance * real_world_scale speed = real_distance / time_per_frame # speed in meters per second label = f"{names[int(cls)]} {track_id} {speed:.2f} m/s" annotator.box_label(box, color=colors(int(cls), True), label=label) # Plot tracks points = np.array(track, dtype=np.int32).reshape((-1, 1, 2)) cv2.circle(frame, (track[-1]), 7, colors(int(cls), True), -1) cv2.polylines(frame, [points], isClosed=False, color=colors(int(cls), True), thickness=2) else: label = f"{names[int(cls)]} {track_id}" annotator.box_label(box, color=colors(int(cls), True), label=label) result.write(frame) if cv2.waitKey(1) & 0xFF == ord("q"): break else: breakresult.release() cap.release() cv2.destroyAllWindows()
how do we benchmark the bytetrack perfomance per player ID?
Zency-Sun
Hi, what should I do if I want to benchmark using only Pytorch, ONNX, openvino and tensorRT?
Paula DerrengerUltralytics(modificato)Hey there! 😊 To benchmark only PyTorch, ONNX, OpenVINO, and TensorRT, use the
formatargument ofbenchmark, which limits the run to one export format. Call it once per format ("-"is the PyTorch model):from ultralytics.utils.benchmarks import benchmark # "-" = PyTorch, then ONNX, OpenVINO (CPU only) and TensorRT (GPU only) for fmt, device in [("-", 0), ("onnx", 0), ("openvino", "cpu"), ("engine", 0)]: benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, device=device, format=fmt)And for CLI:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 device=0 format=onnx yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 device=cpu format=openvino yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 device=0 format=engineBenchmark exports the model for you, so you don't need to export it first. Hope this helps! If there are more questions, feel free to ask.
1Zency-Sun
when I use the under code to deploy: ' model = YOLO("yolov8s.engine") metrics = model.val(data="ultralytics/cfg/datasets/coco128.yaml",device='cuda:0') ' but I meet the error,What should I do?,Thanks your reply!!!
Traceback (most recent call last): File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/ultralytics/nn/autobackend.py", line 220, in init import tensorrt as trt # noqa https://developer.nvidia.com/nvidia-tensorrt-download File "/home/zency/anaconda3/envs/yolov8plus/lib/python3.9/site-packages/tensorrt/init.py", line 68, in from .tensorrt import * ImportError: libnvinfer.so.8: cannot open shared object file: No such file or directory
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/run_test.py", line 190, in yolo_mytest() File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/run_test.py", line 116, in yolo_mytest metrics = model.val(data="ultralytics/cfg/datasets/coco128.yaml",device='cuda:0') # cpu cuda:0 File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/ultralytics/engine/model.py", line 513, in val validator(model=self.model) File "/home/zency/anaconda3/envs/yolov8plus/lib/python3.9/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context return func(*args, **kwargs) File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/ultralytics/engine/validator.py", line 124, in call model = AutoBackend( File "/home/zency/anaconda3/envs/yolov8plus/lib/python3.9/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context return func(*args, **kwargs) File "/media/zency/SSD-Data/Codes/yolov8_v8.1.0/ultralytics/nn/autobackend.py", line 224, in init import tensorrt as trt # noqa File "/home/zency/anaconda3/envs/yolov8plus/lib/python3.9/site-packages/tensorrt/init.py", line 68, in from .tensorrt import * ImportError: libnvinfer.so.8: cannot open shared object file: No such file or directory Ultralytics YOLOv8.1.24 🚀 Python-3.9.18 torch-1.12.1 CUDA:0 (NVIDIA GeForce RTX 3090, 24268MiB) Loading yolov8s.engine for TensorRT inference...
Zency-Sun
I solved the problem above, but there is a new problem:
[TRT] [W] CUDA initialization failure with error: 35
Paula DerrengerUltralyticsHey there! 🌟 It looks like you've encountered the CUDA initialization failure error with code 35, which usually indicates a CUDA driver/runtime version mismatch or an issue with accessing your GPU.
Here are a couple of steps you can try to resolve the issue:
- Check CUDA Compatibility: Ensure that the installed CUDA version is compatible with the version required by TensorRT.
- Update Drivers: Sometimes, simply updating your NVIDIA drivers can resolve such issues.
- Environment Check: Make sure your environment variables (like
PATHandLD_LIBRARY_PATHfor Linux) are correctly set to include paths to CUDA toolkit and libraries.
If these steps don't help, could you provide a bit more context about your setup? Specifically:
- The versions of CUDA, TensorRT, and PyTorch you're using.
- The output of
nvidia-smito check if the GPU is being recognized properly.
This information can help pinpoint the issue more accurately. Thanks for reaching out, and looking forward to getting you past this hurdle! 🚀
Zency-Sun
Thank you for your patient reply, I have resolved the above issue!
Paula DerrengerUltralytics(modificato)@Zency-Sun i'm glad to hear you've resolved your previous issue! Regarding your question about model benchmarking, it's a great way to understand your model's performance across different formats. Here's a quick overview of what you might find useful:
- Why Benchmark?: Helps you make informed decisions by understanding the trade-off between speed and accuracy across different formats and on varied hardware.
- Key Metrics: Look at mAP50-95 for detection accuracy, and inference time for speed. This gives you a holistic view of how well your model performs.
For benchmarking specific formats like PyTorch, ONNX, OpenVINO, and TensorRT, use the
benchmarkutility with theformatargument. It exports the model for you:from ultralytics.utils.benchmarks import benchmark # "-" = PyTorch; OpenVINO runs on CPU, TensorRT on GPU for fmt, device in [("-", "cuda:0"), ("onnx", "cuda:0"), ("openvino", "cpu"), ("engine", "cuda:0")]: benchmark(model="yolo26n.pt", data="coco8.yaml", imgsz=640, device=device, format=fmt)And for CLI:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 device=0 format=onnx # Repeat with format=openvino (device=cpu) and format=engineRemember, exporting to ONNX or OpenVINO can speed up CPU inference, and TensorRT is excellent for maximizing GPU efficiency. 🚀
Let me know if there's anything else you need help with!