
    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mZ ddl	m	Z	 ddl
mZ ddlmZ ddlZddlZddlmZ dd	lmZmZmZ dd
lmZmZ ddlmZ ddlmZmZ ddlm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZD ddlEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZN ddlOmPZPmQZQmRZRmSZSmTZTmUZUmVZV d ZWd ZXd ZY G d d          ZZ G d dej[        j\                  Z]dS )a  
Export a YOLO PyTorch model to other formats. TensorFlow exports authored by https://github.com/zldrobit.

Format                  | `format=argument`         | Model
---                     | ---                       | ---
PyTorch                 | -                         | yolo26n.pt
TorchScript             | `torchscript`             | yolo26n.torchscript
ONNX                    | `onnx`                    | yolo26n.onnx
OpenVINO                | `openvino`                | yolo26n_openvino_model/
TensorRT                | `engine`                  | yolo26n.engine
CoreML                  | `coreml`                  | yolo26n.mlpackage
TensorFlow SavedModel   | `saved_model`             | yolo26n_saved_model/
TensorFlow GraphDef     | `pb`                      | yolo26n.pb
TensorFlow Lite         | `tflite`                  | yolo26n.tflite
TensorFlow Edge TPU     | `edgetpu`                 | yolo26n_edgetpu.tflite
TensorFlow.js           | `tfjs`                    | yolo26n_web_model/
PaddlePaddle            | `paddle`                  | yolo26n_paddle_model/
MNN                     | `mnn`                     | yolo26n.mnn
NCNN                    | `ncnn`                    | yolo26n_ncnn_model/
IMX                     | `imx`                     | yolo26n_imx_model/
RKNN                    | `rknn`                    | yolo26n_rknn_model/
ExecuTorch              | `executorch`              | yolo26n_executorch_model/
Axelera AI              | `axelera`                 | yolo26n_axelera_model/
DeepX                   | `deepx`                   | yolo26n_deepx_model/

Requirements:
    $ pip install "ultralytics[export]"

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

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

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

TensorFlow.js:
    $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
    $ npm install
    $ ln -s ../../yolo26n_web_model public/yolo26n_web_model
    $ npm start
    )annotationsN)deepcopy)datetime)partial)Path)__version__)TASK2CALIBRATIONDATA	TASK2DATAget_cfg)build_dataloaderbuild_yolo_dataset)YOLODataset)check_cls_datasetcheck_det_dataset)check_class_namesdefault_class_names)C2fClassifyDetectRTDETRDecoder	Segment26SemanticSegment)ClassificationModelDetectionModelSegmentationModel
WorldModel)ARM64DEFAULT_CFG	IS_DOCKERLINUXLOGGERMACOSMACOS_VERSION
RKNN_CHIPSSETTINGSTORCH_VERSIONWINDOWSYAML	callbackscolorstrget_default_args	is_jetson)IS_PYTHON_MINIMUM_3_9check_imgszcheck_requirementscheck_versionis_intel)	file_size)batch_probiou)TorchNMS)Profile)arange_patch)
TORCH_1_11
TORCH_1_13	TORCH_2_1	TORCH_2_3	TORCH_2_8	TORCH_2_9select_devicec                    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 d)gd*d+d,ddg d-gd.d/d0ddd!ggd1d2d3ddg d4gd5d6d7ddd!d8ggd9d:d;ddg d<gd=d>d?ddd!d@ggdAdBdCddd!ggdDdEdFddg dGgdHdIdJddg dKgg} t          t          g dLt          |                      S )Mz7Return a dictionary of Ultralytics YOLO export formats.PyTorch-z.ptTTorchScripttorchscript.torchscript)batchoptimizehalfnmsdynamicONNXonnx.onnx)rD   rH   rF   opsetsimplifyrG   OpenVINOopenvino_openvino_modelF)rD   datarH   rF   int8rG   fractionTensorRTengine.engine)rD   rQ   rH   rF   rR   rM   rG   rS   CoreMLcoreml
.mlpackage)rD   rH   rF   rR   rG   zTensorFlow SavedModelsaved_model_saved_model)rD   rQ   rS   rR   kerasrG   zTensorFlow GraphDefpb.pbrD   zTensorFlow Litetflitez.tflite)rD   rQ   rF   rR   rG   rS   zTensorFlow Edge TPUedgetpuz_edgetpu.tflite)rQ   rS   rR   zTensorFlow.jstfjs
_web_model)rD   rQ   rS   rF   rR   rG   PaddlePaddlepaddle_paddle_modelMNNmnn.mnn)rD   rF   rR   NCNNncnn_ncnn_modelrF   IMXimx
_imx_model)rQ   rR   rS   rG   RKNNrknn_rknn_modelname
ExecuTorch
executorch_executorch_modelz
Axelera AIaxelera_axelera_model)rD   rR   rS   rQ   DeepXdeepx_deepx_model)rQ   rR   rE   )FormatArgumentSuffixCPUGPU	Arguments)dictzip)xs    ^/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/ultralytics/engine/exporter.pyexport_formatsr   z   s    
CdB/	~tTCrCrCrs	$.f.f.fgKKK	
 WWW	
 
8\48c8c8cd#AAA	
 
