
    j!                      d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddl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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZT ddlUmVZV ddlWmXZX ddlYmZZZ ddl[m\Z\ ddl]m^Z^ ddl_m`Z`maZambZbmcZcmdZdmeZemfZfmgZg d Zhd%d&dZid Zjd Zk G d d           Zl G d! d"ejm        jn                  Zo G d# d$ejm        jn                  ZpdS )'a9  
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                 | `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

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)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_DEBIAN_BOOKWORMIS_DEBIAN_TRIXIE	IS_JETSONIS_RASPBERRYPI	IS_UBUNTULINUXLOGGERMACOSMACOS_VERSION
RKNN_CHIPSSETTINGSTORCH_VERSIONWINDOWSYAML	callbackscolorstrget_default_argsis_dgx	is_jetson)
IS_PYTHON_3_10IS_PYTHON_MINIMUM_3_9check_apt_requirementscheck_executorch_requirementscheck_imgszcheck_requirementscheck_tensorrtcheck_versionis_intelis_sudo_available)keras2pbonnx2engineonnx2saved_modelpb2tfjstflite2edgetputorch2executorch	torch2imx
torch2onnx)	file_size)batch_probiou)TorchNMS)Profile)arange_patch)
TORCH_1_10
TORCH_1_11
TORCH_1_13	TORCH_2_1	TORCH_2_3	TORCH_2_4	TORCH_2_9select_devicec                    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)rS   rW   rU   opsetsimplifyrV   OpenVINOopenvino_openvino_modelF)rS   rW   rU   int8rV   fractionTensorRTengine.engine)rS   rW   rU   r`   r\   rV   ra   CoreMLcoreml
.mlpackage)rS   rW   rU   r`   rV   zTensorFlow SavedModelsaved_model_saved_model)rS   r`   kerasrV   zTensorFlow GraphDefpb.pbrS   zTensorFlow Litetflite.tflite)rS   rU   r`   rV   ra   zTensorFlow Edge TPUedgetpu_edgetpu.tflitezTensorFlow.jstfjs
_web_model)rS   rU   r`   rV   PaddlePaddlepaddle_paddle_modelMNNmnn.mnn)rS   rU   r`   NCNNncnn_ncnn_modelrU   IMXimx
_imx_model)r`   ra   rV   RKNNrknn_rknn_modelname
ExecuTorch
executorch_executorch_modelAxeleraaxelera_axelera_model)rS   r`   ra   )FormatArgumentSuffixCPUGPU	Arguments)dictzip)xs    `/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/ultralytics/engine/exporter.pyexport_formatsr      s    
CdB/	~tTCrCrCrs	$.f.f.fgCCC	
 OOO	
 
8\48c8c8cd	 -tMnMnMno	eT4'C	Hiu>j>j>jk		+<dE2N	&,e=]=]=]^	?D$	J	vtT+D+D+DE	dWf4EF	|T41L1L1LM	uw6GH	|%8$yQ	I/?\?\?\]A!	AD OOOQTVWQXYYZZZ    Freturnintc                   t           r=t          j        j        j        j        dz
  }t          rt          |d          }|r|dz  }nUd                    t          j
        d          dd                   }ddddd	d
d
d
d
d
dddddd                    |d          }t          || 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)rJ   torchrY   utils
_constantsONNX_MAX_OPSETrK   minjoinr&   splitgetdefsonnx_opset_version)rY   cudar[   versions       r   best_onnx_opsetr      s     
 +:Q> 	#rNNE 	QJE((=.s33BQB788
 
  #gr

! 	" udi2244555r   c                    g d}|J d|  d            dddd}t          t          |          }|D ]=}t          ||d          t          ||d          k    }|r||v sJ d| d|  d	            >dS )
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.
    )rU   r`   rW   rj   rV   rS   ra   Nu"   ERROR ❌️ valid arguments for 'z' not listed.r   )rS   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RRK!!#]#]#]#]!!!$$77F;//L n nk355sTX9Y9YY 	n*$$$&m&m&mdj&m&m&m$$$n nr   c                4     t                      fd}|S )z(YOLO export decorator, i.e. @try_export.c            
        d         }d}	 t                      5 } 	| i |}ddd           n# 1 swxY w Y   t          |t          t          f          r|n|d         }t	          |          }|dk    s
J d            t          j        | d|j        dd| d	|dd
           |S # 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: )
rC   
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   sT   H%
	 0bJ///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"1sDk22<11!D4B8887888K6ccrtcccdccWYccccdddH 	 	 	LFDDBDDDDDDEEEG	s3   B) 	0B) 4B) 4A0B) )
C3$CC)r+   )r   r   r   s   ` @r   
try_exportr      s7    !*--J       r   c                  p   e Zd ZdZeddfd5dZd6d7dZd8d
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 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ed9d1            Zd:d3Zd:d4Z dS );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")
    N
_callbacksdict | Nonec                    t          ||          | _        |pt          j                    | _        t          j        |            dS )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	overridesr   s       r   __init__zExporter.__init__;  sA     C++	#Hy'F'H'H+D11111r   r   r   c                :#   01 t          j                     } j        j                                        00dv rd00dv rd0t	                      }t          |d         dd                   }0|vrjddl}|                    0|dd	
          }|s"0dk    rdnd0 d}t          | d|           t          j
        d0 d|d          d           |d         00fd|D             }t          |          dk    rt          d0 d|           |\  }	}
}}}}}}}}}}}}}}}t          |||||f          }d}|r, j        j         t          j
        d           d j        _        |rndt           j        j                  v rSt           j        j                  }|                    dd          d         }d j        _        |dv sJ d| d            |rJ j        j        >t           j                                        r t          j
        d           d j        _        t'           j        j        dn j        j                   _        |d         |                    d          dz            1t+          0 j        1           |rrt,          st/          d            j        j        s t          j
        d!           d j        _        |j        d"vrt          d#           j        j        sd$ j        _        |ry j        j        s t          j
        d%           d j        _         j        j        s)|j        d&v r t          j
        d'           d j        _        |j        d(vrt          d)          t9          |d*          st;                      |_        t?          |j                  |_        t9          |d+          r j        j          j        j         |_         |s
|s|s|s|s|r0d,|_         t          j
        0!                                 d-           |rT j        j        rH	 ddl"}tG          |j$        d.d/          rd,|_         t          j
        d0           n# tJ          $ r Y nw xY w j        j&        r, j        j        r t          j
        d1           d, j        _&         j        j&        r2|	r0 j        j'        dk    r t          j
        d2           d, j        _&        tQ           j        j)        |j*        d34           _)         j        j+        r&|r
J d5             j        j'        dk    s
J d6            |r j        j,        s t          j
        d7           d8 j        _,         j        j,                                         j        _,         j        j,        tZ          v s J d9 j        j,         d:tZ           d             j        j        rt]          |t^                    r
J d;            |rt`          rtb          r
J d<            |rtd          s
J d=            |
rtd          s
J d>            tg          |d+d,          s t]          |j4        d         tj                    r t          j
        d?           d, j        _         j        j6        pd@ j        _6        |s|s j        j        rO j        j7        rC j        j8        dk    r3t          j
        dA j        j        rdBndC j        j          dD           |rMtb          rt`          rt/          dE           j        j8        dk    r t          j
        dF           d j        _8        t]          |tr                    rt          j
        dG           d|_:         j        j        r` j        j        sTtv          j        ptx          tg          |dHdI                    j        _        t          j
        dJ j        j         d           |rt`          rtb          rt/          dK          t{          j>        dL          r,t                      rt          j@        dM           d,tz          dL<   t!          jA         j        j8        |jB        >                    dNdO          g j)        R  C                     j                  }t          tg          |dPd          p+tg          |dQd          p|jB        >                    dQdR                    }|jE        dSv rt          |j,                  }t          |          C                     j                  }|G                                D ]	} d,| _H        
