Ë
    Fêñiß~  ã            	      ód  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlZddlZddlmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 e%dz  ddddddddf	d„Z4 G d„ d«      Z5 G d„ d«      Z6y)az  
Benchmark YOLO model formats for speed and accuracy.

Usage:
    from ultralytics.utils.benchmarks import ProfileModels, benchmark
    ProfileModels(['yolo26n.yaml', 'yolov8s.yaml']).run()
    benchmark(model='yolo26n.pt', imgsz=160)

Format                  | `format=argument`         | Model
---                     | ---                       | ---
PyTorch                 | -                         | yolo26n.pt
TorchScript             | `torchscript`             | yolo26n.torchscript
ONNX                    | `onnx`                    | yolo26n.onnx
OpenVINO                | `openvino`                | yolo26n_openvino_model/
TensorRT                | `engine`                  | yolo26n.engine
CoreML                  | `coreml`                  | yolo26n.mlpackage
TensorFlow SavedModel   | `saved_model`             | yolo26n_saved_model/
TensorFlow GraphDef     | `pb`                      | yolo26n.pb
TensorFlow Lite         | `tflite`                  | yolo26n.tflite
TensorFlow Edge TPU     | `edgetpu`                 | yolo26n_edgetpu.tflite
TensorFlow.js           | `tfjs`                    | yolo26n_web_model/
PaddlePaddle            | `paddle`                  | yolo26n_paddle_model/
MNN                     | `mnn`                     | yolo26n.mnn
NCNN                    | `ncnn`                    | yolo26n_ncnn_model/
IMX                     | `imx`                     | yolo26n_imx_model/
RKNN                    | `rknn`                    | yolo26n_rknn_model/
ExecuTorch              | `executorch`              | yolo26n_executorch_model/
Axelera AI              | `axelera`                 | yolo26n_axelera_model/
é    )ÚannotationsN)Údeepcopy)ÚPath)ÚYOLOÚ	YOLOWorld)Ú	TASK2DATAÚTASK2METRIC)Úexport_formats)Ú	Segment26)ÚARM64ÚASSETSÚ
ASSETS_URLÚ	IS_DOCKERÚ	IS_JETSONÚLINUXÚLOGGERÚMACOSÚTQDMÚWEIGHTS_DIRÚYAML)ÚIS_PYTHON_3_13Úcheck_imgszÚcheck_requirementsÚ
check_yoloÚis_rockchip)Úsafe_download)Ú	file_size)Úget_cpu_infoÚselect_devicez
yolo26n.pté    FÚcpuçü©ñÒMbP?Ú c	                ó¾  ‡$— t        |«      }t        |t        «      r|d   |d   k(  sJ d«       ‚	 ddl}
|
j                  j                  d«       |
j                  j                  d«       |
j                  j                  d«       |
j                  j                  d«       |
j                  j                  d«       |
j                  j                  d«       t        |d¬	«      }t        | t        t        f«      rt        | «      } |xs t        | j                      }t"        | j                      }g }t%        j$                  «       }|j'                  «       }|r(t)        t+        «       d
   «      }||v sJ d|› d|› d�«       ‚t-        t+        «       j/                  «       Ž D �]÷  \  }}}}}}d\  }}	 |r||k7  rŒ|dk(  r| j                   dk7  sUJ d«       ‚|dk(  rt0        rt2        r=J d«       ‚|dk(  rt0        r+t2        r%J d«       ‚|dk(  rt4        st0        rt2        rJ d«       ‚|dk(  rt6        rJ d«       ‚|dv rt        | t8        «      rJ d«       ‚|dk(  rFt        | t8        «      rJ d«       ‚| j                   dk7  sJ d«       ‚t0        rt:        rt4        sJ d«       ‚|dk(  rt        | t8        «      rJ d «       ‚|d!k(  rt        | t8        «      rJ d"«       ‚|d#k(  rEt        | t8        «      rJ d$«       ‚| j                   d%v sJ d&«       ‚d'| j=                  «       v sJ d(«       ‚|d)k(  r5t        | t8        «      rJ d*«       ‚t0        sJ d+«       ‚t?        «       rJ d,«       ‚|d-k(  rt        | t8        «      rJ d.«       ‚|d/k(  rpt        | t8        «      rJ d0«       ‚t0        rt2        rt@        rJ d1«       ‚| j                   d2k(  r1tC        d3„ | jD                  jG                  «       D «       «      rJ d4«       ‚d5|jH                  v r	|sJ d6«       ‚d7|jH                  v r	|sJ d8«       ‚|d9k(  r4| jJ                  xs | jL                  xs | jN                  }tQ        | «      }nN tQ        | «      jR                  di||||||dd:œ|	¤Ž}t        || j                   ¬;«      }|t        |«      v sJ d<«       ‚d=}| j                   d>k7  s|dk7  sJ d?«       ‚|d@vsJ dA«       ‚|dk7  stU        jV                  «       dBk(  sJ dC«       ‚|d/k7  sJ dD«       ‚|jY                  tZ        dEz  |||d¬F«       |j]                  |d|d|||ddG¬H«	      }|j^                  |   |j`                  dI   }}tc        dJ||z   z  dK«      }|je                  |dLtc        tg        |«      d«      tc        |dM«      tc        |dK«      |g«       �Œú tq        |¬P«       |
js                  |dQdRdS|dTdUgdV¬W«      }|ju                  dXd¬Y«      }|jw                  |
jy                  «       j{                  |
j|                  «      j                  d9«      «      }| jN                  }t%        j$                  «       |z
  }dZ} d[|› d\|› d]|› d^|d_›d`| › da|› da�}!tm        j€                  |!«       tƒ        dbdcddde¬f«      5 }"|"j…                  |!«       ddd«       |rCt        |t†        «      r3||   j‰                  «       }#|Š$ty        ˆ$fdg„|#D «       «      s
J dh‰$› �«       ‚|S # th        $ rp}|rtI        |«      tj        u sJ dN|› dO|› �«       ‚tm        jn                  dN|› dO|› �«       |je                  ||tc        tg        |«      d«      dddg«       Y d}~�Œ¯d}~ww xY w# 1 sw Y   ŒÌxY w)ja“  Benchmark a YOLO model across different formats for speed and accuracy.

    Args:
        model (str | Path): Path to the model file or directory.
        data (str | None): Dataset to evaluate on, inherited from TASK2DATA if not passed.
        imgsz (int): Image size for the benchmark.
        half (bool): Use half-precision for the model if True.
        int8 (bool): Use int8-precision for the model if True.
        device (str): Device to run the benchmark on, either 'cpu' or 'cuda'.
        verbose (bool | float): If True or a float, assert benchmarks pass with given metric.
        eps (float): Epsilon value for divide by zero prevention.
        format (str): Export format for benchmarking. If not supplied all formats are benchmarked.
        **kwargs (Any): Additional keyword arguments for exporter.

    Returns:
        (polars.DataFrame): A Polars DataFrame with benchmark results for each format, including file size, metric, and
            inference time.

    Examples:
        Benchmark a YOLO model with default settings:
        >>> from ultralytics.utils.benchmarks import benchmark
        >>> benchmark(model="yolo26n.pt", imgsz=640)
    r   é   Tz'benchmark() only supports square imgsz.NéÿÿÿÿÚASCII_BORDERS_ONLY_CONDENSEDF)ÚverboseÚArgumentzExpected format to be one of z, but got 'z'.)õ   â�ŒNÚpbÚobbz.TensorFlow GraphDef not supported for OBB taskÚedgetpuz3Edge TPU export only supported on non-aarch64 LinuxÚtfjsz)TF.js export not supported on ARM64 LinuxÚcoremlz;CoreML export only supported on macOS and non-aarch64 Linuxz#CoreML not supported on Python 3.13>   r+   r.   Útfliter-   Úsaved_modelz;YOLOWorldv2 TensorFlow exports not supported by onnx2tf yetÚpaddlez,YOLOWorldv2 Paddle exports not supported yetzBPaddle OBB bug https://github.com/PaddlePaddle/Paddle/issues/72024z3Windows and Jetson Paddle exports not supported yetÚmnnz)YOLOWorldv2 MNN exports not supported yetÚncnnz*YOLOWorldv2 NCNN exports not supported yetÚimxz%YOLOWorldv2 IMX exports not supported>   ÚposeÚdetectÚsegmentÚclassifyzbIMX export is only supported for detection, classification, pose estimation and segmentation tasksÚC2fz*IMX only supported for YOLOv8n and YOLO11nÚrknnz*YOLOWorldv2 RKNN exports not supported yetzRKNN only supported on Linuxz1RKNN Inference only supported on Rockchip devicesÚ
executorchz0YOLOWorldv2 ExecuTorch exports not supported yetÚaxeleraz)YOLOWorldv2 Axelera exports not supportedzGexport is only supported on Linux and is not supported on ARM64 Docker.r8   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N)Ú
isinstancer   )Ú.0Úms     ú^/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/utils/benchmarks.pyú	<genexpr>zbenchmark.<locals>.<genexpr>®   s   è ø€ Ò;tÐYZ¼JÀqÌ)×<TÑ;tùs   ‚zDAxelera export does not currently support YOLO26 segmentation modelsr!   zinference not supported on CPUÚcudazinference not supported on GPUú-)ÚimgszÚformatÚhalfÚint8ÚdataÚdevicer(   )Útaskzexport failedu   â�Žr6   z(GraphDef Pose inference is not supported>   r.   r-   zinference not supportedÚDarwinz(inference only supported on macOS>=10.13z,inference only supported on Axelera hardwarezbus.jpg)rG   rL   rI   r(   r"   )	rK   ÚbatchrG   ÚplotsrL   rI   rJ   r(   ÚconfÚ	inferenceéè  é   u   âœ…é   zBenchmark failure for ú: )rL   ÚFormatu	   Statusâ�”z	Size (MB)zInference time (ms/im)ÚFPSÚrow)ÚschemaÚorientú )Úoffsetud   Benchmarks legend:  - âœ… Success  - â�Ž Export passed but validation failed  - â�Œï¸� Export failedz
Benchmarks complete for z on z
 at imgsz=z (z.2fzs)
ú
zbenchmarks.logÚaÚignoreúutf-8)ÚerrorsÚencodingc              3  óT   •K  — | ]  }t        j                  |«      rŒ|‰kD  –— Œ! y ­wr?   )ÚnpÚisnan)rA   ÚxÚfloors     €rC   rD   zbenchmark.<locals>.<genexpr>ï   s   øè ø€ ÒA ´R·X±X¸aµ[�1�u•9ÑAùs   ƒ(ž
(z%Benchmark failure: metric(s) < floor © )Er   r@   ÚlistÚpolarsÚConfigÚset_tbl_colsÚset_tbl_rowsÚset_tbl_width_charsÚset_tbl_hide_column_data_typesÚset_tbl_hide_dataframe_shapeÚset_tbl_formattingr   Ústrr   r   r   rM   r	   ÚtimeÚlowerÚ	frozensetr
   ÚzipÚvaluesr   r   r   r   r   r   Ú__str__r   r   ÚanyÚmodelÚmodulesÚtypeÚpt_pathÚ	ckpt_pathÚ
model_namer   ÚexportÚplatformÚsystemÚpredictr   ÚvalÚresults_dictÚspeedÚroundÚappendr   Ú	ExceptionÚAssertionErrorr   Úerrorr   Ú	DataFrameÚwith_row_indexÚwith_columnsÚallÚcastÚStringÚ	fill_nullÚinfoÚopenÚwriteÚfloatÚto_numpy)%r{   rK   rG   rI   rJ   rL   r(   ÚepsrH   ÚkwargsÚplÚkeyÚyÚt0Ú
format_argÚformatsÚnameÚsuffixr!   ÚgpuÚ_ÚemojiÚfilenameÚexported_modelÚresultsÚmetricr‡   ÚfpsÚeÚdfÚ
df_displayÚdtÚlegendÚsÚfÚmetricsrh   s%                                       @rC   Ú	benchmarkr³   E   s˜  ø€ ôF ˜Ó€EÜ#-¨e´TÔ#:ˆ5�‰8�u˜Q‘xÒÐoÐFoÓoÐDÀãà‡I�I×Ñ˜2ÔØ‡I�I×Ñ˜2ÔØ‡I�I×!Ñ! "Ô%Ø‡I�I×,Ñ,¨TÔ2Ø‡I�I×*Ñ*¨4Ô0Ø‡I�I× Ñ Ð!?Ô@ä˜6¨5Ô1€FÜ�%œ#œt˜Ô%Ü�U“ˆØÒ(”9˜UŸZ™ZÑ(€DÜ
�e—j‘jÑ
!€Cà
€AÜ	�‰‹€Bà—‘“€JÙÜœNÓ,¨ZÑ8Ó9ˆØ˜Ñ ÐdÐ$AÀ'ÀÈ+ÐV`ÐUaÐacÐ"dÓdÐ Ü-0´.Ó2B×2IÑ2IÓ2KÐ-Ló [UÑ)ˆˆf�f˜c 3¨Ø%‰ˆˆxðY	UÙ˜j¨FÒ2Øð ˜Š~Ø—z‘z UÒ*Ð\Ð,\Ó\Ð*Ø˜9Ò$Ý¥UÐaÐ,aÓaÐ*Ø˜6Ò!Ý!¥eÐYÐ.YÓYÐ,Ø˜8Ò#Ý¥­uÐtÐ7tÓtÐ5Ø˜Ò!Ý)ÐPÐ+PÓPÐ)ØÐKÑKÜ% e¬YÔ7ÐvÐ9vÓvÐ7à˜Ò!Ü% e¬YÔ7ÐgÐ9gÓgÐ7Ø—z‘z UÒ*ÐpÐ,pÓpÐ*Ý¥iµEÐpÐ;pÓpÐ9Ø˜ŠÜ% e¬YÔ7ÐdÐ9dÓdÐ7Ø˜ÒÜ% e¬YÔ7ÐeÐ9eÓeÐ7Ø˜ŠÜ% e¬YÔ7Ð`Ð9`Ó`Ð7Ø—z‘zÐ%NÑNð ØxóÐNð  §¡£Ñ/Ð]Ð1]Ó]Ð/Ø˜ÒÜ% e¬YÔ7ÐeÐ9eÓeÐ7ÝÐ<Ð<Ó<�uÜ&œ=Ð]Ð*]Ó]Ð(Ø˜Ò%Ü% e¬YÔ7ÐkÐ9kÓkÐ7Ø˜Ò"Ü% e¬YÔ7ÐdÐ9dÓdÐ7Ý¥eµ	ð Ø]óÐ:ð "ŸJ™J¨)Ò3¼Ñ;tÐ^c×^iÑ^i×^qÑ^qÓ^sÔ;tÔ8tð ØZóÐuð ˜Ÿ™Ñ#ÙÐ<Ð<Ó<�sØ˜Ÿ™Ñ$ÙÐ<Ð<Ó<�sð ˜Š}Ø Ÿ=™=ÒO¨E¯O©OÒO¸u×?OÑ?O�Ü!)¨%£‘à1œ8 E›?×1Ñ1ð Ø¨°TÀÈ4ÐX^ÐhmñØqwñ�ô "& h°U·Z±ZÔ!@�Ø¤ X£Ñ.Ð?°Ó?Ð.ØˆEð —:‘: Ò'¨6°Tª>ÐeÐ;eÓeÐ9ØÐ!4Ñ4ÐOÐ6OÓOÐ4Ø˜XÒ%¬¯©Ó):¸hÒ)FÐrÐHrÓrÐFØ˜YÒ&ÐVÐ(VÓVÐ&Ø×"Ñ"¤6¨IÑ#5¸UÈ6ÐX\ÐfkÐ"Ôlð %×(Ñ(ØØØØØØØØØð )ó 
ˆGð $×0Ñ0°Ñ5°w·}±}À[Ñ7Q�EˆFÜ˜ ¨¡Ñ,¨aÓ0ˆCØ�H‰H�d˜E¤5¬°8Ó)<¸aÓ#@Ä%ÈÐPQÓBRÔTYÐZ_ÐabÓTcÐehÐiÖjðm[Uô| �fÕØ	�‰�a ¨;¸ÀSÐJbÐdiÐ jÐsxˆÓ	y€BØ	×	Ñ	˜3 qÐ	Ó	)€BØ—‘ §¡£§¡¨r¯y©yÓ!9×!CÑ!CÀCÓ!HÓI€Jà×Ñ€DÜ	�‰‹�rÑ	€BØs€FØ
$ T F¨$¨t¨f°J¸u¸gÀRÈÈ3ÀxÈtÐTZÐS[Ð[]Ð^hÐ]iÐikÐl€AÜ
‡K�K�„NÜ	Ð ¨H¸wÔ	Gð È1Ø	�‰�Œ
÷ñ ”:˜g¤uÔ-Ø�S‘'×"Ñ"Ó$ˆØˆÜÓA gÔAÔAÐrÐEjÐkpÐjqÐCrÓrÐAàÐøô3 ò 	UÙÜ˜A“w¤.Ñ0ÐVÐ4JÈ4È&ÐPRÐSTÐRUÐ2VÓVÐ0Ü�L‰LÐ1°$°°r¸!¸Ð=Ô>Ø�H‰H�d˜E¤5¬°8Ó)<¸aÓ#@À$ÈÈdÐS×TÒTûð		Uú÷"ð ús,   Æ-[Æ5O[Ù6]Û	]Û A%]Ý]Ý]c                  óB   — e Zd ZdZd„ Zdd„Zd	d
d„Zedd„«       Zdd„Z	y)ÚRF100Benchmarkaó  Benchmark YOLO model performance on the RF100 dataset collection.

    This class provides functionality to download, process, and evaluate YOLO models on the RF100 datasets.

    Attributes:
        ds_names (list[str]): Names of datasets used for benchmarking.
        ds_cfg_list (list[Path]): List of paths to dataset configuration files.
        rf (Roboflow | None): Roboflow instance for accessing datasets.
        val_metrics (list[str]): Metrics used for validation.

    Methods:
        set_key: Set Roboflow API key for accessing datasets.
        parse_dataset: Parse dataset links and download datasets.
        fix_yaml: Fix train and validation paths in YAML files.
        evaluate: Evaluate model performance on validation results.
    c                ó@   — g | _         g | _        d| _        g d¢| _        y)z^Initialize the RF100Benchmark class for benchmarking YOLO model performance on RF100 datasets.N©ÚclassÚimagesÚtargetsÚ	precisionÚrecallÚmap50Úmap95)Úds_namesÚds_cfg_listÚrfÚval_metrics)Úselfs    rC   Ú__init__zRF100Benchmark.__init__  s    € àˆŒØˆÔØˆŒÚbˆÕó    c                óB   — t        d«       ddlm}  ||¬«      | _        y)a  Set Roboflow API key for processing.

        Args:
            api_key (str): The API key.

        Examples:
            Set the Roboflow API key for accessing datasets:
            >>> benchmark = RF100Benchmark()
            >>> benchmark.set_key("your_roboflow_api_key")
        Úroboflowr   )ÚRoboflow)Úapi_keyN)r   rÇ   rÈ   rÁ   )rÃ   rÉ   rÈ   s      rC   Úset_keyzRF100Benchmark.set_key  s   € ô 	˜:Ô&Ý%á 7Ô+ˆ�rÅ   c                óÈ  — t         j                  j                  d«      r*t        j                  d«      t        j
                  d«      fnt        j
                  d«       t        j                  d«       t        j
                  d«       t        t        › d�«       t        |d¬«      5 }|D ]ù  }	 t        j                  d|j                  «       «      \  }}}}}| j                  j                  |«       |› d|› �}	t        |	«      j                  «       sI| j                   j#                  |«      j%                  |«      j'                  |«      j)                  d«       nt+        j,                  d	«       | j.                  j                  t        j0                  «       |	z  d