eT4'C	Hiu>r>r>rs		+<dEKgKgKgh	&,e=q=q=qr	?D$	J	vtT+D+D+DE	dWf4EF	|T41T1T1TU	uw6GH	|%8$yQ	y"2E5BgBgBgh	'>5%9U9U9UVQ)	AT OOOQTVWQXYYZZZ    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.
    )rF   rR   rH   r\   rG   rD   rS   rQ   Nu"   ERROR ❌️ valid arguments for 'z' not listed.   )rD   rQ   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     [ZZK!!#]#]#]#]!!!$$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: )
r5   
isinstancestrr   r2   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                  |   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 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d/ Zed9d1            Zd:d3Zd:d4Z dS );Exporterae
  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.
        export_deepx: Export model to DeepX 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   returnr   c                <!    t          j                     } j        j                                        }|dv rd}|dv rd}t	                      }t          |d         dd                   }||vrjddl}|                    ||dd	
          }|s"|dk    rdnd| d}t          | d|           t          j
        d| d|d          d           |d         }|dv }	d _        |dk    r, j        j         t          j
        d           d j        _        |dk    rxdt           j        j                  v r]t           j        j                  }
|
                    dd          d          _        d j        _         j        dv sJ d|
 d            |dk    rJ j        j        >t          j                                        r t          j
        d           d j        _        t%           j        j        dn j        j                   _        t'          t)          |d         |d                             |         t+          | j                   |dv r/ j        j        s#t          j
        | d            d! j        _        |d"k    rt|j        d#k    r:t1          d$ |                                D                       rt          d%           j        j        s#t7          j        |j                   j        _        |dk    rM j        j        s)|j        d&v r t          j
        d'           d! j        _        |j        d(vrt          d)          t=          |d*          st?                      |_         tC          |j                   |_         t=          |d+          r j        j"         j        j"        |_"        |d,v r0d-|_"        t          j
        |#                                 d.           |dk    rb j        j        rV	 ddl$}tK          |j&        d/          r+tO          d01          rd-|_"        t          j
        d2           n# tP          $ r Y nw xY w j        j)        r, j        j        r t          j
        d3           d- j        _)         j        j)        r6|d4k    r0 j        j*        dk    r t          j
        d5           d- j        _)        tW           j        j,        |j-        d67           _,         j        j.        r*|d8k    s
J d9             j        j*        dk    s
J d:            |d;k    r j        j/        s t          j
        d<           d= j        _/         j        j/                                         j        _/         j        j/        t`          v s J d> j        j/         d?t`           d             j        j        r+|j        d@k    r t          j
        dA           d- j        _         j        j        rtc          |td                    r
