
    .h                       d 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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 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# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZGmHZHmIZI ddlJmKZKmLZL ddlMmNZN ddlOmPZP ddlQmRZR ddlSmTZT ddlUmVZVmWZWmXZXmYZYmZZZ d Z[d$de\fdZ]d Z^d Z_d Z` G d d      Za G d  d!ej                  j                        Zd G d" d#ej                  j                        Zey)%a  
Export a YOLO PyTorch model to other formats. TensorFlow exports authored by https://github.com/zldrobit.

Format                  | `format=argument`         | Model
---                     | ---                       | ---
PyTorch                 | -                         | yolo11n.pt
TorchScript             | `torchscript`             | yolo11n.torchscript
ONNX                    | `onnx`                    | yolo11n.onnx
OpenVINO                | `openvino`                | yolo11n_openvino_model/
TensorRT                | `engine`                  | yolo11n.engine
CoreML                  | `coreml`                  | yolo11n.mlpackage
TensorFlow SavedModel   | `saved_model`             | yolo11n_saved_model/
TensorFlow GraphDef     | `pb`                      | yolo11n.pb
TensorFlow Lite         | `tflite`                  | yolo11n.tflite
TensorFlow Edge TPU     | `edgetpu`                 | yolo11n_edgetpu.tflite
TensorFlow.js           | `tfjs`                    | yolo11n_web_model/
PaddlePaddle            | `paddle`                  | yolo11n_paddle_model/
MNN                     | `mnn`                     | yolo11n.mnn
NCNN                    | `ncnn`                    | yolo11n_ncnn_model/
IMX                     | `imx`                     | yolo11n_imx_model/
RKNN                    | `rknn`                    | yolo11n_rknn_model/

Requirements:
    $ pip install "ultralytics[export]"

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

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

Inference:
    $ yolo predict model=yolo11n.pt                 # PyTorch
                         yolo11n.torchscript        # TorchScript
                         yolo11n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                         yolo11n_openvino_model     # OpenVINO
                         yolo11n.engine             # TensorRT
                         yolo11n.mlpackage          # CoreML (macOS-only)
                         yolo11n_saved_model        # TensorFlow SavedModel
                         yolo11n.pb                 # TensorFlow GraphDef
                         yolo11n.tflite             # TensorFlow Lite
                         yolo11n_edgetpu.tflite     # TensorFlow Edge TPU
                         yolo11n_paddle_model       # PaddlePaddle
                         yolo11n.mnn                # MNN
                         yolo11n_ncnn_model         # NCNN
                         yolo11n_imx_model          # IMX
                         yolo11n_rknn_model         # RKNN

TensorFlow.js:
    $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
    $ npm install
    $ ln -s ../../yolo11n_web_model public/yolo11n_web_model
    $ npm start
    N)deepcopy)datetime)Path)__version__)	TASK2DATAget_cfg)build_dataloader)YOLODataset)check_cls_datasetcheck_det_dataset)check_class_namesdefault_class_names)C2fClassifyDetectRTDETRDecoder)ClassificationModelDetectionModelSegmentationModel
WorldModel)ARM64DEFAULT_CFGIS_COLAB	IS_JETSONLINUXLOGGERMACOSMACOS_VERSION
RKNN_CHIPSROOTSETTINGSTORCH_VERSIONWINDOWSYAML	callbackscolorstrget_default_args)check_imgszcheck_is_path_safecheck_requirementscheck_versionis_intelis_sudo_available)attempt_download_assetget_github_assetssafe_download)onnx2engine	torch2imx
torch2onnx)	file_sizespaces_in_path)batch_probiou)TorchNMS)Profile)arange_patch)
TORCH_1_11
TORCH_1_13	TORCH_2_1	TORCH_2_4select_devicec                  T   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g} t        t        g d@t        |              S )Az7Return a dictionary of Ultralytics YOLO export formats.PyTorch-z.ptTTorchScripttorchscript.torchscript)batchoptimizehalfnmsdynamicONNXonnx.onnx)rE   rI   rG   opsetsimplifyrH   OpenVINOopenvino_openvino_modelF)rE   rI   rG   int8rH   fractionTensorRTengine.engine)rE   rI   rG   rR   rN   rH   rS   CoreMLcoreml
.mlpackage)rE   rI   rG   rR   rH   zTensorFlow SavedModelsaved_model_saved_model)rE   rR   kerasrH   zTensorFlow GraphDefpb.pbrE   zTensorFlow Litetflite.tflite)rE   rG   rR   rH   rS   zTensorFlow Edge TPUedgetpu_edgetpu.tflitezTensorFlow.jstfjs
_web_model)rE   rG   rR   rH   PaddlePaddlepaddle_paddle_modelMNNmnn.mnn)rE   rG   rR   NCNNncnn_ncnn_modelrG   IMXimx
_imx_model)rR   rS   rH   RKNNrknn_rknn_modelname)FormatArgumentSuffixCPUGPU	Arguments)dictzip)xs    Y/var/www/html/ai-service/venv/lib/python3.12/site-packages/ultralytics/engine/exporter.pyexport_formatsr   v   sQ    
CdB/	~tTCrs	$.fgC	
 O	
 
8\48cd	 -tMno	eT4'C	Hiu>jk		+<dE2N	&,e=]^	?D$	J	vtT+DE	dWf4EF	|T41LM	uw6GH=	A@ OQTVWQXYZZ    returnc                 Z   dj                  t        j                  d      dd       }t        r9t        j
                  j                  j                  j                  dz
  }|r(|dz  }n"dddddd	d	d	d	d	d
d
d
d
ddj                  |d      }t        || j                  j                               S )z@Return max ONNX opset for this torch version with ONNX fallback..N                           )z1.8z1.9z1.10z1.11z1.12z1.13z2.0z2.1z2.2z2.3z2.4z2.5z2.6z2.7z2.8)joinr"   splitr=   torchrK   utils
_constantsONNX_MAX_OPSETgetmindefsonnx_opset_version)rK   cudaversionrM   s       r~   best_onnx_opsetr      s    hh}**3/34G

  ++::Q>QJE 
  #gr
! 	" udii22455r   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)
ao  
    Validate arguments based on the export format.

    Args:
        format (str): The export format.
        passed_args (Namespace): 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.
    )rG   rR   rI   r\   rH   rE   rS   Nu"   ERROR ❌️ valid arguments for 'z' not listed.r   )rE   data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}#]]!$$7F;/L nk35sTX9YY*$m(?uDcdjckkl&mm$nr   c           	          g g }}| j                   D ]8  }|j                  |j                         |j                  |j                         : t        d t        t        |      t        |      z
        D              S )z3Return TensorFlow GraphDef model output node names.c              3   J   K   | ]  }|j                  d       r| d  yw)NoOpz:0N)
startswith.0r}   s     r~   	<genexpr>zgd_outputs.<locals>.<genexpr>   s%     gqRSR^R^_eRfQCr(gs   #
#)nodeappendrt   extendinputsortedlistset)gd	name_list
input_listr   s       r~   
gd_outputsr      sg    zI &#$**%& gDY#j/)I$Jgggr   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: )
r8   
isinstancestrr   r4   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%
	 0b//0"1sDk21!D4B87778KK6("6rttCjdVSVWYZ]V^^bcdH0 0  	LLF8#3BDD: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                   N   e Zd ZdZeddfdZd,defdZd-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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d e
d'      fd(Zd)efd*Zd)efd+Zy).Exportera	  
    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 (tuple): 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.

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

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

        Args:
            cfg (str, optional): Path to a configuration file.
            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+	#Hy'F'F'H++D1r   r   c                 Z#   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 	cg c]  }	|	|k(  	 }
}	t        |
      dk7  rt        d| d|       |
