Ë
    FêñiÖ  ã                  ó$  — 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mZ ddl	m	Z	 ddl
mZ ddlmZ ddlZddlZddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZE ddlFmGZG ddlHmIZI ddlJmKZK ddlLmMZMmNZNmOZOmPZPmQZQmRZRmSZS d„ ZTd„ ZUd„ ZV G d„ d«      ZW G d„ dej°                  j²                  «      ZZy)a<  
Export a YOLO PyTorch model to other formats. TensorFlow exports authored by https://github.com/zldrobit.

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/

Requirements:
    $ pip install "ultralytics[export]"

Python:
    from ultralytics import YOLO
    model = YOLO('yolo26n.pt')
    results = model.export(format='onnx')

CLI:
    $ yolo mode=export model=yolo26n.pt format=onnx

Inference:
    $ yolo predict model=yolo26n.pt                 # PyTorch
                         yolo26n.torchscript        # TorchScript
                         yolo26n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                         yolo26n_openvino_model     # OpenVINO
                         yolo26n.engine             # TensorRT
                         yolo26n.mlpackage          # CoreML (macOS-only)
                         yolo26n_saved_model        # TensorFlow SavedModel
                         yolo26n.pb                 # TensorFlow GraphDef
                         yolo26n.tflite             # TensorFlow Lite
                         yolo26n_edgetpu.tflite     # TensorFlow Edge TPU
                         yolo26n_paddle_model       # PaddlePaddle
                         yolo26n.mnn                # MNN
                         yolo26n_ncnn_model         # NCNN
                         yolo26n_imx_model          # IMX
                         yolo26n_rknn_model         # RKNN
                         yolo26n_executorch_model   # ExecuTorch
                         yolo26n_axelera_model      # Axelera AI

TensorFlow.js:
    $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
    $ npm install
    $ ln -s ../../yolo26n_web_model public/yolo26n_web_model
    $ npm start
é    )ÚannotationsN)Údeepcopy)Údatetime)Úpartial)ÚPath)Ú__version__)ÚTASK2CALIBRATIONDATAÚ	TASK2DATAÚget_cfg)Úbuild_dataloader)ÚYOLODataset)Úcheck_cls_datasetÚcheck_det_dataset)Úcheck_class_namesÚdefault_class_names)ÚC2fÚClassifyÚDetectÚRTDETRDecoderÚ	Segment26)ÚClassificationModelÚDetectionModelÚSegmentationModelÚ
WorldModel)ÚARM64ÚDEFAULT_CFGÚ	IS_DOCKERÚLINUXÚLOGGERÚMACOSÚMACOS_VERSIONÚ
RKNN_CHIPSÚSETTINGSÚTORCH_VERSIONÚWINDOWSÚYAMLÚ	callbacksÚcolorstrÚget_default_args)ÚIS_PYTHON_MINIMUM_3_9Úcheck_imgszÚcheck_requirementsÚcheck_versionÚis_intel)Ú	file_size)Úbatch_probiou)ÚTorchNMS)ÚProfile)Úarange_patch)Ú
TORCH_1_11Ú
TORCH_1_13Ú	TORCH_2_1Ú	TORCH_2_3Ú	TORCH_2_8Ú	TORCH_2_9Úselect_devicec                 óv  — dddddg gdddddg d¢gd	d
dddg d¢gdddddg d¢gdddddg d¢gdddddg d¢gdddddg d¢gddd ddd!ggd"d#d$ddg d%¢gd&d'd(ddg gd)d*d+ddg d,¢gd-d.d/ddd!ggd0d1d2ddg d3¢gd4d5d6ddd!d7ggd8d9d:ddg d;¢gd<d=d>ddd!d?ggd@dAdBddd!ggdCdDdEddg dF¢gg} t        t        g dG¢t        | Ž «      «      S )Hz7Return a dictionary of Ultralytics YOLO export formats.ÚPyTorchú-z.ptTÚTorchScriptÚtorchscriptú.torchscript)ÚbatchÚoptimizeÚhalfÚnmsÚdynamicÚONNXÚonnxú.onnx)rA   rE   rC   ÚopsetÚsimplifyrD   ÚOpenVINOÚopenvinoÚ_openvino_modelF)rA   rE   rC   Úint8rD   ÚfractionÚTensorRTÚengineú.engine)rA   rE   rC   rN   rJ   rD   rO   ÚCoreMLÚcoremlú
.mlpackage)rA   rE   rC   rN   rD   zTensorFlow SavedModelÚsaved_modelÚ_saved_model)rA   rN   ÚkerasrD   zTensorFlow GraphDefÚpbú.pbrA   zTensorFlow LiteÚtflitez.tflite)rA   rC   rN   rD   rO   zTensorFlow Edge TPUÚedgetpuz_edgetpu.tflitezTensorFlow.jsÚtfjsÚ
_web_model)rA   rC   rN   rD   ÚPaddlePaddleÚpaddleÚ_paddle_modelÚMNNÚmnnú.mnn)rA   rC   rN   ÚNCNNÚncnnÚ_ncnn_modelrC   ÚIMXÚimxÚ
_imx_model)rN   rO   rD   ÚRKNNÚrknnÚ_rknn_modelÚnameÚ
ExecuTorchÚ
executorchÚ_executorch_modelz
Axelera AIÚaxeleraÚ_axelera_model)rA   rN   rO   Údata)ÚFormatÚArgumentÚSuffixÚCPUÚGPUÚ	Arguments)ÚdictÚzip)Úxs    ú]/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/engine/exporter.pyÚexport_formatsr   }   sw  € ð 
�C˜  d¨BÐ/Ø	˜ ~°t¸TÒCrÐsØ	�˜ $¨Ò.fÐgàØØØØÚCð	
ð ØØØØÚOð	
ð 
�8˜\¨4°Ò8cÐdØ	  -°ÀÀtÒMnÐoØ	  e¨T°4¸'¸ÐCØ	˜H i°°uÒ>jÐkØ	 	Ð+<¸dÀEÈ2ÐNØ	˜& ,°°eÒ=]Ð^Ø	˜ ?°D¸$ÀÀ	ÐJØ	��v˜t TÒ+DÐEØ	�˜¨¨d°W¸fÐ4EÐFØ	��| T¨4Ò1LÐMØ	�˜¨¨u°wÀÐ6GÐHØ	�|Ð%8¸$ÀÈÀyÐQØ	�yÐ"2°E¸5ÒBgÐhðA!	€AôD ”ÒOÔQTÐVWÐQXÓYÓZÐZó    c                óÀ   — g d¢}|€J d| › d�«       ‚ddddœ}t        t        |«      }|D ]2  }t        ||d«      t        ||d«      k7  }|sŒ!||v rŒ&J d|› d| › d	�«       ‚ y)
ap  Validate arguments based on the export format.

    Args:
        format (str): The export format.
        passed_args (SimpleNamespace): The arguments used during export.
        valid_args (list): List of valid arguments for the format.

    Raises:
        AssertionError: If an unsupported argument is used, or if the format lacks supported argument listings.
    )rC   rN   rE   rX   rD   rA   rO   Nu"   ERROR â�Œï¸� valid arguments for 'z' not listed.é   )rA   rt   Údeviceu   ERROR â�Œï¸� argument 'z' is not supported for format='ú')r   r   Úgetattr)ÚformatÚpassed_argsÚ
valid_argsÚexport_argsÚcustomÚdefault_argsÚargÚnot_defaults           r~   Úvalidate_argsrŽ   ¤   s•   € ò S€KàÐ!Ð]Ð%GÈÀxÈ}Ð#]Ó]Ð!Ø $°$Ñ7€FÜœ;¨Ó/€LØò nˆÜ˜k¨3°Ó5¼ÀÈsÐTXÓ9YÑYˆÚØ˜*Ò$ÐmÐ(?À¸uÐDcÐdjÐckÐklÐ&mÓmÐ$ñnr€   c                ó,   ‡ ‡— t        ‰ «      Šˆˆ fd„}|S )z(YOLO export decorator, i.e. @try_export.c            
     óž  •— ‰d   }d}	 t        «       5 } ‰	| i |¤Ž}ddd«       t        t        t        f«      r|n|d   }t	        |«      }|dkD  sJ d«       ‚t        j                  |› d|j                  d›d|› d	|d›d
�«       |S # 1 sw Y   ŒlxY w# t        $ r/}t        j                  |› d|j                  d›d|› �«       |‚d}~ww xY w)zExport a model.Úprefixç        Nr   z0.0 MB output model sizeu    export success âœ… ú.1fzs, saved as 'z' (ú MB)z export failure zs: )
r2   Ú
isinstanceÚstrr   r/   r   ÚinfoÚtÚ	ExceptionÚerror)
ÚargsÚkwargsr‘   ÚdtÚfÚpathÚmbÚeÚ
inner_argsÚ
inner_funcs
           €€r~   Ú
outer_funcztry_export.<locals>.outer_func¾   sç   ø€ à˜HÑ%ˆØˆð
	Ü“ð 0˜bÙ Ð/¨Ñ/�÷0ä" 1¤s¬D kÔ2‘1¸¸!¹ˆDÜ˜4“ˆBØ˜’8Ð7Ð7Ó7�8Ü�K‰K˜6˜(Ð"6°r·t±t¸C°jÀÈdÈVÐSVÐWYÐZ]ÐV^Ð^bÐcÔdØˆH÷0ð 0ûô ò 	Ü�L‰L˜F˜8Ð#3°B·D±D¸°:¸SÀÀÐDÔEØˆGûð	ús.   Š