|I                                 |J                                 |K                                }|rddTlLmM}!  |!| j)                  }|s|rddUlNmO}"  |"|          }|rddVlPmQ}#  |#|          }|R                                D ]X}$t]          |$t                    rd|$_T        t]          |$t          tj          f          r j        j7        |$_7        d|$_T         j        j        |$_        t           fdW|j*        V                                D                       }%t           j        jX        |%          |$_X         j        jY        |$_Y         j        j        o| |$_Z        d|$_[        t9          |dX          rBt9          |$dY          r2|$K                    |j\        C                     j                             5t]          |$t                    r|s|$j^        |$__        Zd}&t          d3          D ];}' j        j        r"|s |s t          | j                  |          n
 ||          }&< j        j&        r<|
s|	r8 j        j'        dk    r(|&                                |&                                }}| _b        | _4        | _c        t]          |&t           jd                  rt          |&j[                  nt          dZ |&D                        _e        t           j4        jB        >                    dQ jc                            jf        g                    d[d\           _h        t9          |d]          r't]          |j        t                    r|j        d^         ndR}(d_ jh         d`|(rda|( ndR })|)dbt          jk                    l                                tH          dcddt          t          |j*                            |j         j        j8         j)        |j        1fde j        D             |jB        >                    dNdO          tg          |d+d,          df _o        |
| jo        d<   |j        dgk    r9|j4        d         jp         jo        dh<   t9          |di          r|jq         jo        di<   t          j@        djt          dk           dl| dmt          |j[                   dn je         dot          |          dpdq            t                    dr           dRgt          |          z  }*|	r v                                |*d<   |r w                    |s          |*d<   |
r x                                |*d3<   |r y                                |*dO<   |r z                                |*dt<   |r j        xj        |z  c_         {                                \  |*du<   }+|s|r |                    |+v          |*dw<   |r }                                |*dx<   |r< ~                    t          |*du                    jc        jf         dyz  z          |*d{<   |r                                 |*d|<   |r                                 |*d}<   |r                                 |*d~<   |r                                 |*d<   |r                                 |*d<   |r                                 |*d<   |r                                 |*d<   |r                                 |*d<   d |*D             }*t          |*          r<t          t          |*d                             }* j)        d          j)        d         k    },|,rdRnd j)         dt           j)                   d}-|,r j)        d         n/t           j)                  dd         g                    ddR          }. j        j        rdn j        j&        rdndR}/t          j@        dt          j                     |z
  dpdt          d|j                                                   d|j         d|* d|. d|/ d|j         d|* d|. d|( d|/ d|- d            t                    d           |*S )zExport 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tensorrtrc   >   iosapplerf   mlmodel	mlpackage	mlprogramrf   r   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   c                    g | ]}|k    	S  r   ).0r   fmts     r   
<listcomp>z%Exporter.__call__.<locals>.<listcomp>_  s    (((ac(((r   z'. Valid formats are z>TensorRT requires GPU export, automatically assigning device=00dla:>   r   1z,Expected device 'dla:0' or 'dla:1', but got r   zTExporting on CPU while CUDA is available, setting device=0 for faster export on GPU.cpur   Tz-Axelera export only supported on Python 3.10.z5Setting int8=True for Axelera mixed-precision export.>   detectz3Axelera export only supported for detection models.zcoco128.yamlz1IMX export requires int8=True, setting int8=True.>   poser   segmentz/IMX export requires nms=True, setting nms=True.>   r   r   r   classifyzbIMX export only supported for detection, pose estimation, classification, and segmentation models.namesend2endFzB 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.zahalf=True only compatible with GPU export for TorchScript, 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 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'.      ?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)
tf_wrapper)executorch_wrapperc              3     K   | ]?}t          j        d          |z            t          j        d         |z            z  V  @dS )r   r   N)r   imgsz)r   sr   s     r   	<genexpr>z$Exporter.__call__.<locals>.<genexpr>  sO      mmRSc$*Q-!"344s4:a=1;L7M7MMmmmmmmr   pefusec              3  v   K   | ]4}t          t          |t          j                  r|j        ng           V  5d S N)tupler   r   Tensorshaper   r   s     r   r  z$Exporter.__call__.<locals>.<genexpr>6  sB      XXQRu
1el(C(CKQWWLLXXXXXXr   yoloYOLOr   r   zUltralytics z model ztrained on Ultralyticsz2AGPL-3.0 License (https://ultralytics.com/license)zhttps://docs.ultralytics.comc                $    i | ]\  }}|v 	||S r   r   )r   kvfmt_keyss      r   
<dictcomp>z%Exporter.__call__.<locals>.<dictcomp>G  s$    AAAda1==Q===r   )descriptionauthordater   licensedocsr   r  rS   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)r         )keras_model      z_full_integer_quant.tflite)tflite_model   	   
      r   r   r   r      c                0    g | ]}|t          |          S r   r   r  s     r   r   z%Exporter.__call__.<locals>.<listcomp>~  s#    $$$!$SVV$$$r   u>   WARNING ⚠️ non-PyTorch val requires square images, 'imgsz=z#' will not work. Use export 'imgsz=z' if val is required. r`   rU   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_availablerL   indexr   r.   SystemErrorr`   r  r   rV   hasattrr   r   r   r   upperr   r5   r   ImportErrorrU   typer2   r  r   rT   r   r$   r   r   r   r    rG   r   modelr   confrW   rS   r   
clip_modelr   r   r%   r   r6   r   zerosyamltor   suffixr   
parametersrequires_gradevalfloatr  ultralytics.utils.export.imxr
  #ultralytics.utils.export.tensorflowr  #ultralytics.utils.export.executorchr  modulesr   exportr   tolistr   max_detagnostic_nmsxyxyr  r  r   forward_splitforwardrangeNMSModelimfiler  output_shapestemreplacepretty_namer   r   now	isoformatr   maxmetadatar&  r'  r*   r@   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export_executorchexport_axeleraparentresolve)2r   rJ  r   	fmts_dictfmtsr<  matchesmsgflagsjitrY   xmlrc   rf   rh   rk   rm   ro   rq   rt   rw   rz   r}   r   r   r   is_tf_formatr   
device_strr   rb  rc  pr
  r  r  manchorsy_r   r!  r   r,  squarer  r  qr   r  s2   `                                               @@r   __call__zExporter.__call__G  s    IKKi$$&&%%%CQQQC"$$	Yz*122.//d??NNN //TQs/KKG D?Bd{{;;PqjmPqPqPq C!B!BD!B!BCCCN^S^^QXYZQ[^^^___!*C((((4(((u::??WsWWQUWWXXX& %	
 KVWdCDD  	#di&.N[\\\"DI 	ces49#34444TY-..J##C++B/C"DI*$$$&bU_&b&b&b$$$ 	#49#+
0G0G0I0I+Nqrrr"DI#TY-=-EEE49K[\\ [)%++d*;*;a*?@c49h/// 		0! S!"QRRR9> &VWWW!%	z++ !VWWW9> 0!/	 
	9> &RSSS!%	9= %UZ3P%P%PPQQQ $	z!JJJ x   ug&& 	0-//EK'445)$$ 	y , $	 1 st sz sV ss sg s %#))++qqqrrr $). 	****$S_jtLLL (-r   #   D9> 	#din 	#N`aaa"DIN9> 	#c 	#dk&6%&?&?Ns   #DIN qQQQ
9 	vggggg8;#u,,,.u,,, 
	9> *3   "*	!Y^1133DIN9>Z///t49>ttgqttt 0// 9= 	4!%)<==ss?sss=lUl%ll9lll7#dzdd3ddd1VzVV+VVV)ui// &:ek"o}3]3] &efff %	!Y^3tDIN 	f 		 	493D 	\]I]I]N XDIM.kjjOkY]YbYiOkOk  X  X  X    	$ $E $!u   A%%XYYY"#	eZ(( 	$NR    $E9> 	$). 	(-\75&RZ;[;[1\DINNtbfbkbpttt    	ZU 	Zu 	ZXYYY<'' 	-zz Y   (-H^$ [%*..Q*G*GU$*UUUXXY]YdeeE9d++swuk4/P/PsTYT^TbTbcnprTsTs
 
 ;+++	??D ""4;//!!## 	$ 	$A#AOO



 	/<<<<<<GE4:..E 	&W 	&FFFFFFJu%%E 	.NNNNNN&&u--E 	, 	,A!X&&  !fm455 , I-	9+mmmmW\WcWjWjWlWlmmmmm	 17;;	!%!75v:5$'' 5GAv,>,> 5FF58;;t{33444As## ,L ,O	q 	j 	jA26)-iiWZi*	**2...`e`efh`i`iAA9> 	0t 	0s 	00@E0I0I		5::<<B 
	 !U\**YE!'NNNXXVWXXXXX 	
  
 3 3K K KLLQYYZ`bhii%,UF%;%;d
5:W[@\@\duz&!!bddT%5ddVZ>b>RD>R>R>R`bdd&#LNN,,.."K2#el++,,JY_Z[AAAAdiAAA
z155ui77
 
  ?#&DM% :).R)BDM+&uk** =-2_k*N*%% N Nt N NPUVXV^P_P_ N N#0N N4=dOOMN N N	
 	
 	
 	,---D3t99 	-**,,AaD 	/%%#%..AaD 	&##%%AaD 	*''))AaD 	(%%''AaD 
	*INNg%NN $ 7 7 9 9AaD+ ?T ?~~+~>>! ,))++! t**QqT

	ErErEr8r*ss! *''))! 	)&&((AbE 	&OO%%AbE 	'$$&&AbE 	&OO%%AbE 	'$$&&AbE 	-**,,AbE 	*''))AbE %$Q$$$q66 	D2KK  AZ]djm3F RRVZV` R R+.tz??R R R  &,WDJqMMTZ21F1N1NsTV1W1WE).N	.NffBAK9dikkAo= 9 9&.vt{7J7J7L7L&M&M9 98=
9 9KL9 9UZ9 9]^9 9 5:J9 9 HI9 9 RW9 9 _c9 9 fg9 9 jk9 9 9   	?+++s   -6Q$ $
Q10Q1r  c           	        t          j        | d| j        j         d            | j        j        dk    rt          nt          | j        j                  }t          || j        j	        pd         || j        j
        | j        j        | j        d         d| j        j                  }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
           n0| j        j        dk    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   valr   F)r   ra   r  r  augment
batch_sizer   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   r   d   z5 >100 images required for Axelera calibration, found i,  z5 >300 images recommended for INT8 calibration, found T)rS   workers	drop_last)r!   r   r   r   rJ  r  r   r   r   r   ra   r  rS   rm  r>  r   r?  r   r
   )r   r   r   datasetr   rS   s         r   get_int8_calibration_dataloaderz(Exporter.get_int8_calibration_dataloader  s   v__din___```YTZ_