\  }}}}}}}}}}}}}}}t        |||||f      }d}|r<| j                  j                  &t        j                  d       d| j                  _        |r~dt        | j                  j                        v r]| j                  j                  j                  dd      d   }d| j                  _        |dv sJ d| j                  j                   d       |rZ| j                  j                  Dt         j"                  j%                         r&t        j                  d       d| j                  _        t'        | j                  j                  dn| j                  j                        | _        |d   |
j)                  d      dz      }t+        || j                  |       |r| j                  j,                  s&t        j                  d       d| j                  _        | j                  j.                  s&t        j                  d        d| j                  _        |j0                  d!vrt        d"      t3        |d#      st5               |_        t9        |j6                        |_        | j                  j:                  r<| j                  j,                  r&t        j                  d$       d%| j                  _        | j                  j:                  rC|s|r?| j                  j<                  dk(  r&t        j                  d&       d%| j                  _        t?        | j                  j@                  |jB                  d'(      | _         | j                  jD                  r)|rJ d)       | j                  j<                  dk(  sJ d*       |r| j                  jF                  s&t        j                  d+       d,| j                  _#        | j                  jF                  j                         | j                  _#        | j                  jF                  tH        v s&J d-| j                  jF                   d.tH         d       | j                  j,                  r|rtK        |d/d%      rJ d0       | j                  j.                  rtM        |tN              rJ d1       |rtP        rtR        rJ d2       |rtT        sJ d3       |rtT        sJ d4       tK        |d/d%      stM        |jV                  d   tX              r&t        j                  d5       d%| j                  _        | j                  jZ                  xs d6| j                  _-        |s|s| j                  j.                  rw| j                  j\                  ra| j                  j^                  dk(  rHt        j                  d7| j                  j.                  rd8nd9| j                  j                    d:       |rVtR        rtP        rta        d;      | j                  j^                  dk7  r&t        j                  d<       d| j                  _/        tM        |tb              rt        j                  d=       d|_2        | j                  j,                  rx| j                  jf                  sbth        jf                  xs tj        tK        |d>d?         | j                  _3        t        j                  d@| j                  jf                   d       |rtP        rtR        rta        dA      tm        jn                  dB      r(tq               rt        jr                  dC       d%tl        dB<   t!        jt                  | j                  j^                  |jv                  jo                  dDdE      g| j@                   jy                  | j                        }t{        tK        |dFd      xs+ tK        |dGd      xs |jv                  jo                  dGdH            }|j|                  dIv rt{        |jF                        }t        |      jy                  | j                        }|j                         D ]	  }d%|_A         |j                          |j                          |j                         }|rddJlEmF}   | || j@                        }|j                         D ]  }!tM        |!t              rd|!_I        tM        |!t        tX        f      r| j                  j\                  |!_.        d|!_I        | j                  j                  |!_        | j                  j                  |!_K        | j                  j.                  xr | |!_L        t3        |dK      st3        |!dL      s|!j                  |j                  jy                  | j                               tM        |!t              s
|r|!j                  |!_P        ! d}"t        d'      D ]@  }#| j                  j.                  r |s|s t        || j                        |      n ||      }"B | j                  j:                  r=|s|r9| j                  j<                  dk7  r |j;                         |j;                         }}t        j                  dMt         j                  j                  N       t        j                  dMt        N       t        j                  dMt        N       || _Y        || _+        || _Z        tM        |"t         j                        rt        |"j                        nt        dO |"D              | _]        t{        | jV                  jv                  jo                  dG| j                              j                  j                  dPdQ      | _`        t3        |dR      r)tM        |j                  t              r|j                  dS   ndH}$dT| j                   dU|$rdV|$ ndH }%|%dWt        j                         j                         t        dXdYt        t        |jB                              |j0                  | j                  j^                  | j@                  |j6                  | j                  D &'ci c]  \  }&}'|&|v s|&|' c}'}&|jv                  jo                  dDdE      dZ| _h        ||| j                  d<   |j0                  d[k(  rK|jV                  d   j                  | j                  d\<   t3        |d]      r|j                  | j                  d]<   t        jr                  d^t        d_       d`| dat        |j                         db| j                   dct        |      ddde       | j                  df       dHgt        |      z  }(|r| j                         |(d<   |r| j                  |g      |(d<   |s|r| j                         |(d'<   |r| j                         |(dE<   |r| j                         |(dh<   |r| j                  xj,                  |z  c_        | j                         \  |(di<   })|s|r| j                  |)j      |(dk<   |r| j                         |(dl<   |r;| j                  t{        |(di         | j                  j                   dmz  n      |(do<   |r| j                         |(dp<   |r| j                         |(dq<   |r| j                         |(dr<   |r| j                         |(ds<   |r| j                         |(dt<   |r| j                         |(du<   |(D 	cg c]  }	|	st        |	       }(}	t        |(      rlt        t{        |(d               }(| j@                  d   | j@                  d   k(  }*|*rdHn%dv| j@                   dwt        | j@                         dx}+|*r| j@                  d   n't        | j@                        dd j                  dydH      },|j0                  dzk(  r|rd{|$ ndH}-| j                  j,                  rd|n| j                  j:                  rd}ndH}.t        jr                  d~t        j                          |z
  dddt        d|j                  j                                d|j0                   d|( d|, dy|. dy|- d|j0                   d|( d|, d|$ dy|. dy|+ d       | j                  d       |(S c c}	w c c}'}&w c c}	w )z;Return list of exported files/dirs after running callbacks.>   trttensorrtrU   >   iosapplerX   mlmodel	mlpackage	mlprogramrX   rv   r   Nr   g333333?)ncutoffptz#Model is already in PyTorch format.zInvalid export format=''.z Valid formats are z', updating to format='r   z'. Valid formats are z>TensorRT requires GPU export, automatically assigning device=00dla:>   r   1z5Expected self.args.device='dla:0' or 'dla:1, but got r   zTExporting on CPU while CUDA is available, setting device=0 for faster export on GPU.cpurz   Tz1IMX export requires int8=True, setting int8=True.z/IMX export requires nms=True, setting nms=True.>   posedetectzCIMX export only supported for detection and pose estimation models.nameszChalf=True and int8=True are mutually exclusive, setting half=False.FzQhalf=True only compatible with GPU export, i.e. use device=0, setting half=False.r   )stridemin_dimzHoptimize=True not compatible with format='ncnn', i.e. use optimize=FalsezEoptimize=True not compatible with cuda devices, i.e. use device='cpu'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 end2endz4TFLite INT8 export not supported for end2end models.z2'nms=True' is not valid for classification models.z1TFLite export with NMS unsupported on ARM64 Linuxz/TensorFlow exports with NMS require torch>=1.13z)ONNX export with NMS requires torch>=1.13zD'nms=True' is not available for end2end models. Forcing 'nms=False'.g      ?z'dynamic=True' model with 'znms=Truezformat=z*' requires max batch size, i.e. 'batch=16'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=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pefuseignore)categoryc              3   ~   K   | ]5  }t        t        |t        j                        r|j                  ng        7 y wN)tupler   r   Tensorshaper   s     r~   r   z$Exporter.__call__.<locals>.<genexpr>  s)     XQRu
1ell(CQWWLXs   ;=yoloYOLOr   r   zUltralytics z model ztrained on Ultralyticsz2AGPL-3.0 License (https://ultralytics.com/license)zhttps://docs.ultralytics.com)descriptionauthordater   licensedocsr   r   rE   imgszr   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)r         )keras_model      z_full_integer_quant.tflite)tflite_model   	   
      r   r   r   u>   WARNING ⚠️ non-PyTorch val requires square images, 'imgsz=z#' will not work. Use export 'imgsz=z' if val is required. segmentzdata=rR   rG   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   warningsumanyr   r   rsplitr   r   is_availabler>   indexr   rR   rH   r   hasattrr   r   r   rG   typer(   r  r   rF   rt   r   r   r   r   r   r   r;   modelr   confrI   rE   SystemErrorr   
clip_modelr   r   r   r!   r   r,   r   zerosyamltor   suffixr   
parametersrequires_gradevalfloatr   ultralytics.utils.export.imxr   modulesr   exportr   max_detxyxyr   r   forward_splitforwardrangeNMSModelwarningsfilterwarningsjitTracerWarningUserWarningDeprecationWarningimfiler  r  output_shapestemreplacepretty_namer{   r   now	isoformatr   intmaxmetadatar  r  r&   r4   run_callbackslenexport_torchscriptexport_engineexport_onnxexport_openvinoexport_coremlexport_saved_model	export_pbexport_tfliteexport_edgetpuexport_tfjsexport_paddle
export_mnnexport_ncnn
export_imxexport_rknnparentresolve)/r   r/  r   fmt	fmts_dictfmtsr$  matchesmsgr}   flagsrF  rK   xmlrU   rX   rZ   r]   r_   ra   rc   rf   ri   rl   ro   rr   is_tf_formatr   fmt_keysrJ  rK  pr   my_r   r
  kvr   r  squaresr  predict_dataqs/                                                  r~   __call__zExporter.__call__.  s   IIKii$$&%%CQQC"$	Yz*12./d? //TQs/KG?Bd{;RijminnpPq C5(;D6!BCCNN4SE9PQXYZQ[P\\]^_!*C#'(ac((u:?6se;PQUPVWXX 	odCb&'4QWY\^bdgim KVWdCD dii&&.NN[\"DIIes499#3#344))""))#q1"5C"DII*$q(]^b^g^g^n^n]oop&qq$499##+

0G0G0INNqr"DII#TYY-=-=-EE499K[K[\ [)%++d*;a*?@c499h/99>>RS!%		99==PQ $		zz!33 !fggug&-/EK'499>>diinnNN`a"DIIN99>>ts0@0@E0INNno"DIIN qQ
99ggg8;;##u,u.uu,99>>3 "*		!YY^^113DIIN99>>Z/ *499>>*::fgqfrrst/ 99>>fui7o9oo799==!%)<=s?ss=U%l9ll7#zd3dd1zV+VV)ui/:ekk"o}3]ef %		!YY^^3tDIINf		4993D3D\]I]NN-DIIMMjQXY]YbYbYiYiXjOk-l  mW  X E!u  A%XY"#		eZ(NNR  $E99>>$))..(--\75&RZ;[1\DIINNNabfbkbkbpbpaqqst UuXYY<<'zY (-H^$ [[%**..Q*GU$**UXXY]YdYdeE9d+swuk4/PsTYT^T^TbTbcnprTs
 ;;++		?D ""4;;/!!# 	$A#AO	$



<E4::.E 	,A!X&!fm45 II--	99++ II--	5v:5$'GAv,>FF588;;t{{34As#LOO		, q 	jA26))--WZ*		*2.`efh`iA	j99>>ts0@0@E0I	5::<B 	5993J3JK;?3EF 
	 !U\\* !''NXVWXX 	
  

 3 3K KLQQYYZ`bhi%,UF%;
5::W[@\uzz&!bd$T%5%5$6gVZD6>R`b=cd&#LLN,,."K2#ell+,JJYY__ZZ[[&*iiAda1=QTA

z15
 ?#&DMM% ::).R)B)BDMM+&uk*-2__k**%&&6tf<OPUVXV^V^P_O` a#001IdOC3HN	
 	,-D3t9**,AaD%%#%.AaD4##%AaD'')AaD%%'AaDIINNg%N $ 7 7 9AaD+T~~+~>!))+!**QqT
		GWWqEr8r*s!'')!&&(AbEOO%AbE$$&AbEOO%AbE$$&AbE $!SV$$q6D2K AZZ]djjm3F  UVZV`V`Ua b++.tzz?*;;PR  &,DJJqMTZZ21F1N1NsTV1WE-2ZZ9-DU4&>QSL))..		fBAKK%diikAoc%: ;&&.vt{{7J7J7L&M%N7

|71#WUZT[[\]^\__`am`n3EJJ<wqcQVPWW]^b]ccdefdgghijhk7	9 	?+q )` Bd %s$   AFAF"AF";AF(@AF(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
                  | j                  d   d| j                  j                        }t        |      }|| j                  j                  k  r&t        d| d	| j                  j                   d
      |dk  rt        j                  | d| d       t!        || j                  j                  dd      S )z=Build and return a dataloader for calibration of INT8 models.z/ collecting INT8 calibration images from 'data=r   classifyvalr   F)r   rS   r   r  augment