B ”	B�A*B ÂBÂB Â	CÂ*CÃC)r)   )r£   r¤   r¢   s   ` @r~   Ú
try_exportr¥   º   s   ù€ ä! *Ó-€Jõð  Ðr€   c                  ó|  — e Zd ZdZeddfd-d„Zd.d/d„Zd0d„Ze e	d«      fd„«       Z
e e	d	«      fd
„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd„«       Ze e	d«      fd „«       Zed e	d!«      fd"„«       Ze e	d#«      fd$„«       Ze e	d%«      fd&„«       Ze e	d'«      fd(„«       Zd)„ Zed1d*„«       Zd2d+„Zd2d,„Zy)3ÚExportera1
  A class for exporting YOLO models to various formats.

    This class provides functionality to export YOLO models to different formats including ONNX, TensorRT, CoreML,
    TensorFlow, and others. It handles format validation, device selection, model preparation, and the actual export
    process for each supported format.

    Attributes:
        args (SimpleNamespace): Configuration arguments for the exporter.
        callbacks (dict): Dictionary of callback functions for different export events.
        im (torch.Tensor): Input tensor for model inference during export.
        model (torch.nn.Module): The YOLO model to be exported.
        file (Path): Path to the model file being exported.
        output_shape (tuple): Shape of the model output tensor(s).
        pretty_name (str): Formatted model name for display purposes.
        metadata (dict): Model metadata including description, author, version, etc.
        device (torch.device): Device on which the model is loaded.
        imgsz (list): Input image size for the model.

    Methods:
        __call__: Main export method that handles the export process.
        get_int8_calibration_dataloader: Build dataloader for INT8 calibration.
        export_torchscript: Export model to TorchScript format.
        export_onnx: Export model to ONNX format.
        export_openvino: Export model to OpenVINO format.
        export_paddle: Export model to PaddlePaddle format.
        export_mnn: Export model to MNN format.
        export_ncnn: Export model to NCNN format.
        export_coreml: Export model to CoreML format.
        export_engine: Export model to TensorRT format.
        export_saved_model: Export model to TensorFlow SavedModel format.
        export_pb: Export model to TensorFlow GraphDef format.
        export_tflite: Export model to TensorFlow Lite format.
        export_edgetpu: Export model to Edge TPU format.
        export_tfjs: Export model to TensorFlow.js format.
        export_rknn: Export model to RKNN format.
        export_imx: Export model to IMX format.
        export_executorch: Export model to ExecuTorch format.
        export_axelera: Export model to Axelera format.

    Examples:
        Export a YOLO26 model to ONNX format
        >>> from ultralytics.engine.exporter import Exporter
        >>> exporter = Exporter()
        >>> exporter(model="yolo26n.pt")  # exports to yolo26n.onnx

        Export with specific arguments
        >>> args = {"format": "onnx", "dynamic": True, "half": True}
        >>> exporter = Exporter(overrides=args)
        >>> exporter(model="yolo26n.pt")
    Nc                óŠ   — t        ||«      | _        |xs t        j                  «       | _        t        j                  | «       y)a4  Initialize the Exporter class.

        Args:
            cfg (str | Path | dict | SimpleNamespace, optional): Configuration file path or configuration object.
            overrides (dict, optional): Configuration overrides.
            _callbacks (dict, optional): Dictionary of callback functions.
        N)r   r›   r'   Úget_default_callbacksÚadd_integration_callbacks)ÚselfÚcfgÚ	overridesÚ
_callbackss       r~   Ú__init__zExporter.__init__  s5   € ô ˜C Ó+ˆŒ	Ø#ÒH¤y×'FÑ'FÓ'HˆŒÜ×+Ñ+¨DÕ1r€   c                ó2$  ‡ — t        j                   «       }‰ j                  j                  j                  «       }|dv rd}|dv rd}t	        «       }t        |d   dd «      }||vr\ddl}|j                  ||dd	¬
«      }|s|dk(  rdnd|› d�}t        |› d|› �«      ‚t        j                  d|› d|d   › d�«       |d   }|dv }	d‰ _        |dk(  r<‰ j                  j                  €&t        j                  d«       d‰ j                  _        |dk(  r„dt        ‰ j                  j                  «      v rct        ‰ j                  j                  «      }
|
j                  dd«      d   ‰ _        d‰ j                  _        ‰ j                  dv sJ d|
› d�«       ‚|dk(  rZ‰ j                  j                  €Dt        j                   j#                  «       r&t        j                  d«       d‰ j                  _        t%        ‰ j                  j                  €dn‰ j                  j                  «      ‰ _        t'        t)        |d   |d   «      «      |   }t+        |‰ j                  |«       |dk(  rº|j,                  d k(  r+t/        d!„ |j1                  «       D «       «      rt        d"«      ‚‰ j                  j2                  s&t        j                  d#«       d$‰ j                  _        ‰ j                  j4                  s.t7        j8                  |j,                  «      ‰ j                  _        |dk(  rŸ‰ j                  j2                  s&t        j                  d%«       d$‰ j                  _        ‰ j                  j:                  s4|j,                  d&v r&t        j                  d'«       d$‰ j                  _        |j,                  d(vrt        d)«      ‚t=        |d*«      st?        «       |_         tC        |j@                  «      |_         t=        |d+«      r¶‰ j                  jD                  �‰ j                  jD                  |_"        |d,v r-d-|_"        t        j                  |jG                  «       › d.�«       |dk(  rO‰ j                  j2                  r9	 ddl$}tK        |jL                  d/d$¬0«      rd-|_"        t        j                  d1«       ‰ j                  jP                  r<‰ j                  j2                  r&t        j                  d2«       d-‰ j                  _(        ‰ j                  jP                  rD|d3k(  r?‰ j                  jR                  dk(  r&t        j                  d4«       d-‰ j                  _(        tU        ‰ j                  jV                  |jX                  d5¬6«      ‰ _+        ‰ j                  jZ                  r,|d7k7  sJ d8«       ‚‰ j                  jR                  dk(  sJ d9«       ‚|d:k(  r±‰ j                  j\                  s&t        j                  d;«       d<‰ j                  _.        ‰ j                  j\                  j                  «       ‰ j                  _.        ‰ j                  j\                  t^        v s&J d=‰ j                  j\                  › d>t^        › d�«       ‚‰ j                  j:                  rÉta        |tb        «      rJ d?«       ‚|d@k7  std        rtf        rJ dA«       ‚|	rth        sJ dB«       ‚|dCk7  sth        sJ dD«       ‚tk        |d+d-«      sta        |jl                  d   tn        «      r&t        j                  dE«       d-‰ j                  _        ‰ j                  jp                  xs dF‰ j                  _8        |dGv s‰ j                  j:                  rw‰ j                  jr                  ra‰ j                  jt                  dk(  rHt        j                  dH‰ j                  j:                  rdIndJ‰ j                  j                  › �› dK�«       |dLk(  rVtf        rtd        rtw        dM«      ‚‰ j                  jt                  dk7  r&t        j                  dN«       d‰ j                  _:        ta        |tx        «      rt        j                  dO«       d|_=        ‰ j                  j2                  rx‰ j                  j4                  sbt|        j4                  xs t~        tk        |dPdQ«         ‰ j                  _        t        j                  dR‰ j                  j4                  › d�«       |dSk(  rtd        rtf        rtw        dT«      ‚t�        j8                  dU«      r(tƒ        «       rt        j„                  dV«       d-t€        dU<   t        j†                  ‰ j                  jt                  |jˆ                  j9                  dWdX«      g‰ jV                  ¢­Ž j‹                  ‰ j                  «      }t�        tk        |dYd«      xs+ tk        |dZd«      xs |jˆ                  j9                  dZd[«      «      }|jŽ                  d\v rt�        |j\                  «      }t‘        |«      j‹                  ‰ j                  «      }|j“                  «       D ]	  }d-|_J        Œ |j—                  «        |j™                  «        |j›                  «       }|dk(  rdd]lNmO}  ||‰ jV                  «      }|d^v rdd_lPmQ}  ||«      }|d`k(  rddalRmS}  ||«      }|j1                  «       D �]Š  }ta        |t¨        «      rd$|_U        ta        |t¬        tn        f«      �r2‰ j                  jr                  |_9        d$|_U        ‰ j                  j                  |_        t¯        ˆ fdb„|jX                  j±                  «       D «       «      }t³        ‰ j                  j´                  |«      |_Z        ‰ j                  j¶                  |_[        ‰ j                  j:                  xr |dk7  |_\        d|_]        t=        |dc«      s�Œt=        |dd«      s�Œ t=        |de«      r�Œ.|j›                  |j¼                  j‹                  ‰ j                  «      «       �Œdta        |t¾        «      s�Œv|	r�Œz|jÀ                  |_a        �Œ� d}tÅ        d5«      D ]@  }‰ j                  j:                  r |dfvr tÇ        |‰ j                  «      |«      n ||«      }ŒB ‰ j                  jP                  r=|dgv r9‰ j                  jR                  dk7  r |jQ                  «       |jQ                  «       }}|‰ _d        |‰ _6        |‰ _e        ta        |t        jÌ                  «      rt        |jº                  «      nt        dh„ |D «       «      ‰ _g        t�        ‰ jl                  jˆ                  j9                  dZ‰ jÊ                  «      «      jÐ                  jÓ                  didj«      ‰ _j        t=        |dk«      r)ta        |j                  t&        «      r|j                  dl   nd[}dm‰ jÔ                  › dn|rdo|› �nd[› �}|dpt×        jØ                  «       jÛ                  «       tL        dqdrtÝ        tß        |jX                  «      «      |j,                  ‰ j                  jt                  ‰ jV                  |j@                  ‰ j                  D ��ci c]  \  }}||v sŒ||“Œ c}}|jˆ                  j9                  dWdX«      tk        |d+d-«      dsœ‰ _p        ‰ j                  �‰ j                  ‰ jà                  d<   |j,                  dtk(  rK|jl                  d   jâ                  ‰ jà                  du<   t=        |dv«      r|jä                  ‰ jà                  dv<   t        j„                  dwtç        dx«      › dy|› dzt        |jº                  «      › d{‰ jÎ                  › d|té        |«      d}›d~�«       ‰ jë                  d«       |	r°‰ j                  xj2                  |dLk(  z  c_        ‰ jí                  «       \  }}|d€v r‰ jï                  |¬�«      }|d@k(  r‰ jñ                  «       }|dLk(  r5‰ jó                  t�        |«      ‰ jÊ                  jÐ                  › d‚�z  ¬ƒ«      }|dSk(  r%‰ jõ                  «       }n tk        ‰ d„|› �«      «       }|�r:‰ jV                  d   ‰ jV                  d   k(  }|rd[n%d…‰ jV                  › d†tß        ‰ jV                  «      › d‡�}|r‰ jV                  d   n't        ‰ jV                  «      dd jÓ                  dˆd[«      }‰ j                  j2                  rd‰n‰ j                  jP                  rdŠnd[} t        j„                  d‹t        j                   «       |z
  d}›dŒtç        d�|jö                  jù                  «       «      › dŽ|j,                  › d�|› d�|› dˆ| › d‘|j,                  › d�|› d�|› d’|› dˆ| › dˆ|› d“�«       ‰ jë                  d”«       |S # tN        $ r Y �ŒOw xY wc c}}w )•z¯Export a model and return the final exported path as a string.

        Returns:
            (str): Path to the exported file or directory (the last export artifact).
        >   ÚtrtÚtensorrtrQ   >   ÚiosÚapplerT   ÚmlmodelÚ	mlpackageÚ	mlprogramrT   rv   r‚   Nr   g333333ã?)ÚnÚcutoffÚptz#Model is already in PyTorch format.zInvalid export format='z'.z Valid formats are z', updating to format='r„   >   rY   r]   r[   r\   rV   z>TensorRT requires GPU export, automatically assigning device=0Ú0Údlaú:éÿÿÿÿ>   r»   Ú1z,Expected device 'dla:0' or 'dla:1', but got ú.ri   zTExporting on CPU while CUDA is available, setting device=0 for faster export on GPU.Úcpurz   rr   Úsegmentc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N)r•   r   )Ú.0Úms     r~   ú	<genexpr>z$Exporter.__call__.<locals>.<genexpr>>  s   è ø€ Ò.aÈA¬z¸!¼Y×/GÑ.aùs   ‚zEAxelera export does not currently support YOLO26 segmentation models.z5Setting int8=True for Axelera mixed-precision export.Tz1IMX export requires int8=True, setting int8=True.>   ÚposeÚdetectrÂ   z/IMX export requires nms=True, setting nms=True.>   rÈ   rÉ   rÂ   ÚclassifyzbIMX export only supported for detection, pose estimation, classification, and segmentation models.ÚnamesÚend2end>   ri   rf   rl   r`   r\   rp   FzB export does not support end2end models, disabling end2end branch.z<=10.3.0)ÚhardzTTensorRT<=10.3.0 with int8 has known end2end build issues, disabling end2end branch.zChalf=True and int8=True are mutually exclusive, setting half=False.r?   zahalf=True only compatible with GPU export for TorchScript, i.e. use device=0, setting half=False.é   )ÚstrideÚmin_dimrf   zHoptimize=True not compatible with format='ncnn', i.e. use optimize=FalsezEoptimize=True not compatible with cuda devices, i.e. use device='cpu'rl   zcRockchip RKNN export requires a missing 'name' arg for processor type. Using default name='rk3588'.Úrk3588zInvalid processor name 'z,' for Rockchip RKNN export. Valid names are z2'nms=True' is not valid for classification models.r[   z1TFLite export with NMS unsupported on ARM64 Linuxz/TensorFlow exports with NMS require torch>=1.13rG   z)ONNX export with NMS requires torch>=1.13zD'nms=True' is not available for end2end models. Forcing 'nms=False'.g      Ð?>   rT   rQ   z'dynamic=True' model with 'znms=Truezformat=z*' requires max batch size, i.e. 'batch=16'r\   z_Edge TPU export only supported on non-aarch64 Linux. See https://coral.ai/docs/edgetpu/compilerz7Edge TPU export requires batch size 1, setting batch=1.a   YOLOWorld (original version) export is not supported to any format. YOLOWorldv2 models (i.e. 'yolov8s-worldv2.pt') only support export to (torchscript, onnx, openvino, engine, coreml) formats. See https://docs.ultralytics.com/models/yolo-world for details.ÚtaskrÉ   zOINT8 export requires a missing 'data' arg for calibration. Using default 'data=r]   z8TF.js exports are not currently supported on ARM64 LinuxÚopenvino_msgu�   ðŸ’¡ ProTip: Export to OpenVINO format for best performance on Intel hardware. Learn more at https://docs.ultralytics.com/integrations/openvino/Úchannelsé   Úpt_pathÚ	yaml_fileÚ >   ú.ymlú.yaml)ÚFXModel>   r[   r\   )Ú