%B%B!!HY[_[d[ijj)E*Y'*Q-y
 
 
 LLq55i^_iiijjjDIOQ''tyNpppphmppp   9y((QWWNfff[\fffggggY**q3wwNfff[\fffgggua4PPPPr   zTorchScript:c                J   t          j        d| dt           d           | j                            d          }t
          j                            | j        j	        rt          | j        | j                  n| j        | j        d          }dt          j        | j                  i}| j        j        rKt          j        | d           d	d
lm}  ||                              t)          |          |           n$|                    t)          |          |           |S )z(Export YOLO model to TorchScript format.r(  z starting export with torch ...rR   Fstrictz
config.txtz optimizing for mobile...r   )optimize_for_mobile)_extra_files)r!   r   r&   rc  with_suffixr   r  tracer   rV   ra  rJ  rb  jsondumpsrk  rT   torch.utils.mobile_optimizerr  _save_for_lite_interpreterr   save)r   r   r   tsextra_filesr  s         r   rn  zExporter.export_torchscript  s    	OOO]OOOPPPI!!.11Y__	]Xdj$)<<<SWS]_c_fot_uu#TZ%>%>?9 	6K6<<<===HHHHHH##>>s1vvT_>````GGCFFG555r   zONNX:c           
        dg}| j         j        r*|ddt          j                                        rdndz   gz  }t          |           ddl}| j         j        pt          |d| j	        j
        v 	          }t          j        d
| d|j         d| d           | j         j        rt          sJ dt            d            t#          | j                            d                    }| j        j        dk    rddgndg}| j         j        }|r}dddddi}t/          | j        t0                    rddd|d<   dddd|d<   n"t/          | j        t2                    rddd|d<   | j         j        r|d                             d           | j         j        r(| j        j        dk    r|| j         _        d| j         _        t7          | j                   5  t9          | j         j        rt;          | j        | j                   n| j        | j        ||dg||pd            ddd           n# 1 swxY w Y   |                    |          }| j         j        rj	 ddl }	t          j        | d!|	j         d           |	!                    |          }n0# tD          $ r#}
t          j#        | d"|
            Y d}
~
nd}
~
ww xY w| j$        %                                D ]:\  }}|j&        '                                }|t#          |          c|_(        |_)        ;tU          |d#d          d$k    r&t          j        | d%|j+         d&           d$|_+        | j         j,        r| j         j-        d'k    rv| j	        j
        d(k    rf	 dd)l.m/} t          j        | d*           |0                    |d+          }n0# tD          $ r#}
t          j#        | d,|
            Y d}
~
nd}
~
ww xY w|1                    ||           |S )-z!Export YOLO model to ONNX format.onnx>=1.12.0,<2.0.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==)rZ   r   output0output1imagesrS   heightwidth)r   r   r  r  )r   r   mask_height
mask_widthr   obbT)r[   input_namesoutput_namesrW   z slimming with onnxslim z simplifier failure: 
ir_versionr2  z limiting IR version z' to 10 for ONNXRuntime compatibility...rY   r   )float16z converting to FP16...)keep_io_typesz FP16 conversion failure: )2r   r\   r   r   rC  r3   rY   r[   r   r   rI  r!   r   r   rV   rG   r&   r   rc  r  rJ  r  rW   r   r   r   poprD   r?   ra  rb  loadonnxslimslimr   r?  rk  itemsmetadata_propsaddkeyvaluer   r  rU   r   onnxruntime.transformersr  convert_float_to_float16r  )r   r   requirementsrY   r[   r   r  rW   
model_onnxr  r   r  r  metar  s                  r   rp  zExporter.export_onnx  s    ..9 	p/EJLcLcLeLeBm&&km1nooL<(((	Y?4fHX>X#Y#Y#Y___D<L__UZ___```9= 	mlll\illlll:	%%g..//15I1M1M	9--T]S^)# 	*Wg!F!FGG$*&788 @)0Y%?%?	")0]|%T%T	""DJ77 @)0Y%?%?	"y} *	"&&q)))9= 	&TZ_55#DIO!%DI$)$$ 		 		379=PTY///dj%J)4   		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 YYq\\
 9 	DDvXXx?SXXXYYY%]]:66

 D D D&BBqBBCCCCCCCCD M'')) 	- 	-DAq,0022D#$c!ff DHdjj :|Q//"44K6vv