batch_sizezThe calibration dataset (zE images) must have at least as many images as the batch size ('batch=z').i,  z5 >300 images recommended for INT8 calibration, found z images.T)rE   workers	drop_last)r   r   r   r   r/  r   r   r   r
   r   rS   r  rE   rV  r&  r'  r	   )r   r   r   datasetr   s        r~   get_int8_calibration_dataloaderz(Exporter.get_int8_calibration_dataloader<  s.   vhMdiinnM]]^_`YTZZ__
%B!HY[_[d[d[i[ij)E*YY''**Q-yy
 Ltyy+A3 /99??+30  WNNfX%Z[\Z]]efgtyyUYZZr   zTorchScript:c                 ~   t        j                  d| dt         d       | j                  j	                  d      }t
        j                  j                  | j                  j                  r t        | j                  | j                        n| j                  | j                  d      }dt        j                  | j                        i}| j                  j                   rBt        j                  | d       d	d
lm}  ||      j'                  t)        |      |       |S |j+                  t)        |      |       |S )z(Export YOLO model to TorchScript format.r  z starting export with torch ...rD   Fstrictz
config.txtz optimizing for mobile...r   )optimize_for_mobile)_extra_files)r   r   r"   rK  with_suffixr   rF  tracer   rH   rC  r/  rJ  jsondumpsrT  rF   torch.utils.mobile_optimizerr  _save_for_lite_interpreterr   save)r   r   r   tsextra_filesr  s         r~   rW  zExporter.export_torchscriptS  s     	b <]O3OPII!!.1YY__		Xdjj$))<SWS]S]_c_f_fot_u#TZZ%>?99KK6(";<=H#>>s1vT_>`  GGCFG5r   zONNX:c                    dg}| j                   j                  r*|ddt        j                  j	                         rdndz   gz  }t        |       ddl}| j                   j                  xs# t        |d| j                  j                  v 	      }t        j                  d
| d|j                   d| d       | j                   j                  rt        sJ dt          d       t#        | j$                  j'                  d            }t)        | j*                  t,              rddgndg}| j                   j.                  }|rdddddi}t)        | j*                  t,              rddd|d<   dddd|d<   n"t)        | j*                  t0              rddd|d<   | j                   j                  r|d   j3                  d       | j                   j                  r*| j*                  j4                  dk(  r|| j                   _        t7        | j                         5  t9        | j                   j                  r t;        | j*                  | j                         n| j*                  | j<                  ||dg||xs d       ddd       |j?                  |      }| j                   j                  r;	 ddl }	t        j                  | d|	j                   d       |	jC                  |      }| jH                  jK                         D ]7  \  }}|jL                  jO                         }|t#        |      c|_(        |_)        9 tU        |d!d      d"kD  r,t        j                  | d#|jV                   d$       d"|_+        |jY                  ||       |S # 1 sw Y   xY w# tD        $ r$}
t        jF                  | d |
        Y d}
~
d}
~
ww xY w)%z!Export YOLO model to ONNX format.onnx>=1.12.0onnxslim>=0.1.71onnxruntimez-gpur   r   Nr   )r   r  z starting export with onnx z opset r  z:'nms=True' ONNX export requires torch>=1.13 (found torch==)rL   output0output1imagesrE   heightwidth)r   r   r   anchors)r   r   mask_height
mask_widthr   obb)rM   input_namesoutput_namesrI   z slimming with onnxslim z simplifier failure: 
ir_versionr  z limiting IR version z' to 10 for ONNXRuntime compatibility...)-r   rN   r   r   r+  r*   rK   rM   r   r   r.  r   r   r   rH   r;   r"   r   rK  r  r   r/  r   rI   r   popr   r9   r3   rC  rJ  loadonnxslimslimr   r'  rT  itemsmetadata_propsaddkeyvaluer   r  r  )r   r   requirementsrK   rM   r   r  rI   
model_onnxr  r   ru  rv  metas                 r~   rY  zExporter.export_onnxd  s4    ''99/EJJLcLcLe&km1nooL<(		Y?4fHXHX>X#Yb ;D<L<L;MWUZT[[^_`99==l![\i[jjkll:		%%g./1;DJJHY1Z	9-aj`k))##Wg!FGG$**&78)0Y%?	")0]|%T	"DJJ7)0Y%?	"yy}}	"&&q)99==TZZ__5#DIIO$))$ 		3799==TYY/djj%J)4		 YYq\
 99Dvh&>x?S?S>TTWXY%]]:6
 MM'') 	-DAq,,002D#$c!f DHdj	-
 :|Q/"4KK6("7