tf_wrapperrp   )Úexecutorch_wrapperc              3  óŒ   •K  — | ];  }t        ‰j                  d    |z  «      t        ‰j                  d   |z  «      z  –— Œ= y­w)r   r‚   N)ÚintÚimgsz)rÅ   Úsr«   s     €r~   rÇ   z$Exporter.__call__.<locals>.<genexpr>Ï  s;   øè ø€ ÒmÐRSœc $§*¡*¨Q¡-°!Ñ"3Ó4´s¸4¿:¹:Àa¹=È1Ñ;LÓ7MÕMÑmùs   ƒAAÚpeÚfuseÚlrpc>   ri   rT   >   rG   r?   c              3  ó~   K  — | ]5  }t        t        |t        j                  «      r|j                  ng «      –— Œ7 y ­wrÄ   )Útupler•   ÚtorchÚTensorÚshape)rÅ   r}   s     r~   rÇ   z$Exporter.__call__.<locals>.<genexpr>ç  s)   è ø€ ÒXÐQR”u¬
°1´e·l±lÔ(C˜QŸWšWÈ×LÑXùs   ‚;=ÚyoloÚYOLOr›   rt   zUltralytics z model ztrained on ÚUltralyticsz2AGPL-3.0 License (https://ultralytics.com/license)zhttps://docs.ultralytics.com)ÚdescriptionÚauthorÚdateÚversionÚlicenseÚdocsrÏ   rÒ   rA   rà   rË   r›   rÔ   rÌ   rÈ   Ú	kpt_shapeÚ	kpt_namesú
zPyTorch:z starting from 'z' with input shape z BCHW and output shape(s) z (r“   r”   Úon_export_start>   rY   r]   )Úkeras_modelz_full_integer_quant.tflite)Útflite_modelÚexport_u>   WARNING âš ï¸� non-PyTorch val requires square images, 'imgsz=z#' will not work. Use export 'imgsz=z' if val is required.ú rN   rC   z
Export complete (zs)
Results saved to Úboldz$
Predict:         yolo predict task=z model=z imgsz=z 
Validate:        yolo val task=z data=z$
Visualize:       https://netron.appÚon_export_end)}Útimer›   r†   Úlowerr   ræ   ÚdifflibÚget_close_matchesÚ
ValueErrorr   Úwarningr¼   rƒ   r–   Úrsplitrç   ÚcudaÚis_availabler:   r{   r|   rŽ   rÒ   ÚanyÚmodulesrN   rt   r	   ÚgetrD   Úhasattrr   rË   r   rÌ   Úupperr²   r-   r   ÚImportErrorrC   Útyper+   rà   rÏ   rB   rn   r"   r•   r   r   r   r5   r…   Úmodelr   ÚconfrE   rA   ÚSystemErrorr   Ú
clip_modelr   r
   r#   r.   r—   ÚzerosÚyamlÚtor   Úsuffixr   Ú
parametersÚrequires_gradÚevalÚfloatrã   Úultralytics.utils.export.imxrÛ   Ú#ultralytics.utils.export.tensorflowrÜ   Ú#ultralytics.utils.export.executorchrÝ   r   Úexportr   ÚsumÚtolistÚminÚmax_detÚagnostic_nmsÚxyxyré   râ   r   Úforward_splitÚforwardÚrangeÚNMSModelÚimÚfilerè   Úoutput_shapeÚstemÚreplaceÚpretty_namer   ÚnowÚ	isoformatrß   ÚmaxÚmetadataró   rô   r(   r/   Úrun_callbacksÚexport_saved_modelÚ	export_pbÚexport_tfliteÚexport_edgetpuÚexport_tfjsÚparentÚresolve)!r«   r  r˜   ÚfmtÚ	fmts_dictÚfmtsrÿ   ÚmatchesÚmsgÚis_tf_formatÚ
device_strÚfmt_keysr±   r'  r(  ÚprÛ   rÜ   rÝ   rÆ   ÚanchorsÚyÚ_rt   rí   ÚkÚvrž   r÷   Úsquarerá   rà   Úqs!   `                                r~   Ú__call__zExporter.__call__  sÃ  ø€ ô �I‰I‹KˆØ�i‰i×Ñ×$Ñ$Ó&ˆØÐ%Ñ%ØˆCØÐQÑQØˆCÜ"Ó$ˆ	Ü�Y˜zÑ*¨1¨2Ð.Ó/ˆØ�d‰?Ûð ×/Ñ/°°T¸QÀsÐ/ÓKˆGÙØ?BÀdº{Ñ;ÐRiÐjmÐinÐnpÐPq�Ü  C 5Ð(;¸D¸6Ð!BÓCÐCÜ�N‰NÐ4°S°EÐ9PÐQXÐYZÑQ[ÐP\Ð\]Ð^Ô_Ø˜!‘*ˆCØÐPÐPˆð ˆŒØ�(Š?˜tŸy™y×/Ñ/Ð7Ü�N‰NÐ[Ô\Ø"ˆD�I‰IÔØ�(Š?˜u¬¨D¯I©I×,<Ñ,<Ó(=Ñ=Ü˜TŸY™Y×-Ñ-Ó.ˆJØ!×(Ñ(¨¨aÓ0°Ñ4ˆDŒHØ"ˆD�I‰IÔØ—8‘8˜zÑ)ÐgÐ-YÐZdÐYeÐefÐ+gÓgÐ)Ø�%Š<˜DŸI™I×,Ñ,Ð4¼¿¹×9PÑ9PÔ9RÜ�N‰NÐqÔrØ"ˆD�I‰IÔÜ#¨T¯Y©Y×-=Ñ-=Ð-E¡EÈ4Ï9É9×K[ÑK[Ó\ˆŒô œ˜I jÑ1°9¸[Ñ3IÓJÓKÈCÑPˆÜ�c˜4Ÿ9™9 hÔ/Ø�)ÒØ�z‰z˜YÒ&¬3Ñ.aÐQV×Q^ÑQ^ÓQ`Ô.aÔ+aÜ Ð!hÓiÐiØ—9‘9—>’>Ü—‘ÐVÔWØ!%�—	‘	”Ø—9‘9—>’>Ü!5×!9Ñ!9¸%¿*¹*Ó!E�—	‘	”Ø�%Š<Ø—9‘9—>’>Ü—‘ÐRÔSØ!%�—	‘	”Ø—9‘9—=’= U§Z¡ZÐ3PÑ%PÜ—‘ÐPÔQØ $�—	‘	”Ø�z‰zÐ!JÑJÜ Øxóð ô �u˜gÔ&Ü-Ó/ˆEŒKÜ'¨¯©Ó4ˆŒÜ�5˜)Ô$Ø�y‰y× Ñ Ð,Ø $§	¡	× 1Ñ 1�”ØÐPÑPà %�”Ü—‘ #§)¡)£+ Ð.pÐqÔrØ�hŠ 4§9¡9§>¢>ð	Û*ä$ S§_¡_°jÀtÕLØ(-˜œÜŸ™Ørôð
 �9‰9�>Š>˜dŸi™iŸnšnÜ�N‰NÐ`ÔaØ"ˆD�I‰IŒNØ�9‰9�>Š>˜c ]Ò2°t·{±{×7GÑ7GÈ5Ò7PÜ�N‰NØsôð #ˆD�I‰IŒNÜ  §¡§¡¸¿¹ÈqÔQˆŒ
Ø�9‰9×ÒØ˜&’=ÐlÐ"lÓl�=Ø—;‘;×#Ñ# uÒ,ÐuÐ.uÓuÐ,Ø�&Š=Ø—9‘9—>’>Ü—‘ð3ôð "*�—	‘	”Ø!ŸY™YŸ^™^×1Ñ1Ó3ˆD�I‰IŒNØ—9‘9—>‘>¤ZÑ/ð Ø*¨4¯9©9¯>©>Ð*:Ð:fÔgqÐfrÐrsÐtóÐ/ð �9‰9�=Š=Ü! %Ô)<Ô=ÐsÐ?sÓsÐ=Ø˜(’?­%µuÐqÐ>qÓqÐ<Ù#¥zÐdÐ3dÓdÐ1Ø˜&’=¥JÐ[Ð0[Ó[Ð.Ü�u˜i¨Ô/´:¸e¿k¹kÈ"¹oÌ}Ô3]Ü—‘ÐeÔfØ %�—	‘	”Ø!ŸY™YŸ^™^Ò3¨tˆD�I‰IŒNØÐ'Ñ'¨4¯9©9¯=ª=¸d¿i¹i×>OÒ>OÐTX×T]ÑT]×TcÑTcÐghÒThÜ�N‰NØ-¸D¿I¹I¿MºM©jÐQXÐY]×YbÑYb×YiÑYiÐXjÐOkÐ-lð  mWð  Xôð �)ÒÝ�EÜ!Øuóð ð —‘—‘ AÒ%Ü—‘ÐXÔYØ"#�—	‘	”Ü�eœZÔ(Ü�N‰NðRôð  $ˆEÔØ�9‰9�>Š> $§)¡)§.¢.Ü(×-Ñ-Ò\´¼7À5È&ÐRZÓ;[Ñ1\ˆD�I‰IŒNÜ�N‰NØaÐbf×bkÑbk×bpÑbpÐaqÐqsÐtôð �&Š=�U¥uÜÐXÓYÐYä�<‰<˜Ô'ÜŒzÜ—‘ðYôð (-ŒH�^Ñ$ô �[‰[˜Ÿ™Ÿ™¨%¯*©*¯.©.¸ÀQÓ*GÐUÈ$Ï*É*ÒU×XÑXÐY]×YdÑYdÓeˆÜÜ�E˜9 dÓ+Òs¬w°u¸kÈ4Ó/PÒsÐTY×T^ÑT^×TbÑTbÐcnÐprÓTsó
ˆð �;‰;Ð+Ñ+Ü˜Ÿ	™	“?ˆDô ˜“×"Ñ" 4§;¡;Ó/ˆØ×!Ñ!Ó#ò 	$ˆAØ#ˆA�Oð	$à�
‰
ŒØ�‰ŒØ—
‘
“ˆà�%Š<Ý<á˜E 4§:¡:Ó.ˆEØÐ'Ñ'ÝFá˜uÓ%ˆEØ�,ÒÝNá& uÓ-ˆEØ—‘“ó 	,ˆAÜ˜!œXÔ&Ø�”Ü˜!œf¤mÐ4Õ5Ø ŸI™I×-Ñ-�”	Ø�”ØŸ9™9×+Ñ+�”äÓmÐW\×WcÑWc×WjÑWjÓWlÔmÓm�Ü §	¡	× 1Ñ 1°7Ó;�”	Ø!%§¡×!7Ñ!7�”ØŸ™Ÿ™Ò:¨3°(©?�”Ø�”Ü˜5 $Ö'¬G°A°vÖ,>ÄwÈqÐRXÖGYØ—F‘F˜5Ÿ8™8Ÿ;™; t§{¡{Ó3Ö4Ü˜AœsÖ#«LàŸO™O�–	ð#	,ð& ˆÜ�q“ò 	pˆAØ26·)±)·-²-ÀCÐO`ÑD`Ð*”˜ §	¡	Ó*¨2Ô.ÑfkÐlnÓfo‰Að	pà�9‰9�>Š>˜cÐ%<Ñ<ÀÇÁ×AQÑAQÐUZÒAZØŸ™›	 5§:¡:£<�ˆBð ˆŒØˆŒ
ØˆŒ	ô ˜!œUŸ\™\Ô*ô �!—'‘'ŒNäÑXÐVWÔXÓXð 	Ôô
   §
¡
§¡× 3Ñ 3°KÀÇÁÓ KÓL×QÑQ×YÑYÐZ`ÐbhÓiˆÔÜ%,¨U°FÔ%;Ä
È5Ï:É:ÔW[Ô@\ˆu�z‰z˜&Ò!ÐbdˆØ$ T×%5Ñ%5Ð$6°gÑVZÀÈDÈ6Ñ>RÐ`bÐ=cÐdˆà&Ø#Ü—L‘L“N×,Ñ,Ó.Ü"ØKØ2Üœ#˜eŸl™lÓ+Ó,Ø—J‘JØ—Y‘Y—_‘_Ø—Z‘ZØ—[‘[Ø&*§i¡i×A™d˜a °1¸²=�Q˜‘TÓAØŸ
™
Ÿ™ z°1Ó5Ü˜u i°Ó7ñ
ˆŒð  �8‰8ÐØ#'§8¡8ˆD�M‰M˜%Ñ Ø�:‰:˜ÒØ).¯©°R©×)BÑ)BˆD�M‰M˜+Ñ&Ü�u˜kÔ*Ø-2¯_©_�—‘˜kÑ*ä�‰Ø”˜*Ó%Ð&Ð&6°t°fÐ<OÔPUÐVX×V^ÑV^ÓP_ÐO`ð aØ#×0Ñ0Ð1°´I¸d³OÀCÐ3HÈðNô	
ð 	×ÑÐ,Ô-ñ Ø�I‰I�NŠN˜c YÑ.Ñ.�NØ!×4Ñ4Ó6‰NˆAˆ{Ø�nÑ$Ø—N‘N¨{�NÓ;�Ø�hŠØ×&Ñ&Ó(�Ø�iÒØ×'Ñ'´T¸!³WÀ$Ç)Á)Ç.Á.ÐAQÐQkÐ?lÑ5lÐ'Óm�Ø�fŠ}Ø×$Ñ$Ó&‘à.”˜ ¨ u˜oÓ.Ó0ˆAò Ø—Z‘Z ‘] d§j¡j°¡mÑ3ˆFñ ñ àUÐVZ×V`ÑV`ÐUað b+Ü+.¨t¯z©z«?Ð*;Ð;PðRð ñ &,�D—J‘J˜q’M´°T·Z±Z³ÀÀ2Ð1F×1NÑ1NÈsÐTVÓ1WˆEØŸ)™)Ÿ.š.‘¸¿	¹	¿º©fÈBˆAÜ�K‰KØ%¤d§i¡i£k°A¡o°cÐ%:ð ;&Ü&.¨v°t·{±{×7JÑ7JÓ7LÓ&MÐ%NØ7¸¿
¹
°|À7È1È#ÈWÐUZÐT[Ð[\Ð]^Ð\_Ø3°E·J±J°<¸wÀqÀcÈÐQVÐPWÐW]Ð^bÐ]cÐcdÐefÐdgÐghÐijÐhkØ7ð	9ôð 	×Ñ˜?Ô+ØˆøôO #ò Úðüóf Bs%   Ò8AH ûAHûAHÁH	AHÁHAHrØ   c           	     ó\  — t        j                  |› d| j                  j                  › d�«        | j                  j
                  dk(  rt        nt        | j                  j                  «      }t        || j                  j                  xs d   || j                  j                  | j                  j
                  t        | j                  «      d| j                  j                  ¬«      }t        |j                  j                  d   d«      r(| j                  |j                  j                  d   _        t#        |«      }|d	k  rt%        d
|› d�«      ‚t'        | j                  j                  |«      }|| j                  j                  k  rt        j(                  |› d|› d|› d�«       | j                  j*                  dk(  r!|dk  rt        j(                  |› d|› d�«       n9| j                  j*                  dk7  r |dk  rt        j(                  |› d|› d�«       t-        ||dd¬«      S )z=Build and return a dataloader for calibration of INT8 models.z/ collecting INT8 calibration images from 'data=r„   rÊ   ÚvalF)rt   rO   rÒ   rà   ÚaugmentÚ
batch_sizer   Ú	new_shaper‚   z>The calibration dataset must have at least 1 image, but found z images.z calibration dataset has only z, images, reducing calibration batch size to rÀ   rr   éd   z5 >100 images required for Axelera calibration, found i,  z5 >300 images recommended for INT8 calibration, found T)rA   ÚworkersÚ	drop_last)r   r—   r›   rt   r  rÒ   r   r   r   ÚsplitrO   r/  rà   rA   r	  Ú
transformsrN  Úlenr  r  r  r†   r   )r«   r‘   rt   Údatasetr¸   rA   s         r~   Úget_int8_calibration_dataloaderz(Exporter.get_int8_calibration_dataloader.  sÏ  € ä�‰�v�hÐMÈdÏiÉiÏnÉnÐM]Ð]^Ð_Ô`ØY T§Z¡Z§_¡_¸
Ò%BÕ!ÔHYÐ[_×[dÑ[d×[iÑ[iÓjˆÜØ�—‘—‘Ò) EÑ*ØØ—Y‘Y×'Ñ'Ø—‘—‘Ü�d—j‘j“/ØØ—y‘y—‘ô
ˆô �7×%Ñ%×0Ñ0°Ñ3°[ÔAØ9=¿¹ˆG×Ñ×)Ñ)¨!Ñ,Ô6Ü�‹LˆØˆqŠ5ÜÐ]Ð^_Ð]`Ð`hÐiÓjÐjÜ�D—I‘I—O‘O QÓ'ˆØˆt�y‰y�‰ÒÜ�N‰NØ�(Ð8¸¸Ð;gÐhmÐgnÐnoÐpôð �9‰9×Ñ˜yÒ(¨Q°ªWÜ�N‰N˜f˜XÐ%ZÐ[\ÐZ]Ð]eÐfÕgØ�Y‰Y×Ñ Ò*¨q°3ªwÜ�N‰N˜f˜XÐ%ZÐ[\ÐZ]Ð]eÐfÔgÜ ¨u¸aÈ4ÔPÐPr€   zTorchScript:c                ó,  — ddl m}  || j                  j                  r t	        | j
                  | j                  «      n| j
                  | j                  | j                  j                  d«      | j                  j                  | j                  |¬«      S )z(Export YOLO model to TorchScript format.r   )Útorch2torchscriptr@   )r  r'  Úoutput_filerB   r0  r‘   )Ú$ultralytics.utils.export.torchscriptrX  r›   rD   r&  r  r'  r(  Úwith_suffixrB   r0  )r«   r‘   rX  s      r~   Úexport_torchscriptzExporter.export_torchscriptK  sg   € õ 	Ká Ø59·Y±Y·]²]”(˜4Ÿ:™: t§y¡yÔ1ÈÏ
É
Ø�w‰wØŸ	™	×-Ñ-¨nÓ=Ø—Y‘Y×'Ñ'Ø—]‘]Øô
ð 	
r€   zONNX:c                óP	  — dg}| j                   j                  r*|ddt        j                  j	                  «       rdndz   gz  }t        |«       ddl}ddlm}m	} | j                   j                  xs   ||d	| j                  j                  v ¬
«      }t        j                  d|› d|j                  › d|› d�«       | j                   j                   rt"        sJ dt$        › d�«       ‚t'        | j(                  j+                  d«      «      }| j,                  j.                  dk(  rddgndg}| j                   j0                  }	|	r€dddddœi}	t3        | j,                  t4        «      rdddœ|	d<   ddddœ|	d<   n"t3        | j,                  t6        «      rdddœ|	d<   | j                   j                   r|	d   j9                  d«       | j                   j                   r;| j,                  j.                  dk(  r"|| j                   _
        d | j                   _        t;        t=        |	«      | j                   j>                  | j                   j@                  ¬!«      5   || j                   j                   r tC        | j,                  | j                   «      n| j,                  | jD                  ||dg||	xs d¬"«       ddd«       |jG                  |«      }
| j                   j                  r;	 ddl$}t        j                  |› d#|j                  › d�«       |jK                  |
«      }
| jP                  jS                  «       D ]7  \  }}|
jT                  jW                  «       }|t'        |«      c|_,        |_-        Œ9 t]        |
d%d«      d&kD  r,t        j                  |› d'|
j^                  › d(�«       d&|
_/        | j                   j>                  rd| j                   j@                  d)k(  rK| j                  j                  d*k(  r2	 dd+l0m1} t        j                  |› d,�«       |je                  |
d ¬-«      }
|jg                  |
|«       |S # 1 sw Y   �ŒŠxY w# tL        $ r%}t        jN                  |› d$|› �«       Y d}~�ŒTd}~ww xY w# tL        $ r$}t        jN                  |› d.|› �«       Y d}~Œzd}~ww xY w)/z!Export YOLO model to ONNX format.zonnx>=1.12.0,<2.0.0zonnxslim>=0.1.71Úonnxruntimez-gpurØ   r   N)Úbest_onnx_opsetÚ
torch2onnxr  )r  rõ   z starting export with onnx z opset ú...z:'nms=True' ONNX export requires torch>=1.13 (found torch==ú)rH   rÂ   Úoutput0Úoutput1ÚimagesrA   ÚheightÚwidth)r   rÎ   rÕ   rB  )r   rÎ   Úmask_heightÚ
mask_widthrÎ   ÚobbT)rE   rC   r9  )rI   Úinput_namesÚoutput_namesrE   z slimming with onnxslim z simplifier failure: Ú
ir_versioné
   z limiting IR version z' to 10 for ONNXRuntime compatibility...rG   rÁ   )Úfloat16z converting to FP16...)Úkeep_io_typesz FP16 conversion failure: )4r›   rJ   rç   r  r  r,   rG   Úultralytics.utils.export.enginer_  r`  rI   rƒ   r  r   r—   r   rD   r5   r$   r–   r(  r[  r  rÒ   rE   r•   r   r   Úpopr3   ÚboolrC   r†   r&  r'  ÚloadÚonnxslimÚslimr™   r  r0  ÚitemsÚmetadata_propsÚaddÚkeyÚvaluer…   rm  Úonnxruntime.transformersro  Úconvert_float_to_float16Úsave)r«   r‘   ÚrequirementsrG   r_  r`  rI   rž   rl  rE   Ú
model_onnxru  r¡   rE  rF  Úmetaro  s                    r~   Úexport_onnxzExporter.export_onnxY  sí  € ð .Ð.ˆØ�9‰9×ÒØÐ/°ÌEÏJÉJ×LcÑLcÔLeÁ&ÐkmÑ1nÐoÑoˆLÜ˜<Ô(ÛçOà—	‘	—‘ÒY¡?°4¸fÈÏÉ×HXÑHXÐ>XÔ#YˆÜ�‰�b˜˜Ð ;¸D×<LÑ<LÐ;MÈWÐUZÐT[Ð[^Ð_Ô`Ø�9‰9�=Š=ÝÐlÐ![Ô\iÐ[jÐjkÐlÓl�:ä�—	‘	×%Ñ% gÓ.Ó/ˆØ15·±·±ÀIÒ1M˜	 9Ñ-ÐT]ÐS^ˆØ—)‘)×#Ñ#ˆÙØ W°¸gÑ!FÐGˆGÜ˜$Ÿ*™*Ô&7Ô8Ø)0°YÑ%?�˜	Ñ"Ø)0°]À|Ñ%T�˜	Ò"Ü˜DŸJ™J¬Ô7Ø)0°YÑ%?�˜	Ñ"Ø�y‰y�}Š}Ø˜	Ñ"×&Ñ& qÔ)Ø�9‰9�=Š=˜TŸZ™ZŸ_™_°Ò5Ø#ˆD�I‰IŒOØ!%ˆD�I‰IÔä¤$ w£-°d·i±i·n±nÈ$Ï)É)×JZÑJZÔ[ñ 		ÙØ37·9±9·=²=”˜Ÿ™ T§Y¡YÔ/ÀdÇjÁjØ—‘ØØØ%˜JØ)Øš 4õ÷		ð —Y‘Y˜q“\ˆ
ð �9‰9×ÒðDÛä—‘˜v˜hÐ&>¸x×?SÑ?SÐ>TÐTWÐXÔYØ%Ÿ]™]¨:Ó6�
ð —M‘M×'Ñ'Ó)ò 	-‰DˆAˆqØ×,Ñ,×0Ñ0Ó2ˆDØ#$¤c¨!£fÐ ˆDŒH�d•jð	-ô
 �:˜|¨QÓ/°"Ò4Ü�K‰K˜6˜(Ð"7¸