8Mvvvwww$&J! 9> 	Idi.&88T[=MQV=V=VI<<<<<<v===>>>$==jX\=]]

 I I I&GGAGGHHHHHHHHI 			*a   sC   A
H&&H*-H*8J 
J9J44J984N- -
O7OOz	OpenVINO:c                .    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        rt           j         j
                  n j         j
        j        rdn j        j        g j                  } fd} j
        j        rt%           j                                       j        j        dt,          j                   }t%          t1          |           j                            d          j        z            }t          d           t          t6          sdnd           ddl}d}t;           j        j        d         t<                    rd                    tA           j        !                                          d         d         "                    d          dd                   }|#                    d| dd| dd| dd| dgdg          }|$                    ||%                     &                    |           j'                  |j(        j)        |          }	 ||	|           |S t%           j                                       j        j        dt,          j                   }
t%          t1          |
           j                            d          j        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== is installed)inputexample_inputc                |   |                      dddg           |                      dddg           |                      dddg           |                      dgdd	g           |                      j        j        dd
g           |                      d j        j                                        D             ddg           j        j        dk    r|                      dddg                               | |j        j                   t          j
        t          |          j        dz  j                   dS )z/Set RT info, serialize, and save metadata YAML.r  
model_info
model_typeTreverse_input_channelsr   	pad_value     o@scale_valuesiou_thresholdc                :    g | ]}|                     d d          S )r7  r  )rf  )r   r  s     r   r   z?Exporter.export_openvino.<locals>.serialize.<locals>.<listcomp>%  s&    !Y!Y!Y!!))C"5"5!Y!Y!Yr   labelsr   fit_to_window_letterboxresize_type)compress_to_fp16metadata.yamlN)set_rt_infor   iourJ  r   valuesr  
save_modelrU   r(   r  r   r  rk  )ov_modelrc  ovr   s     r   	serializez+Exporter.export_openvino.<locals>.serialize  s=     ,)EFFF  6N'OPPP  |[&ABBB  %<*HIII  0OPPP  !Y!Ytz?O?V?V?X?X!Y!Y!Y\hjr[stttz*,,$$%>}@]^^^MM(D49>MJJJId4jj'/94=IIIIIr   _int8_openvino_modelz.xmlz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)rJ  calibration_datasetpresetignored_scoper_   )*r3   r"   r#   r^   r!   r   r   rH   r&   convert_modelr   rV   ra  rJ  rW   rb  r  r`   r   rc  rf  rP  ossepr   r  r   rI   nncfr   r   r   listnamed_modulesr   IgnoredScopequantizeDatasetr  _transform_fnQuantizationPresetMIXED)r   r   r  r  fqfq_ovr  r  head_module_namequantized_ov_modelr   f_ovr  s   `           @r   rq  zExporter.export_openvino  s9    	5n]f=T=T//ZnoooSSSSSSTTThhhMhhhhhy##/3y}LHTZ+++$*)+@$$$'-' $ 
 
	J 	J 	J 	J 	J 	J 9> 	TY''	(8:YQSQW:Y:YZZBR49#8#8#@#@#EEFFE0111IY44>ZZZKKK !M$**2.77 #&88D1I1I1K1K,L,LR,PQR,S,Y,YZ],^,^_a`a_a,b#c#c  $ 1 16-6667-7777-7777-777	 %+ !2 ! ! "&$(LL1U1UV\1]1]_c_q$r$r.4+	 "/ " " I(%000I	NN""49#35Orv5O5OPP477TY226::??@@	(D!!!r   zPaddlePaddle:c                   t           r
J d            t          t          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        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-gpu>=3.0.0,<3.3.0zpaddlepaddle==3.0.0zpaddlepaddle>=3.0.0,<3.3.0x2paddler   N)pytorch2paddler(  z starting export with X2Paddle r  ru   r  )modulesave_dirjit_typeinput_examplesr  )r   r3   r   r   rC  r   r  x2paddle.convertr  r!   r   r   r   rc  rf  rP  r  r  rJ  rb  r(   r  r   rk  )r   r   r  r  r   s        r   rx  zExporter.export_paddleR  s    GGGGG} :**,,200 2**1		
 		
 		
 	333333YYY@TYYYZZZ	NN""49#35MRV5M5MNNdj1wX\X_W`aaaa	$q''O+T];;;r   zMNN:c                    t           s
J d            |                                 }t          d           ddl}ddlm} t          j        d| d|                                 d           t          |          
                                sJ d	|             t          | j                            d
                    }dddd|d|dt          j        | j                  g	}| j        j        r|                    d           | j        j        r|                    d           |                    |           t          | j        j        dz            }|
                                r|                                 |S )zIExport YOLO model to MNN format using MNN https://github.com/alibaba/MNN.z>MNN export requires torch>=1.10.0 to avoid segmentation faultsz