8M8M7NNuvw$&J!		*a I		 		,  D&)>qcBCCDs%   A"N&:N N	N>N99N>z	OpenVINO:c           	      t    t        t        rt        dk\  rdnd       ddlt	        j
                  d| dj                   d       t        sJ d	t         d
       j                   j                  j                  r t         j                   j                        n j                   j                  j                  rdn j                  j                   g j                        } fd} j                  j"                  rt%         j&                        j)                   j&                  j*                  dt,        j.                         }t%        t1        |       j&                  j3                  d      j4                  z        }t        d       t        d       ddl}dt8        j:                  fd}d}t=         j                  j                  d   t>              rwdjA                  tC         j                  jE                               d   d   jG                  d      dd       }	|jI                  d|	 dd|	 dd|	 dd|	 dd|	 dgdg      }|jK                  ||jM                   jO                  |      |      |jP                  jR                  |      }
 ||
|       |S t%         j&                        j)                   j&                  j*                  dt,        j.                         }t%        t1        |       j&                  j3                  d      j4                  z        } |||       |S ) z%Export YOLO model to OpenVINO format.z15.4zopenvino>=2025.2.0zopenvino>=2024.0.0r   Nr  z starting export with openvino r  z/OpenVINO export requires torch>=2.1 but torch==z is installed)r   example_inputc           	         | 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_channelsr   	pad_value     o@scale_valuesiou_thresholdr  rt  labelsr}  fit_to_window_letterboxresize_type)compress_to_fp16metadata.yamlN)set_rt_infor   iour/  r   valuesrN  r   
save_modelrG   r$   r  r   rf  rT  )ov_modelrK  rv  ovr   s      r~   	serializez+Exporter.export_openvino.<locals>.serialize  s     ,)EF  6N'OP  |[&AB  %<*HI  0OP  tzz?O?O?V?V?X!Y!!))C"5!Y\hjr[stzz*,$$%>}@]^MM(D499>>MJIId4j''/94==I "Zs   ,E_int8_openvino_modelz.xmlzpackaging>=23.2znncf>=2.14.0r   c                 &   t        | t              r| d   n| } | j                  t        j                  k(  sJ d       | j                         j                  t        j                        dz  }|j                  dk(  rt        j                  |d      S |S )z Quantization transform function.imgz<Input image must be uint8 for the quantization preprocessingr  r   r   )r   r{   dtyper   uint8numpyastypenpfloat32ndimexpand_dims)	data_itemrJ  s     r~   transform_fnz.Exporter.export_openvino.<locals>.transform_fn  su    >HTX>Y)E*:_h	 %++5u7uu5__&--bjj9EA021r~~b!,D"Dr   r   r   r   z.*z/.*/Addz/.*/Sub*z/.*/Mul*z/.*/Div*z\.dfl.*Sigmoid)patternstypes)r/  calibration_datasetpresetignored_scoperQ   )*r*   r   r   rP   r   r   r   r<   r"   convert_modelr   rH   rC  r/  rI   rJ  r  rR   r   rK  rN  r6  ossepr   r  rt   nncfr  ndarrayr   r   r   r   named_modulesr   IgnoredScopequantizeDatasetr  QuantizationPresetMIXED)r   r   r  r  fqfq_ovr  r  r  head_module_namequantized_ov_modelr   f_ovr  s   `            @r~   rZ  zExporter.export_openvino  s    	5]f=T/Znob ??OsSThKM?Zghhy##/3yy}}HTZZ+$**))++$$''--'' $ 
	J 99>>TYY''		(8(8<PQSQWQWPX:YZBR499#8#8#@#E#EEFE01~.E2:: E !M$****2.7#&88D1I1I1K,LR,PQR,S,Y,YZ],^_a`a,b#c  $ 1 1-.g6-.h7-.h7-.h7-.h7 %+ !2 	! "&$(LL1U1UV\1]_k$l..44+	 "/ " (%0I		N""499#3#3rvvh5OP47TYY226:???@(D!r   zPaddlePaddle:c                    t         rJ d       t        t        j                  j	                         rdn	t
        rdnddf       ddl}ddlm} t        j                  d	| d
|j                   d       t        | j                        j                  | j                  j                  dt         j"                         } || j$                  |d| j&                  g       t)        j*                  t-        |      dz  | j.                         |S )z)Export YOLO model to PaddlePaddle format.z'Jetson Paddle exports not supported yetzpaddlepaddle-gpuzpaddlepaddle==3.0.0zpaddlepaddle>=3.0.0x2paddler   N)pytorch2paddler  z starting export with X2Paddle r  rg   r  )modulesave_dirjit_typeinput_examplesr  )r   r*   r   r   r+  r   r  x2paddle.convertr  r   r   r   r   rK  rN  r6  r  r  r/  rJ  r$   r  r   rT  )r   r   r  r  r   s        r~   ra  zExporter.export_paddle  s     GGG} ::**, #  +*		
 	3b ?@T@T?UUXYZ		N""499#3#3}RVVH5MNdjj1wX\X_X_W`a		$q'O+T]];r   zMNN:c                    | j                         }t        d       ddl}ddlm} t        j                  d| d|j                          d       t        |      j                         s
J d|        t        | j                  j                  d	            }d
ddd|d|dt        j                  | j                        g	}| j                   j"                  r|j%                  d       | j                   j&                  r|j)                  d       |j+                  |       t        | j                  j,                  dz        }|j                         r|j/                          |S )zIExport YOLO model to MNN format using MNN https://github.com/alibaba/MNN.z
MNN>=2.9.6r   N)
mnnconvertr  z starting export with MNN r  failed to export ONNX file: rj   r   z-frJ   z--modelFilez
--MNNModelz	--bizCode)z--weightQuantBits8z--fp16z.__convert_external_data.bin)rY  r*   rh   	MNN.toolsr  r   r   r   r   existsr   rK  r  r  r  rT  r   rR   r   rG   r   convertrf  unlink)r   r   f_onnxrh   r  r   r   convert_scratchs           r~   rb  zExporter.export_mnn
  s    !!#<(( 	b :3;;=/MNF|""$M(DVH&MM$		%%f-.D&-q+W[WaWabfboboWpq99>>KK2399>>KK!4 tyy//2PPQ!!#""$r   zNCNN:c                 d   t        dd       ddl}t        j                  d| d|j                   d       t        t        | j                        j                  | j                  j                  d	t        j                               }| j                  j                  d
      }t        t        rdnd      }|j                         r|nt        |z  }|j                         st        j                   | dt         d       t"        rdnt        rdn	t$        rdnd}	 t'        d      \  }}	|	D 
cg c]  }
| d|
v s|
 c}
d   }t)        |t              sJ d       t        j                  | d|        t-        d| d| d       }t/        t        j0                         |      r@t3        j4                  ||z  |!       |j7                  d"       t3        j8                  |       d#|d$z   d%|d&z   d'|d(z   g}d)|d*z   d+|d,z   d-|d.z   d/|d0z   g}t        |      t        |      g||d1t;        | j<                  j>                         d2| j@                  jB                   d3| j<                  jD                  d4g| jF                   d5}|jI                  d6       t        j                  | d7d8jK                  |       d9       tM        jN                  |d:       |D 
cg c]  }
|
jQ                  d;d<      d=    }}
d>d?d@dAg|D ]  }t        |      jS                  dB        tU        jV                  |dCz  | jX                         t        |      S c c}
w # t*        $ r3}d}d| d| d}t        j                   | d| d|        Y d}~+d}~ww xY wc c}
w )DzIExport YOLO model to NCNN format using PNNX https://github.com/pnnx/pnnx.rl   z	--no-depscmdsr   Nr  z starting export with NCNN r  rm   rL   zpnnx.exepnnxz PNNX not found. Attempting to download binary file from https://github.com/pnnx/pnnx/.
Note PNNX Binary file must be placed in current working directory or in z3. See PNNX repo for full installation instructions.macoswindowszlinux-aarch64linuxz	pnnx/pnnx)repo.zipz#Unable to retrieve PNNX repo assetsz+ successfully found latest PNNX asset file 20250930zpnnx-rA   z PNNX GitHub assets not found: z, using default z/https://github.com/pnnx/pnnx/releases/download//T)delete)srcdsti  z
ncnnparam=zmodel.ncnn.paramzncnnbin=zmodel.ncnn.binzncnnpy=zmodel_ncnn.pyz
pnnxparam=zmodel.pnnx.paramzpnnxbin=zmodel.pnnx.binzpnnxpy=zmodel_pnnx.pyz	pnnxonnx=zmodel.pnnx.onnxzfp16=zdevice=zinputshape="r   "exist_ok
 running 'r  r   check=r   r   z	debug.binzdebug.paramz