J dB            |dCk    stf          rth          r
J dD            |	rtj          s
J dE            |dFk    stj          s
J dG            tm          |d+d-          s tc          |j7        d         tp                    r t          j
        dH           d- j        _         j        j9        pdI j        _9        |dJv s j        j        rO j        j:        rC j        j;        dk    r3t          j
        dK j        j        rdLndM j        j          dN           |dOk    rMth          rtf          rty          dP           j        j;        dk    r t          j
        dQ           d j        _;        tc          |tz                    rt          j
        dR           d|_>         j        j        r` j        j        sTt~          j        pt          tm          |dSdT                    j        _        t          j
        dU j        j         d           |dVk    rtf          rth          rty          dW          t          j        dX          r,t                      rt          jC        dY           d-t          dX<   t          jD         j        j;        |jE                            dZd[          g j,        R  F                     j                  }t          tm          |d\d          p+tm          |d]d          p|jE                            d]d^                    }|jH        d_v rt          |j/                  }t          |          F                     j                  }|J                                D ]	}d-|_K        
|L                                 |M                                 |N                                }|dk    rdd`lOmP}  || j,                  }|dav rddblQmR}  ||          }|dck    rdddlSmT}  ||          }|                                D ]}tc          |t          t          f          rd!|_W         j        j        |_        tc          |t          tp          f          r j        j:        |_:        d!|_W         j        j        |_        t           fde|j-        Z                                D                       }t           j        j\        |          |_\         j        j]        |_]         j        j        o|dk    |_^        d|__        t=          |df          rRt=          |dg          rBt=          |dh          s2|N                    |j`        F                     j                             atc          |t                    r|	s|jb        |_c        d}t          d6          D ];} j        j        r"|divr t          | j                  |          n
 ||          }< j        j)        r<|djv r8 j        j*        dk    r(|)                                |)                                }}| _f        | _7        | _g        tc          |t          jh                  rt          |j_                  nt          dk |D                        _i        t           j7        jE                            d] jg                            jj        k                    dldm           _l        t=          |dn          r'tc          |j        t&                    r|j        do         nd^}dp jl         dq|rdr| nd^ }|dst          jn                    o                                tL          dtdut          t          |j-                            |j         j        j;         j,        |j         fdv j        D             |jE                            dZd[          tm          |d+d-          dw _r         j         j         jr        d<   |j        dxk    r9|j7        d         js         jr        dy<   t=          |dz          r|jt         jr        dz<   t          jC        d{t          d|           d}| d~t          |j_                   d ji         dt          |          dd            w                    d           |	r x                                \  }}|dv r y                    |          }|dCk    r z                                }|dOk    r3 {                    t          |           jg        jj         dz            }|dVk    r |                                }n tm           d|                       }|r" j,        d          j,        d         k    }|rd^nd j,         dt           j,                   d}|r j,        d         n/t           j,                  dd         k                    dd^          } j        j        rdn j        j)        rdnd^}t          jC        dt          j                     |z
  ddt          dt          |          }                                           d|j         d| d| d| d|j         d| d| d| d| d| d            w                    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tensorrtrU   >   iosapplerX   mlmodel	mlpackage	mlprogramrX   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   >   r]   ra   r_   r`   rZ   z>TensorRT requires GPU export, automatically assigning device=00dla:>   r   1z,Expected device 'dla:0' or 'dla:1', but got .rm   zTExporting on CPU while CUDA is available, setting device=0 for faster export on GPU.cpur   >   rm   ry   rv   r`   z. export requires int8=True, setting int8=True.Trv   segmentc              3  @   K   | ]}t          |t                    V  d S N)r   r   ).0ms     r   	<genexpr>z$Exporter.__call__.<locals>.<genexpr>G  s,      .a.aAz!Y/G/G.a.a.a.a.a.ar   zEAxelera export does not currently support YOLO26 segmentation models.>   posedetectr   z/IMX export requires nms=True, setting nms=True.>   r   r   r   classifyzbIMX export only supported for detection, pose estimation, classification, and segmentation models.namesend2end>   rm   rj   rp   rd   r`   rt   FzB export does not support end2end models, disabling end2end branch.z==10.3.0   )jetpackzTensorRT 10.3.0 on JetPack 6 with int8 has known end2end build issues, disabling end2end branch. For a fix, see https://docs.ultralytics.com/guides/nvidia-jetson/#why-does-my-tensorrt-int8-export-disable-end2end-on-jetpack-6zChalf=True and int8=True are mutually exclusive, setting half=False.rB   zahalf=True only compatible with GPU export for TorchScript, i.e. use device=0, setting half=False.   )stridemin_dimrj   zHoptimize=True not compatible with format='ncnn', i.e. use optimize=FalsezEoptimize=True not compatible with cuda devices, i.e. use device='cpu'rp   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 semanticzN'nms=True' is not valid for semantic segmentation models. Forcing 'nms=False'.z2'nms=True' is not valid for classification models.r_   z1TFLite export with NMS unsupported on ARM64 Linuxz/TensorFlow exports with NMS require torch>=1.13rJ   z)ONNX export with NMS requires torch>=1.13zD'nms=True' is not available for end2end models. Forcing 'nms=False'.g      ?>   rX   rU   z'dynamic=True' model with 'znms=Truezformat=z*' requires max batch size, i.e. 'batch=16'r`   z_Edge TPU export only supported on non-aarch64 Linux. See https://coral.ai/docs/edgetpu/compilerz7Edge TPU export requires batch size 1, setting batch=1.a   YOLOWorld (original version) export is not supported to any format. YOLOWorldv2 models (i.e. 'yolov8s-worldv2.pt') only support export to (torchscript, onnx, openvino, engine, coreml) formats. See https://docs.ultralytics.com/models/yolo-world for details.taskr   zOINT8 export requires a missing 'data' arg for calibration. Using default 'data=ra   z8TF.js exports are not currently supported on ARM64 Linuxopenvino_msgu   💡 ProTip: Export to OpenVINO format for best performance on Intel hardware. Learn more at https://docs.ultralytics.com/integrations/openvino/channels   pt_path	yaml_file >   .yml.yaml)FXModel>   r_   r`   )
tf_wrapperrt   )executorch_wrapperc              3     K   | ]?}t          j        d          |z            t          j        d         |z            z  V  @dS )r   r   N)intimgsz)r   sr   s     r   r   z$Exporter.__call__.<locals>.<genexpr>  sO      mmRSc$*Q-!"344s4:a=1;L7M7MMmmmmmmr   pefuselrpc>   rm   rX   >   rJ   rB   c              3  v   K   | ]4}t          t          |t          j                  r|j        ng           V  5d S r   )tupler   torchTensorshape)r   r   s     r   r   z$Exporter.__call__.<locals>.<genexpr>  sB      XXQRu
1el(C(CKQWWLLXXXXXXr   yoloYOLOr   rQ   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   kvfmt_keyss      r   
<dictcomp>z%Exporter.__call__.<locals>.<dictcomp>  s$    AAAda1==Q===r   )descriptionauthordateversionlicensedocsr   r   rD   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]   ra   )keras_modelz_full_integer_quant.tflite)tflite_modelexport_u>   WARNING ⚠️ non-PyTorch val requires square images, 'imgsz=z#' will not work. Use export 'imgsz=z' if val is required. rR   rF   z
Export complete (zs)
Results saved to boldz$
Predict:         yolo predict task=z model=z imgsz=z 
Validate:        yolo val task=z data=z$
Visualize:       https://netron.appon_export_end)~timer   r   lowerr   r   difflibget_close_matches
ValueErrorr!   warningr   r   r   rsplitr   cudais_availabler=   r   r   r   rR   r   anymodulesrQ   r	   getrG   hasattrr   r   r   r   upperr   r0   r   r,   ImportErrorrF   typer.   r   r   rE   rr   r$   r   r   r   r    r8   r   modelr   confrH   rD   SystemErrorr   
clip_modelr   r
   r%   r1   r   zerosyamltor   suffixr   