z  «       Œû 	 ddd«       | j                  | j.                  fS # t2        $ r Y �Œ)w xY w# 1 sw Y   Œ1xY w)a½  Parse dataset links and download datasets.

        Args:
            ds_link_txt (str): Path to the file containing dataset links.

        Returns:
            (tuple[list[str], list[Path]]): List of dataset names and list of paths to dataset configuration files.

        Examples:
            >>> benchmark = RF100Benchmark()
            >>> benchmark.set_key("api_key")
            >>> benchmark.parse_dataset("datasets_links.txt")
        zrf-100zultralytics-benchmarksz/datasets_links.txtra   ©rc   z/+rF   Úyolov8zDataset already downloaded.z	data.yamlN)ÚosÚpathÚexistsÚshutilÚrmtreeÚmkdirÚchdirr   r   r•   ÚreÚsplitÚstripr¿   r‰   r   rÁ   Ú	workspaceÚprojectÚversionÚdownloadr   r”   rÀ   ÚcwdrŠ   )
rÃ   Úds_link_txtÚfileÚliner¤   Ú_urlrØ   rÙ   rÚ   Úproj_versions
             rC   Úparse_datasetzRF100Benchmark.parse_dataset  s  € ô :<¿¹¿¹ÈÔ9QŒ�‰�xÓ	 ¤"§(¡(¨8Ó"4Ñ5ÔWY×W_ÑW_Ð`hÓWiøÜ
�‰�ÔÜ
�‰Ð)Ô*Üœ˜Ð$7Ð8Ô9ä�+¨Ô0ð 	°DØò �ð
Ü;=¿8¹8ÀDÈ$Ï*É*Ë,Ó;WÑ8�A�t˜Y¨°Ø—M‘M×(Ñ(¨Ô1Ø&- Y¨a°¨yÐ#9�LÜ Ó-×4Ñ4Ô6ØŸ™×)Ñ)¨)Ó4×<Ñ<¸WÓE×MÑMÈgÓV×_Ñ_Ð`hÕiäŸ™Ð$AÔBØ×$Ñ$×+Ñ+¬D¯H©H«J¸Ñ,EÈÑ,SÕTñ÷	ð �}‰}˜d×.Ñ.Ð.Ð.øô !ò Úðú÷	ð 	ús1   Â(GÂ/C6GÆ%GÇ	GÇGÇGÇGÇG!c                ón   — t        j                  | «      }d|d<   d|d<   t        j                  | |«       y)z8Fix the train and validation paths in a given YAML file.ztrain/imagesÚtrainzvalid/imagesr…   N)r   ÚloadÚsave)rÏ   Ú	yaml_datas     rC   Úfix_yamlzRF100Benchmark.fix_yaml@  s3   € ô —I‘I˜d“Oˆ	Ø+ˆ	�'ÑØ)ˆ	�%ÑÜ�	‰	�$˜	Õ"rÅ   c                ó*  ‡‡‡— g d¢}t        j                  |«      d   Št        |d¬«      5 }|j                  «       }g }|D ]x  Št	        ˆfd„|D «       «      rŒ‰j                  d«      Št        t        d„ ‰«      «      Š‰D �	cg c]  }	|	j                  d«      ‘Œ c}	Š|j                  ˆˆfd	„‰D «       «       Œz 	 d
d
d
«       d}
t        «      dkD  r+t        j                  d«       |D ]  }|d   dk(  sŒ|d   }
Œ n't        j                  d«       t        d„ |D «       «      }
t        |dd¬«      5 }|j                  | j                  |   › d|
› d�«       d
d
d
«       t!        |
«      S c c}	w # 1 sw Y   Œ¶xY w# 1 sw Y   t!        |
«      S xY w)a˜  Evaluate model performance on validation results.

        Args:
            yaml_path (str): Path to the YAML configuration file.
            val_log_file (str): Path to the validation log file.
            eval_log_file (str): Path to the evaluation log file.
            list_ind (int): Index of the current dataset in the list.

        Returns:
            (float): The mean average precision (mAP) value for the evaluated model.

        Examples:
            Evaluate a model on a specific dataset
            >>> benchmark = RF100Benchmark()
            >>> benchmark.evaluate("path/to/data.yaml", "path/to/val_log.txt", "path/to/eval_log.txt", 0)
        )u   ðŸš€u   âš ï¸�u   ðŸ’¡r*   Únamesra   rÌ   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr?   ri   )rA   Úsymbolrß   s     €rC   rD   z*RF100Benchmark.evaluate.<locals>.<genexpr>_  s   øè ø€ ÒA¨&�v ”~ÑAùs   ƒr\   c                ó   — | dk7  S )Nr#   ri   )r…   s    rC   ú<lambda>z)RF100Benchmark.evaluate.<locals>.<lambda>b  s
   € °#¸±)€ rÅ   r^   c           	   3  ó~   •K  — | ]4  }|‰v s|d k(  r)d‰vr%d‰vr!‰d   ‰d   ‰d   ‰d   ‰d   ‰d   ‰d	   d