×8MÑ8MÐ7NÐNuÐvÔwØ$&ˆJÔ!ð �9‰9�>Š>˜dŸi™i×.Ñ.°&Ò8¸T¿[¹[×=MÑ=MÐQVÒ=VðIÝ<ä—‘˜v˜hÐ&<Ð=Ô>Ø$×=Ñ=¸jÐX\Ð=Ó]�
ð 	�	‰	�*˜aÔ Øˆ÷]		ñ 		ûô, ò DÜ—‘ & Ð)>¸q¸cÐB×CÒCûðDûô( ò IÜ—‘ & Ð)CÀAÀ3ÐG×HÑHûðIús=   ÉAP:Ë":Q Ï51Q8 Ð:QÑ	Q5ÑQ0Ñ0Q5Ñ8	R%ÒR Ò R%z	OpenVINO:c           
     ó  ‡ ‡— ddl m} t        t        rt        dk\  rdnd«       ddlŠt        sJ dt        › d�«       ‚ˆˆ fd	„}d
\  }}‰ j                  j                  ræt        d«       t        t        sdnd«       ddl}|j                  ‰ j                  |«      ‰ j                  «      }t        ‰ j                   j                   d   t"        «      rrdj%                  t'        ‰ j                   j)                  «       «      d   d   j+                  d«      dd «      }|j-                  d|› d�d|› d�d|› d�d|› d�gdg¬«      } |‰ j                  j.                  r t1        ‰ j                   ‰ j                  «      n‰ j                   ‰ j2                  ‰ j                  j4                  ‰ j                  j6                  ‰ j                  j                  |||¬«      }d‰ j                  j                  rdnd› dt8        j:                  › �}	t=        ‰ j>                  «      jA                  ‰ j>                  jB                  |	«      }
t=        tE        |
«      ‰ j>                  jG                  d«      jH                  z  «      } |||«       |
S )z%Export YOLO model to OpenVINO format.r   )Útorch2openvinoz15.4zopenvino>=2025.2.0zopenvino>=2024.0.0Nz/OpenVINO export requires torch>=2.1 but torch==ú is installedc           	     óÀ  •— | j                  dddg«       | j                  dddg«       | j                  dddg«       | j                  dgdd	g«       | j                  ‰j                  j                  dd
g«       | j                  ‰j                  j                  j                  «       D �cg c]  }|j                  dd«      ‘Œ c}ddg«       ‰j                  j                  dk7  r| j                  dddg«       ‰j                  | |‰j                  j                  ¬«       t        j                  t        |«      j                  dz  ‰j                  «       yc c}w )z/Set RT info, serialize, and save metadata YAML.rë   Ú
model_infoÚ
model_typeTÚreverse_input_channelsér   Ú	pad_valueç     ào@Úscale_valuesÚiou_thresholdrú   rD  ÚlabelsrÊ   Úfit_to_window_letterboxÚresize_type)Úcompress_to_fp16úmetadata.yamlN)Úset_rt_infor›   Úiour  rË   Úvaluesr+  rÒ   Ú
save_modelrC   r&   r~  r   r7  r0  )Úov_modelr(  rF  Úovr«   s      €€r~   Ú	serializez+Exporter.export_openvino.<locals>.serialize´  s  ø€ à× Ñ  ¨,¸Ð)EÔFØ× Ñ  ¨Ð6NÐ'OÔPØ× Ñ   |°[Ð&AÔBØ× Ñ  % ¨<¸Ð*HÔIØ× Ñ  §¡§¡°¸Ð0OÔPØ× Ñ ¸t¿z¹z×?OÑ?O×?VÑ?VÓ?XÖ!Y¸! !§)¡)¨C°Õ"5Ò!YÐ\hÐjrÐ[sÔtØ�z‰z�‰ *Ò,Ø×$Ñ$Ð%>ÀÈ}Ð@]Ô^à�M‰M˜( D¸4¿9¹9¿>¹>ˆMÔJÜ�I‰I”d˜4“j×'Ñ'¨/Ñ9¸4¿=¹=ÕIùò "Zs   Â,E)NNzpackaging>=23.2znncf>=2.14.0,<3.0.0znncf>=2.14.0r¾   rÀ   rÎ   z.*z/.*/Addz/.*/Sub*z/.*/Mul*z/.*/Div*ÚSigmoid)ÚpatternsÚtypes)r  r'  rE   rC   rN   Úcalibration_datasetÚignored_scoper‘   rD  Úint8_rØ   Úopenvino_modelz.xml)%Ú!ultralytics.utils.export.openvinor„  r,   r    r!   rL   r6   r$   r›   rN   r7   ÚnncfÚDatasetrV  Ú_transform_fnr•   r  r   ÚjoinÚlistÚnamed_modulesrR  ÚIgnoredScoperD   r&  r'  rE   rC   ÚosÚsepr–   r(  r+  r  r   r[  rn   )r«   r‘   r„  rš  rž  rŸ  r£  Úhead_module_namer˜  r  rž   Úf_ovr™  s   `           @r~   Úexport_openvinozExporter.export_openvino©  s*  ù€ õ 	Eô 	µ5¼]ÈfÒ=TÑ/ÐZnÔoÛåÐhÐKÌMÈ?ÐZgÐhÓhˆyõ	Jð .8Ñ*Ð˜]Ø�9‰9�>Š>ÜÐ0Ô1Ü½IÑ4È>ÔZÛà"&§,¡,¨t×/SÑ/SÐTZÓ/[Ð]a×]oÑ]oÓ"pÐÜ˜$Ÿ*™*×*Ñ*¨2Ñ.´Ô7à#&§8¡8¬D°·±×1IÑ1IÓ1KÓ,LÈRÑ,PÐQRÑ,S×,YÑ,YÐZ]Ó,^Ð_aÐ`aÐ,bÓ#cÐ Ø $× 1Ñ 1àÐ-Ð.¨gÐ6ØÐ-Ð.¨hÐ7ØÐ-Ð.¨hÐ7ØÐ-Ð.¨hÐ7ð	ð %˜+ð !2ó !�ñ "Ø59·Y±Y·]²]”(˜4Ÿ:™: t§y¡yÔ1ÈÏ
É
Ø�w‰wØ—I‘I×%Ñ%Ø—‘—‘Ø—‘—‘Ø 3Ø'Øô	
ˆð  §	¡	§¢‘W°BÐ7°~ÄbÇfÁfÀXÐNˆÜ�—	‘	‹N×"Ñ" 4§9¡9×#3Ñ#3°VÓ<ˆÜ”4˜“7˜TŸY™Y×2Ñ2°6Ó:×?Ñ?Ñ?Ó@ˆá�(˜DÔ!Øˆr€   zPaddlePaddle:c           	     óô   — ddl m}  || j                  | j                  t	        | j
                  «      j                  | j
                  j                  dt        j                  › �«      | j                  |¬«      S )z)Export YOLO model to PaddlePaddle format.r   )Útorch2paddlera   ©r  r'  Ú