MNN>=2.9.6r   N)
mnnconvertr(  z starting export with MNN r  failed to export ONNX file: rx   r  z-frX   z--modelFilez
--MNNModelz	--bizCode)z--weightQuantBits8z--fp16z.__convert_external_data.bin)rE   rp  r3   rv   	MNN.toolsr  r!   r   r   r   existsr   rc  r  r  r  rk  r   r`   extendrU   appendconvertr  unlink)r   r   f_onnxrv   r  r   r   convert_scratchs           r   ry  zExporter.export_mnnj  s    [[[[[z!!##<(((


(((((( 	MMM3;;==MMMNNNF||""$$MM&MV&M&MMM$	%%f--..D&-q+W[WabfboWpWpq9> 	4KK23339> 	"KK!!!4   ty/2PPQQ!!## 	%""$$$r   zNCNN:c           	     F   t          dd           t          d           ddl}ddl}t          j        d| d|j         d	|j         d
           t          t          | j                  	                    | j        j
        dt          j                             }t          |dz                                  |dz                                  |dz                                            }t          |dz                                  |dz                                  |dz                                  |dz                                  |dz                                            }|                    d            |j        | j        fd| j        i||| j        j        | j        j        d ddddg|                                R D ]%}t          |                              d           &t3          j        |dz  | j                   t          |          S ) zIExport YOLO model to NCNN format using PNNX https://github.com/pnnx/pnnx.rz   z	--no-depscmdspnnxr   Nr(  z starting export with NCNN z
 and PNNX r  r{   zmodel.ncnn.paramzmodel.ncnn.binzmodel_ncnn.py)	ncnnparamncnnbinncnnpyzmodel.ptzmodel.pnnx.paramzmodel.pnnx.binzmodel_pnnx.pyzmodel.pnnx.onnx)ptpath	pnnxparampnnxbinpnnxpypnnxonnxTexist_okinputs)fp16r   z	debug.binzdebug.paramz
debug2.binzdebug2.param)
missing_okr  )r3   rz   r  r!   r   r   r   r   rc  rf  rP  r  r  r   as_posixmkdirrY  rJ  rb  r   rU   r   rI  r  r  r(   r  rk  )r   r   rz   r  r   	ncnn_args	pnnx_argsf_debugs           r   rz  zExporter.export_ncnn  s4    	644446"""mmmD<LmmX\XhmmmnnnTY''	(8:P:P:PQQRR--7799))3355'1133
 
 
	 
N,,..--7799))3355'1133++5577
 
 
	 	
DJwwtww)wywty~fjfqfvwwwww#]L.fS\ScScSeSeff 	2 	2GMM  D 1111	!o%t}5551vvr   zCoreML:c                    | j         j                                        dk    }t          ddg           ddl}t          j        d| d|j         d           t          r
J d	            t          s
J d
            | j         j
        dk    r| j         j        s
J d            | j         j        r0| j         j        r
J d            | j        j        dk    s
J d            | j                            |rdnd          }|                                rt%          j        |           d}| j        j        dk    rF|                    t+          | j        j                                                            }| j        }nk| j        j        dk    r1| j         j        rt1          | j        | j        |           n| j        }n*| j         j        rt          j        | d           | j        }t6          j                            |                                | j        d          }| j         j        r|                    |                     d| j         j
        d          | j        j!        d         |                     d| j"        d         dz  | j"        d                   |                     d| j"        d         dz  | j"        d                   f          }|#                    d|          g}	n&|$                    d| j        j!        dg d          g}	|%                    ||	||rdnd !          }
| j         j&        rd"n| j         j'        rd#nd$\  }}|dk     rd%|v rt          d&           |r'|j(        j)        j*        +                    |
||          }
nT|d'k    rNddl,m-c m.} |/                    d%|d()          }|0                    |*          }|1                    |
|+          }
| j         j        r0| j        j        dk    r | 2                    |
|rdn|
j3        ,          }
| j4        }|5                    d-          |
_6        |5                    d.          |
_7        |5                    d/          |
_8        |5                    d0          |
_9        |
j:        ;                    d1 |<                                D                        | j        j        dk    r|
j:        ;                    d2d3i           	 |
=                    t}          |                     nh# t~          $ r[}t          j        | d4| d5           |                    d          }|
=                    t}          |                     Y d}~nd}~ww xY w|S )6z#Export YOLO model to CoreML format.r   zcoremltools>=9.0znumpy>=1.14.5,<=2.3.5r   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.mlmodelrg   r   )r   zB 'nms=True' is only available for Detect models like 'yolo26n.pt'.Fr  )lower_boundupper_bounddefault    r   )r  imagegp?)r   r   r   )r  scalebiasneuralnetworkr   )r  classifier_config
convert_to)r0  kmeans)r4  linear)r*  Nr1  zscikit-learnr0  i   )modenbitsweight_threshold)global_config)configweights_dirr!  r"  r$  r   c                4    i | ]\  }}|t          |          S r   r6  )r   r  r  s      r   r   z*Exporter.export_coreml.<locals>.<dictcomp>  s$    .O.O.OTQq#a&&.O.O.Or   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;  r3   coremltoolsr!   r   r   r'   rF   rS   rW   rV   rJ  r  rc  r  is_dirshutilrmtreeClassifierConfigr  r   r  IOSDetectModelrb  r?  r   r  r  rS  ShapeRangeDimr  r  
TensorType	ImageTyper  r`   rU   modelsneural_networkquantization_utilsquantize_weightscoremltools.optimize.coremlrT   rf   OpPalettizerConfigOptimizationConfigpalettize_weights_pipeline_coremlr9  rk  r  short_descriptionr"  r$  r   user_defined_metadataupdater  r  r   r   )r   r   r   ctr   r/  rJ  r  input_shaper  ct_modelbitsr3  cto	op_configr7  r  r   s                     r   rr  zExporter.export_coreml  s    )"((**i7!89	
 	
 	
 	!   VVV2>VVVWWWfffff{?????z9?Q9$  } $ 9 	vy}  w $ :?j0002u000I!!"I**\JJ88:: 	M! :?j(( " 3 3D9I9P9P9R9R4S4S T TJEEZ_((RVR[R_oN4:twg+NNNNeieoEEy} n&lllmmmJEY__UZZ\\475_AA9 	g((KKA49?TUKVVGM!$KKBDJqMA<MW[WabcWdKeeKKBDJqMA<MW[WabcWdKee	 #  K mmG;m??@FFll7$'-wUdUdUdleefF ::/*1B{	  
 
 '+inj]]DIN:j..`j
d"994">222 J93FWWX`bfhlmm99999999922_b2cc	//i/HH00&0II9= 	nTZ_88,,X7Cl44X`Xl,mmHM%&UU=%9%9"%%//55++55++&--.O.OQWWYY.O.O.OPPP:?j((*113XZk2lmmm	"MM#a&&!!!! 	" 	" 	"N t t t t t   j))AMM#a&&!!!!!!!!	" s   3"T 
U; AU66U;z	TensorRT:c                <   | j         j        j        dk    s
J d            |                                 }t	          d          st                      rt          d           	 ddl}n"# t          $ r t                       ddl}Y nw xY wt          |j
        dd	
           t          |j
        dd           t          j        d| d|j
         d           t          |                                          sJ d|             | j                            d          }t#          ||| j        j        | j        j        | j        j        | j        j        | j         j        || j        j        r|                     |          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.  )jetpackz10.15r   Nz>=7.0.0Tr   z!=10.1.0z5https://github.com/ultralytics/ultralytics/pull/14239)r  r(  z starting export with TensorRT r  r  rd   )r   r  rk  verboser   )rb  r   rI  rp  r-   r,   r4   r   rH  r5   r   r!   r   r   r	  rc  r  r9   r   	workspacerU   r`   rW   r  r  rk  rZ  )r   r   r   r  r   r   s         r   ro  zExporter.export_engine  s    w~"e+++-l+++!!## Q 	$688 	$7###	#""""" 	# 	# 	#""""""	# 	coyt<<<<coz7noooo 	TTTTTTUUUF||""$$MM&MV&M&MMM$I!!),,IININIGMDHIN\D88@@@X\]I%	
 	
 	
 	
 s   "A' 'BBzTensorFlow SavedModel:c                   t           j                                        }	 ddl}n## t          $ r t          d           ddl}Y nw xY w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        d                    }|                                rt#          j        |           d}| j        j        r| j        j        rd |                     |          D             }t           j        j                            t          j        |d                                          | j                                      dddd                                                              t@          j!                  }tE          | j#        j#        d          tH                    r;| j        j%        pd!| j        _%        d"| j        j%        cxk    rd!k    sn J d#            d| j        _&        | '                                }tQ          ||| j        j        || j        j)        d$v |%          }tU          j+        |d&z  | j,                   |-                    d'          D ]<}d(t          |          v r|.                                n| /                    |           =t          |          |fS ))z2Export 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.3,<1.29.0r  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)r   rZ  r  ri   c                    g | ]
}|d          S )imgr   )r   rS   s     r   r   z/Exporter.export_saved_model.<locals>.<listcomp>U  s    ]]]ueEl]]]r   )sizer   r  r   r      r4  z%RTDETR export requires opset>=16;<=19>   rq   ro   )r`   r  disable_group_convolutionr   r  z*.tflitezquant_with_int16_act.tflite)0r   r   rC  r^  rH  r3   r"   r!   r   r   r5   r   r   rc  rf  rP  r=  r>  r?  r   r`   r   r  nn
functionalinterpolatecatrT  r  permutenumpyastypenpfloat32r   rJ  r   r[   r\   rp  r:   r   r(   r  rk  rglobr  _add_tflite_metadata)	r   r   r   tfr   r  r  r,  rc  s	            r   rs  zExporter.export_saved_model.  s.    z&&((	$##### 	$ 	$ 	$;<<<######	$ 	"!+'+E992F%)"%)<!!}
 A	
 	
 	
 	
 	UUU".UUUVVVNH	
 	
 	
 	
 TY''	(8.IIJJ88:: 	M! 9> 	din 	]]0T0TU[0\0\]]]F#//	&!0D0D0J0J0L0LSWS]/^^Aq!$$