debug2.binzdebug2.param
missing_okr  )-r*   rl   r   r   r   r   r   rK  rN  r6  r  r  r  r#   is_filer    r'  r   r   r/   r   r   r0   r)   cwdshutilmovechmodrmtreerR  r   rG   r   r.  rE   r  mkdirr   
subprocessrunr*  r  r$   r  rT  )r   r   rl   r   r  rt   r   systemreleaseassetsr}   assetr   	unzip_dir	ncnn_args	pnnx_argscmd
pnnx_filesf_debugs                      r~   rc  zExporter.export_ncnn#  s    	64b ;D<L<L;MSQRTYY''		(8(8Kx:PQR&&w/'Jv6||~tD4K||~NN( QS
 !&W9X]_cjFe"3"E$*Cqo.BCAF!%-T/TT-vh&QRWQXYZ
 &(WX_W``abgah&irvwI!$((*i8	D 0d;

5!i( //01q++,-a/)*+
	 //01q++,-a/)*+--./	
	 IK
 
 	

 C		'()
 dkk&&'(
 DIIOOQ<<=Q?
 	
vhj#q9:s$' 5>>qahhsA&r*>
>#]L.^S]^ 	2GM  D 1	2 			!o%t}}51v[ D  e$y&6&)HK[\a[bcddeJ ?s6   M. 2M)?M)7M. 4N-)M. .	N*7(N%%N*zCoreML:c                     | j                   j                  j                         dk(  }t        d       ddl}t        j                  d| d|j                   d       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&                  |       d}| j                  j                  dk(  rI|j)                  t+        | j                  j,                  j/                                     }| j                  }n| j                  j                  dk(  rF| j                   j                  r#t1        | j                  | j2                  |       n| j                  }n:| j                   j                  rt        j4                  | d       | j                  }t6        j8                  j;                  |j=                         | j2                  d      }| j                   j                  r|j?                  |jA                  d
| j                   j                  d
      | j2                  jB                  d
   |jA                  d| jD                  d   dz  | jD                  d         |jA                  d| jD                  d
   dz  | jD                  d
         f      }|jG                  d|      g}	n,|jI                  d| j2                  jB                  dg d      g}	|jK                  ||	||rdnd       }
| j                   jL                  rd!n| j                   jN                  rd"nd#\  }}|dk  rd$|v rt        d%       |r2|jP                  jR                  jT                  jW                  |
||      }
nG|d&k(  rBddl,m-c m.} |j_                  d$|d'(      }|ja                  |)      }|jc                  |
|*      }
| j                   j                  r:| j                  j                  dk(  r!| je                  |
|rdn|
jf                  +      }
| jh                  }|jk                  d,      |
_6        |jk                  d-      |
_7        |jk                  d.      |
_8        |jk                  d/      |
_9        |
jt                  jw                  |jy                         D ci c]  \  }}|t{        |       c}}       | j                  j                  dk(  r|
jt                  jw                  d0d1i       	 |
j}                  t{        |             |S c c}}w # t~        $ rQ}t        j4                  | d2| d3       |j!                  d      }|
j}                  t{        |             Y d}~|S d}~ww xY w)4z#Export YOLO model to CoreML format.r   zcoremltools>=8.0r   Nr  z" starting export with coremltools r  zHCoreML 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.mlmodelrY   r   )r   zB 'nms=True' is only available for Detect models like 'yolo11n.pt'.Fr  )lower_boundupper_bounddefault    r   )r  imagegp?)r   r   r   )r  scalebiasneuralnetworkr   )inputsclassifier_config
convert_to)r  kmeans)   linear)r+  Nr3  zscikit-learnr  i   )modenbitsweight_threshold)global_config)configweights_dirr
  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#  r*   coremltoolsr   r   r   r#   r:   rE   rI   rH   r/  r   rK  r  is_dirr  r  ClassifierConfigr   r   r  IOSDetectModelrJ  r'  r   rF  r  r9  ShapeRangeDimr  r  
TensorType	ImageTyper  rR   rG   modelsneural_networkquantization_utilsquantize_weightscoremltools.optimize.coremlrF   rX   OpPalettizerConfigOptimizationConfigpalettize_weights_pipeline_coremlr<  rT  r  short_descriptionr  r  r   user_defined_metadataupdater  r   r  r   )r   r   r   ctr   r1  r/  r  input_shaper0  ct_modelbitsr6  cto	op_configr:  rr  ru  rv  r   s                       r~   r[  zExporter.export_coremlg  s    ))""((*i7-. b B2>>BRRUVWfff{???z99??Q99$$ }$ 99yy}} w$ ::??j0u2uu0II!!*\J88:MM! ::??j( " 3 3D9I9I9P9P9R4S TJJEZZ__(RVR[R[R_R_N4::twwg+NeieoeoEyy}}&)klmJJEYY__UZZ\4775_A99((KKA499??TUKVGGMM!$KKBDJJqMA<MW[WaWabcWdKeKKBDJJqMA<MW[WaWabcWdKe	 # K mmG;m?@Fll7$''--wUdlefF ::/*1{	  
 '+iinn]DIINN.`j
d"94">29933FFWWX`bfhlm9922_b2c	//i/H00&0I99==TZZ__8,,X74X`XlXl,mHMM%&UU=%9"%%/55+55+&&--QWWY.OTQq#a&y.OP::??j(**113XZk2lm	"MM#a&!  /P  	"NN(@ Ds t j)AMM#a&!!	"s   <V-
V3 3	X<AXXz	TensorRT:c                    | j                   j                  j                  dk7  sJ d       | j                         }	 ddl}t        |j                  dd	
       t        |j                  dd       t        j                  d| d|j                   d       t!        |      j#                         s
J d|        | j$                  j'                  d      }t)        ||| j*                  j,                  | j*                  j.                  | j*                  j0                  | j*                  j2                  | j                   j4                  || j*                  j0                  r| j7                  |      nd| j8                  | j*                  j:                  |       |S # t
        $ rI t        r;t        j                  j                  j                  d      d   }t        d| d       ddl}Y w xY w)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   Nr   ztensorrt-cuz>7.0.0,!=10.1.0z>=7.0.0T)hardz!=10.1.0z5https://github.com/ultralytics/ultralytics/pull/14239)rl  r  z starting export with TensorRT r  r  rV   )r   r  rT  verboser   )rJ  r   r.  rY  r   ImportErrorr   r   r   r   r   r*   r+   r   r   r   r   r  rK  r  r1   r   	workspacerG   rR   rI   r  r  rT  rZ  )r   r   r   r  r   cuda_versionr   s          r~   rX  zExporter.export_engine  s    ww~~""e+l-ll+!!#	#" 	cooyt<cooz7no 	b ??PPSTUF|""$M(DVH&MM$II!!),IIIINNIINNIIGGMMDHIINND88@X\]]II%%	
 7  	#$}}1177<Q?"[o#NO"		#s   F AG('G(zTensorFlow SavedModel:c                 d	   t         j                  j                         }	 ddl}t        ddddt        rdnd	z   d