output_dirr0  r‘   )Úultralytics.utils.export.paddler°  r  r'  r–   r(  r+  r  rª  r«  r0  )r«   r‘   r°  s      r~   Úexport_paddlezExporter.export_paddleè  s]   € õ 	AáØ—*‘*Ø�w‰wÜ˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>À-ÔPR×PVÑPVÈxÐ@XÓYØ—]‘]Øô
ð 	
r€   zMNN:c                óÜ   — ddl m}  || j                  «       | j                  j	                  d«      | j
                  j                  | j
                  j                  | j                  |¬«      S )zIExport YOLO model to MNN format using MNN https://github.com/alibaba/MNN.r   )Úonnx2mnnrd   )Ú	onnx_filerY  rC   rN   r0  r‘   )	Úultralytics.utils.export.mnnr¶  r‚  r(  r[  r›   rC   rN   r0  )r«   r‘   r¶  s      r~   Ú
export_mnnzExporter.export_mnnõ  sR   € õ 	:áØ×&Ñ&Ó(ØŸ	™	×-Ñ-¨fÓ5Ø—‘—‘Ø—‘—‘Ø—]‘]Øô
ð 	
r€   zNCNN:c           	     ó  — ddl m}  || j                  | j                  t	        | j
                  «      j                  | j
                  j                  d«      | j                  j                  | j                  | j                  |¬«      S )zIExport YOLO model to NCNN format using PNNX https://github.com/pnnx/pnnx.r   )Ú