parametersrequires_gradevalfloatr   ultralytics.utils.export.imxr   #ultralytics.utils.export.tensorflowr   #ultralytics.utils.export.executorchr   r   r   exportr   sumtolistminmax_detagnostic_nmsxyxyr   r   r   forward_splitforwardrangeNMSModelimfiler   output_shapestemreplacepretty_namer   now	isoformatr   maxmetadatar  r  r*   r2   run_callbacksexport_saved_model	export_pbexport_tfliteexport_edgetpuexport_tfjsresolve)r   r  r   fmt	fmts_dictfmtsr  matchesmsgis_tf_format
device_strr   r7  r8  pr   r   r   r   anchorsy_rQ   r   r   r  squarer   r   qr   s   `                             @r   __call__zExporter.__call__  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PP (??ty/7N[\\\"DI(??uDI,<(=(===TY-..J!((a004DH"DI8z)))+gZd+g+g+g)))%<<DI,49P9P9R9R4Nqrrr"DI#TY-=-EEE49K[\\ Ij19[3IJJKKCPc49h///8888NcQQQRRR!DIN)zY&&3.a.aQVQ^Q^Q`Q`.a.a.a+a+a& !hiii9> F!5!9%*!E!E	%<<9= %UZ3P%P%PPQQQ $	z!JJJ x   ug&& 	0-//EK'445)$$ 	y , $	 1PPP %#))++qqqrrrh49>****$S_jAA iXYFZFZFZ (-  
 #   D9> 	#din 	#N`aaa"DIN9> 	#c]22t{7G57P7PNs   #DIN qQQQ
9 	v&==="l===;#u,,,.u,,,&==9> *3   "*	!Y^1133DIN9>Z///t49>ttgqttt 0// 9= 	"UZ:55Nklll!DIM9= 	4!%)<==ss?sss=(??%?u??>q??<#dzdd3ddd1&==J==0[==.ui// &:ek"o}3]3] &efff %	!Y^3tDIN'''49='di>O'TXT]TcghThTh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   &==U=u=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'''FFFFFFJu%%E,NNNNNN&&u--E 	, 	,A!h899 ,9+!fm455 , I-	9+mmmmW\WcWjWjWlWlmmmmm	 17;;	!%!7:3(?5$'' 5GAv,>,> 5wqRXGYGY 5FF58;;t{33444As## ,L ,O	q 	p 	pA26)-oCO`D`D`*	**2...fkfklnfofoAA9> 	0c%<<<AQUZAZAZ		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
 
  8#'8DM% :).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	
 	
 	
 	,---  	1!4466NA{n$$NN{N;;h&&((i''T!WW$).?l?l?l5l'mmf}}$$&&.ooo..00A  	Z]djm3F RRVZV` R R+.tz??R R R  &,WDJqMMTZ21F1N1NsTV1W1WE).N	.NffBAK9dikkAo= 9 9&.vtAww7H7H&I&I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   AQ
 

QQr   c           	        t          j        | d| j        j         d            | j        j        dk    rt          nt          | j        j                  }| j        j        dk    rYt          || j        j	        pd         || j        j
        | j        j        t          | j                  d| j        j                  }nht          | j                  }t          | j                  |_        t          ||| j        j	        pd         | j        j        |d| j        j
                  }t!          |j        j        d         d	          r| j        |j        j        d         _        t'          |          }|d