dd|rdnddf	d       t        j                  d| d|j                   d       t        |j                  dddd       t        t        | j                        j                  | j                  j                  d            }|j!                         rt#        j$                  |       t        d      }|j'                         st)        | ddd       t+        | j,                  j,                  d   t.              rW| j0                  j2                  xs d| j0                  _        d | j0                  j2                  cxk  rdk  sJ d!        J d!       d| j0                  _        | j7                         }d}| j0                  j8                  r|d"z  }| j0                  j:                  r|j=                          | j?                  |      D 	cg c]  }	|	d#   	 }
}	t         j@                  jB                  jE                  t        jF                  |
d      jI                         | jJ                  $      jM                  dd%d&d'      }
tO        jP                  t        |      |
jS                         jU                  tN        jV                               d(|g d)gggg d*ggggg}ddl,}t        j                  | d+|j                   d       |j[                  |t        |      dd,| j0                  j8                  || j0                  j8                   d| j0                  j\                  d-v .	      }t_        jP                  |d/z  | j`                         | j0                  j8                  rjc                  d0       |je                  d1      D ]I  }|jg                  |ji                  |jj                  j                  d2d3      |j                  z                K |je                  d4      D ]  }|jc                           |je                  d5      D ]0  }d6t        |      v r|jc                         n| jm                  |       2 t        |      |fS # t        $ r t        d       ddl}Y w xY wc c}	w )7z2Export YOLO model to TensorFlow SavedModel format.r   Nztensorflow>=2.0.0,<=2.19.0ztf_keras<=2.19.0zsng4onnx>=1.0.1zonnx_graphsurgeon>=0.3.26zai-edge-litert>=1.2.0z,<1.4.0r   r  zonnx2tf>=1.26.3r  zonnxruntime-gpur  zprotobuf>=5z---extra-index-url https://pypi.ngc.nvidia.comr  r  ! starting export with tensorflow r  z>=2.0.0
tensorflowTz6https://github.com/ultralytics/ultralytics/issues/5161)rt   rZ  rl  r[   z6calibration_image_sample_data_20x128x128x3_float32.npyr  )unzipr  r      r4  z%RTDETR export requires opset>=16;<=19z&tmp_tflite_int8_calibration_images.npyr  )sizer   r   r   r  r   r   r      rf  rf  z% starting TFLite export with onnx2tf r   >   rc   ra   )	input_onnx_file_pathoutput_folder_pathnot_use_onnxsim	verbosityoutput_integer_quantized_tflite!custom_input_op_name_np_data_pathenable_batchmatmul_unfoldoutput_signaturedefsdisable_group_convolutionr  r  z*_dynamic_range_quant.tflite_dynamic_range_quant_int8z%*_integer_quant_with_int16_act.tflitez*.tflitezquant_with_int16_act.tflite)7r   r   r+  r`  r[  r*   r   r   r   r   r+   r   r   rK  rN  r6  r?  r  r  r  r.   r   r/  r   r   rM   rN   rY  rR   r   r  r  nn
functionalinterpolatecatr:  r  permuter  r  r  r  r  onnx2tfr  r   r$   rT  r  rglobrename	with_namerM  _add_tflite_metadata)r   r   r   tfr   onnx2tf_filer  np_datatmp_filerE   r  rw  r  rK  s                 r~   r\  zExporter.export_saved_model  s    zz&&(	$# 	"!+'92F!"%)!}
 A	
 	b A"..AQQTUVNNH	
 TYY''		(8(8.IJ88:MM! TU""$"l^4#8TR djj&&r*M:"iioo3DIIO.B.W0WW.W0WW.!		!!# 99>>CCHyy~~	484X4XY_4`a5%,aa,,88619M9S9S9U\`\f\f8gooq!Q Hv||~'<'<RZZ'HI$h9+OCTBUAVWXvhCGDWDWCXX[\]oo!'"1v ,0IINN.53799>>/A!%&*ii&6&6:M&M & 

 			!o%t}}5 99>>OOtO, >? nDNN499+<+<=SU\+]`d`k`k+klmn GH  GGJ' 	gD73q6AAHHJtG`G`aeGf	g 1v{""g  	$;<#	$` bs   R R-R*)R*zTensorFlow GraphDef:c                 4   ddl }ddlm} t        j                  d| d|j
                   d       | j                  j                  d      }|j                  fd      }|j                  |j                  j                  d   j                  j                  d   j                              } ||      }|j                  j                          |j                   j#                  |j                  t%        |j&                        |j(                  d	
       |S )zgExport YOLO model to TensorFlow GraphDef *.pb format https://github.com/leimao/Frozen-Graph-TensorFlow.r   N)!convert_variables_to_constants_v2r  r_  r  r^   c                      |       S r   )r}   r  s    r~   <lambda>z$Exporter.export_pb.<locals>.<lambda>N  s    +a. r   F)graph_or_graph_deflogdirrt   as_text)r`  0tensorflow.python.framework.convert_to_constantsr  r   r   r   rK  r  functionget_concrete_function
TensorSpecr0  r  r  graphas_graph_defiowrite_graphr   rf  rt   )r   r  r   r|  r  r   rr  frozen_funcs    `      r~   r]  zExporter.export_pbE  s     	 fb A"..AQQTUVII!!%(KK01##BMM+2D2DQ2G2M2M{OaOabcOdOjOj$kl7:&&(
[->->s188}[\[a[akpq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  r_  r  r[   z_int8.tflitez_float16.tflitez_float32.tflite)r`  r   r   r   r   r   rK  rN  r6  r   rR   rM  rG   )r   r   r|  rZ   r   s        r~   r^  zExporter.export_tfliteU  s     	 b A"..AQQTUV3tyy>11$))2B2BNST99>> 0==A
 1v	 YY^^ 0@@A 1v  0@@A1vr   z	Edge TPU:c                    d}d}t         s
J d|        t        j                  |t        j                  t        j                  d      j                  dk7  rVt        j                  d| d|        d	D ]6  }t        j                  t               r|n|j                  d
d      dd       8 t        j                  |ddd      j                  j                         j                  d      d   }t        j                  d| d| d       t        |      j                  dd      }dt        |      j                   d| d}t        j                  | d| d       t        j                  |d       | j                  |       |S )zQExport YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/.zedgetpu_compiler --versionz'https://coral.ai/docs/edgetpu/compiler/z$export only supported on Linux. See T)stdoutstderrshellr   r  z< export requires Edge TPU compiler. Attempting install from )zOcurl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -zecho "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.listzsudo apt-get updatez%sudo apt-get install edgetpu-compilerzsudo r   )r  r  )r  capture_outputr  r   )maxsplitr   z( starting export with Edge TPU compiler r  r`   rb   zedgetpu_compiler --out_dir "zS" --show_operations --search_delegate --delegate_search_step 30 --timeout_sec 180 "r  r  r   r  )r   r  r  DEVNULL
returncoder   r   r-   rN  r  decoder*  r   r   rf  r{  )r   r  r   r$  help_urlcverr   s           r~   r_  zExporter.export_edgetpue  sz    +<G<XJGGu>>#j&8&8ASAS[_`kkoppKK"VH$`ai`jkl m $5$7qQYYwPR=S[_gklm nnSTNUU\\^eeopeqrtub HSQR%%i1BCq'..) *
 ~Q  	 	vhjQ/0s$'!!!$r   zTensorFlow.js:c                 V   t        d       ddl}ddl}t        j                  d| d|j
                   d       t        | j                        j                  | j                  j                  d      }t        | j                  j                  d            }|j                         j                         }t        |d	      5 }|j                  |j                                ddd       d
j!                  t#        |            }t        j                  d| d|        | j$                  j&                  rdn| j$                  j(                  rdnd}	t+        |      5 }
t+        |      5 }d|	 d| d|
 d| d	}t        j                  | d| d       t-        j.                  |d       ddd       ddd       d|v rt        j0                  | d| d       t3        j4                  t7        |      dz  | j8                         |S # 1 sw Y   'xY w# 1 sw Y   kxY w# 1 sw Y   oxY w)z*Export YOLO model to TensorFlow.js format.tensorflowjsr   Nr  z# starting export with tensorflowjs r  rd   r^   rb,z output node names: z--quantize_float16z--quantize_uint8r   z6tensorflowjs_converter --input_format=tf_frozen_model z --output_node_names=z "z" "r  r  r   Tr  r  z8 your model may not work correctly with spaces in path 'r   r  )r*   r`  r  r   r   r   r   rK  rN  r6  r  Graphr  openParseFromStringreadr   r   r   rG   rR   r5   r  r  r'  r$   r  r   rT  )r   r   r|  rc   r   f_pbr   rK  outputsquantizationfpb_f_r$  s                r~   r`  zExporter.export_tfjs  s    	>*#b CDDTDTCUUXYZ		N""499#3#3\B499((/0XXZ$$&$ 	,tyy{+	,((:b>*b 4WI>?/3yy~~+Y]YbYbYgYgCUmoD! 	,T>!+< 	,22>?TU\T]]_`d_eehikhllmo  KK6(*SE34NN3d+	, 	, !8NNfX%]^_]``bcd 			$q'O+T]];'	, 	,	, 	, 	, 	,s1    HH'AH)HHH	HH(zRKNN:c                 ~   t        j                  d| d       t        d       t        rddl}d |_        ddlm} | j                         }t        t        |      j                   d      }|j                  d	
        |d      }|j                  g dgg dg| j                  j                         |j                  |       |j!                  d       |j#                  dd| j                  j                   d      }|j%                  ||z          t'        j(                  |dz  | j*                         |S )z!Export YOLO model to RKNN format.r  z& starting export with rknn-toolkit2...zrknn-toolkit2r   Nc                       y r  r  r  r   r~   r  z&Exporter.export_rknn.<locals>.<lambda>  s    r   )rq   rs   Tr  F)rZ  rd  re  )mean_values