##	  dj&r*M:: 	X"io3DIO....B.....0W...!	!!##&&*i&6:M&M
 
 
 		!o%t}555GGJ'' 	m 	mD:c$iiGGDKKMMMTMfMfgkMlMl1vv{""s   % AAzTensorFlow GraphDef:c                \    | j                             d          }t          |||           |S )zgExport YOLO model to TensorFlow GraphDef *.pb format https://github.com/leimao/Frozen-Graph-TensorFlow.rl   )rc  r  r8   )r   r,  r   r   s       r   rt  zExporter.export_pbr  s0     I!!%((a(((r   zTensorFlow Lite:c                   ddl }t          j        d| d|j         d           t	          t          | j                                      | j        j        d                    }| j	        j
        r|| j        j         dz  }n1| j	        j        r|| j        j         dz  }n|| j        j         d	z  }t          |          S )
z,Export YOLO model to TensorFlow Lite format.r   Nr(  r]  r  ri   z_int8.tflitez_float16.tflitez_float32.tflite)r^  r!   r   r   r   r   rc  rf  rP  r   r`   re  rU   )r   r   ro  rh   r   s        r   ru  zExporter.export_tflitey  s     	 UUU".UUUVVV3ty>>11$)2BNSSTT9> 	A====AAY^ 	A@@@@AA@@@@A1vvr   zAxelera:c           	     8   dt           j        d<   	 ddlm} n2# t          $ r% t          g d           t          dd           Y nw xY wddlm} dd	lm} d
| j	        _
        |                                 }t          |          j        }t          | d          }|                    d           d| j                                        v r |dddddd|          }n |dddddd|          }|                    ||                     |          || j                  }|                    |||           | d}	t          |	          }
||	z  }|
                                r|
                    |           t/          j        |dz  | j                   |S )z$Export YOLO model to Axelera format.python&PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATIONr   )compiler)	libllvm14zlibgirepository1.0-devz
pkg-configzlibcairo2-devzbuild-essentialcmakezaxelera-voyager-sdk==1.5.2z--extra-index-url https://software.axelera.ai/artifactory/axelera-runtime-pypi --extra-index-url https://software.axelera.ai/artifactory/axelera-dev-pypir  )CompilerConfigr   r   Tr  C2PSAper_tensor_min_maxFr   r   rS   )quantization_schemeignore_weight_buffersresources_usedaipu_cores_usedmulticore_modeoutput_axm_format
model_namer-  )tiling_depthsplit_buffer_promotionr}  r~  r  r  r  )rJ  r  r7  transform_fn)rJ  r7  
output_dirz.axmr  )r  environr   ru  rH  r0   r3   axelera.compilerrx  r   r[   rp  r   re  r"  rJ  __str__r  r  r  compiler	  rf  r(   r  rk  )r   r   ru  rx  	onnx_pathr  export_pathr7  qmodelaxm_nameaxm_srcaxm_dsts               r   r~  zExporter.export_axelera  s9    @H
;<	((((((( 		 		 		"rrr   ,]     		 	%$$$$$333333	$$&&	)__)
j888994(((dj((****#^$8&+# !&"&%  FF $^'+# !&"&%  F "" $ D DV L L+	 # 
 
 	vfMMM &&&x..(>> 	%OOG$$$	+/???s    ,AAzExecuTorch:c                    t           sJ dt           d            t                       t          | j        | j        | j        | j        |          S )z-Export YOLO model to ExecuTorch *.pte format.z,ExecuTorch requires torch>=2.9.0 but torch==r  )rk  r   )rK   r&   r1   r=   rJ  rc  rb  rk  )r   r   s     r   r}  zExporter.export_executorch  sQ     eeeeeeeey%'''
DItw_effffr   z	Edge TPU:c                   d}d}t           sJ d|             t          j        |t          j        t          j        d          j        dk    rft          j        d| d|            t                      rd	nd
}| dd| dd| dfD ]}t          j        |dd           t          dg           t          j        |ddd          j	        
                                                    d          d         }t          j        d| d| d           t          ||j        |           t          |                              dd          }|                     |           |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 zsudo r  zmkdir -p /etc/apt/keyringszCcurl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | z-gpg --dearmor -o /etc/apt/keyrings/google.gpgzvecho "deb [signed-by=/etc/apt/keyrings/google.gpg] https://packages.cloud.google.com/apt coral-edgetpu-stable main" | z.tee /etc/apt/sources.list.d/coral-edgetpu.list)r  checkzedgetpu-compiler)r  capture_outputr  r   )maxsplitr   z( starting export with Edge TPU compiler r  )tflite_filer  r   rn   rp   )r    
subprocessrunDEVNULL
returncoder!   r   r7   r0   r  decoderB  r<   r  r   rf  rn  )	r   r/  r   cmdhelp_urlsudocverr   s	            r   rv  zExporter.export_edgetpu  s    +<GGGXGGGGu>#j&8AS[_```kopppKkVkkaikklll/11977rD333 JVZ  J  J  J ~  JN  ~  ~  ~ : :
 qD99999"$6#7888nSTNNNU\\^^eeopeqqrtuQQQQQQRRR<L<OX^____%%i1BCC!!!$$$r   zTensorFlow.js:c                z   t          d           t          | j                                      | j        j        d          }t          | j                            d                    }t          ||| j        j        | j        j	        |           t          j        t          |          dz  | j                   |S )z*Export YOLO model to TensorFlow.js format.tensorflowjsrr   rl   )pb_filer  rU   r`   r   r  )r3   r   rc  rf  rP  r  r;   r   rU   r`   r(   r  r   rk  )r   r   r   f_pbs       r   rw  zExporter.export_tfjs  s     	>***	NN""49#3\BB49((//00din]cdddd	$q''O+T];;;r   zRKNN:c           	        t          j        d| d           t          d           t          d           t          rddl}d |_        ddlm} t          | j	        j
        pd	d	          | j	        _
        |                                 }t          t          |          j         d
          }|                    d            |d          }|                    g dgg dg| j	        j                   |                    |           |                    d           |                    t)          |t          |          j         d| j	        j         dz                       t+          j        |dz  | j                   |S )z!Export YOLO model to RKNN format.r(  z& starting export with rknn-toolkit2...zrknn-toolkit2zonnx<1.19.0r   Nc                     d S r  r   r   r   r   <lambda>z&Exporter.export_rknn.<locals>.<lambda>  s    D r   )r   rb  r   Tr  F)rZ  )r   r   r   )   r  r  )mean_values
std_valuestarget_platform)rJ  )do_quantizationrO   z.rknnr  )r!   r   r3   r   builtinsexitrknn.apir   r   r   r[   rp  r   re  r"  r7  r   	load_onnxbuildr|  r   r(   r  rk  )r   r   r  r   r   r  r   s          r   r|  zExporter.export_rknn  s    	GGGGHHH?+++=))) 	)OOO(LHM!!!!!!dio3R88	d1ggl777884(((tE"""8I[_[d[ijjjQ

5
)))[d1ggl+R+RTY^+R+R+RRSSTTT	+/???r   zIMX:c                   t           s
J d            t          s
J d            t          | j        dd          rt	          d          t          d           t          d           	 t          j        dd	gd
d
          j        	                                }t          j        d|          }|r"t          |                    d                    nd}|dk    s