œ–— Œ6 y­w)r�   z(AP)z(AR)r   r%   rT   é   rU   é   é   r·   Nri   )rA   r«   Úclass_namesÚentriess     €€rC   rD   z*RF100Benchmark.evaluate.<locals>.<genexpr>d  sl   øè ø€ ò "ð Ø˜KÑ'¨A°ªJ¸6ÈÑ;PÐU[ÐcjÑUjð ")¨¡Ø")¨!¡*Ø#*¨1¡:Ø%,¨Q¡ZØ")¨!¡*Ø!(¨¡Ø!(¨¡õñ"ùs   ƒ:=Nç        r%   zMultiple dicts foundr¸   r�   r½   zSingle dict foundc              3  ó&   K  — | ]	  }|d    –— Œ y­w)r½   Nri   )rA   Úress     rC   rD   z*RF100Benchmark.evaluate.<locals>.<genexpr>y  s   è ø€ Ò>¨C˜3˜w�<Ñ>ùs   ‚r_   rV   )r   rå   r•   Ú	readlinesrz   rÖ   rj   Úfilterr×   ÚextendÚlenr   r”   Únextr–   r¿   r—   )rÃ   Ú	yaml_pathÚval_log_fileÚeval_log_fileÚlist_indÚskip_symbolsr±   ÚlinesÚ
eval_linesr«   Úmap_valÚlstró   rô   rß   s               @@@rC   ÚevaluatezRF100Benchmark.evaluateH  s„  ú€ ò" 9ˆÜ—i‘i 	Ó*¨7Ñ3ˆÜ�,¨Ô1ð 	°QØ—K‘K“MˆEØˆJØò �ÜÓA°LÔAÔAØØŸ*™* S›/�ÜœvÑ&;¸WÓEÓF�Ø29Ö:¨Q˜1Ÿ7™7 4�=Ò:�Ø×!Ñ!ô "ð %ô"õ ñ÷	ð, ˆÜˆz‹?˜QÒÜ�K‰KÐ.Ô/Ø!ò +�Ø�w‘< 5Ó(Ø! '™l‘Gñ+ô �K‰KÐ+Ô,ÜÑ>°:Ô>Ó>ˆGä�- ¨wÔ7ð 	?¸1Ø�G‰G�t—}‘} XÑ.Ð/¨r°'°¸"Ð=Ô>÷	?ô �W‹~Ðùò7 ;÷	ð 	ú÷@	?ô �W‹~Ðús*   ­AE3ÂE.Â E3Ä6%E?Å.E3Å3E<Å?FN)rÉ   rs   )zdatasets_links.txt)rÝ   rs   )rÏ   r   )rý   rs   rþ   rs   rÿ   rs   r   Úint)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÄ   rÊ   râ   Ústaticmethodrè   r  ri   rÅ   rC   rµ   rµ   ô   s1   „ ñò"có,ô !/ðF ò#ó ð#ô6rÅ   rµ   c                  óè   — e Zd ZdZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd„ Zd„ Zedd„«       Zeddd„«       Z	ddd„Z
ed	„ «       Zddd
„Z	 	 	 	 	 	 	 	 dd„Ze	 	 	 	 	 	 	 	 dd„«       Zedd„«       Zy)ÚProfileModelsa*  ProfileModels class for profiling different models on ONNX and TensorRT.

    This class profiles the performance of different models, returning results such as model speed and FLOPs.

    Attributes:
        paths (list[str]): Paths of the models to profile.
        num_timed_runs (int): Number of timed runs for the profiling.
        num_warmup_runs (int): Number of warmup runs before profiling.
        min_time (float): Minimum number of seconds to profile for.
        imgsz (int): Image size used in the models.
        half (bool): Flag to indicate whether to use FP16 half-precision for TensorRT profiling.
        trt (bool): Flag to indicate whether to profile using TensorRT.
        device (torch.device): Device used for profiling.

    Methods:
        run: Profile YOLO models for speed and accuracy across various formats.
        get_files: Get all relevant model files.
        get_onnx_model_info: Extract metadata from an ONNX model.
        iterative_sigma_clipping: Apply sigma clipping to remove outliers.
        profile_tensorrt_model: Profile a TensorRT model.
        profile_onnx_model: Profile an ONNX model.
        generate_table_row: Generate a table row with model metrics.
        generate_results_dict: Generate a dictionary of profiling results.
        print_table: Print a formatted table of results.

    Examples:
        Profile models and print results
        >>> from ultralytics.utils.benchmarks import ProfileModels
        >>> profiler = ProfileModels(["yolo26n.yaml", "yolov8s.yaml"], imgsz=640)
        >>> profiler.run()
    Nc	                óÊ   — || _         || _        || _        || _        || _        || _        || _        t        |t        j                  «      r|| _	        yt        |«      | _	        y)a[  Initialize the ProfileModels class for profiling models.

        Args:
            paths (list[str]): List of paths of the models to be profiled.
            num_timed_runs (int): Number of timed runs for the profiling.
            num_warmup_runs (int): Number of warmup runs before the actual profiling starts.
            min_time (float): Minimum time in seconds for profiling a model.
            imgsz (int): Size of the image used during profiling.
            half (bool): Flag to indicate whether to use FP16 half-precision for TensorRT profiling.
            trt (bool): Flag to indicate whether to profile using TensorRT.
            device (torch.device | str | None): Device used for profiling. If None, it is determined automatically.

        Notes:
            FP16 'half' argument option removed for ONNX as slower on CPU than FP32.
        N)ÚpathsÚnum_timed_runsÚnum_warmup_runsÚmin_timerG   rI   Útrtr@   ÚtorchrL   r   )	rÃ   r  r  r  r  rG   rI   r  rL   s	            rC   rÄ   zProfileModels.__init__¢  sW   € ð4 ˆŒ