std_valuestarget_platform)r/  )do_quantizationrL   rA   z.rknnr  )r   r   r*   r   builtinsexitrknn.apirq   rY  r   rM  r  r:  r   rt   	load_onnxbuildrN  re  r$   r  rT  )r   r   r  rq   r   export_pathrr   s          r~   re  zExporter.export_rknn  s    	b FGH?+(HM!d1gll^;784(E"8I[_[d[d[i[ijQ

5
)IIg499>>"2%89K!O,.		+/?r   zIMX:c                     t         sJ d       t        | j                  dd      rt        d      t	        d       t	        d       t	        d       	 t        j                  dd	gd
d
      j                  j                         }t        j                  d|      }|rt        |j                  d            nd}|dk\  sJ d       	 t#        | j                  | j$                  | j&                  j(                  | j&                  j*                  | j&                  j,                  | j.                  | j1                  |      |      S # t        t
        j                  t        f$ r. t!               rdgng g dz   }t        j                  |d
       Y w xY w)z Export YOLO model to IMX format.zexport only supported on Linux. See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converterr   Fz/IMX export is not supported for end2end models.)z model-compression-toolkit>=2.4.1zsony-custom-layers>=0.3.0zedge-mdt-tpc>=1.1.0zpydantic<=2.11.7zimx500-converter[pt]>=3.16.1zmct-quantizers>=1.6.0javaz	--versionT)r  r  z(?:openjdk|java) (\d+)r   r   r   zJava version too oldsudo)aptinstallz-yzopenjdk-21-jrer  )rT  r  r   )r   r   r/  r&  r*   r  r  r  r  researchrR  groupFileNotFoundErrorCalledProcessErrorAssertionErrorr-   r2   rK  r   r0  r  r>  rT  r  )r   r   java_outputversion_matchjava_versionr$  s         r~   rd  zExporter.export_imx  sX     	
u	
u 4::y%0NOOx	
 	9:23	,$..&+)>d[_`ggnnpKII&?MM:G3}22156QL2%='==%
 JJIIIINNIIMMII]]88@	
 		
	 ":#@#@.Q 	,02F8>hhCNN3d+	,s   A2E A	FF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writestrr  r  rT  )r   rK  r  zfs       r~   r{  zExporter._add_tflite_metadata  sS    __T3(<(<= 	NKKDMM!)LM	N 	N 	Ns   2AA&zCoreML Pipeline:c                    ddl }t        j                  | d|j                   d       |j	                         }t        t        |j                  j                              }| j                  j                  dk(  rz| j                  d   | j                  d   dz
  f|d   j                  j                  j                  dd | j                  d   df|d   j                  j                  j                  dd | j                  d	   }|j                  j                   d   j                  j"                  j$                  |j                  j                   d   j                  j"                  j&                  }	}|d   j                  j                  j                  d
   }
t)        |      |
k7  r1i |t+        t)        |      |
      D ci c]  }|t-        |       c}}|j.                  j1                  ||      }|j2                  j4                  j7                         }|j8                  |_        t+        t)        |            D ]  }|j:                  j                  j                  |   j=                         }|j                  j                   j?                          |j                  j                   |   jA                  |       |j                  j                  j?                          |j                  j                  |   jA                  |        ddg}tC        |      D ]#  \  }}||j                  j                  |   _"        % tC        |      D ]D  \  }}|j                  j                  |   j                  j                  }|jF                  jH                  j?                          d|jF                  jH                  d   _%        d
|jF                  jH                  d   _&        |jF                  jH                  j?                          |j                  j                  j                  d
   |jF                  jH                  d   _%        |j                  j                  j                  d
   |jF                  jH                  d   _&        |j                  dd= G |jN                  }|d   jD                  |_(        |d   jD                  |_)        |d   |_*        |d   |_+        d|_,        d|_-        | j                  j\                  |_/        | j                  j`                  |_1        d|jd                  _3        |jh                  jj                  jm                  |jo                                |j.                  j1                  |      }|j.                  jp                  js                  d|j.                  jt                  jw                  d|	|      fd|j.                  jt                  jy                         fd|j.                  jt                  jy                         fg|      }|j{                  |       |j{                  |       |j|                  j                  j                   d   jA                  |j:                  j                  j                   d   j=                                |j|                  j                  j                  d   jA                  |j:                  j                  j                  d   j=                                |j|                  j                  j                  d   jA                  |j:                  j                  j                  d   j=                                |j8                  |j|                  _        |j|                  j                  j                  j~                  j                  t-        |j^                        t-        |jb                        d       |j.                  j1                  |j|                  |      }d|j                  d<   d|j^                   d|j                  d<   d|jb                   d|j                  d<   d|j                  d<   d|j                  d<   t        j                  | d       |S c c}w )z:Create CoreML pipeline with NMS for YOLO detection models.r   Nz$ starting pipeline with coremltools r  r   r   r   r  r   r   r;  