J d            n# t          t          j        t           f$ rp t"          st$          r)t'          j        d| d           t+          dg           n6t,          st.          r(t'          j        d| d           t+          dg           Y nw xY wt1          | j        | j        | j        j        | j        j        | j        j        | j        |                     |          |          S )z Export YOLO model to IMX format.zExport 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.)z model-compression-toolkit>=2.4.1zedge-mdt-cl<1.1.0zedge-mdt-tpc>=1.2.0zpydantic<=2.11.7zimx500-converter[pt]>=3.17.3javaz	--versionT)r  r  z(?:openjdk|java) (\d+)r   r   r   zJava version too oldr(  z! installing Java 21 for Ubuntu...zopenjdk-21-jrez2 installing Java 17 for Raspberry Pi or Debian ...zopenjdk-17-jre)rk  r  r   ) r    r/   r   rJ  r>  r3   r  r  r  r  researchr   groupFileNotFoundErrorCalledProcessErrorAssertionErrorr   r   r!   r   r0   r   r   r>   rc  r   rK  r  r[  rk  r  )r   r   java_outputversion_matchjava_versions        r   r{  zExporter.export_imx  s     	
 	
F	
 	
u %\\&\\\$4:y%00 	PNOOO	
 	
 	
 	9:::	;$.&+)>d[_```gnnppKI&?MMM:GN3}22155666QL2%%%'=%%%%!:#@.Q 	; 	; 	; ;, ;JJJJKKK&(8'9:::: ;#5 ;[[[[\\\&(8'9:::	; JIINIMI]88@@	
 	
 	
 		
s   'A;C# #B	E/.E/c                    ddl }|                    |d|j                  5 }|                    dt	          j        | j        d                     ddd           dS # 1 swxY w Y   dS )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  rk  )r   rc  r  zfs       r   rn  zExporter._add_tflite_metadataB  s    __T3(<== 	NKKDM!)L)L)LMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	Ns   0AA"%A"zCoreML Pipeline:c                   ddl }t          j        | d|j         d           |                                }t          t          |j        j                            }| j	        j
        dk    r`| 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)          |          |
k    r+i |d t+          t)          |          |
          D             }|j                            ||          }|j        j                                        }|j        |_        t+          t)          |                    D ]}|j        j        j        |                                         }|j        j                                         |j        j        |                             |           |j        j                                         |j        j        |                             |           ddg}tA          |          D ]\  }}||j        j        |         _!        tA          |          D ]\  }}|j        j        |         j        j        }|j"        j#                                         d|j"        j#        d         _$        d
|j"        j#        d         _%        |j"        j#                                         |j        j        j        d
         |j"        j#        d         _$        |j        j        j        d
         |j"        j#        d         _%        |j        dd= |j&        }|d         j!        |_'        |d         j!        |_(        |d         |_)        |d         |_*        d|_+        d|_,        | j	        j-        |_.        | j	        j/        |_0        | j	        j1         |j2        _3        |j4        j5        6                    |7                                           |j                            |          }|j        j8        9                    d|j        j:        ;                    d|	|          fd|j        j:        <                                fd|j        j:        <                                fg|          }|=                    |           |=                    |           |j>        j        j        d                             |j        j        j        d                                                    |j>        j        j        d                             |j        j        j        d                                                    |j>        j        j        d                             |j        j        j        d                                                    |j        |j>        _        |j>        j        j        j?        @                    t          |j.                  t          |j0                  d           |j                            |j>        |          }d|jB        d<   d|j.         d|jB        d<   d|j0         d|jB        d<   d|jC        d<   d|jC        d<   t          j        | d           |S )z:Create CoreML pipeline with NMS for YOLO detection models.r   Nz$ starting pipeline with coremltools r  r   r   r   r*  r   r   c                .    i | ]}|t          |          S r   r6  )r   is     r   r   z-Exporter._pipeline_coreml.<locals>.<dictcomp>[  s      J J JqCFF J J Jr   r8  
confidencecoordinatesiouThresholdconfidenceThresholdr+  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)Dr<  r!   r   r   get_specr  iterr!  outputr   r   rd  rI  multiArrayTyper  rk  r  	imageTyper  r  rm  r`  rF  MLModelproto	Model_pb2ModelspecificationVersion_specSerializeToStringr  ParseFromString	enumerater   
shapeRange
sizeRanges
lowerBound
upperBoundnonMaximumSuppressionconfidenceInputFeatureNamecoordinatesInputFeatureNameconfidenceOutputFeatureNamecoordinatesOutputFeatureNameiouThresholdInputFeatureName#confidenceThresholdInputFeatureNamer  r  rK  r  r\  pickTopperClassstringClassLabelsvectorr
  r  pipelinePipeline	datatypesArrayDouble	add_modelspecuserDefinedrQ  r   input_descriptionoutput_description)r   rJ  r9  r   rR  r  outsr   nxnyncnms_specr  decoder_outputr  r   outma_typerV   	nms_modelr  s                        r   rN  zExporter._pipeline_coremlI  sZ       vVV2>VVVWWW ~~D)011229y((373DQ3GIZ[\I]`aIa3aDGL'-aaa0373DQ3G3JDGL'-aaa0 g&!'*/9?AQAWXYAZA_AiApB!W\(.r2u::KuK J JE#e**b4I4I J J JKE 	!!$K!@@ 8%++--(,(A%s4yy!! 	K 	KA"[4;A>PPRRN &**,,, &q)99.III '++--- '*::>JJJJ$m4 .. 	7 	7GAt26H '*//oo 	! 	!FAs*1!49HG)--///:;G)!,7:<G)!,7)--///:=(:Q:WXZ:[G)!,7:=(:Q:WXZ:[G)!,7aaa  ,)-a&*.q','*6q/'+7?(+9(2G/9="&).#'9#99$++ELLNN;;;I%%h//	 9%..")-33Ar2>>?!4!;!;!=!=>&	(;(B(B(D(DE
 ) / 
 
 	5!!!9%%% 	!'*::5;;R;XYZ;[;m;m;o;oppp!(+;;IO<W<^_`<a<s<s<u<uvvv!(+;;IO<W<^_`<a<s<s<u<uvvv .2-F*!*6==!#"233SQTQhMiMijj	
 	
 	

 	!!(-[!II+8(2tadaq2t2t2t/\#BY\\\ 	 56 2s .2k /v000111r   
np.ndarrayc                   t          | t                    r| d         n| } | j        t          j        k    s
J d            |                                                     t          j                  dz  }|j	        dk    r|d         n|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   uint8ri  rj  rk  rl  ndim)	data_itemrb  s     r   r  zExporter._transform_fn  s~     7AD6Q6Q"`)E"2"2W`	%+---/m---__%%bj11E97a<<r$xxR/r   eventc                F    | j         |                             |           dS )z1Append the given callback to the specified event.N)r)   r  r   r  callbacks      r   add_callbackzExporter.add_callback  s#    u$$X.....r   c                X    | j                             |g           D ]} ||            dS )z(Execute all callbacks for a given event.N)r)   r   r  s      r   rl  zExporter.run_callbacks  s<    **5"55 	 	HHTNNNN	 	r   )r   r   r  )r   r   )r  )r   r   )r  r   )!__name__
__module____qualname____doc__r   r   r  r  r   r*   rn  rp  rq  rx  ry  rz  rr  ro  rs  rt  ru  r~  r}  rv  rw  r|  r{  rn  rN  staticmethodr  r
  rl  r   r   r   r   r     s#       1 1f '$RV 
2 
2 
2 
2 
2L L L L L\
Q Q Q Q6 (0(@(@    Z  !)'!2!2 K K K ZKZ %-Xk%:%: @ @ @ Z@D #+8O#<#<    Z.  ( 0 0    Z2 !)'!2!2    ZB #+8I#6#6 ] ] ] Z]~  $XXk-B-B % % % Z%N (01I(J(J A# A# A# ZA#F ,4H5K,L,L    Z #+8,>#?#?    Z $,HZ$8$8 @ @ @ Z@D '/x'>'> g g g Zg *,XXk5J5J    Z. !)*:!;!; 	 	 	 Z	 !)'!2!2    Z6  ( 0 0 ,
 ,
 ,
 Z,
\N N N 37xxHZ?[?[ ] ] ] ]~ 0 0 0 \0/ / / /     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.Tc                p   t                                                       |j        \  }}}}|| _        t	          |j                  | _        || _        ||k    rd|z  | _        dS t          j
        d|z  d|z  d|z  d|z  gt          |                                          j                  | _        dS )a/  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.
        g      ?)r   N)superr   r  rJ  rm  r   r  r   	normalizer   tensornextrQ  r   )r   rJ  rb  r   r  hw	__class__s          r   r   zIOSDetectModel.__init__  s     	X