k     rt)          d| d          t+          | j        j        |          }|| j        j        k     rt          j        | d| d| d           | j        j        dk    r!|dk     rt          j        | d| d           n0| j        j        dk    r |dk     rt          j        | d| d           t1          ||dd          S )z=Build and return a dataloader for calibration of INT8 models.z/ collecting INT8 calibration images from 'data=r   r   valF)rQ   rS   r   r   augment
batch_size)moderS   r   	new_shaper   z>The calibration dataset must have at least 1 image, but found z images.z calibration dataset has only z, images, reducing calibration batch size to r   rv   d   z5 >100 images required for Axelera calibration, found i,  z5 >300 images recommended for INT8 calibration, found T)rD   workers	drop_last)r!   r   r   rQ   r  r   r   r   r   splitrS   r?  r   rD   r   r   r  
transformsr[  lenr  r/  r  r   r   )r   r   rQ   datasetr   r   rD   s          r   get_int8_calibration_dataloaderz(Exporter.get_int8_calibration_dataloader6  sS   v__din___```YTZ_
%B%B!!HY[_[d[ijj:?j((!TY_-.+Z_$*oo9?  GG 49%%CDJCI(TY_-.	+  G 7%03[AA 	D9=G)!,6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                    ddl m}  || j        j        rt	          | j        | j                  n| j        | j        | j                            d          | j        j	        | j
        |          S )z(Export YOLO model to TorchScript format.r   )torch2torchscriptrC   )r  r7  output_filerE   r@  r   )$ultralytics.utils.export.torchscriptre  r   rG   r6  r  r7  r8  with_suffixrE   r@  )r   r   re  s      r   export_torchscriptzExporter.export_torchscript_  sz     	KJJJJJ  59Y]R(4:ty111
w	--n==Y']
 
 
 	
r   zONNX:c           
     (   dg}| j         j        r*|ddt          j                                        rdndz   gz  }t          |           ddl}ddlm}m	} | j         j
        p ||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}	t3          | j        t4                    rddd|	d<   dddd|	d<   n"t3          | j        t6                    rddd|	d<   | j         j        r|	d                             d           | j         j        r(| j        j        dk    r|| j         _
        d | j         _        t;          t=          |	          | j         j        | j         j         !          5   || j         j        rtC          | j        | j                   n| j        | 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# tL          $ r#}t          j'        | d$|            Y d}~nd}~ww xY w| j(        )                                D ]:\  }}|
j*        +                                }|t'          |          c|_,        |_-        ;t]          |
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+l0m1} t          j        | d,           |2                    |
d -          }
n0# tL          $ r#}t          j'        | d.|            Y d}~nd}~ww xY w|3                    |
|           |S )/z!Export YOLO model to ONNX format.zonnx>=1.12.0,<2.0.0zonnxslim>=0.1.71onnxruntimez-gpur   r   N)best_onnx_opset
torch2onnxr  )r  r  z starting export with onnx z opset ...z:'nms=True' ONNX export requires torch>=1.13 (found torch==)rK   r   output0output1imagesrD   heightwidth)r   r   r   rP  )r   r   mask_height
mask_widthr   obbT)rH   rF   rH  )rL   input_namesoutput_namesrH   z slimming with onnxslim z simplifier failure: 
ir_version
   z limiting IR version z' to 10 for ONNXRuntime compatibility...rJ   r   )float16z converting to FP16...)keep_io_typesz FP16 conversion failure: )4r   rM   r   r  r  r/   rJ   ultralytics.utils.export.enginerl  rm  rL   r   r  r!   r   r   rG   r8   r&   r   r8  rh  r  r   rH   r   r   r   popr6   boolrF   r   r6  r7  loadonnxslimslimr   r  r@  itemsmetadata_propsaddkeyvaluer   rz  onnxruntime.transformersr|  convert_float_to_float16save)r   r   requirementsrJ   rl  rm  rL   r   ry  rH   
model_onnxr  r   r   r   metar|  s                    r   export_onnxzExporter.export_onnxm  s    ..9 	p/EJLcLcLeLeBm&&km1nooL<(((OOOOOOOO	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$w--din$)JZ[[[ 		 		J379=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   3AII	I	28J+ +
K5KK4O 
O9O44O9z	OpenVINO:c           
         ddl m} t          t          rt          dk    rdnd           ddlt          sJ dt           d             fd	}d
\  }} j        j	        r
t          d           t          t          sdnd           ddl}|                                         |           j                  }t           j        j        d         t"                    rd                    t'           j                                                  d         d                             d          dd                   }|                    d| dd| dd| dd| dgdg          } | j        j        rt1           j         j                  n j         j         j        j         j        j         j        j	        |||          }d j        j	        rdnd dt8          j         }	t=           j                                        j        j!        |	          }
t=          tE          |
           j        #                    d          j$        z            } |||           |
S )z%Export YOLO model to OpenVINO format.r   )torch2openvinoz15.4zopenvino>=2025.2.0zopenvino>=2024.0.0Nz/OpenVINO export requires torch>=2.1 but torch== is installedc                |   |                      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 )r
  rR  )r;  )r   r   s     r   
<listcomp>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   iour  r   valuesr   
save_modelrF   r(   r  r   parentr@  )ov_modelr8  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   )NNzpackaging>=23.2znncf>=2.14.0,<3.0.0znncf>=2.14.0r   r   r   z.*z/.*/Addz/.*/Sub*z/.*/Mul*z/.*/Div*Sigmoid)patternstypes)r  r7  rH   rF   rR   calibration_datasetignored_scoper   rR  int8_r   openvino_modelz.xml)%!ultralytics.utils.export.openvinor  r/   r"   r#   rO   r9   r&   r   rR   r:   nncfDatasetrc  _transform_fnr   r  r   joinlistnamed_modulesr_  IgnoredScoperG   r6  r7  rH   rF   ossepr   r8  r;  r$  r   rh  rr   )r   r   r  r  r  r  r  head_module_namer  r$  r   f_ovr  s   `           @r   export_openvinozExporter.export_openvino  s    	EDDDDD 	5n]f=T=T//ZnooohhhMhhhhhy	J 	J 	J 	J 	J 	J .8*]9> 	0111IY44>ZZZKKK"&,,t/S/STZ/[/[]a]o"p"p$**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 ! ! ">59Y]R(4:ty111
wI% 3'	
 	
 	
 O	6WWBNNbfNN	NN""49#3V<<477TY226::??@@	(D!!!r   zPaddlePaddle:c           	         ddl m}  || j        | j        t	          | j                                      | j        j        dt          j	                   | j
        |          S )z)Export YOLO model to PaddlePaddle format.r   )torch2paddlere   r  r7  