confidencecoordinatesiouThresholdconfidenceThresholdTr,  r   )input_featuresoutput_features)zIoU thresholdzConfidence thresholdzInput imagez,(optional) IoU threshold override (default: r  z3(optional) Confidence threshold override (default: u?   Boxes × Class confidence (see user-defined metadata "classes")u7   Boxes × [x, y, width, height] (relative to image size)z pipeline success)Cr>  r   r   r   get_specr   iterr
  outputr   r   rL  r.  multiArrayTyper  rT  r   	imageTyper  r  rV  rB  r   rF  MLModelproto	Model_pb2ModelspecificationVersion_specSerializeToStringr  r  	enumeratert   
shapeRange
sizeRanges
lowerBound
upperBoundnonMaximumSuppressionconfidenceInputFeatureNamecoordinatesInputFeatureNameconfidenceOutputFeatureNamecoordinatesOutputFeatureNameiouThresholdInputFeatureName#confidenceThresholdInputFeatureNamer  r  r0  r  pickTopperClassstringClassLabelsvectorr   r  pipelinePipeline	datatypesArrayDouble	add_modelspecuserDefinedrQ  input_descriptionoutput_description)r   r/  r<  r   rR  r  outsr   nxnyncinms_specdecoder_outputr  rt   outma_typerH   	nms_modelr  s                        r~   rN  zExporter._pipeline_coreml  s    vhB2>>BRRUVW ~~D))001299y(373D3DQ3GIZIZ[\I]`aIa3aDGLL''--a0373D3DQ3G3JDGLL''--a0 g&!!''*//99??AQAQAWAWXYAZA_A_AiAiApApB!W\\((..r2u:KuKE#e*b4I JqCF JKE 		!!$K!@ 88%%++-(,(A(A%s4y! 	KA"[[44;;A>PPRN  &&**,  &&q)99.I  ''++-  ''*::>J	K %m4 . 	7GAt26H  ''*/	7  o 	!FAs**11!499HHG))--/:;G))!,7:<G))!,7))--/:=((:Q:Q:W:WXZ:[G))!,7:=((:Q:Q:W:WXZ:[G))!,7a 	! ,,)-a&*.q',,'*6q/'+7?(+9(2G/99=="&))..#$$++ELLN;II%%h/	 99%%.."))--33Ar2>?!4!4!;!;!=>&		(;(;(B(B(DE
 ) / 
 	5!9% 	!!''*::5;;;R;R;X;XYZ;[;m;m;op!!((+;;IOO<W<W<^<^_`<a<s<s<uv!!((+;;IOO<W<W<^<^_`<a<s<s<uv .2-F-F*!!**66==!#"2"23SQTQhQhMij	

 		!!(--[!I+8(4`adaqaq`rrs2t/A#BYBYAZZ[\ 	 56 2s  .2k  /vh/01W !Ks    beventc                 @    | j                   |   j                  |       y)z1Append the given callback to the specified event.N)r%   r   r   r  callbacks      r~   add_callbackzExporter.add_callbackN  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~   rU  zExporter.run_callbacksR  s)    **5"5 	HTN	r   r  )r   )__name__
__module____qualname____doc__r   r   r   r{  r  r   r&   rW  rY  rZ  ra  rb  rc  r[  rX  r\  r]  r^  r_  r`  re  rd  r{  rN  r	  rU  r  r   r~   r   r      s   0d '$4 2Lc L\[. (0(@    !)'!2 @ @D %-k%: H HT #+O#<  .  ( 0  0 !)'!2 A AF #+I#6 [ [z  $Xk-B " "H (01I(J X# X#t ,45K,L   #+,>#?   *,Xk5J    D !)*:!;  @ !)'!2  4  ( 0 !
 !
FN 37xHZ?[ ]~/# /3 r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )rA  z;Wrap an Ultralytics YOLO model for Apple iOS CoreML export.c                 N   t         |           |j                  \  }}}}|| _        t	        |j
                        | _        || _        ||k(  rd|z  | _        yt        j                  d|z  d|z  d|z  d|z  gt        |j                               j                        | _        y)aG  
        Initialize the IOSDetectModel class with a YOLO model and example image.

        Args:
            model (torch.nn.Module): The YOLO model to wrap.
            im (torch.Tensor): Example input tensor with shape (B, C, H, W).
            mlprogram (bool): Whether exporting to MLProgram format to fix NMS bug.
        g      ?)r   N)superr   r  r/  rV  r   r  r   	normalizer   tensornextr7  r   )r   r/  rJ  r   rt  hw	__class__s          r~   r   zIOSDetectModel.__init__[  s     	XX
1a
ekk""6 1WDN"\\q#'37C!G4E,,./66DNr   c                    | j                  |      d   j                  dd      j                  d| j                  fd      \  }}| j                  rm| j                  dz  dk7  r[t        | j                  dz   dz  dz        | j                  z
  }t        j                  j                  j                  |d|ddfdd      }||| j                  z  fS )zRNormalize predictions of object detection model with input size-dependent factors.r   r   r  P   O   constant)r/  	transposer   r  r   rR  r   rr  rs  padr  )r   r}   xywhcls
pad_lengths        r~   rA  zIOSDetectModel.forwardq  s    JJqM!$..q!4::Atww<K	c>>dggla/tww|2b89DGGCJ((%%))#:q!/DjRSTCD4>>)))r   )Tr  r  r  r  r   rA  __classcell__r  s   @r~   rA  rA  X  s    E,*r   rA  c                   (     e Zd ZdZ fdZd Z xZS )rC  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 (Namespace): The export arguments.
        r  >   rc   r_   rZ   N)	r  r   r/  r   r   r  r   	frozensetis_tf)r   r/  r   r  s      r~   r   zNMSModel.__init__~  sJ     	
	::&YY%%3T)UU
r   c           	         ddl m} 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  rt#        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                  j0                        | j                  _        t#        j$                  |j                  d   | j                  j0                  |
j                  d   d
z   |z   fi |}t3        |      D ]a  }|
|   ||   ||   ||   f\  }}}}|| j                  j4                  kD  }| j6                  s%| j                  j8                  dk(  rZ| j:                  rN||z  }|j=                  t/        | j                  j0                  dz  |j                  d               j>                  }||   ||   ||   ||   f\  }}}}|jA                         }| j:                  rdnd}| j                  j8                  dk(  r||z  }n7||z  t#        j(                  |j                  d
d	 fi |j'                         z  }| j                  jB                  sr| j:                  rd
nd}|jE                  dd      jG                  |j                  d   |      }|d	d	d	|f   ||z  z   }t#        j*                  ||d	d	|d	f   fd      }| j:                  r{ |tH        jJ                  | j6                  xsP | j                  jL                  xs ddk  xs1 | j                  j8                  dk(  xr | j                  jN                   tP        d      n|} || j:                  rt#        j*                  ||gd      n||| j                  jR                        d	| j                  j0                   }t#        j*                  ||   ||   jU                  dd      ||   jU                  dd      jW                  |j                        ||   gd      }ddd| j                  j0                  |j                  d   z
  f}	t"        jX                  jZ                  j]                  ||	      ||<   d | j                  j^                  dk(  r
|d	| |d   fS |d	| S )au  
        Perform inference with NMS post-processing. Supports Detect, Segment, OBB and Pose.

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

        Returns:
            (torch.Tensor): List of detections, each an (N, max_det, 4 + 2 + extra_shape) Tensor where N is the
                number of detections after NMS.
        r   )partial)rH   )r   r  r   r  r   Nr   )dimrK   r  r  r_   r   rP   F)use_triuiou_func
exit_earlyr  )0	functoolsr)  torchvision.opsrH   r/  r   r  r{   r   r  r  r  rV  r   r   rI   rE   r   r3  rS  r  ru  r   r   r>  rB  r0  r'  r   r  topkindicescloneagnostic_nmsreshapeexpandr7   fast_nmsrM   rR   r6   r  viewr5  rr  rs  r  r   )r   r}   r)  rH   predspredr   bsextra_shaper  boxesscoresextrasclassesr  r  boxr  scoreextramasknmsbox
multiplierend
cls_offsetoffboxnms_fnkeepdetss                                r~   rA  zNMSModel.forward  s    	&'

1%eU3uQxT[[

;ZZ]~~b"%jjnC

0@0@,A(AB991!4++eiiTYY__r5I(JELLYZO\x_c_i_ijkjl_mxqwxC99dC[)D $

As4::3C3C/Dk+RXY
 Zvv ***,

1tyy/@/@A		kk$**Q-):):EKKOa<OR]<]haghr 0	8A%*1Xwqz6!9fQi%O"CeU499>>)Dzzdii..&8TXXzz#dii&7&7!&;U[[^"LMUU%(YdSYd%S"CUYY[F"hhAJyy8+*$#f,u||AGGABK/R6/R/V/V/XX99))88a ![[Q/66v||AL
4C4:
+BBFF1cd7O#<"E 88 %%

 O IIOO1rR7O II,,
:Mtyy~~
 +$	   6:hh		65/r2F		 "		!!	#D
 99TE$K,,R3SY^^B5J5M5Mcii5XZ_`dZeflnD aDII--

1=>CXX((,,T37CFa0	8b (,zz)'CCR%(#QSbQr   r!  r#  s   @r~   rC  rC  {  s    LVNRr   rC  )F)fr  r  r  r  r  r  r"  rD  copyr   r   pathlibr   r  r  r   ultralyticsr   ultralytics.cfgr   r   ultralytics.datar	   ultralytics.data.datasetr
   ultralytics.data.utilsr   r   ultralytics.nn.autobackendr   r   ultralytics.nn.modulesr   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%   r&   r'   ultralytics.utils.checksr(   r)   r*   r+   r,   r-   ultralytics.utils.downloadsr.   r/   r0   ultralytics.utils.exportr1   r2   r3   ultralytics.utils.filesr4   r5   ultralytics.utils.metricsr6   ultralytics.utils.nmsr7   ultralytics.utils.opsr8   ultralytics.utils.patchesr9   ultralytics.utils.torch_utilsr:   r;   r<   r=   r>   r   rR  r   r   r   r   r   rr  ModulerA  rC  r  r   r~   <module>rb     s   7r  	 	          # . - 0 G M G G c c    &  a ` G G = 3 * ) 2 e e"[J6 68n.h.g gT# *UXX__  *F_Ruxx _Rr   