Ø,ˆÔØ.ˆÔØ ˆŒØˆŒ
ØˆŒ	ØˆŒÜ *¨6´5·<±<Ô @�fˆ�ÄmÐTZÓF[ˆ�rÅ   c           	     óÞ  — | j                  «       }|st        j                  d«       g S g }g }|D �]¨  }|j                  d«      }|j                  dv rÓt        t        |«      «      }|j                  «        |j                  | j                  ¬«      }| j                  r]| j                  j                  dk7  rD|j                  «       s4|j                  d| j                  | j                  | j                  d¬«      }|j                  d	| j                  | j                  d¬
«      }n%|j                  dk(  r| j!                  |«      }|}n�Œ| j#                  t        |«      «      }	| j%                  t        |«      «      }
|j'                  | j)                  |j*                  |
|	|«      «       |j'                  | j-                  |j*                  |
|	|«      «       �Œ« | j/                  |«       |S )aÐ  Profile YOLO models for speed and accuracy across various formats including ONNX and TensorRT.

        Returns:
            (list[dict]): List of dictionaries containing profiling results for each model.

        Examples:
            Profile models and print results
            >>> from ultralytics.utils.benchmarks import ProfileModels
            >>> profiler = ProfileModels(["yolo26n.yaml", "yolo11s.yaml"])
            >>> results = profiler.run()
        z'No matching *.pt or *.onnx files found.z.engine¾   ú.ptú.ymlú.yaml©rG   r!   ÚengineF)rH   rI   rG   rL   r(   Úonnx)rH   rG   rL   r(   z.onnx)Ú	get_filesr   ÚwarningÚwith_suffixr¢   r   rs   Úfuser”   rG   r  rL   r}   Úis_filer�   rI   Úget_onnx_model_infoÚprofile_tensorrt_modelÚprofile_onnx_modelr‰   Úgenerate_table_rowÚstemÚgenerate_results_dictÚprint_table)rÃ   ÚfilesÚ