torch2ncnnz_ncnn_model/)r  r'  r²  rC   r0  rƒ   r‘   )Úultralytics.utils.export.ncnnr»  r  r'  r–   r(  r+  r  r›   rC   r0  rƒ   )r«   r‘   r»  s      r~   Úexport_ncnnzExporter.export_ncnn  s`   € õ 	=áØ—*‘*Ø�w‰wÜ˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>ÀÓOØ—‘—‘Ø—]‘]Ø—;‘;Øô
ð 	
r€   zCoreML:c                óR	  — | j                   j                  j                  «       dk(  }ddlm}m}m} t        ddg«       ddl}t        rJ d«       ‚t        sJ d«       ‚| j                   j                  d	kD  r| j                   j                  sJ d
«       ‚| j                   j                  r=| j                   j                  rJ d«       ‚| j                  j                  dk7  sJ d«       ‚| j                   j#                  |rdnd«      }|j%                  «       rt'        j(                  |«       | j                  j                  dk(  rC| j                   j                  r  || j                  | j*                  | ¬«      n| j                  }n:| j                   j                  rt-        j.                  |› d�«       | j                  }| j                   j                  rÆ|j1                  |j3                  d	| j                   j                  d	¬«      | j*                  j4                  d	   |j3                  d| j6                  d   dz  | j6                  d   ¬«      |j3                  d| j6                  d	   dz  | j6                  d	   ¬«      f¬«      }	|j9                  d|	¬«      g}
n,|j;                  d| j*                  j4                  dg d¢¬«      g}
 |||
| j*                  | j                  j                  dk(  r-t=        | j                  j>                  jA                  «       «      nd|| j                   jB                  | j                   jD                  | jF                  |¬«	      }| j                   j                  rˆ| j                  j                  dk(  ro ||| jH                  |rdn|jJ                  | jF                  || j                   jL                  | j                   jN                  | j                   jP                  |¬«	      }| j                  j                  dk(  r|jR                  jU                  ddi«       	 |jW                  tY        |«      «       |S # tZ        $ rQ}t-        j.                  |› d|› d �«       |j#                  d«      }|jW                  tY        |«      «       Y d}~|S d}~ww xY w)!z#Export YOLO model to CoreML format.rµ   r   )ÚIOSDetectModelÚpipeline_coremlÚtorch2coremlzcoremltools>=9.0znumpy>=1.14.5,<=2.3.5NzHCoreML export is not supported on Windows, please run on macOS or Linux.z"CoreML export requires torch>=1.11r‚   zkbatch sizes > 1 are not supported without 'dynamic=True' for CoreML export. Please retry at 'dynamic=True'.ze'nms=True' cannot be used together with 'dynamic=True' for CoreML export. Please disable one of them.rÊ   zA'dynamic=True' is not supported for CoreML classification models.z.mlmodelrU   rÉ   )r·   zB 'nms=True' is only available for Detect models like 'yolo26n.pt'.)Úlower_boundÚupper_boundÚdefaulté    rÎ   )ré   Úimagegp?)r’   r’   r’   )ré   ÚscaleÚbias)	r  Úinputsr'  Úclassifier_namesrµ   rC   rN   r0  r‘   )Úweights_dirr0  rµ   r•  r  r!  r‘   z#com.apple.coreml.model.preview.typeÚimageClassifierz& CoreML export to *.mlpackage failed (z‚), reverting to *.mlmodel export. Known coremltools Python 3.11 and Windows bugs https://github.com/apple/coremltools/issues/1928.).r›   r†   rþ   Úultralytics.utils.export.coremlr¿  rÀ  rÁ  r,   Úcoremltoolsr%   r4   rA   rE   rD   r  rÒ   r(  r[  Úis_dirÚshutilÚrmtreer'  r   r  ÚShapeÚRangeDimré   rà   Ú
TensorTypeÚ	ImageTyper§  rË   r–  rC   rN   r0  r)  rË  r•  r  r!  Úuser_defined_metadataÚupdater~  r–   r™   )r«   r‘   rµ   r¿  rÀ  rÁ  Úctrž   r  Úinput_shaperÉ  Úct_modelr¡   s                r~   Úexport_coremlzExporter.export_coreml  sÀ  € ð —)‘)×"Ñ"×(Ñ(Ó*¨iÑ7ˆßaÑaô 	Ð.Ð0GÐHÔIÛ åÐfÐfÓfˆ{ÝÐ?Ð?Ó?ˆzØ�9‰9�?‰?˜QÒØ—9‘9×$Ò$ð Ø}óÐ$ð �9‰9×ÒØ—y‘y—}’}ð ØwóÐ$ð —:‘:—?‘? jÒ0ÐuÐ2uÓuÐ0Ø�I‰I×!Ñ!±¡*¸\ÓJˆØ�8‰8Œ:Ü�M‰M˜!Ôà�:‰:�?‰?˜hÒ&ØRV×R[ÑR[×R_ÒR_‘N 4§:¡:¨t¯w©wÀgÀ+ÕNÐei×eoÑeo‰Eà�y‰y�}Š}Ü—‘ & Ð)kÐlÔmà—J‘JˆEà�9‰9×ÒØŸ(™(à—K‘K¨A¸4¿9¹9¿?¹?ÐTU�KÓVØ—G‘G—M‘M !Ñ$Ø—K‘K¨B¸D¿J¹JÀq¹MÈAÑ<MÐW[×WaÑWaÐbcÑWd�KÓeØ—K‘K¨B¸D¿J¹JÀq¹MÈAÑ<MÐW[×WaÑWaÐbcÑWd�KÓeð	ð #ó ˆKð —m‘m G°;�mÓ?Ð@‰Fà—l‘l 7°$·'±'·-±-ÀwÒUd�lÓeÐfˆFáØØØ�w‰wØ@DÇ
Á
ÇÁÐS]Ò@]œT $§*¡*×"2Ñ"2×"9Ñ"9Ó";Ô<ÐcgØØ—‘—‘Ø—‘—‘Ø—]‘]Øô

ˆð �9‰9�=Š=˜TŸZ™ZŸ_™_°Ò8Ù&ØØ×!Ñ!Ù$+™D°×1EÑ1EØŸ™ØØ—I‘I—M‘MØ—Y‘Y—^‘^Ø!ŸY™Y×3Ñ3Øô
ˆHð �:‰:�?‰?˜jÒ(Ø×*Ñ*×1Ñ1Ð3XÐZkÐ2lÔmð	"Ø�M‰Mœ#˜a›&Ô!ð ˆøô ò 	"Ü�N‰NØ�(Ð@ÀÀð Dsð tôð —‘˜jÓ)ˆAØ�M‰Mœ#˜a›&×!Ð!Øˆûð	"ús   Ð0Q Ñ	R&ÑAR!Ò!R&z	TensorRT:c                ó�  — | j                   j                  j                  dk7  sJ d«       ‚| j                  «       }ddlm} t        |«      j                  «       s
J d|› �«       ‚| j                  j                  d«      } |||| j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                   j                  | j                   | j                  j                  r| j#                  |«      nd| j$                  | j                  j&                  |¬«       |S )	zKExport YOLO model to TensorRT format https://developer.nvidia.com/tensorrt.rÁ   z=export running on CPU but must be on GPU, i.e. use 'device=0'r   )Úonnx2enginezfailed to export ONNX file: rR   N)r¼   rU  r0  Úverboser‘   )r'  rƒ   r  r‚  rq  rÝ  r   Úexistsr(  r[  r›   Ú	workspacerC   rN   rE   ré   r¼   rV  r0  rÞ  )r«   r‘   Úf_onnxrÝ  rž   s        r~   Úexport_enginezExporter.export_engineg  s÷   € ð �w‰w�~‰~×"Ñ" eÒ+ÐlÐ-lÓlÐ+Ø×!Ñ!Ó#ˆÝ?ä�F‹|×"Ñ"Ô$ÐMÐ(DÀVÀHÐ&MÓMÐ$Ø�I‰I×!Ñ! )Ó,ˆÙØØØ�I‰I×ÑØ�I‰I�N‰NØ�I‰I�N‰NØ�I‰I×ÑØ�G‰G�M‰MØ—‘ØDHÇIÁIÇNÂN�D×8Ñ8¸Ô@ÐX\Ø—]‘]Ø—I‘I×%Ñ%Øõ	
ð ˆr€   zTensorFlow SavedModel:c                óB  — ddl m} t        t        | j                  «      j                  | j                  j                  d«      «      }|j                  «       rt        j                  |«       d}| j                  j                  rË| j                  j                  rµ| j                  |«      D �cg c]  }|d   ‘Œ	 }}t        j                  j                   j#                  t        j$                  |d«      j'                  «       | j(                  ¬«      j+                  dddd	«      j-                  «       j/                  t0        j2                  «      }t5        | j6                  j6                  d
   t8        «      rW| j                  j:                  xs d| j                  _        d| j                  j:                  cxk  rdk  sJ d«       ‚ J d«       ‚d| j                  _        | j?                  «       } |||| j                  j                  || j                  j@                  dv |¬«      }tC        jD                  |dz  | jF                  «       |jI                  d«      D ]0  }dt        |«      v r|jK                  «       n| jM                  |«       Œ2 t        |«      |fS c c}w )z2Export YOLO model to TensorFlow SavedModel format.r   )Úonnx2saved_modelrW   NÚimg)ÚsizerÎ   rÕ   r‚   r¾   é   é   z%RTDETR export requires opset>=16;<=19T>   r]   r\   )rN   re  Údisable_group_convolutionr‘   r“  z*.tflitezquant_with_int16_act.tflite)'r  rä  r   r–   r(  r+  r  rÏ  rÐ  rÑ  r›   rN   rt   rV  rç   ÚnnÚ
functionalÚinterpolateÚcatr  rà   ÚpermuteÚnumpyÚastypeÚnpÚfloat32r•   r  r   rI   rJ   r‚  r†   r&   r~  r0  ÚrglobÚunlinkÚ_add_tflite_metadata)	r«   r‘   rä  rž   re  rA   rá  r÷   r(  s	            r~   r2  zExporter.export_saved_model�  s  € õ 	Iä”�T—Y‘Y“×'Ñ'¨¯	©	×(8Ñ(8¸.ÓIÓJˆØ�8‰8Œ:Ü�M‰M˜!Ôð ˆØ�9‰9�>Š>˜dŸi™iŸnšnØ04×0TÑ0TÐU[Ó0\Ö] u�e˜E“lÐ]ˆFÐ]ä—‘×#Ñ#×/Ñ/´·	±	¸&À!Ó0D×0JÑ0JÓ0LÐSW×S]ÑS]Ð/Ó^ß‘˜˜A˜q !Ó$ß‘“ß‘œŸ
™
Ó#ð	 ô �d—j‘j×&Ñ& rÑ*¬MÔ:Ø"Ÿi™iŸo™oÒ3°ˆD�I‰IŒOØ˜Ÿ™Ÿ™Ô.¨BÒ.ÐWÐ0WÓWÑ.ÐWÐ0WÓWÐ.Ø!ˆ�	‰	ÔØ×!Ñ!Ó#ˆÙ&ØØØ—‘—‘ØØ&*§i¡i×&6Ñ&6Ð:MÐ&MØô
ˆô 	�	‰	�!�oÑ% t§}¡}Ô5à—G‘G˜JÓ'ò 	mˆDØ:¼cÀ$»iÑGˆD�K‰KŒMÈT×MfÑMfÐgkÓMlùð	mô �1‹v�{Ð"Ð"ùò7 ^s   Â/JzTensorFlow GraphDef:c                óV   — ddl m}  ||| j                  j                  d«      |¬«      S )zgExport YOLO model to TensorFlow GraphDef *.pb format https://github.com/leimao/Frozen-Graph-TensorFlow.r   )Úkeras2pbrZ   )rY  r‘   )r  r÷  r(  r[  )r«   r÷   r‘   r÷  s       r~   r3  zExporter.export_pbª  s'   € õ 	Aá˜°·±×1FÑ1FÀuÓ1MÐV\Ô]Ð]r€   zTensorFlow Lite:c                ó  — ddl }t        j                  d|› d|j                  › d�«       t	        t        | j                  «      j                  | j                  j                  d«      «      }| j                  j                  r'|| j                  j                  › d�z  }t        |«      S | j                  j                  r'|| j                  j                  › d�z  }t        |«      S || j                  j                  › d	�z  }t        |«      S )
z,Export YOLO model to TensorFlow Lite format.r   Nrõ   z! starting export with tensorflow ra  rW   z_int8.tflitez_float16.tflitez_float32.tflite)Ú
tensorflowr   r—   r   r   r–   r(  r+  r  r›   rN   r*  rC   )r«   r‘   ÚtfrV   rž   s        r~   r4  zExporter.export_tflite±  sÙ   € ó 	 ä�‰�b˜˜Ð AÀ"Ç.Á.ÐAQÐQTÐUÔVÜœ3˜tŸy™y›>×1Ñ1°$·)±)×2BÑ2BÀNÓSÓTˆØ�9‰9�>Š>Ø §¡§¡Ð 0°Ð=Ñ=ˆAô
 �1‹vˆð	 �Y‰Y�^Š^Ø §¡§¡Ð 0°Ð@Ñ@ˆAô �1‹vˆð  §¡§¡Ð 0°Ð@Ñ@ˆAÜ�1‹vˆr€   zAxelera:c           	     óZ  — t         rt        rt        rJ d«       ‚t        sJ d«       ‚ddlm} | j                  j                  | j                  j                  › d�z  } || j                  || j                  |«      | j                  | j                  j                  | j                  |¬«      S )z$Export YOLO model to Axelera format.zGexport is only supported on Linux and is not supported on ARM64 Docker.zexport requires torch>=2.8.0.r   )Útorch2axelerars   )r  r²  rž  Útransform_fnÚ
model_namer0  r‘   )r   r   r   r8   Ú ultralytics.utils.export.axelerarü  r(  r7  r*  r  rV  r¥  r0  )r«   r‘   rü  r²  s       r~   Úexport_axelerazExporter.export_axeleraÁ  s•   € õ �e­	ð 	
ØUó	
Ð2õ Ð9Ð9Ó9ˆyåBà—Y‘Y×%Ñ%¨4¯9©9¯>©>Ð*:¸.Ð(IÑIˆ
ÙØ—*‘*Ø!Ø $× DÑ DÀVÓ LØ×+Ñ+Ø—y‘y—~‘~Ø—]‘]Øô
ð 	
r€   zExecuTorch:c                óü   — t         sJ dt        › d�«       ‚ddlm}  || j                  | j
                  t        | j                  «      j                  | j                  j                  d«      | j                  |¬«      S )z-Export YOLO model to ExecuTorch *.pte format.z,ExecuTorch requires torch>=2.9.0 but torch==r…  r   )Útorch2executorchz_executorch_model/r±  )r9   r$   r  r  r  r'  r–   r(  r+  r  r0  )r«   r‘   r  s      r~   Úexport_executorchzExporter.export_executorchÖ  sg   € õ ÐeÐHÌÈÐWdÐeÓeˆyÝHáØ—*‘*Ø�w‰wÜ˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>Ð@TÓUØ—]‘]Øô
ð 	
r€   z	Edge TPU:c                ó^   — ddl m}  |||j                  |¬«      }| j                  |«       |S )zQExport YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/.r   )Útflite2edgetpu)Útflite_filer²  r‘   )r  r  r7  rõ  )r«   rø   r‘   r  rY  s        r~   r5  zExporter.export_edgetpuä  s1   € õ 	Gá$°È,×J]ÑJ]ÐflÔmˆØ×!Ñ! +Ô.ØÐr€   zTensorFlow.js:c                ó†  — ddl m}  |t        | j                  j	                  d«      «      t        | j                  «      j                  | j                  j                  d«      | j                  j                  | j                  j                  |¬«      }t        j                  t        |«      dz  | j                  «       |S )z*Export YOLO model to TensorFlow.js format.r   )Úpb2tfjsrZ   z_web_model/)Úpb_filer²  rC   rN   r‘   r“  )r  r  r–   r(  r[  r+  r  r›   rC   rN   r&   r~  r   r0  )r«   r‘   r  r²  s       r~   r6  zExporter.export_tfjsí  sˆ   € õ 	@áÜ˜Ÿ	™	×-Ñ-¨eÓ4Ó5Ü˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>ÀÓNØ—‘—‘Ø—‘—‘Øô
ˆ
ô 	�	‰	”$�zÓ" _Ñ4°d·m±mÔDØÐr€   zRKNN:c                óz  — ddl m} t        | j                  j                  xs dd«      | j                  _        | j                  «       } ||t        | j                  «      j                  | j                  j                  dt        j                  › �«      | j                  j                  | j                  |¬«      S )z!Export YOLO model to RKNN format.r   )Ú	onnx2rknnrç  rm   )r·  r²  rn   r0  r‘   )Úultralytics.utils.export.rknnr  r  r›   rI   r‚  r–   r(  r+  r  rª  r«  rn   r0  )r«   r‘   r  rá  s       r~   Úexport_rknnzExporter.export_rknnü  s†   € õ 	<ä˜dŸi™iŸo™oÒ3°°RÓ8ˆ�	‰	ŒØ×!Ñ!Ó#ˆÙØÜ˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>À+ÌbÏfÉfÈXÐ@VÓWØ—‘—‘Ø—]‘]Øô
ð 	
r€   zIMX:c                óÜ  — t         sJ d«       ‚t        sJ d«       ‚t        | j                  dd«      rt	        d«      ‚ddlm}  || j                  t        | j                  «      j                  | j                  j                  d«      | j                  j                  | j                  j                  | j                  j                  | j                  t!        | j"                  |«      |¬	«      S )
z Export YOLO model to IMX format.z–Export only supported on Linux.See https://developer.aitrios.sony-semicon.com/en/docs/raspberry-pi-ai-camera/imx500-converter?version=3.17.3&progLang=z4IMX export is only supported on Python 3.9 or above.rÌ   Fz/IMX export is not supported for end2end models.r   )Ú	torch2imxz_imx_model/)r  r²  r  r•  r   r0  rU  r‘   )r   r*   r…   r  r  r  r  r–   r(  r+  r  r›   r  r•  r   r0  r   rV  )r«   r‘   r  s      r~   Ú
export_imxzExporter.export_imx  s¼   € õ ð 	
ðFó	
ˆuõ %Ð\Ð&\Ó\Ð$ä�4—:‘:˜y¨%Ô0ÜÐNÓOÐOÝ:áØ—*‘*Ü˜4Ÿ9™9“~×-Ñ-¨d¯i©i×.>Ñ.>ÀÓNØ—‘—‘Ø—	‘	—‘Ø—I‘I×%Ñ%Ø—]‘]Ü˜D×@Ñ@À&ÓIØô	
ð 		
r€   c                óÒ   — ddl }|j                  |d|j                  «      5 }|j                  dt	        j
                  | j                  d¬«      «       ddd«       y# 1 sw Y   yxY w)zVAdd metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata.r   NÚazmetadata.jsonrÎ   )Úindent)ÚzipfileÚZipFileÚZIP_DEFLATEDÚwritestrÚjsonÚdumpsr0  )r«   r(  r  Úzfs       r~   rõ  zExporter._add_tflite_metadata#  sS   € ãà�_‰_˜T 3¨×(<Ñ(<Ó=ð 	NÀØ�K‰K˜¬¯©°D·M±MÈ!Ô)LÔM÷	N÷ 	Nñ 	Nús   ¢2AÁA&c                ó  — t        | t        «      r| d   n| } | j                  t        j                  k(  sJ d«       ‚| j                  «       j                  t        j                  «      dz  }|j                  dk(  r|d   S |S )zLThe transformation function for Axelera/OpenVINO quantization preprocessing.rå  z<Input image must be uint8 for the quantization preprocessingrŒ  rÕ   N)
r•   r{   Údtyperç   Úuint8rï  rð  rñ  rò  Úndim)Ú	data_itemr'  s     r~   r¥  zExporter._transform_fn*  sp   € ô 7AÀÌDÔ6Q )¨EÒ"2ÐW`ˆ	Ø�‰¤%§+¡+Ò-ÐmÐ/mÓmÐ-Ø�_‰_Ó×%Ñ%¤b§j¡jÓ1°EÑ9ˆØŸ7™7 aš<ˆr�$‰xÐ/¨RÐ/r€   c                ó@   — | j                   |   j                  |«       y)z1Append the given callback to the specified event.N)r'   Úappend©r«   ÚeventÚcallbacks      r~   Úadd_callbackzExporter.add_callback2  s   € à�‰�uÑ×$Ñ$ XÕ.r€   c                óV   — | j                   j                  |g «      D ]
  } || «       Œ y)z(Execute all callbacks for a given event.N)r'   r  r"  s      r~   r1  zExporter.run_callbacks6  s)   € àŸ™×*Ñ*¨5°"Ó5ò 	ˆHÙ�T�Nñ	r€   )r®   zdict | NonerÄ   )Úreturnr–   )rØ   )r'  z