1a
ek"""66 1WDNNN"\q#'37C!G4E,,..//6  DNNNr   c                ~   |                      |          d                             dd                              d| j        fd          \  }}| j        r^| j        dz  dk    rPt          | j        dz   dz  dz            | j        z
  }t          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)rJ  	transposer   r  r   r   r   rd  re  padr  )r   r   xywhcls
pad_lengths        r   r_  zIOSDetectModel.forward  s    JJqMM!$..q!44::Atw<KK	c> 	Udgla//tw|2b899DGCJ(%))#:q!/DjRSTTCD4>)))r   )Tr  r  r  r  r   r_  __classcell__r  s   @r   rA  rA    sR        EE     ** * * * * * *r   rA  c                  (     e Zd ZdZ fdZd Z xZS )ra  zBModel wrapper with embedded NMS for Detect, Segment, Pose and OBB.c                    t                                                       || _        || _        |j        dk    | _        | j        j        t          h d          v | _        dS )zInitialize the NMSModel.

        Args:
            model (torch.nn.Module): The model to wrap with NMS postprocessing.
            args (SimpleNamespace): The export arguments.
        r  >   rq   rm   rh   N)	r  r   rJ  r   r  r  r   	frozensetis_tf)r   rJ  r   r  s      r   r   zNMSModel.__init__  s[     	
	:&Y%3T3T3T)U)UU


r   c           	     
   ddl m} ddlm} |                     |          }t          |t                    r|d         n|}t          |j        |j	                  }|j
        d         }|                    dd          }|j
        d         dt          | j        j                  z   z
  }| j        j        r| j        j        dk    r|t#          j        t#          j        t#          j        | j        j        |z
            t#          j        d                    g|j
        dd	         R i |}	t#          j        ||	f          }|                    dt          | j        j                  |gd
          \  }
}}|                    d          \  }}t/          |j
        d         | j        j                  | j        _        t#          j        |j
        d         | j        j        |
j
        d         d
z   |z   fi |}t3          |          D ]:}|
|         ||         ||         ||         f\  }}}}|| j        j        k    }| j        s| j        j        dk    rL| j        rE||z  }|                    t/          | j        j        dz  |j
        d                             j        }||         ||         ||         ||         f\  }}}}|                                 }| j        rdn)dt'          t          | j        j                  d          z  }| j        j        dk    r||z  }n7||t#          j        |j
        d
d	         fi |                                z  z  }| j        j!        s| j        rd
nd}|"                    |j
        d         d          #                    |j
        d         |          }|d	d	d	|f         ||z  z   }t#          j        ||d	d	|d	f         fd          }| j        rR |tH          j%        | j        p-| j        j&        pddk     p| j        j        dk    o| j        j'         tP          d          n|} || j        rt#          j        ||gd          n||| j        j)                  d	| j        j                 }t#          j        ||         ||         "                    dd          ||         "                    dd          *                    |j	                  ||         gd          }ddd| j        j        |j
        d         z
  f}	t"          j+        j,        -                    ||	          ||<   <| j        j.        dk    r|d	|         |d         fn	|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   )partial)rV   )r   r  r   r*  r   Nr   )dimrY   r+  r0  rm   r   r^   F)use_triuiou_func
exit_earlyr   )/	functoolsr+  torchvision.opsrV   rJ  r   r  r   r   r  r  r  rm  r   r   rW   rS   r   rM  rj  r  rg  r   r   r[  r`  rK  r)  r   r  topkindicescloner\  viewexpandrB   fast_nmsr[   r`   rA   r  rO  rd  re  r  r  )r   r   r+  rV   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   r_  zNMSModel.forward  s^    	&%%%%%''''''

1%eU33>uQxxT[
;;;Z]~~b"%%jnC
0@,A,A(AB9 	*1!4!4+eiTY_r5I(J(JELYZOO\\x_c_ijkjljl_mxxxqwxxC9dC[))D $

As4:3C/D/Dk+RXY
 Z Zvv ***,,
1ty/@AA	k$*Q-):EKOa<OR]<]hhaghhr /	8 /	8A%*1Xwqz6!9fQi%O"CeU49>)Dz Vdi.&88TX8zz#di&7!&;U[^"L"LMMU%(YdSYd%S"CUYY[[F"hMAC
8H4I4I10M0M,MJy8++*$#vQWQRR[0S0SF0S0S0W0W0Y0Y'YZ9) F8*aa XXcilA66==cilCPP
4C4:
+BBFF111cdd7O#<"EEE 8%
 O IO1rR7O I,
:Mty~
 +$	 	 	 	   66:hJ	65/r2222F	  "	!!	#D
 9TE$K,,R33SY^^B5J5J5M5Mci5X5XZ_`dZefln  D aDI-
1=>CX(,,T377CFF'+z)'C'CCRC%(##SbSQr   r#  r%  s   @r   ra  ra    s`        LLV V V V VLR LR LR LR LR LR LRr   ra  )F)r   r   )qr  
__future__r   r  r  r  r>  r  r:  copyr   r   pathlibr   ri  rk  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(   r)   r*   r+   r,   r-   ultralytics.utils.checksr.   r/   r0   r1   r2   r3   r4   r5   r6   r7   ultralytics.utils.exportr8   r9   r:   r;   r<   r=   r>   r?   ultralytics.utils.filesr@   ultralytics.utils.metricsrA   ultralytics.utils.nmsrB   ultralytics.utils.opsrC   ultralytics.utils.patchesrD   ultralytics.utils.torch_utilsrE   rF   rG   rH   rI   rJ   rK   rL   r   r   r   r   r   rd  ModulerA  ra  r   r   r   <module>rb     s  ; ;z # " " " " "  				 				                              # # # # # # . . . . . . . . - - - - - - 0 0 0 0 0 0 G G G G G G G G M M M M M M M M G G G G G G G G G G G G c c c c c c c c c c c c                                               0                       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 . - - - - - 3 3 3 3 3 3 * * * * * * ) ) ) ) ) ) 2 2 2 2 2 2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$[ $[ $[N6 6 6 6 6<n n n,  .p p p p p p p pf%* * * * *UX_ * * *D\R \R \R \R \Rux \R \R \R \R \Rr   