table_rowsÚoutputrÞ   Úengine_filer{   Ú
model_infoÚ	onnx_fileÚt_engineÚt_onnxs              rC   ÚrunzProfileModels.runÅ  s«  € ð —‘Ó ˆáÜ�N‰NÐDÔEØˆIàˆ
ØˆØó 	_ˆDØ×*Ñ*¨9Ó5ˆKØ�{‰{Ð6Ñ6ÜœS ›Y›�Ø—
‘
”Ø"ŸZ™Z¨d¯j©j˜ZÓ9�
Ø—8’8 §¡× 0Ñ 0°EÒ 9À+×BUÑBUÔBWØ"'§,¡,Ø'Ø!ŸY™YØ"Ÿj™jØ#Ÿ{™{Ø %ð #/ó #�Kð "ŸL™LØ!ØŸ*™*ØŸ;™;Ø!ð	 )ó ‘	ð —‘ Ò'Ø!×5Ñ5°dÓ;�
Ø ‘	áà×2Ñ2´3°{Ó3CÓDˆHØ×,Ñ,¬S°«^Ó<ˆFØ×Ñ˜d×5Ñ5°d·i±iÀÈÐS]Ó^Ô_Ø�M‰M˜$×4Ñ4°T·Y±YÀÈÐR\Ó]Ö^ð;	_ð> 	×Ñ˜Ô$ØˆrÅ   c                ó>  — g }| j                   D ]¿  }t        |«      }|j                  «       rLg d¢}|j                  |D ��cg c]*  }t	        j                  t        ||z  «      «      D ]  }|‘Œ Œ, c}}«       Œj|j                  dv r|j                  t        |«      «       Œ“|j                  t	        j                  t        |«      «      «       ŒÁ t        j                  dt        |«      › �«       t        |«      D �cg c]  }t        |«      ‘Œ c}S c c}}w c c}w )z¥Return a list of paths for all relevant model files given by the user.

        Returns:
            (list[Path]): List of Path objects for the model files.
        )z*.ptz*.onnxz*.yamlr  zProfiling: )r  r   Úis_dirrú   Úglobrs   r¢   r‰   r   r”   Úsorted)rÃ   r*  rÏ   Ú