np.ndarray)r#  r–   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r¯   rI  rV  r¥   r(   r\  r‚  r®  r´  r¹  r½  rÛ  râ  r2  r3  r4  r   r  r5  r6  r  r  rõ  Ústaticmethodr¥  r%  r1  © r€   r~   r§   r§   Ñ   s4  „ ñ1ðf '°$ÐRVô 
2ô[ózQð: Ù(0°Ó(@ò 
ó ð
ð Ù!)¨'Ó!2ò Mó ðMð^ Ù%-¨kÓ%:ò <ó ð<ð| Ù#+¨OÓ#<ò 

ó ð

ð Ù (¨Ó 0ò 
ó ð
ð Ù!)¨'Ó!2ò 
ó ð
ð Ù#+¨IÓ#6ò Ró ðRðh Ù#+¨KÓ#8ò ó ðð2 Ù(0Ð1IÓ(Jò &#ó ð&#ðP Ù,4Ð5KÓ,Lò ^ó ð^ð Ù#+Ð,>Ó#?ò ó ðð Ù$,¨ZÓ$8ò 
ó ð
ð( Ù'/°Ó'>ò 
ó ð
ð Ø*,±X¸kÓ5Jò ó ðð Ù!)Ð*:Ó!;ò ó ðð Ù!)¨'Ó!2ò 
ó ð
ð Ù (¨Ó 0ò 
ó ð
ò.Nð ò0ó ð0ó/ôr€   r§   c                  ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )r&  zBModel wrapper with embedded NMS for Detect, Segment, Pose and OBB.c                ó¶   •— t         ‰| �  «        || _        || _        |j                  dk(  | _        | j                  j                  t        h d£«      v | _        y)zºInitialize the NMSModel.

        Args:
            model (torch.nn.Module): The model to wrap with NMS postprocessing.
            args (SimpleNamespace): The export arguments.
        rj  >   r]   r[   rV   N)	Úsuperr¯   r  r›   rÒ   rj  r†   Ú	frozensetÚis_tf)r«   r  r›   Ú	__class__s      €r~   r¯   zNMSModel.__init__?  sJ   ø€ ô 	‰ÑÔØˆŒ