output_dirr@  r   )ultralytics.utils.export.paddler  r  r7  r   r8  r;  r$  r  r  r@  )r   r   r  s      r   export_paddlezExporter.export_paddle  so     	A@@@@@|*w49~~--di.>@XPRPV@X@XYY]
 
 
 	
r   zMNN:c                    ddl m}  ||                                 | j                            d          | j        j        | j        j        | j        |          S )zIExport YOLO model to MNN format using MNN https://github.com/alibaba/MNN.r   )onnx2mnnrh   )	onnx_filerf  rF   rR   r@  r   )	ultralytics.utils.export.mnnr  r  r8  rh  r   rF   rR   r@  )r   r   r  s      r   
export_mnnzExporter.export_mnn	  sg     	:99999x&&((	--f55]
 
 
 	
r   zNCNN:c           	         ddl m}  || j        | j        t	          | j                                      | j        j        d          | j        j	        | j
        | j        |          S )zIExport YOLO model to NCNN format using PNNX https://github.com/pnnx/pnnx.r   )
torch2ncnnz_ncnn_model/)r  r7  r  rF   r@  r   r   )ultralytics.utils.export.ncnnr  r  r7  r   r8  r;  r$  r   rF   r@  r   )r   r   r  s      r   export_ncnnzExporter.export_ncnn  sm     	=<<<<<z*w49~~--di.>OO];
 
 
 	
r   zCoreML:c                   | j         j                                        dk    }ddlm}m}m} t          ddg           ddl}t          r
J d            t          s
J d            | j         j        d	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        |           | j        j        dk    r-| j         j        r || j        | j        |           n| j        }n*| j         j        rt-          j        | d           | j        }| 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}
 |||
| j        | j        j        dk    r+t=          | j        j                                                   nd|| j         j!        | j         j"        | j#        |	  	        }| j         j        rU| j        j        dk    rE ||| j$        |rdn|j%        | j#        || j         j&        | j         j'        | j         j(        |	  	        }| j        j        dk    r|j)        *                    ddi           	 |+                    tY          |                     nh# tZ          $ r[}t-          j        | d| d            |                    d          }|+                    tY          |                     Y d}~nd}~ww xY w|S )!z#Export YOLO model to CoreML format.r   r   )IOSDetectModelpipeline_coremltorch2coremlzcoremltools>=9.0znumpy>=1.14.5,<=2.3.5NzHCoreML export is not supported on Windows, please run on macOS or Linux.z"CoreML export requires torch>=1.11r   zkbatch sizes > 1 are not supported without 'dynamic=True' for CoreML export. Please retry at 'dynamic=True'.ze'nms=True' cannot be used together with 'dynamic=True' for CoreML export. Please disable one of them.r   zA'dynamic=True' is not supported for CoreML classification models.z.mlmodelrY   r   )r   zB 'nms=True' is only available for Detect models like 'yolo26n.pt'.)lower_boundupper_bounddefault    r   )r   imagegp?)r   r   r   )r   scalebias)	r  inputsr7  classifier_namesr   rF   rR   r@  r   )weights_dirr@  r   r  r  r1  r   z#com.apple.coreml.model.preview.typeimageClassifierz& CoreML export to *.mlpackage failed (z), reverting to *.mlmodel export. Known coremltools Python 3.11 and Windows bugs https://github.com/apple/coremltools/issues/1928.).r   r   r  ultralytics.utils.export.coremlr  r  r  r/   coremltoolsr'   r7   rD   rH   rG   r  r   r8  rh  is_dirshutilrmtreer7  r!   r  ShapeRangeDimr   r   
TensorType	ImageTyper  r   r  rF   rR   r@  r9  r  r  r  r1  user_defined_metadataupdater  r   r   )r   r   r   r  r  r  ctr   r  input_shaper  ct_modelr   s                r   export_coremlzExporter.export_coreml&  sZ    )"((**i7aaaaaaaaaa 	.0GHIII    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!:?h&&RVR[R_oNN4:twg+NNNNeieoEEy} n&lllmmmJE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<w@D
S]@]@]T$*"2"9"9";";<<<cg]

 

 

 9= 	TZ_88&!$+EDD1EIMY^!Y3
 
 