extensionsÚextrÞ   s         rC   r  zProfileModels.get_filesû  sÝ   € ð ˆØ—J‘Jò 	3ˆDÜ˜“:ˆDØ�{‰{Œ}Ú9�
Ø—‘¨j×` sÄTÇYÁYÌsÐSWÐZ]ÑS]ËÓE_Ò`¸TšdÐ`˜dÓ`ÕaØ—‘Ð 8Ñ8Ø—‘œS ›YÕ'à—‘œTŸY™Y¤s¨4£yÓ1Õ2ð	3ô 	�‰�k¤&¨£- Ð1Ô2Ü'-¨e£}Ö5˜t”�T•
Ò5Ð5ùó aùò 6s   Á/DÃ?Dc                 ó   — y)z\Extract metadata from an ONNX model file including layers, parameters, gradients, and FLOPs.)rõ   rõ   rõ   rõ   ri   )r/  s    rC   r#  z!ProfileModels.get_onnx_model_info  s   € ð "rÅ   c                ó  — t        j                  | «      } t        |«      D ]b  }t        j                  | «      t        j                  | «      }}| | |||z  z
  kD  | |||z  z   k  z     }t        |«      t        | «      k(  r | S |} Œd | S )a{  Apply iterative sigma clipping to data to remove outliers.

        Args:
            data (np.ndarray): Input data array.
            sigma (float): Number of standard deviations to use for clipping.
            max_iters (int): Maximum number of iterations for the clipping process.

        Returns:
            (np.ndarray): Clipped data array with outliers removed.
        )re   ÚarrayÚrangeÚmeanÚstdrû   )rK   ÚsigmaÚ	max_itersr¤   r=  r>  Úclipped_datas          rC   Úiterative_sigma_clippingz&ProfileModels.iterative_sigma_clipping  s‘   € ô �x‰x˜‹~ˆÜ�yÓ!ò 	 ˆAÜŸ™ ›¤r§v¡v¨d£|�#ˆDØ ¨¨u°s©{Ñ(:Ñ!:¸tÀdÈUÐUXÉ[ÑFXÑ?XÑ YÑZˆLÜ�<Ó ¤C¨£IÒ-Øàˆð  ‰Dð	 ð ˆrÅ   c                óz  — | j                   rt        |«      j                  «       syt        |«      }t	        j
                  | j                  | j                  dft        j                  ¬«      }d}t        d«      D ]\  }t        j                  «       }t        | j                  «      D ]  } ||| j                  d¬«       Œ t        j                  «       |z
  }Œ^ t        t        | j                  ||z   z  | j                  z  «      | j                  dz  «      }g }	t        t        |«      |¬«      D ]8  } ||| j                  d¬«      }
|	j!                  |
d	   j"                  d
   «       Œ: | j%                  t	        j&                  |	«      dd¬«      }	t	        j(                  |	«      t	        j*                  |	«      fS )aw  Profile YOLO model performance with TensorRT, measuring average run time and standard deviation.

        Args:
            engine_file (str): Path to the TensorRT engine file.
            eps (float): Small epsilon value to prevent division by zero.

        Returns:
            (tuple[float, float]): Mean and standard deviation of inference time in milliseconds.
        )rõ   rõ   rð   )Údtyperõ   F)rG   r(   é2   ©Údescr   rR   rT   ©r?  r@  )r  r   r"  r   re   ÚzerosrG   Úuint8r<  rt   r  Úmaxrˆ   r  r  r   r‰   r‡   rB  r;  r=  r>  )rÃ   r-  r™   r{   Ú