ØˆŒ	Ø—:‘: Ñ&ˆŒØ—Y‘Y×%Ñ%¬Ò3TÓ)UÐUˆ�
r€   c           	     ó  — ddl m} | j                  |«      }t        |t        «      r|d   n|}t        |j                  |j                  ¬«      }|j                  d   }|j                  dd«      }|j                  d   dt        | j                  j                  «      z   z
  }| j                  j                  r§| j                  j                  dkD  rŽt        j                   t        j"                  t        j$                  | j                  j                  |z
  «      t        j$                  d«      «      g|j                  dd ¢­i |¤Ž}t        j&                  ||f«      }|j)                  dt        | j                  j                  «      |gd	¬
«      \  }	}
}|
j#                  d¬
«      \  }
}t+        |j                  d   | j                  j,                  «      | j                  _        t        j                   |j                  d   | j                  j,                  |	j                  d   d	z   |z   fi |¤Ž}t/        |«      D �]›  }|	|   ||   |
|   ||   f\  }}}}|| j                  j0                  kD  }| j2                  s%| j                  j4                  dk(  rZ| j6                  rN||z  }|j9                  t+        | j                  j,                  dz  |j                  d   «      «      j:                  }||   ||   ||   ||   f\  }}}}|j=                  «       }| j6                  rdn+dt#        t        | j                  j                  «      d«      z  }| j                  j4                  dk(  r||z  }n7||t        j$                  |j                  d	d fi |¤Žj#                  «       z  z  }| j                  j>                  s| j6                  rd	nd}|jA                  |j                  d   d«      jC                  |j                  d   |«      }|dd…d|…f   ||z  z   }t        j&                  ||dd…|d…f   fd¬
«      }| j6                  r~tE        tF        jH                  | j2                  xsP | j                  jJ                  xs ddk  xs1 | j                  j4                  dk(  xr | j                  jL                   tN        d¬«      n|} || j6                  rt        j&                  ||gd¬
«      n||| j                  jP                  «      d| j                  j,                   }t        j&                  ||   ||   jA                  dd«      ||   jA                  dd«      jS                  |j                  «      ||   gd¬
«      }ddd| j                  j,                  |j                  d   z
  f}t        jT                  jV                  jY                  ||«      ||<   �Œž | j                  jZ                  dk(  r
|d| |d   fS |d| S )aˆ  Perform inference with NMS post-processing. Supports Detect, Segment, OBB and Pose.

        Args:
            x (torch.Tensor): The preprocessed tensor with shape (B, C, H, W).

        Returns:
            (torch.Tensor | tuple): Tensor of shape (B, max_det, 4 + 2 + extra_shape) where B is the batch size, or a
                tuple of (detections, proto) for segmentation models.
        r   )rD   )rƒ   r  r¾   éþÿÿÿé   r‚   NrÎ   )ÚdimrG   é   é   r[   é   rL   F)Úuse_triuÚiou_funcÚ
exit_earlyrÂ   ).Útorchvision.opsrD   r  r•   ræ   r{   rƒ   r  ré   Ú	transposerT  rË   r›   rE   rA   rç   r  r/  Útensorrí  rR  r  r   r%  r  r2  r†   rj  ÚtopkÚindicesÚcloner!  ÚviewÚexpandr   r1   Úfast_nmsrI   rN   r0   r•  r  rê  rë  ÚpadrÒ   )r«   r}   rD   ÚpredsÚpredrœ   ÚbsÚextra_shaperG  ÚboxesÚscoresÚextrasÚclassesÚoutÚiÚboxÚclsÚscoreÚextraÚmaskÚnmsboxÚ
multiplierÚendÚ
cls_offsetÚoffboxÚnms_fnÚkeepÚdetss                               r~   r$  zNMSModel.forwardL  s	  € õ 	(à—
‘
˜1“ˆÜ% e¬UÔ3ˆu�QŠx¸ˆÜ˜TŸ[™[°·
±
Ô;ˆØ�Z‰Z˜‰]ˆØ�~‰~˜b "Ó%ˆØ—j‘j ‘n¨¬C°·
±
×0@Ñ0@Ó,AÑ(AÑBˆØ�9‰9×Ò §¡§¡°1Ò!4Ü—+‘+œeŸi™i¬¯©°T·Y±Y·_±_ÀrÑ5IÓ(JÌEÏLÉLÐYZËOÓ\ÐxÐ_c×_iÑ_iÐjkÐjlÐ_mÒxÐqwÑxˆCÜ—9‘9˜d C˜[Ó)ˆDØ $§
¡
¨A¬s°4·:±:×3CÑ3CÓ/DÀkÐ+RÐXY 
Ó ZÑˆˆv�vØ Ÿ*™*¨˜*Ó,‰ˆ�Ü §
¡
¨1¡¨t¯y©y×/@Ñ/@ÓAˆ�	‰	Ôä�k‰k˜$Ÿ*™* Q™-¨¯©×):Ñ):¸E¿K¹KÈ¹OÈaÑ<OÐR]Ñ<]ÑhÐagÑhˆÜ�r“ó /	8ˆAØ%*¨1¡X¨w°q©z¸6À!¹9ÀfÈQÁiÐ%OÑ"ˆC��e˜UØ˜4Ÿ9™9Ÿ>™>Ñ)ˆDØ�zŠz˜dŸi™i×.Ñ.°&Ò8¸T¿XºXà˜‘�à—z‘z¤# d§i¡i×&7Ñ&7¸!Ñ&;¸U¿[¹[È¹^Ó"LÓM×UÑU�Ø%(¨¡Y°°d±¸SÀ¹YÈÈdÉÐ%SÑ"ˆC�˜˜UØ—Y‘Y“[ˆFà"Ÿhšh™¨A´´C¸¿
¹
×8HÑ8HÓ4IÈ1Ó0MÑ,MˆJà�y‰y×Ñ 8Ò+Ø˜*Ñ$‘à# v´·±¸Q¿W¹WÀQÀR¸[Ñ0SÈFÑ0S×0WÑ0WÓ0YÑ'YÑZ�Ø—9‘9×)Ò)ØŸ8š8‘a¨�à ŸX™X c§i¡i°¡l°AÓ6×=Ñ=¸c¿i¹iÈ¹lÈCÓP�
Ø¢ 4 C 4 ™¨:¸
Ñ+BÑB�ÜŸ™ F¨F²1°c±d°7©OÐ#<À"ÔE�ð —8’8ô Ü×%Ñ%àŸ
™
ò OØ ŸI™IŸO™OÒ1¨r°RÑ7òOà ŸI™I×,Ñ,°
Ñ:ÒM¸t¿y¹y¿~¹~ðô
 +Ø$õ	ð ð ñ Ø6:·h²h”—	‘	˜6 5˜/¨rÕ2ÀFØØ—	‘	—‘óð "�—	‘	×!Ñ!ð	#ˆDô
 —9‘9Ø�T‘˜E $™K×,Ñ,¨R°Ó3°S¸±Y·^±^ÀBÈÓ5J×5MÑ5MÈcÏiÉiÓ5XÐZ_Ð`dÑZeÐfÐlnôˆDð �a˜˜DŸI™I×-Ñ-°·
±
¸1±Ñ=Ð>ˆCÜ—X‘X×(Ñ(×,Ñ,¨T°3Ó7ˆC�‹Fð_/	8ð` (,§z¡z§¡¸)Ò'C��C�R�˜% ™(Ð#ÐQÈÈSÈbÈÐQr€   )r(  r)  r*  r+  r¯   r$  Ú__classcell__)r3  s   @r~   r&  r&  <  s   ø„ ÙLôVöJRr€   r&  )[r+  Ú
__future__r   r  rª  rÐ  rý   Úcopyr   r   Ú	functoolsr   Úpathlibr   rï  rñ  rç   Úultralyticsr   Úultralytics.cfgr	   r
   r   Úultralytics.datar   Úultralytics.data.datasetr   Úultralytics.data.utilsr   r   Úultralytics.nn.autobackendr   r   Úultralytics.nn.modulesr   r   r   r   r   Úultralytics.nn.tasksr   r   r   r   Úultralytics.utilsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Úultralytics.utils.checksr*   r+   r,   r-   r.   Úultralytics.utils.filesr/   Úultralytics.utils.metricsr0   Úultralytics.utils.nmsr1   Úultralytics.utils.opsr2   Úultralytics.utils.patchesr3   Úultralytics.utils.torch_utilsr4   r5   r6   r7   r8   r9   r:   r   rŽ   r¥   r§   rê  ÚModuler&  r-  r€   r~   ú<module>ru     sÉ   ðñ;õz #ã Û 	Û Û Ý Ý Ý Ý ã Û å #ß DÑ DÝ -Ý 0ß Gß Mß RÕ Rß cÓ c÷÷ ÷ ÷ ñ ÷"õ õ .Ý 3Ý *Ý )Ý 2÷÷ ñ ò$[òNnò,÷.hñ hôVZRˆu�x‰x�‰õ ZRr€   