H :?j((*113XZk2lmmm	"MM#a&&!!!! 	" 	" 	"N t t t t t   j))AMM#a&&!!!!!!!!	" s   !"N 
O)AO$$O)z	TensorRT:c                   | j         j        j        dk    s
J d            |                                 }ddlm} t          |                                          sJ d|             | j        	                    d          } |||| j
        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   )onnx2enginezfailed to export ONNX file: rV   N)r   rb  r@  verboser   )r7  r   r  r  r~  r  r   existsr8  rh  r   	workspacerF   rR   rH   r   r   rc  r@  r  )r   r   f_onnxr  r   s        r   export_enginezExporter.export_engine{  s    w~"e+++-l+++!!##??????F||""$$MM&MV&M&MMM$I!!),,IININIGMDHIN\D88@@@X\]I%	
 	
 	
 	
 r   zTensorFlow SavedModel:c                   ddl m} 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	                                                              t0          j                  }t5          | j        j        d
         t8                    r;| j
        j        pd| j
        _        d| j
        j        cxk    rdk    sn J d            d| j
        _        |                                 } |||| j
        j        || j
        j         dv |          }tC          j"        |dz  | j#                   |$                    d          D ]<}dt          |          v r|%                                n| &                    |           =t          |          |fS )z2Export YOLO model to TensorFlow SavedModel format.r   )onnx2saved_modelr[   Nc                    g | ]
}|d          S )imgr   )r   rD   s     r   r  z/Exporter.export_saved_model.<locals>.<listcomp>  s    ]]]ueEl]]]r   )sizer   r   r   r         z%RTDETR export requires opset>=16;<=19T>   ra   r`   )rR   rr  disable_group_convolutionr   r  z*.tflitezquant_with_int16_act.tflite)'r*  r  r   r   r8  r;  r$  r  r  r  r   rR   rQ   rc  r   nn
functionalinterpolatecatr(  r   permutenumpyastypenpfloat32r   r  r   rL   rM   r  r   r(   r  r@  rglobunlink_add_tflite_metadata)r   r   r  r   rr  r  r  r8  s           r   rB  zExporter.export_saved_model  s7    	IHHHH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{""r   zTensorFlow GraphDef:c                Z    ddl m}  ||| j                            d          |          S )zgExport YOLO model to TensorFlow GraphDef *.pb format https://github.com/leimao/Frozen-Graph-TensorFlow.r   )keras2pbr^   )rf  r   )r*  r  r8  rh  )r   r  r   r  s       r   rC  zExporter.export_pb  s?     	A@@@@@x1F1Fu1M1MV\]]]]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  z! starting export with tensorflow rn  r[   z_int8.tflitez_float16.tflitez_float32.tflite)
tensorflowr!   r   r   r   r   r8  r;  r$  r   rR   r:  rF   )r   r   tfrZ   r   s        r   rD  zExporter.export_tflite  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           	     "   t           rt          rt          r
J d            t          s
J d            ddlm} | j        j        | j        j         dz  } || j	        || 
                    |          | j        | j        j        | j        |          S )z$Export YOLO model to Axelera format.zGexport is only supported on Linux and is not supported on ARM64 Docker.zexport requires torch>=2.8.0.r   )torch2axelerarw   )r  r  r  transform_fn
model_namer@  r   )r    r   r   r;    ultralytics.utils.export.axelerar  r8  r  r:  r  rc  r  r@  )r   r   r  r  s       r   export_axelerazExporter.export_axelera  s      	
e 	
	 	
 	
U	
 	
2 99999yBBBBBBY%49>(I(I(II
}*! $ D DV L L+y~]
 
 
 	
r   zExecuTorch:c                    t           sJ dt           d            ddlm}  || j        | j        t          | j                                      | j        j	        d          | j
        |          S )z-Export YOLO model to ExecuTorch *.pte format.z,ExecuTorch requires torch>=2.9.0 but torch==r  r   )torch2executorchz_executorch_model/r  )r<   r&   r+  r  r  r7  r   r8  r;  r$  r@  )r   r   r  s      r   export_executorchzExporter.export_executorch  s     eeeeeeeeyHHHHHH*w49~~--di.>@TUU]
 
 
 	
r   z	Edge TPU:c                b    ddl m}  |||j        |          }|                     |           |S )zQExport YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/.r   )tflite2edgetpu)tflite_filer  r   )r*  r  r  r  )r   r  r   r  rf  s        r   rE  zExporter.export_edgetpu  sK     	GFFFFF$n,J]flmmm!!+...r   zTensorFlow.js:c                X   ddl m}  |t          | j                            d                    t          | j                                      | j        j        d          | j        j        | j        j	        |          }t          j        t          |          dz  | j                   |S )z*Export YOLO model to TensorFlow.js format.r   )pb2tfjsr^   z_web_model/)pb_filer  rF   rR   r   r  )r*  r  r   r8  rh  r;  r$  r   rF   rR   r(   r  r   r@  )r   r   r  r  s       r   rF  zExporter.export_tfjs  s     	@?????W	--e445549~~--di.>NN
 
 

 		$z""_4dmDDDr   zRKNN:c                :   ddl m} t          | j        j        pdd          | j        _        |                                 } ||t          | j                                      | j        j	        dt          j                   | j        j        | j        |          S )z!Export YOLO model to RKNN format.r   )	onnx2rknnr  rq   )r  r  rr   r@  r   )ultralytics.utils.export.rknnr  r/  r   rL   r  r   r8  r;  r$  r  r  rr   r@  )r   r   r  r  s       r   export_rknnzExporter.export_rknn  s     	<;;;;;dio3R88	!!##y49~~--di.>@Vbf@V@VWW]
 
 
 	
r   zIMX:c                   t           s
J d            t          s
J d            t          | j        dd          rt	          d          ddlm}  || j        t          | j                  	                    | j        j
        d          | j        j        | j        j        | j        j        | j        t!          | 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.r   )	torch2imxz_imx_model/)r  r  r  r  r0  r@  rb  r   )r    r-   r   r  r  r)  r   r   r8  r;  r$  r   r  r  r0  r@  r   rc  )r   r   r   s      r   
export_imxzExporter.export_imx  s      	
 	
F	
 	
u %\\&\\\$4:y%00 	PNOOO::::::y*49~~--di.>NN	I%]D@&II	
 	
 	
 		
r   zDeepX:c                    t           rt          r
J d            ddlm} |                                 } ||| j        |                     |          | j        | j        j	        |          S )z"Export YOLO model to DeepX format.z0DeepX export only supported on non-aarch64 Linuxr   )
onnx2deepx)r  r   rb  r@  rE   r   )
r    r   ultralytics.utils.export.deepxr#  r  r   rc  r@  r   rE   )r   r   r#  r   s       r   export_deepxzExporter.export_deepx7  s     VUVV$VVV"======z*88@@]Y'
 
 
 	
r   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writestrjsondumpsr@  )r   r8  r)  zfs       r   r  zExporter._add_tflite_metadataG  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"
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   uint8r   r  r  r  ndim)	data_itemr7  s     r   r  zExporter._transform_fnN  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)   appendr   r6  callbacks      r   add_callbackzExporter.add_callbackV  s#    u$$X.....r   c                X    | j                             |g           D ]} ||            dS )z(Execute all callbacks for a given event.N)r)   r  r9  s      r   rA  zExporter.run_callbacksZ  s<    **5"55 	 	HHTNNNN	 	r   )r   r   r   )r   r   )r   )r   r0  )r6  r   )!__name__
__module____qualname____doc__r   r   rU  rc  r   r*   ri  r  r  r  r  r  r  r  rB  rC  rD  r  r  rE  rF  r  r!  r%  r  staticmethodr  r;  rA  r   r   r   r   r      s       2 2h '$RV 
2 
2 
2 
2 
2] ] ] ] ]~'Q 'Q 'Q 'QR (0(@(@ 
 
 
 Z
 !)'!2!2 M M M ZM^ %-Xk%:%: < < < Z<| #+8O#<#< 

 

 

 Z

  ( 0 0 
 
 
 Z
 !)'!2!2 
 
 
 Z
 #+8I#6#6 R R R ZRh #+8K#8#8    Z2 (01I(J(J &# &# &# Z&#P ,4H5K,L,L ^ ^ ^ Z^ #+8,>#?#?    Z $,HZ$8$8 
 
 
 Z
( '/x'>'> 
 
 
 Z
 *,XXk5J5J    Z !)*:!;!;    Z !)'!2!2 
 
 
 Z
  ( 0 0 
 
 
 Z
. "*(8"4"4 
 
 
 Z
N N N 0 0 0 \0/ / / /     r   r   c                  (     e Zd ZdZ fdZd Z xZS )r6  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.
        rw  >   ra   r_   rZ   N)	superr   r  r   r   rw  r   	frozensetis_tf)r   r  r   	__class__s      r   r   zNMSModel.__init__c  s[     	
	:&Y%3T3T3T)U)UU


r   c           	     
   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 |}t/          |          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        rVtE          tF          j$        | j        p-| j        j%        pddk     p| j        j        dk    o| j        j&         tN          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   )rG   )r   r2  r      r   Nr   )dimrJ         r_      rO   F)use_triuiou_func
exit_earlyr   ).torchvision.opsrG   r  r   r   r   r   r2  r   	transposera  r   r   rH   rD   r   r!  r?  tensorr  r_  r/  r0  r5  r  rF  r   rw  topkindicescloner1  viewexpandr   r4   fast_nmsrL   rR   r3   r  r#  r  r  padr   )r   r   rG   predspredr   bsextra_shaper[  boxesscoresextrasclassesoutiboxclsscoreextramasknmsbox
multiplierend
cls_offsetoffboxnms_fnkeepdetss                               r   r4  zNMSModel.forwardp  sJ    	('''''

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>  r?  r@  r   r4  __classcell__)rG  s   @r   r6  r6  `  s`        LLV V V V VJR JR JR JR JR JR JRr   r6  )^r@  
__future__r   r-  r  r  r  copyr   r   	functoolsr   pathlibr   r   r  r   ultralyticsr   ultralytics.cfgr	   r
   r   ultralytics.datar   r   ultralytics.data.datasetr   ultralytics.data.utilsr   r   ultralytics.nn.autobackendr   r   ultralytics.nn.modulesr   r   r   r   r   r   ultralytics.nn.tasksr   r   r   r   ultralytics.utilsr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   ultralytics.utils.checksr-   r.   r/   r0   r1   ultralytics.utils.filesr2   ultralytics.utils.metricsr3   ultralytics.utils.nmsr4   ultralytics.utils.opsr5   ultralytics.utils.patchesr6   ultralytics.utils.torch_utilsr7   r8   r9   r:   r;   r<   r=   r   r   r   r   r  Moduler6  r   r   r   <module>r     s  = =~ # " " " " "  				                                # # # # # # D D D D D D D D D D A A A A A A A A 0 0 0 0 0 0 G G G G G G G G M M M M M M M M c c c c c c c c c c c c c c c c c c c c c c c c c c c c                                   $ u t t t t t t t t t t t t t - - - - - - 3 3 3 3 3 3 * * * * * * ) ) ) ) ) ) 2 2 2 2 2 2                 ,[ ,[ ,[^n n n,  .G G G G G G G GTZR ZR ZR ZR ZRux ZR ZR ZR ZR ZRr   