input_dataÚelapsedr¤   Ú
start_timeÚnum_runsÚ	run_timesr¨   s              rC   r$  z$ProfileModels.profile_tensorrt_model)  sv  € ð �xŠxœt KÓ0×8Ñ8Ô:Øô �[Ó!ˆÜ—X‘X˜tŸz™z¨4¯:©:°qÐ9ÄÇÁÔJˆ
ð ˆÜ�q“ò 	/ˆAÜŸ™›ˆJÜ˜4×/Ñ/Ó0ò C�Ù�j¨¯
©
¸EÖBðCä—i‘i“k JÑ.‰Gð		/ô ”u˜TŸ]™]¨g¸©mÑ<¸t×?SÑ?SÑSÓTÐVZ×ViÑViÐlnÑVnÓoˆð ˆ	Ü”e˜H“o¨KÔ8ò 	<ˆAÙ˜J¨d¯j©jÀ%ÔHˆGØ×Ñ˜W Q™Z×-Ñ-¨kÑ:Õ;ð	<ð ×1Ñ1´"·(±(¸9Ó2EÈQÐZ[Ð1Ó\ˆ	Ü�w‰w�yÓ!¤2§6¡6¨)Ó#4Ð4Ð4rÅ   c                ó(   — t        d„ | D «       «       S )z<Check whether the tensor shape in the ONNX model is dynamic.c              3  óJ   K  — | ]  }t        |t        «      xr |d k\  –— Œ y­w)r   N)r@   r  )rA   Údims     rC   rD   z.ProfileModels.check_dynamic.<locals>.<genexpr>Q  s#   è ø€ ÒQ¸S”z #¤sÓ+Ò8°°q±Ó8ÑQùs   ‚!#)r�   )Útensor_shapes    rC   Úcheck_dynamiczProfileModels.check_dynamicN  s   € ô ÑQÀLÔQÓQÐQÐQrÅ   c                óò  — t        dg«       ddl}|j                  «       }|j                  j                  |_        d|_        |j                  ||dg¬«      }i }|j                  «       D �]Š  }|j                  }| j                  |j                  «      r¡t        |j                  «      dk7  rC| j                  |j                  dd «      r%t        d	|j                  › d
|j                  › �«      ‚t        |j                  «      dk(  rdd| j                  | j                  fndg|j                  dd ¢­}	n|j                  }	d|v rt         j"                  }
nbd|v rt         j$                  }
nMd|v rt         j&                  }
n8d|v rt         j(                  }
n#d|v rt         j*                  }
nt        d|› �«      ‚t!        j,                  j.                  |	Ž j1                  |
«      }|j                  }|||<   �Œ� |j3                  «       d   j                  }d}t5        d«      D ]Z  }t7        j6                  «       }t5        | j8                  «      D ]  }|j;                  |g|«       Œ t7        j6                  «       |z
  }Œ\ t=        t?        | j@                  ||z   z  | j8                  z  «      | jB                  «      }g }tE        t5        |«      |¬«      D ]R  }t7        j6                  «       }|j;                  |g|«       |jG                  t7        j6                  «       |z
  dz  «       ŒT | jI                  t!        jJ                  |«      dd¬«      }t!        jL                  |«      t!        jN                  |«      fS )at  Profile an ONNX model, measuring average inference time and standard deviation across multiple runs.

        Args:
            onnx_file (str): Path to the ONNX model file.
            eps (float): Small epsilon value to prevent division by zero.

        Returns:
            (tuple[float, float]): Mean and standard deviation of inference time in milliseconds.
        )Úonnxruntimezonnxruntime-gpur   Né   ÚCPUExecutionProvider)Ú	providersrU   r%   zUnsupported dynamic shape z of rð   Úfloat16r—   ÚdoubleÚint64Úint32zUnsupported ONNX datatype rõ   rF  rS   rT   rñ   rH  )(r   rW  ÚSessionOptionsÚGraphOptimizationLevelÚORT_ENABLE_ALLÚgraph_optimization_levelÚintra_op_num_threadsÚInferenceSessionÚ
get_inputsr}   rU  Úshaperû   Ú
ValueErrorr¡   rG   re   r[  Úfloat32Úfloat64r]  r^  ÚrandomÚrandÚastypeÚget_outputsr<  rt   r  r2  rK  rˆ   r  r  r   r‰   rB  r;  r=  r>  )rÃ   r/  r™   ÚortÚsess_optionsÚsessÚinput_data_dictÚinput_tensorÚ
input_typeÚinput_shapeÚinput_dtyperL  Ú
input_nameÚoutput_namerM  r¤   rN  rO  rP  s                      rC   r%  z ProfileModels.profile_onnx_modelS  s$  € ô 	Ð>Ð?Ô@Û!ð ×)Ñ)Ó+ˆØ03×0JÑ0J×0YÑ0YˆÔ-Ø,-ˆÔ)Ø×#Ñ# I¨|ÐH^ÐG_Ð#Ó`ˆàˆØ ŸO™OÓ-ó 	5ˆLØ%×*Ñ*ˆJØ×!Ñ! ,×"4Ñ"4Ô5Ü�|×)Ñ)Ó*¨aÒ/°D×4FÑ4FÀ|×GYÑGYÐZ[ÐZ\ÐG]Ô4^Ü$Ð'AÀ,×BTÑBTÐAUÐUYÐZf×ZkÑZkÐYlÐ%mÓnÐnä69¸,×:LÑ:LÓ6MÐQRÒ6R�Q˜˜4Ÿ:™: t§z¡zÑ2ÐYZÐXtÐ]i×]oÑ]oÐpqÐprÐ]sÑXtñ ð +×0Ñ0�ð ˜JÑ&Ü Ÿj™j‘Ø˜JÑ&Ü Ÿj™j‘Ø˜ZÑ'Ü Ÿj™j‘Ø˜JÑ&Ü Ÿh™h‘Ø˜JÑ&Ü Ÿh™h‘ä Ð#=¸j¸\Ð!JÓKÐKäŸ™Ÿ™¨Ð5×<Ñ<¸[ÓIˆJØ%×*Ñ*ˆJØ*4ˆO˜JÓ'ð7	5ð: ×&Ñ&Ó(¨Ñ+×0Ñ0ˆð ˆÜ�q“ò 	/ˆAÜŸ™›ˆJÜ˜4×/Ñ/Ó0ò 9�Ø—‘˜+˜¨Õ8ð9ä—i‘i“k JÑ.‰Gð		/ô ”u˜TŸ]™]¨g¸©mÑ<¸t×?SÑ?SÑSÓTÐVZ×ViÑViÓjˆð ˆ	Ü”e˜H“o¨IÔ6ò 	@ˆAÜŸ™›ˆJØ�H‰H�k�] OÔ4Ø×ÑœdŸi™i›k¨JÑ6¸$Ñ>Õ?ð	@ð
 ×1Ñ1´"·(±(¸9Ó2EÈQÐZ[Ð1Ó\ˆ	Ü�w‰w�yÓ!¤2§6¡6¨)Ó#4Ð4Ð4rÅ   c                ó†   — |\  }}}}d|d›d| j                   › d|d   d›d|d   d›d	|d   d›d|d   d›d	|d
z  d›d|d›d�S )aÑ  Generate a table row string with model performance metrics.

        Args:
            model_name (str): Name of the model.
            t_onnx (tuple): ONNX model inference time statistics (mean, std).
            t_engine (tuple): TensorRT engine inference time statistics (mean, std).
            model_info (tuple): Model information (layers, params, gradients, flops).

        Returns:
            (str): Formatted table row string with model metrics.
        z| Ú18sz | z | - | r   z.1fõ   Â±r%   z ms | g    €„.Az |r  )	rÃ   r€   r1  r0  r.  Ú_layersÚparamsÚ
_gradientsÚflopss	            rC   r&  z ProfileModels.generate_table_row›  s‚   € ð$ .8Ñ*ˆ�˜ Uà�˜CÐ   D§J¡J <¨w°v¸a±yÀ°oÀRÈÈqÉ	ÐRUÀÐV\Ð]eÐfgÑ]hÐilÐ\mÐmoØ˜‰{˜3Ð˜v f¨s¡l°3Ð%7°s¸5À¸+ÀRðIð	
rÅ   c                óh   — |\  }}}}| |t        |d«      t        |d   d«      t        |d   d«      dœS )a¼  Generate a dictionary of profiling results.

        Args:
            model_name (str): Name of the model.
            t_onnx (tuple): ONNX model inference time statistics (mean, std).
            t_engine (tuple): TensorRT engine inference time statistics (mean, std).
            model_info (tuple): Model information (layers, params, gradients, flops).

        Returns:
            (dict): Dictionary containing profiling results.
        rð   r   )z
model/namezmodel/parameterszmodel/GFLOPszmodel/speed_ONNX(ms)zmodel/speed_TensorRT(ms))rˆ   )r€   r1  r0  r.  r{  r|  r}  r~  s           rC   r(  z#ProfileModels.generate_results_dict³  sG   € ð$ .8Ñ*ˆ�˜ Uà$Ø &Ü! %¨›OÜ$)¨&°©)°QÓ$7Ü(-¨h°q©k¸1Ó(=ñ
ð 	
rÅ   c                ó¾  — t         j                  j                  «       rt         j                  j                  d«      nd}ddddt	        «       › d�d|› d	�d
dg}ddj                  d„ |D «       «      z   dz   }ddj                  d„ |D «       «      z   dz   }t        j                  d|› �«       t        j                  |«       | D ]  }t        j                  |«       Œ y)z”Print a formatted table of model profiling results.

        Args:
            table_rows (list[str]): List of formatted table row strings.
        r   ÚGPUÚModelzsize<br><sup>(pixels)zmAP<sup>val<br>50-95zSpeed<br><sup>CPU (z) ONNX<br>(ms)zSpeed<br><sup>z TensorRT<br>(ms)zparams<br><sup>(M)zFLOPs<br><sup>(B)ú|c              3  ó(   K  — | ]
  }d |› d �–— Œ y­w)r\   Nri   ©rA   Úhs     rC   rD   z,ProfileModels.print_table.<locals>.<genexpr>ß  s   è ø€ Ò:¨Q ! A 3 a¤Ñ:ùs   ‚c              3  ó>   K  — | ]  }d t        |«      dz   z  –— Œ y­w)rF   rT   N)rû   r…  s     rC   rD   z,ProfileModels.print_table.<locals>.<genexpr>à  s   è ø€ Ò"G¸! 3¬#¨a«&°1©*Õ#5Ñ"Gùs   ‚z

N)r  rE   Úis_availableÚget_device_namer   Újoinr   r”   )r+  r£   ÚheadersÚheaderÚ	separatorrY   s         rC   r)  zProfileModels.print_tableÎ  sÒ   € ô 05¯z©z×/FÑ/FÔ/HŒe�j‰j×(Ñ(¨Ô+ÈeˆàØ#Ø"Ø!¤,£.Ð!1°Ð@Ø˜S˜EÐ!2Ð3Ø Øð
ˆð �s—x‘xÑ:°'Ô:Ó:Ñ:¸SÑ@ˆØ˜#Ÿ(™(Ñ"G¸wÔ"GÓGÑGÈ#ÑMˆ	ä�‰�d˜6˜(�OÔ$Ü�‰�IÔØò 	ˆCÜ�K‰K˜Õñ	rÅ   )éd   é
   é<   i€  TTN)r  ú	list[str]r  r  r  r  r  r—   rG   r  rI   Úboolr  r’  rL   ztorch.device | str | None)r/  rs   )rT   rð   )rK   z
np.ndarrayr?  r—   r@  r  )r"   )r-  rs   r™   r—   )r/  rs   r™   r—   )r€   rs   r1  útuple[float, float]r0  r“  r.  z!tuple[float, float, float, float])r+  r‘  )r  r	  r
  r  rÄ   r2  r  r  r#  rB  r$  rU  r%  r&  r(  r)  ri   rÅ   rC   r  r  �  sI  „ ñðF "Ø!ØØØØØ,0ð!\àð!\ð ð!\ð ð	!\ð
 ð!\ð ð!\ð ð!\ð ð!\ð *ó!\òF4òl6ð( ò"ó ð"ð óó ðô(#5ðJ ñRó ðRôF5ðP
àð
ð $ð
ð &ð	
ð
 6ó
ð0 ð
Øð
à#ð
ð &ð
ð 6ò	
ó ð
ð4 òó ñrÅ   r  )7r  Ú
__future__r   r5  rÎ   r‚   rÕ   rÑ   rt   Úcopyr   Úpathlibr   Únumpyre   Ú
torch.cudar  Úultralyticsr   r   Úultralytics.cfgr   r	   Úultralytics.engine.exporterr
   Úultralytics.nn.modulesr   Úultralytics.utilsr   r   r   r   r   r   r   r   r   r   r   Úultralytics.utils.checksr   r   r   r   r   Úultralytics.utils.downloadsr   Úultralytics.utils.filesr   Úultralytics.utils.torch_utilsr   r   r³   rµ   r  ri   rÅ   rC   ú<module>r¢     s¡   ðñõ< #ã Û 	Û Û 	Û Û Ý Ý ã Û ç 'ß 2Ý 6Ý ,÷÷ ÷ ñ ÷ nÕ mÝ 5Ý -ß Eð ˜Ñ
$Ø	Ø
Ø	Ø	ØØØØól÷^Jñ J÷Zdò drÅ   