
    h1%                    l   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
m
Z
 ddlmZ ddlZddlZddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZBmCZCmDZD ddlEmFZFmGZG ddlHmIZImJZJ ddlKmLZLmMZM ddlNmOZO ddlPmQZQmRZRmSZS d ZTd ZUd ZVd ZW G d d      ZX G d dej                  j                        Z[ G d dej                  j                        Z\y) a
  
Export a YOLO PyTorch model to other formats. TensorFlow exports authored by https://github.com/zldrobit.

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

Requirements:
    $ pip install "ultralytics[export]"

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

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

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

TensorFlow.js:
    $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
    $ npm install
    $ ln -s ../../yolo11n_web_model public/yolo11n_web_model
    $ npm start
    N)deepcopy)datetime)Path)__version__)	TASK2DATAget_cfg)build_dataloader)YOLODataset)check_cls_datasetcheck_det_dataset)check_class_namesdefault_class_names)C2fClassifyDetectRTDETRDecoder)ClassificationModelDetectionModelSegmentationModel
WorldModel)ARM64DEFAULT_CFGIS_COLAB	IS_JETSONLINUXLOGGERMACOSMACOS_VERSION
RKNN_CHIPSROOTSETTINGSWINDOWSYAML	callbackscolorstrget_default_args)check_imgszcheck_is_path_safecheck_requirementscheck_versionis_intelis_sudo_available)attempt_download_assetget_github_assetssafe_download)export_engineexport_onnx)	file_sizespaces_in_path)Profilenms_rotated)arange_patch)
TORCH_1_13get_latest_opsetselect_devicec                  T   dddddg gdddddg dgd	d
dddg dgdddddg dgdddddg dgdddddg dgdddddg dgddd ddd!ggd"d#d$ddg d%gd&d'd(ddg gd)d*d+ddg dgd,d-d.ddd!ggd/d0d1ddg d2gd3d4d5ddd!d6ggd7d8d9ddg d:gd;d<d=ddd!d>ggg} t        t        g d?t        |              S )@z7Return a dictionary of Ultralytics YOLO export formats.PyTorch-z.ptTTorchScripttorchscript.torchscript)batchoptimizehalfnmsONNXonnx.onnx)r@   dynamicrB   opsetsimplifyrC   OpenVINOopenvino_openvino_modelF)r@   rG   rB   int8rC   fractionTensorRTengine.engine)r@   rG   rB   rM   rI   rC   rN   CoreMLcoreml
.mlpackage)r@   rB   rM   rC   zTensorFlow SavedModelsaved_model_saved_model)r@   rM   kerasrC   zTensorFlow GraphDefpb.pbr@   zTensorFlow Litetflite.tflite)r@   rB   rM   rC   rN   zTensorFlow Edge TPUedgetpu_edgetpu.tflitezTensorFlow.jstfjs
_web_modelPaddlePaddlepaddle_paddle_modelMNNmnn.mnn)r@   rB   rM   NCNNncnn_ncnn_modelrB   IMXimx
_imx_model)rM   rN   rC   RKNNrknn_rknn_modelname)FormatArgumentSuffixCPUGPU	Arguments)dictzip)xs    Y/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/ultralytics/engine/exporter.pyexport_formatsrz   r   sQ    
CdB/	~tTCgh	$.fgC	
 O	
 
8\48XY	 -tMno	eT4'C	Hiu>jk		+<dE2N	&,e=]^	?D$	J	vtT+DE	dWf4EF	|T41LM	uw6GH=	A@ OQTVWQXYZZ    c                     g d}|J d|  d       dddd}t        t        |      }|D ]2  }t        ||d      t        ||d      k7  }|s!||v r&J d| d|  d	        y)
ao  
    Validate arguments based on the export format.

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

    Raises:
        AssertionError: If an unsupported argument is used, or if the format lacks supported argument listings.
    )rB   rM   rG   rW   rC   r@   rN   Nu"   ERROR ❌️ valid arguments for 'z' not listed.   )r@   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           ry   validate_argsr      s     SK!]%Gx}#]]!$$7F;/L nk35sTX9YY*$m(?uDcdjckkl&mm$nr{   c           	          g g }}| j                   D ]8  }|j                  |j                         |j                  |j                         : t        d t        t        |      t        |      z
        D              S )z3Return TensorFlow GraphDef model output node names.c              3   J   K   | ]  }|j                  d       r| d  yw)NoOpz:0N)
startswith.0rx   s     ry   	<genexpr>zgd_outputs.<locals>.<genexpr>   s%     gqRSR^R^_eRfQCr(gs   #
#)nodeappendro   extendinputsortedlistset)gd	name_list
input_listr   s       ry   
gd_outputsr      sg    zI &#$**%& gDY#j/)I$Jgggr{   c                 ,     t                fd}|S )z(YOLO export decorator, i.e. @try_export.c                  R   d   }d}	 t               5 } | i |\  }}ddd       t        j                  | d|j                  dd dt	        |      dd       |fS # 1 sw Y   CxY w# t
        $ r/}t        j                  | d	|j                  dd
|        |d}~ww xY w)zExport a model.prefix        Nu    export success ✅ .1fzs, saved as 'z' ( MB)z export failure zs: )r4   r   infotr2   	Exceptionerror)	argskwargsr   dtfmodele
inner_args
inner_funcs	          ry   
outer_funcztry_export.<locals>.outer_func   s    H%	 7b%t6v657KK6("6rttCjaSPST]^_T`adSeeijke8O7 7  	LLF8#3BDD:SDEG	s.   
A. A"AA. "A+'A. .	B&7*B!!B&)r&   )r   r   r   s   ` @ry   
try_exportr      s    !*-J r{   c                   N   e Zd ZdZeddfdZd,defdZd-dZe	 e
d      fd	       Ze	 e
d
      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	d e
d      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	 e
d      fd       Ze	d e
d      fd       Ze	 e
d       fd!       Ze	 e
d"      fd#       Ze	 e
d$      fd%       Zd& Zd e
d'      fd(Zd)efd*Zd)efd+Zy).Exportera	  
    A class for exporting YOLO models to various formats.

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

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

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

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

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

        Args:
            cfg (str, optional): Path to a configuration file.
            overrides (dict, optional): Configuration overrides.
            _callbacks (dict, optional): Dictionary of callback functions.
        N)r   r   r$   get_default_callbacksadd_integration_callbacks)selfcfg	overrides
_callbackss       ry   __init__zExporter.__init__   s5     C+	#Hy'F'F'H++D1r{   returnc                 #   t        j                          }| j                  j                  j                         }|dv rd}|dv rd}t	               }t        |d   dd       }||vrPddl}|j                  ||dd	
      }|st        d| d|       t        j                  d| d|d    d       |d   }|D cg c]  }||k(  	 }	}t        |	      dk7  rt        d| d|       |	\  }
}}}}}}}}}}}}}}t        |||||f      }d}|r<| j                  j                  &t        j                  d       d| j                  _        |r~dt        | j                  j                        v r]| j                  j                  j                  dd      d   }d| j                  _        |dv sJ d| j                  j                   d       |rZ| j                  j                  Dt         j"                  j%                         r&t        j                  d       d| j                  _        t'        | j                  j                  dn| j                  j                        | _        |d   |	j)                  d      dz      }t+        || j                  |       |r| j                  j,                  s&t        j                  d       d| j                  _        | j                  j.                  s&t        j                  d       d| j                  _        |j0                  dvrt        d      t3        |d      st5               |_        t9        |j6                        |_        | j                  j:                  r<| j                  j,                  r&t        j                  d        d!| j                  _        | j                  j:                  rA|r?| j                  j<                  dk(  r&t        j                  d"       d!| j                  _        t?        | j                  j@                  |jB                  d#$      | _         | j                  jD                  r)|rJ d%       | j                  j<                  dk(  sJ d&       |r| j                  jF                  s&t        j                  d'       d(| j                  _#        | j                  jF                  j                         | j                  _#        | j                  jF                  tH        v s&J d)| j                  jF                   d*tH         d       | j                  j,                  r|rtK        |d+d!      rJ d,       | j                  j.                  rtM        |tN              rJ d-       |rtP        rtR        rJ d.       tK        |d+d!      r&t        j                  d/       d!| j                  _        | j                  jT                  xs d0| j                  _*        |s| j                  j.                  r`| j                  jV                  rJ| j                  jX                  dk(  r1t        j                  d1| j                  j.                  rd2nd3 d4       |rVtR        rtP        rt[        d5      | j                  jX                  dk7  r&t        j                  d6       d| j                  _,        tM        |t\              rt        j                  d7       d|_/        | j                  j,                  rx| j                  j`                  sbtb        j`                  xs td        tK        |d8d9         | j                  _0        t        j                  d:| j                  j`                   d;       |rtP        rtR        rt[        d<      tg        jh                  d=      r(tk               rt        jl                  d>       d!tf        d=<   t!        jn                  | j                  jX                  |jp                  ji                  d?d@      g| j@                   js                  | j                        }tu        tK        |dAd      xs+ tK        |dBd      xs |jp                  ji                  dBdC            }|jv                  dDv rtu        |jF                        }ty        |      js                  | j                        }|j{                         D ]	  }d!|_>         |j                          |j                          |j                         }|rddElBmC}  ||      }|j                         D ]  } tM        | t              rd| _F        tM        | t        t        f      r| j                  jV                  | _+        d| _F        | j                  j                  | _        | j                  j                  | _I        | j                  j.                  xr | | _J        t3        |dF      rdt3        | dG      rX| j                  |j                  js                  | j                               n#tM        | t              r|s| j                  | _N        tM        | t              s+|s/ddHlOmP}! dI  |!t!        j                  | j@                  D "cg c]   }"|"| jB                  j                  d      z  " c}"dJ      | jB                  dK      D        \  | _S        | _T         d}#t        d#      D ]@  }$| j                  j.                  r |s|s t        || j                        |      n ||      }#B | j                  j:                  r;|r9| j                  j<                  dk7  r |j;                         |j;                         }}t        j                  dLt         j                  j                  M       t        j                  dLt        M       t        j                  dLt        M       || _]        || _^        || __        tM        |#t         j                        rt        |#j                        nt        dN |#D              | _b        tu        | j                  jp                  ji                  dB| j                              j                  j                  dOdP      | _e        t3        |dQ      r)tM        |j                  t              r|j                  dR   ndC}%dS| j                   dT|%rdU|% ndC }&|&dVt        j                         j                         t        dWdXt        t        |jB                              |j0                  | j                  jX                  | j@                  |j6                  | j                  D '(ci c]  \  }'}(|'|v s|'|( c}(}'|jp                  ji                  d?d@      dY| _m        ||| j                  d<   |j0                  dZk(  r&|j                  d   j                  | j                  d[<   t        jl                  d\t        d]       d^| d_t        |j                         d`| j                   dat        |      dbdc       | j                  dd       dCgt        |      z  })|
s|r| j                         \  |)d<   }$|r| j                  |e      \  |)d<   }$|r| j                         \  |)d#<   }$|r| j                         \  |)d@<   }$|r| j                         \  |)df<   }$|r| j                  xj,                  |z  c_        | j                         \  |)dg<   }*|s|r| j                  |*h      \  |)di<   }$|r| j                         \  |)dj<   }$|r>| j                  tu        |)dg         | j                  j                   dkz  l      \  |)dm<   }$|r| j                         \  |)dn<   }$|r| j                         \  |)do<   }$|r| j                         \  |)dp<   }$|r| j                         \  |)dq<   }$|r| j                         \  |)dr<   }$|r| j                         \  |)ds<   }$|)D cg c]  }|st        |       })}t        |)      rnt        tu        |)d               })| j@                  d   | j@                  d   k(  }+|+rdCn%dt| j@                   dut        | j@                         dv}"|+r| j@                  d   n't        | j@                        dd j                  dwdC      },|j0                  dxk(  r|rdy|% ndC}-| j                  j,                  rdzn| j                  j:                  rd{ndC}.t        jl                  d|t        j                          |z
  dbd}t        d~|j                  j                                d|j0                   d|) d|, dw|. dw|- d|j0                   d|) d|, d|% dw|. dw|" d       | j                  d       |)S c c}w c c}"w c c}(}'w c c}w )z;Return list of exported files/dirs after running callbacks.>   trttensorrtrP   >   iosapplerS   mlmodel	mlpackage	mlprogramrS   rq   r}   Nr   g333333?)ncutoffzInvalid export format='z'. Valid formats are z', updating to format='r   z>TensorRT requires GPU export, automatically assigning device=00dla:>   r   1z5Expected self.args.device='dla:0' or 'dla:1, but got .zTExporting on CPU while CUDA is available, setting device=0 for faster export on GPU.cpuru   Tz1IMX export requires int8=True, setting int8=True.z/IMX export requires nms=True, setting nms=True.>   posedetectzCIMX export only supported for detection and pose estimation models.nameszChalf=True and int8=True are mutually exclusive, setting half=False.Fz<half=True only compatible with GPU export, i.e. use device=0   )stridemin_dimzHoptimize=True not compatible with format='ncnn', i.e. use optimize=FalsezEoptimize=True not compatible with cuda devices, i.e. use device='cpu'zcRockchip RKNN export requires a missing 'name' arg for processor type. Using default name='rk3588'.rk3588zInvalid processor name 'z,' for Rockchip RKNN export. Valid names are end2endz4TFLite INT8 export not supported for end2end models.z2'nms=True' is not valid for classification models.z1TFLite export with NMS unsupported on ARM64 LinuxzD'nms=True' is not available for end2end models. Forcing 'nms=False'.g      ?z'dynamic=True' model with 'znms=Truezformat=enginez*' requires max batch size, i.e. 'batch=16'z_Edge TPU export only supported on non-aarch64 Linux. See https://coral.ai/docs/edgetpu/compilerz7Edge TPU export requires batch size 1, setting batch=1.a   YOLOWorld (original version) export is not supported to any format. YOLOWorldv2 models (i.e. 'yolov8s-worldv2.pt') only support export to (torchscript, onnx, openvino, engine, coreml) formats. See https://docs.ultralytics.com/models/yolo-world for details.taskr   zOINT8 export requires a missing 'data' arg for calibration. Using default 'data='.z8TF.js exports are not currently supported on ARM64 Linuxopenvino_msgu   💡 ProTip: Export to OpenVINO format for best performance on Intel hardware. Learn more at https://docs.ultralytics.com/integrations/openvino/channels   pt_path	yaml_file >   .yml.yaml)FXModelpefuse)make_anchorsc              3   @   K   | ]  }|j                  d d        yw)r   r}   N)	transposer   s     ry   r   z$Exporter.__call__.<locals>.<genexpr>  s#      ( KK1%(s   dimg      ?ignore)categoryc              3   ~   K   | ]5  }t        t        |t        j                        r|j                  ng        7 y wN)tuple
isinstancetorchTensorshaper   s     ry   r   z$Exporter.__call__.<locals>.<genexpr>  s)     XQRu
1ell(CQWWLXs   ;=yoloYOLOr   r~   zUltralytics z model ztrained on Ultralyticsz2AGPL-3.0 License (https://ultralytics.com/license)zhttps://docs.ultralytics.com)descriptionauthordateversionlicensedocsr   r   r@   imgszr   r   r   r   	kpt_shape
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   	   
               u>   WARNING ⚠️ non-PyTorch val requires square images, 'imgsz=z#' will not work. Use export 'imgsz=z' if val is required. segmentzdata=rM   rB   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   lowerrz   r   difflibget_close_matches
ValueErrorr   warningsumanyr   strrsplitr   cudais_availabler9   indexr   rM   rC   r   hasattrr   r   r   rB   typer'   r   r   rA   ro   r   r   r   r   r   r   confrG   r@   SystemErrorr   
clip_modelr~   r   r   r!   getr+   r   zerosyamltor   suffixr   
parametersrequires_gradevalfloatr   ultralytics.utils.torch_utilsr   modulesr   exportr   r   max_detxyxyr   r   forward_splitforwardultralytics.utils.talr   cat	unsqueezeanchorsstridesrangeNMSModelwarningsfilterwarningsjitTracerWarningUserWarningDeprecationWarningimr   filer   r   output_shapestemreplacepretty_namerv   r   now	isoformatr   intmaxmetadatar   r%   r2   run_callbackslenexport_torchscriptr0   r1   export_openvinoexport_coremlexport_saved_model	export_pbexport_tfliteexport_edgetpuexport_tfjsexport_paddle
export_mnnexport_ncnn
export_imxexport_rknnparentresolve)/r   r   r   fmt	fmts_dictfmtsr  matchesrx   flagsr9  rE   xmlrP   rS   rU   rX   rZ   r\   r^   ra   rd   rg   rj   rm   is_tf_formatr   fmt_keysr=  r>  pr   mr   sy_r~   r   kvr   r   squarer   predict_dataqs/                                                  ry   __call__zExporter.__call__  s   IIKii$$&%%CQQC"$	Yz*12./d? //TQs/KG #:3%?TUYTZ![\\NN4SE9PQXYZQ[P\\]^_!*C#'(ac((u:?6se;PQUPVWXX 	odCb&'4QWY\^bdgim KVWdCD dii&&.NN[\"DIIes499#3#344))""))#q1"5C"DII*$q(]^b^g^g^n^n]oop&qq$499##+

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



=ENE 	A!X&!fm45 II--	99++ II--	5v:5$'GAv,>FF588;;t{{34As#LOO	!V$>()		tzz"R!1qxx'9'9"'=#="RXYZ\]\d\dfi($	19#	0 q 	gA26))--SV*		*2.]bce]fA	g99>>dt{{'7'75'@	5::<B 	5993J3JK;?3EF 
	 !U\\* !''NXVWXX 	
  

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

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

|71#WUZT[[\]^\__`am`n3EJJ<wqcQVPWW]^b]ccdefdgghijhk7	9 	?+{ )` #SN B` %s,   8AF>%AG*AG7AG@AG@"AGr   c           	         t        j                  | d| j                  j                   d        | j                  j
                  dk(  rt        nt        | j                  j                        }t        || j                  j                  xs d   || j                  j                  | j                  j
                  | j                  d   d| j                  j                        }t        |      }|| j                  j                  k  r&t        d| d	| j                  j                   d
      |dk  rt        j                  | d| d       t!        || j                  j                  dd      S )z=Build and return a dataloader for calibration of INT8 models.z/ collecting INT8 calibration images from 'data=r   classifyvalr   F)r~   rN   r   r   augment
batch_sizezThe calibration dataset (zE images) must have at least as many images as the batch size ('batch=z').,  z5 >300 images recommended for INT8 calibration, found z images.T)r@   workers	drop_last)r   r   r   r~   r   r   r   r   r
   splitrN   r   r@   rI  r  r  r	   )r   r   r~   datasetr   s        ry   get_int8_calibration_dataloaderz(Exporter.get_int8_calibration_dataloader  s.   vhMdiinnM]]^_`YTZZ__
%B!HY[_[d[d[i[ij)E*YY''**Q-yy
 Ltyy+A3 /99??+30  WNNfX%Z[\Z]]efgtyyUYZZr{   zTorchScript:c                    t        j                  d| dt        j                   d       | j                  j                  d      }t        j                  j                  | j                  j                  r t        | j                  | j                        n| j                  | j                  d      }dt        j                  | j                        i}| j                  j                   rDt        j                  | d       d	d
lm}  ||      j'                  t)        |      |       |dfS |j+                  t)        |      |       |dfS )z(Export YOLO model to TorchScript format.r   z starting export with torch ...r?   Fstrictz
config.txtz optimizing for mobile...r   )optimize_for_mobile)_extra_filesN)r   r   r   r   r>  with_suffixr9  tracer   rC   r6  r   r=  jsondumpsrG  rA   torch.utils.mobile_optimizerr{  _save_for_lite_interpreterr  save)r   r   r   tsextra_filesr{  s         ry   rJ  zExporter.export_torchscript4  s     	b <U=N=N<OsSTII!!.1YY__		Xdjj$))<SWS]S]_c_f_fot_u#TZZ%>?99KK6(";<=H#>>s1vT_>` $w GGCFG5$wr{   zONNX:c                    dg}| j                   j                  r*|ddt        j                  j	                         rdndz   gz  }t        |       ddl}| j                   j                  xs
 t               }t        j                  d| d	|j                   d
| d       t        | j                  j                  d            }t        | j                   t"              rddgndg}| j                   j$                  }|rdddddi}t        | j                   t"              rddd|d<   dddd|d<   n"t        | j                   t&              rddd|d<   | j                   j(                  r|d   j+                  d       | j                   j(                  r*| j                   j,                  dk(  r|| j                   _        t/        | j                         5  t1        | j                   j(                  r t3        | j                   | j                         n| j                   | j4                  ||dg||xs d       ddd       |j7                  |      }| j                   j                  r;	 ddl}	t        j                  | d|	j                   d       |	j;                  |      }| j@                  jC                         D ]7  \  }}|jD                  jG                         }|t        |      c|_$        |_%        9 |jM                  ||       ||fS # 1 sw Y   xY w# t<        $ r$}
t        j>                  | d|
        Y d}
~
d}
~
ww xY w)z!Export YOLO model to ONNX format.onnx>=1.12.0,<1.18.0onnxslim>=0.1.59onnxruntimez-gpur   r   Nr   z starting export with onnx z opset rx  rF   output0output1imagesr@   heightwidth)r   r   r   r3  )r   r   mask_height
mask_widthr   obb)rH   input_namesoutput_namesrG   z slimming with onnxslim z simplifier failure: )'r   rI   r   r  r  r)   rE   rH   r8   r   r   r   r  r>  r}  r   r   r   rG   r   rC   popr   r6   r1   r6  r=  loadonnxslimslimr   r  rG  itemsmetadata_propsaddkeyvaluer  )r   r   requirementsrE   opset_versionr   r  rG   
model_onnxr  r   rf  rg  metas                 ry   r1   zExporter.export_onnxE  s    //99/EJJLcLcLe&km1nooL<(		=+;+=b ;D<L<L;MWUbTccfgh		%%g./1;DJJHY1Z	9-aj`k))##Wg!FGG$**&78)0Y%?	")0]|%T	"DJJ7)0Y%?	"yy}}	"&&q)99==TZZ__5+DIIO$))$ 		3799==TYY/djj#%J)4		 YYq\
 99Dvh&>x?S?S>TTWXY%]]:6
 MM'') 	-DAq,,002D#$c!f DHdj	- 			*a *}?		 		,  D&)>qcBCCDs%   A"L":L L	L?L::L?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        j                   d
       j                   j                  j                  r t         j                   j                        n j                   j                  j                  rdn j                  j                   g j                        } fd} j                  j"                  rt%         j&                        j)                   j&                  j*                  dt,        j.                         }t%        t1        |       j&                  j3                  d      j4                  z        }t        d       t        d       ddl}dt8        j:                  fd}d}t=         j                  j                  d   t>              rwdjA                  tC         j                  jE                               d   d   jG                  d      dd       }	|jI                  d|	 dd|	 dd|	 dd|	 dd|	 dgdg      }|jK                  ||jM                   jO                  |      |      |jP                  jR                  |      }
 ||
|       |dfS t%         j&                        j)                   j&                  j*                  dt,        j.                         }t%        t1        |       j&                  j3                  d      j4                  z        } |||       |df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 rx  z2OpenVINO export requires torch>=1.13.0 but torch==z is installed)r   example_inputc           	         | j                  dddg       | j                  dddg       | j                  dddg       | j                  dgdd	g       | j                  j                  j                  dd
g       | j                  j                  j                  j                         D cg c]  }|j                  dd       c}ddg       j                  j                  dk7  r| j                  dddg       j                  | |j                  j                         t        j                  t        |      j                  dz  j                         yc c}w )z/Set RT info, serialize, and save metadata YAML.r   
model_info
model_typeTreverse_input_channelsr   	pad_value     o@scale_valuesiou_thresholdr
  re  labelsrm  fit_to_window_letterboxresize_type)compress_to_fp16metadata.yamlN)set_rt_infor   iour   r   valuesrA  r   
save_modelrB   r#   r  r   rW  rG  )ov_modelr>  rg  ovr   s      ry   	serializez+Exporter.export_openvino.<locals>.serialize  s     ,)EF  6N'OP  |[&AB  %<*HI  0OP  tzz?O?O?V?V?X!Y!!))C"5!Y\hjr[stzz*,$$%>}@]^MM(D499>>MJIId4j''/94==I "Zs   ,E_int8_openvino_modelz.xmlzpackaging>=23.2znncf>=2.14.0r   c                 &   t        | t              r| d   n| } | j                  t        j                  k(  sJ d       | j                         j                  t        j                        dz  }|j                  dk(  rt        j                  |d      S |S )z Quantization transform function.imgz<Input image must be uint8 for the quantization preprocessingr  r   r   )r   rv   dtyper   uint8numpyastypenpfloat32ndimexpand_dims)	data_itemr=  s     ry   transform_fnz.Exporter.export_openvino.<locals>.transform_fn  su    >HTX>Y)E*:_h	 %++5u7uu5__&--bjj9EA021r~~b!,D"Dr{   r   r   r   z.*z/.*/Addz/.*/Sub*z/.*/Mul*z/.*/Div*z\.dfl.*Sigmoid)patternstypes)r   calibration_datasetpresetignored_scoperL   )*r)   r   r   rK   r   r   r   r7   r   convert_modelr   rC   r6  r   rG   r=  r   rM   r  r>  rA  r$  ossepr   r}  ro   nncfr  ndarrayr   r   joinr   named_modulesrt  IgnoredScopequantizeDatasetrv  QuantizationPresetMIXED)r   r   r  r  fqfq_ovr  r  r  head_module_namequantized_ov_modelr   f_ovr  s   `            @ry   rK  zExporter.export_openvino  s    	5]f=T/Znob ??OsSTpOPUPaPaObboppz##/3yy}}HTZZ+$**))++$$''--'' $ 
	J 99>>TYY''		(8(8<PQSQWQWPX:YZBR499#8#8#@#E#EEFE01~.E2:: E !M$****2.7#&88D1I1I1K,LR,PQR,S,Y,YZ],^_a`a,b#c  $ 1 1-.g6-.h7-.h7-.h7-.h7 %+ !2 	! "&$(LL1U1UV\1]_k$l..44+	 "/ " (%0t8O		N""499#3#3rvvh5OP47TYY226:???@(D!$wr{   zPaddlePaddle:c                    t         rJ d       t        t        j                  j	                         rdn	t
        rdnddf       ddl}ddlm} t        j                  d	| d
|j                   d       t        | j                        j                  | j                  j                  dt         j"                         } || j$                  |d| j&                  g       t)        j*                  t-        |      dz  | j.                         |dfS )z)Export YOLO model to PaddlePaddle format.z'Jetson Paddle exports not supported yetzpaddlepaddle-gpuzpaddlepaddle==3.0.0zpaddlepaddle>=3.0.0x2paddler   N)pytorch2paddler   z starting export with X2Paddle rx  rb   r~  )modulesave_dirjit_typeinput_examplesr  )r   r)   r   r  r  r   r  x2paddle.convertr  r   r   r   r  r>  rA  r$  r  r  r   r=  r#   r  r   rG  )r   r   r  r  r   s        ry   rR  zExporter.export_paddle  s     GGG} ::**, #  +*		
 	3b ?@T@T?UUXYZ		N""499#3#3}RVVH5MNdjj1wX\X_X_W`a		$q'O+T]];$wr{   zMNN:c                    | j                         \  }}t        d       ddl}ddlm} t        j                  d| d|j                          d       t        |      j                         s
J d|        t        | j                  j                  d	            }d
ddd|d|dt        j                  | j                        g	}| j                   j"                  r|j%                  d       | j                   j&                  r|j)                  d       |j+                  |       t        | j                  j,                  dz        }|j                         r|j/                          |dfS )zIExport YOLO model to MNN format using MNN https://github.com/alibaba/MNN.z
MNN>=2.9.6r   N)
mnnconvertr   z starting export with MNN rx  failed to export ONNX file: re   r   z-frD   z--modelFilez
--MNNModelz	--bizCode)z--weightQuantBits8z--fp16z.__convert_external_data.bin)r1   r)   rc   	MNN.toolsr  r   r   r   r   existsr  r>  r}  r  r  rG  r   rM   r   rB   r   convertrW  unlink)	r   r   f_onnxre  rc   r  r   r   convert_scratchs	            ry   rS  zExporter.export_mnn  s'    $$&	<(( 	b :3;;=/MNF|""$M(DVH&MM$		%%f-.D&-q+W[WaWabfboboWpq99>>KK2399>>KK!4 tyy//2PPQ!!#""$$wr{   zNCNN:c                 d   t        d       ddl}t        j                  d| d|j                   d       t        t        | j                        j                  | j                  j                  dt        j                               }| j                  j                  d      }t        t        rd	nd
      }|j                         r|nt        |z  }|j                         st        j                   | dt         d       t"        rdnt        rdn	t$        rdnd}	 t'        d      \  }}	|	D 
cg c]  }
| d|
v s|
 c}
d   }t)        |t              sJ d       t        j                  | d|        t-        d| d| d      }t/        t        j0                         |      r@t3        j4                  ||z  |       |j7                  d        t3        j8                  |       d!|d"z   d#|d$z   d%|d&z   g}d'|d(z   d)|d*z   d+|d,z   d-|d.z   g}t        |      t        |      g||d/t;        | j<                  j>                         d0| j@                  jB                   d1| j<                  jD                  d2g| jF                   d3}|jI                  d4       t        j                  | d5d6jK                  |       d7       tM        jN                  |d8       |D 
cg c]  }
|
jQ                  d9d:      d;    }}
d<d=d>d?g|D ]  }t        |      jS                  d@        tU        jV                  |dAz  | jX                         t        |      dfS c c}
w # t*        $ r3}d}d| d| d}t        j                   | d| d|        Y d}~-d}~ww xY wc c}
w )BzIExport YOLO model to NCNN format using PNNX https://github.com/pnnx/pnnx.rg   r   Nr   z starting export with NCNN rx  rh   r?   zpnnx.exepnnxz PNNX not found. Attempting to download binary file from https://github.com/pnnx/pnnx/.
Note PNNX Binary file must be placed in current working directory or in z3. See PNNX repo for full installation instructions.macoswindowszlinux-aarch64linuxz	pnnx/pnnx)repo.zipz#Unable to retrieve PNNX repo assetsz+ successfully found latest PNNX asset file 20240410zpnnx-r<   z PNNX GitHub assets not found: z, using default z/https://github.com/pnnx/pnnx/releases/download//T)delete)srcdsti  z
ncnnparam=zmodel.ncnn.paramzncnnbin=zmodel.ncnn.binzncnnpy=zmodel_ncnn.pyz
pnnxparam=zmodel.pnnx.paramzpnnxbin=zmodel.pnnx.binzpnnxpy=zmodel_pnnx.pyz	pnnxonnx=zmodel.pnnx.onnxzfp16=zdevice=zinputshape="r   "exist_ok
 running 'r
  r   check=r}   r   z	debug.binzdebug.paramz
debug2.binzdebug2.param
missing_okr  )-r)   rg   r   r   r   r   r  r>  rA  r$  r  r  r}  r"   is_filer    r  r   r   r.   r   r   r/   r(   cwdshutilmovechmodrmtreerE  r   rB   r   r  r@   r   mkdirr  
subprocessrunr  r  r#   r  rG  )r   r   rg   r   f_tsro   r  systemreleaseassetsrx   assetr   	unzip_dir	ncnn_args	pnnx_argscmd
pnnx_filesf_debugs                      ry   rT  zExporter.export_ncnn  s    	6"b ;D<L<L;MSQRTYY''		(8(8Kx:PQRyy$$^4'Jv6||~tD4K||~NN( QS
 !&W9X]_cjFe"3"E$*Cqo.BCAF!%-T/TT-vh&QRWQXYZ
 &(WX_W``abgah&irvwI!$((*i8	D 0d;

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

 C		'()
 dkk&&'(
 DIIOOQ<<=Q?
 	
vhj#q9:s$' 5>>qahhsA&r*>
>#]L.^S]^ 	2GM  D 1	2 			!o%t}}51vt|[ D  e$y&6&)HK[\a[bcddeJ ?s6   M. 0M)=M)7M. 2N-)M. .	N*7(N%%N*zCoreML:c           
      	   | j                   j                  j                         dk(  }t        d       ddl}t        j                  d| d|j                   d       t        rJ d       | j                   j                  d	k(  sJ d
       | j                  j                  |rdnd      }|j                         rt        j                  |       g d}d}d}| j                  j                   dk(  rI|j#                  t%        | j                  j&                  j)                                     }| j                  }n| j                  j                   dk(  rC| j                   j*                  r t-        | j                  | j.                        n| j                  }n:| j                   j*                  rt        j0                  | d       | j                  }t2        j4                  j7                  |j9                         | j.                  d      }	|j;                  |	|j=                  d| j.                  j>                  ||      g||rdnd      }
| j                   j@                  rdn| j                   jB                  rdnd\  }}|dk  rd|v rt        d       |r2|jD                  jF                  jH                  jK                  |
||      }
nG|dk(  rBddl&m'c m(} |jS                  d|d !      }|jU                  |"      }|jW                  |
|#      }
| j                   j*                  rY| j                  j                   dk(  r@|rd}n(|
jY                  t[        |             t[        |d$z        }| j]                  |
|%      }
| j^                  }|ja                  d&      |
_1        |ja                  d'      |
_2        |ja                  d(      |
_3        |ja                  d)      |
_4        |
jj                  jm                  |jo                         D ci c]  \  }}|t[        |       c}}       | j                  j                   dk(  r|
jj                  jm                  d*d+i       	 |
jY                  t[        |             ||
fS c c}}w # tp        $ rS}t        j0                  | d,| d-       |j                  d      }|
jY                  t[        |             Y d}~||
fS d}~ww xY w).z#Export YOLO model to CoreML format.r   zcoremltools>=8.0r   Nr   z" starting export with coremltools rx  zHCoreML export is not supported on Windows, please run on macOS or Linux.r}   zDCoreML batch sizes > 1 are not supported. Please retry at 'batch=1'.z.mlmodelrT   )r   r   r   gp?rm  r   zB 'nms=True' is only available for Detect models like 'yolo11n.pt'.Fry  image)r   scalebiasneuralnetworkr   )inputsclassifier_config
convert_to)r  kmeans)   linear)    Nr"  r  zscikit-learnr  i   )modenbitsweight_threshold)global_config)configzData/com.apple.CoreML/weightsweights_dirr   r   r   r   z#com.apple.coreml.model.preview.typeimageClassifierz& CoreML export to *.mlpackage failed (z), reverting to *.mlmodel export. Known coremltools Python 3.11 and Windows bugs https://github.com/apple/coremltools/issues/1928.)9r   r   r  r)   coremltoolsr   r   r   r"   r@   r>  r}  is_dirr  r  r   r   ClassifierConfigr   r   r  rC   IOSDetectModelr=  r  r   r9  r~  r'  r  	ImageTyper   rM   rB   modelsneural_networkquantization_utilsquantize_weightscoremltools.optimize.coremlrA   rS   OpPalettizerConfigOptimizationConfigpalettize_weightsr  r  _pipeline_coremlrG  r  short_descriptionr   r   r   user_defined_metadataupdater  r   )r   r   r   ctr   r  r  r  r   r  ct_modelbitsr#  cto	op_configr'  r)  rb  rf  rg  r   s                        ry   rL  zExporter.export_coreml@  s    ))""((*i7-. b B2>>BRRUVWfff{yy!#k%kk#II!!*\J88:MM! ::??j( " 3 3D9I9I9P9P9R4S TJJEZZ__(;?99==N4::tww7djjEyy}}&)klmJJEYY__UZZ\4775_A ::LLUQULVW/*1{	  
 '+iinn]DIINN.`j
d"94">29933FFWWX`bfhlm9922_b2c	//i/H00&0I99==TZZ__8"c!f%!!&E"EF,,X;,OHMM%&UU=%9"%%/55+55+&&--QWWY.OTQq#a&y.OP::??j(**113XZk2lm	"MM#a&! ({ /P  	"NN(@ Ds t j)AMM#a&!!({	"s   Q;
R 	S
ASSz	TensorRT:c                    | j                   j                  j                  dk7  sJ d       | j                         \  }}	 ddl}t        |j                  dd       t        |j                  d	d
       t        j                  d| d|j                   d       t        |      j                         s
J d|        | j                  j                  d      }t!        ||| j"                  j$                  | j"                  j&                  | j"                  j(                  | j"                  j*                  | j                   j,                  || j"                  j(                  r| j/                  |      nd| j0                  | j"                  j2                  |       |dfS # t
        $ r t        rt        d       ddl}Y yw xY w)zKExport YOLO model to TensorRT format https://developer.nvidia.com/tensorrt.r   z=export running on CPU but must be on GPU, i.e. use 'device=0'r   Nztensorrt>7.0.0,!=10.1.0z>=7.0.0T)hardz!=10.1.0z5https://github.com/ultralytics/ultralytics/pull/14239)msgr   z starting export with TensorRT rx  r  rQ   )r   ru  rG  verboser   )r=  r   r  r1   r   ImportErrorr   r)   r*   r   r   r   r   r  r>  r}  r0   r   	workspacerB   rM   rG   r   rv  rG  rD  )r   r   r   r  re  r   r   s          ry   r0   zExporter.export_engine  sg    ww~~""e+l-ll+$$&		#"
 	cooyt<cooz7no 	b ??PPSTUF|""$M(DVH&MM$II!!),IIIINNIINNIIGGMMDHIINND88@X\]]II%%	
 $w5  	#"#<="	#s   F F=<F=zTensorFlow SavedModel:c                 0   t         j                  j                         }	 ddl}t        dddddd	d
|rdnddf	d       t        j                  d| d|j                   d       t        |j                  dddd       t        t        | j                        j                  | j                  j                  d            }|j                         rt!        j"                  |       t        d      }|j%                         st'        | ddd       d| j(                  _        | j-                         \  }}d}| j(                  j.                  r|dz  }	| j(                  j0                  r|j3                          | j5                  |      D 
cg c]  }
|
d   	 }}
t         j6                  j8                  j;                  t        j<                  |d      j?                         | j@                        jC                  ddd d!      }tE        jF                  t        |	      |jI                         jK                  tD        jL                               d"|	g d#gggg d$ggggg}ddl'}t        j                  | d%|j                   d       |jQ                  |t        |      dd&| j(                  j.                  d'|dd| j(                  jR                  d(v )
      }tU        jF                  |d*z  | jV                         | j(                  j.                  r	jY                  d+       |j[                  d,      D ]I  }|j]                  |j_                  |j`                  j                  d-d.      |j                  z                K |j[                  d/      D ]  }|jY                           |j[                  d0      D ]0  }d1t        |      v r|jY                         n| jc                  |       2 t        |      |fS # t        $ r t        d       ddl}Y w xY wc c}
w )2z2Export YOLO model to TensorFlow SavedModel format.r   Nztensorflow>=2.0.0tf_keraszsng4onnx>=1.0.1zonnx_graphsurgeon>=0.3.26zai-edge-litert>=1.2.0,<1.4.0r  zonnx2tf>=1.26.3r  zonnxruntime-gpur  zprotobuf>=5z---extra-index-url https://pypi.ngc.nvidia.com)cmdsr   ! starting export with tensorflow rx  z>=2.0.0
tensorflowTz6https://github.com/ultralytics/ultralytics/issues/5161)ro   rD  rC  rV   z6calibration_image_sample_data_20x128x128x3_float32.npyr  )unzipr  z&tmp_tflite_int8_calibration_images.npyr  )sizer   r   r}   r  r   r   r      rP  rP  z% starting TFLite export with onnx2tf r   z
per-tensor>   r^   r\   )
input_onnx_file_pathoutput_folder_pathnot_use_onnxsim	verbosityoutput_integer_quantized_tflite
quant_type!custom_input_op_name_np_data_pathenable_batchmatmul_unfoldoutput_signaturedefsdisable_group_convolutionr  r  z*_dynamic_range_quant.tflite_dynamic_range_quant_int8z%*_integer_quant_with_int16_act.tflitez*.tflitezquant_with_int16_act.tflite)2r   r  r  rK  rE  r)   r   r   r   r*   r   r  r>  rA  r$  r,  r  r  r  r-   r   rI   r1   rM   r~   r	  rv  nn
functionalinterpolater1  r(  r   permuter  r  r  r  r  onnx2tfr  r   r#   rG  r  rglobrename	with_namer@  _add_tflite_metadata)r   r   r  tfr   onnx2tf_filer  re  np_datatmp_filer@   r  ra  r   r>  s                  ry   rM  zExporter.export_saved_model  s    zz&&(	$# 	!+.&!"%)!}
 A	
 	b A"..AQQTUVNNH	
 TYY''		(8(8.IJ88:MM! TU""$"l^4#8TR "		$$&	 99>>CCHyy~~	484X4XY_4`a5%,aa,,88619M9S9S9U\`\f\f8gooq!Q Hv||~'<'<RZZ'HI$h9+OCTBUAVWXvhCGDWDWCXX[\]oo!'"1v ,0IINN#.5&*!%&*ii&6&6:M&M & 
 			!o%t}}5 99>>OOtO, >? nDNN499+<+<=SU\+]`d`k`k+klmn GH  GGJ' 	gD73q6AAHHJtG`G`aeGf	g 1v{""c  	$23#	$Z bs   O4 P4PPzTensorFlow GraphDef:c                 8   ddl }ddlm} t        j                  d| d|j
                   d       | j                  j                  d      }|j                  fd      }|j                  |j                  j                  d   j                  j                  d   j                              } ||      }|j                  j                          |j                   j#                  |j                  t%        |j&                        |j(                  d	
       |dfS )zgExport YOLO model to TensorFlow GraphDef *.pb format https://github.com/leimao/Frozen-Graph-TensorFlow.r   N)!convert_variables_to_constants_v2r   rJ  rx  rY   c                      |       S r    )rx   r   s    ry   <lambda>z$Exporter.export_pb.<locals>.<lambda>  s    +a. r{   F)graph_or_graph_deflogdirro   as_text)rK  0tensorflow.python.framework.convert_to_constantsrk  r   r   r   r>  r}  functionget_concrete_function
TensorSpecr  r   r  graphas_graph_defiowrite_graphr  rW  ro   )r   r   r   rf  rk  r   rb  frozen_funcs    `      ry   rN  zExporter.export_pb  s     	 fb A"..AQQTUVII!!%(KK01##BMM+2D2DQ2G2M2M{OaOabcOdOjOj$kl7:&&(
[->->s188}[\[a[akpq$wr{   zTensorFlow Lite:c                    ddl }t        j                  d| d|j                   d       t	        t        | j                        j                  | j                  j                  d            }| j                  j                  r|| j                  j                   dz  }nO| j                  j                  r|| j                  j                   dz  }n|| j                  j                   d	z  }t        |      dfS )
z,Export YOLO model to TensorFlow Lite format.r   Nr   rJ  rx  rV   z_int8.tflitez_float16.tflitez_float32.tflite)rK  r   r   r   r   r  r>  rA  r$  r   rM   r@  rB   )r   r   rf  rU   r   s        ry   rO  zExporter.export_tflite  s     	 b A"..AQQTUV3tyy>11$))2B2BNST99>> 0==AYY^^ 0@@A 0@@A1vt|r{   z	Edge TPU:c                    d}d}t         s
J d|        t        j                  |t        j                  t        j                  d      j                  dk7  rVt        j                  d| d|        d	D ]6  }t        j                  t               r|n|j                  d
d      dd       8 t        j                  |ddd      j                  j                         j                  d      d   }t        j                  d| d| d       t        |      j                  dd      }dt        |      j                   d| d}t        j                  | d| d       t        j                  |d       | j                  |       |dfS )zQExport YOLO model to Edge TPU format https://coral.ai/docs/edgetpu/models-intro/.zedgetpu_compiler --versionz'https://coral.ai/docs/edgetpu/compiler/z$export only supported on Linux. See T)stdoutstderrshellr   r   z< export requires Edge TPU compiler. Attempting install from )zOcurl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -zecho "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.listzsudo apt-get updatez%sudo apt-get install edgetpu-compilerzsudo r   )r  r  )r  capture_outputr  r}   )maxsplitr   z( starting export with Edge TPU compiler rx  r[   r]   zedgetpu_compiler --out_dir "zS" --show_operations --search_delegate --delegate_search_step 30 --timeout_sec 180 "r  r  r   r  N)r   r
  r  DEVNULL
returncoder   r   r,   rA  r}  decoder  r  r   rW  re  )r   r  r   r  help_urlcverr   s           ry   rP  zExporter.export_edgetpu,  s~    +<G<XJGGu>>#j&8&8ASAS[_`kkoppKK"VH$`ai`jkl m $5$7qQYYwPR=S[_gklm nnSTNUU\\^eeopeqrtub HSQR%%i1BCq'..) *
 ~Q  	 	vhjQ/0s$'!!!$$wr{   zTensorFlow.js:c                 Z   t        d       ddl}ddl}t        j                  d| d|j
                   d       t        | j                        j                  | j                  j                  d      }t        | j                  j                  d            }|j                         j                         }t        |d	      5 }|j                  |j                                ddd       d
j!                  t#        |            }t        j                  d| d|        | j$                  j&                  rdn| j$                  j(                  rdnd}	t+        |      5 }
t+        |      5 }d|	 d| d|
 d| d	}t        j                  | d| d       t-        j.                  |d       ddd       ddd       d|v rt        j0                  | d| d       t3        j4                  t7        |      dz  | j8                         |dfS # 1 sw Y   )xY w# 1 sw Y   mxY w# 1 sw Y   qxY w)z*Export YOLO model to TensorFlow.js format.tensorflowjsr   Nr   z# starting export with tensorflowjs rx  r_   rY   rb,z output node names: z--quantize_float16z--quantize_uint8r   z6tensorflowjs_converter --input_format=tf_frozen_model z --output_node_names=z "z" "r  r  r   Tr  r
  z8 your model may not work correctly with spaces in path 'r   r  )r)   rK  r  r   r   r   r  r>  rA  r$  r}  Graphrw  openParseFromStringreadr  r   r   rB   rM   r3   r
  r  r  r#   r  r   rG  )r   r   rf  r^   r   f_pbr   r>  outputsquantizationfpb_f_r  s                ry   rQ  zExporter.export_tfjsO  s    	>*#b CDDTDTCUUXYZ		N""499#3#3\B499((/0XXZ$$&$ 	,tyy{+	,((:b>*b 4WI>?/3yy~~+Y]YbYbYgYgCUmoD! 	,T>!+< 	,22>?TU\T]]_`d_eehikhllmo  KK6(*SE34NN3d+	, 	, !8NNfX%]^_]``bcd 			$q'O+T]];$w'	, 	,	, 	, 	, 	,s1    HH!'AH)H!HH	H!!H*zRKNN:c                    t        j                  d| d       t        d       t        rddl}d |_        ddlm} | j                         \  }}t        t        |      j                   d      }|j                  d	
        |d      }|j                  g dgg dg| j                  j                         |j                  |       |j!                  d       |j#                  dd| j                  j                   d      }|j%                  ||z          t'        j(                  |dz  | j*                         |dfS )z!Export YOLO model to RKNN format.r   z& starting export with rknn-toolkit2...zrknn-toolkit2r   Nc                       y r   rm  rm  r{   ry   rn  z&Exporter.export_rknn.<locals>.<lambda>z  s    r{   )rl   rn   Tr  F)rD  rN  rO  )mean_values
std_valuestarget_platform)r   )do_quantizationrF   r<   z.rknnr  )r   r   r)   r   builtinsexitrknn.apirl   r1   r   r@  r	  r'  r   ro   	load_onnxbuildrA  rV  r#   r  rG  )r   r   r  rl   r   re  export_pathrm   s           ry   rV  zExporter.export_rknnp  s    	b FGH?+(HM!!1d1gll^;784(E"8I[_[d[d[i[ijQ

5
)IIg499>>"2%89K!O,.		+/?D  r{   zIMX:c           
      0   d}t         sJ d       t        | j                  dd      rt        d      t	        d       t	        d       t	        d       dd	l}dd	l}dd
lm} ddl	m
 t        j                  d| d|j                   d       	 t        j                  ddgdd      j                   j#                         }t%        j&                  d|      }|rt)        |j+                  d            nd}|dk\  sJ d       	 | j5                  |      fd}
 |dd      }|j6                  j9                         }d| j                  j;                         v rD| j                  j<                  dk(  r	g d }d!}d"}ne| j                  j<                  d#k(  rLg d$}d%}d&}nC| j                  j<                  dk(  r	g d'}d(}d)}n!| j                  j<                  d#k(  rg d*}d+}d,}t?        tA        | j                  jC                                     k7  rt        d-      D ]B  }|jE                  |j6                  jF                  jH                  jK                  |      gd.       D |j6                  jM                  |j6                  jO                  d/0      |j6                  jQ                  d1      |2      }|j6                  jS                  3      }|rJ|jT                  jW                  | j                  |
||jT                  jY                  d4dd5      ||6      d   n,|jZ                  j]                  | j                  |
|||7      d   } G fd8d9t^        j`                  jb                        } ||| jd                  jf                  xs d:| jd                  jh                  | jd                  jj                  | j                  j<                  ;      jm                  | jn                        }tq        ts        | jt                        jw                  | jt                  jx                  d<            }|j{                  d=       |tq        ts        | jt                  j|                        jw                  | jt                  jx                  d>            z  }|j~                  j                  |||
?       |j                  |      }| j                  j                         D ]7  \  }}|j                  j                         }|ts        |      c|_F        |_G        9 |j                  ||       t        j                  d@dAts        |      dBts        |      dCdDgd       t        |dEz  dFdGH      5 }|j                  | j                  j                  j                         D cg c]
  \  }}| d c}}       d	d	d	       |d	fS # t,        t        j.                  t0        f$ r/ t3               rdgng g dz   }	t        j                  |	d       Y w xY wc c}}w # 1 sw Y   |d	fS xY w)Iz Export YOLO model to IMX format.Fzexport only supported on Linux. See https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-converterr   z/IMX export is not supported for end2end models.)z model-compression-toolkit>=2.4.1zsony-custom-layers>=0.3.0zedge-mdt-tpc>=1.1.0zpydantic<=2.11.7zimx500-converter[pt]>=3.16.1zmct-quantizers>=1.6.0r   N) get_target_platform_capabilities)multiclass_nms_with_indicesr   z0 starting export with model_compression_toolkit rx  javaz	--versionT)r  r  z(?:openjdk|java) (\d+)r}      zJava version too oldsudo)aptinstallz-yzopenjdk-21-jrer  c              3   8   K   | D ]  }|d   }|dz  }|g  y w)Nr  r  rm  )
dataloaderr@   r  s      ry   representative_dataset_genz7Exporter.export_imx.<locals>.representative_dataset_gen  s.     # ElEkes   z4.0imx500)tpc_versiondevice_typeC2PSAr   )submul_2add_14cat_21g~8CA   r   )r  r  r  cat_22cat_23mul_4add_15g\EBAi  )r  muladd_6cat_17gffffuCA   )add_7r  cat_19r  r  r  cat_18gBA   z9IMX export only supported for YOLOv8n and YOLO11n models.r   r  )num_of_images)concat_threshold_update)mixed_precision_configquantization_configbit_width_config)weights_memoryi  )n_epochsuse_hessian_based_weightsuse_hessian_sample_attention)r   representative_data_gentarget_resource_utilizationgptq_configcore_configtarget_platform_capabilities)	in_moduler  r  r  r  c                   v     e Zd ZdZ	 	 	 	 d	dej
                  j                  dededede	f
 fdZ
fdZ xZS )
'Exporter.export_imx.<locals>.NMSWrapperzFWrap PyTorch Module with multiclass_nms layer from sony_custom_layers.r   score_thresholdr  max_detectionsr   c                 h    t         |           || _        || _        || _        || _        || _        y)a  
                Initialize NMSWrapper with PyTorch Module and NMS parameters.

                Args:
                    model (torch.nn.Module): Model instance.
                    score_threshold (float): Score threshold for non-maximum suppression.
                    iou_threshold (float): Intersection over union threshold for non-maximum suppression.
                    max_detections (int): The number of detections to return.
                    task (str): Task type, either 'detect' or 'pose'.
                N)superr   r   r  r  r  r   )r   r   r  r  r  r   	__class__s         ry   r   z0Exporter.export_imx.<locals>.NMSWrapper.__init__  s6    $  ""
'6$%2"&4# 	r{   c                    | j                  |      }|d   |d   }} ||| j                  | j                  | j                        }| j                  dk(  ry|d   }t        j                  |d|j                  j                  d      j                  dd|j                  d                  }|j                  |j                  |j                  |fS |S )z:Forward pass with model inference and NMS post-processing.r   r}   )boxesscoresr  r  r  r   r   r   )r   r  r  r  r   r   gatherindicesr2  expandrM  r  r  r  )	r   r  r  r  r  nms_outputskptsout_kptsr  s	           ry   r/  z/Exporter.export_imx.<locals>.NMSWrapper.forward  s     **V, '
GAJv9!$($8$8"&"4"4#'#6#6 99&"1:D$||D![5H5H5R5RSU5V5]5]^`bdfjfofoprfs5tuH&,,k.@.@+BTBTV^^^""r{   )MbP?gffffff?rq  r   )__name__
__module____qualname____doc__r   r]  Moduler(  rE  r  r   r/  __classcell__)r  r  s   @ry   
NMSWrapperr    s[    X
 */'*&)$!xx! "'!  %	!
 !$! !2# #r{   r  r  )r   r  r  r  r   rk   r  z	_imx.onnx)r   save_model_pathrepr_datasetz
imxconv-ptz-iz-oz--no-input-persistencyz--overwrite-outputz
labels.txtwzutf-8)encoding)Lr   r   r   r  r)   model_compression_toolkitrE   edgemdt_tpcr  sony_custom_layers.pytorchr  r   r   r   r
  r  r}  r  researchrE  groupFileNotFoundErrorCalledProcessErrorAssertionErrorr,   rv  coreBitWidthConfig__str__r   rI  r   r*  set_manual_activation_bit_widthcommonnetwork_editorsNodeNameFilter
CoreConfig MixedPrecisionQuantizationConfigQuantizationConfigResourceUtilizationgptq+pytorch_gradient_post_training_quantizationget_pytorch_gptq_configptq"pytorch_post_training_quantizationr   r]  r  r   r  r  r,  r#  r   r   r  r>  rA  r$  r	  ro   exporterpytorch_export_modelr  rG  r  r  r  r  r  r  r  
writelinesr   )r   r   r  mctrE   r  java_outputversion_matchjava_versionr  r  tpcbit_cfglayer_namesr  n_layers
layer_namer'  resource_utilizationquant_modelr  r   
onnx_modelr  rf  rg  r  r>  re  ro   r  s                                 @ry   rU  zExporter.export_imx  si     	
u	
u 4::y%0NOOx	
 	9:23/@Jb PQTQ`Q`Paadef	,$..&+)>d[_`ggnnpKII&?MM:G3}22156QL2%='==%
 372V2VW]2^ 	 /5hW(())+djj((**zz(*B!-F*_!+zz(*?!*F*[!+ tDJJ&&()*h6XYY% 	vJ33SXX__5T5T5c5cdn5o4prtu	v $$#&88#L#L[]#L#^ # ; ;TX ; Y$ % 
  #xx;;>;Z  HH@@jj(B,@HH<<!Uaf =  #-0 A 	 	 ;;**(B,@"-0 <   	*-	# -	#^ ! IINN3e))--99,,
 "T[[/ 	 TYY''		(8(8,GH	c$))..199$)):J:JKXYY
))zHb 	* 	
 YYz*
MM'') 	-DAq,,002D#$c!f DHdj	- 			*j)4Z$A@XZno	
 !l"C': 	SdOO

8H8H8N8N8PQWQvR[QR	S $we ":#@#@.Q 	,02F8>hhCNN3d++	,` R	S $ws2   A2V3 3X	XX	3A	X ?X X		Xc                     ddl }|j                  |d|j                        5 }|j                  dt	        j
                  | j                  d             ddd       y# 1 sw Y   yxY w)zVAdd metadata to *.tflite models per https://ai.google.dev/edge/litert/models/metadata.r   Nazmetadata.jsonr   )indent)zipfileZipFileZIP_DEFLATEDwritestrr  r  rG  )r   r>  r  zfs       ry   re  zExporter._add_tflite_metadata<  sS    __T3(<(<= 	NKKDMM!)LM	N 	N 	Ns   2AA&zCoreML Pipeline:c                    ddl }t        j                  | d|j                   d       t	        | j
                  j                        \  }}}}|j                         }t        |j                  j                        \  }	}
t        r`ddlm} |j                  d||f      }|j                  d|i      }||	j                      j                  }||
j                      j                  }n2| j"                  d   | j"                  d	   d
z
  f}| j"                  d   d
f}| j$                  d   }|j                  j&                  d   j(                  j*                  j,                  |j                  j&                  d   j(                  j*                  j.                  }}|\  }}t1        |      |k(  sJ t1        |       d|        ||	j(                  j2                  j                  dd ||
j(                  j2                  j                  dd |j4                  j7                  ||      }|j8                  j:                  j=                         }|j>                  |_        tA        d      D ]  }|jB                  j                  j                  |   jE                         }|j                  j&                  jG                          |j                  j&                  |   jI                  |       |j                  j                  jG                          |j                  j                  |   jI                  |        d|j                  j                  d   _        d|j                  j                  d	   _        |d
g}tA        d      D ]  }|j                  j                  |   j(                  j2                  }|jJ                  jL                  jG                          d|jJ                  jL                  d   _'        d|jJ                  jL                  d   _(        |jJ                  jL                  jG                          ||   |jJ                  jL                  d	   _'        ||   |jJ                  jL                  d	   _(        |j                  dd=  |jR                  }|	j                   |_*        |
j                   |_+        d|_,        d|_-        d|_.        d|_/        | j`                  jb                  |_2        | j`                  jf                  |_4        d|jj                  _6        |jn                  jp                  js                  |ju                                |j4                  j7                  |      }|j4                  jv                  jy                  d|j4                  jz                  j}                  d||      fd|j4                  jz                  j                         fd|j4                  jz                  j                         fgddg      }|j                  |       |j                  |       |j                  j                  j&                  d   jI                  |jB                  j                  j&                  d   jE                                |j                  j                  j                  d   jI                  |jB                  j                  j                  d   jE                                |j                  j                  j                  d	   jI                  |jB                  j                  j                  d	   jE                                |j>                  |j                  _        |j                  j                  j$                  j                  j                  t        |jd                        t        |jh                        d       |j4                  j7                  |j                  |      }d|j                  d<   d|jd                   d|j                  d<   d|jh                   d|j                  d<   d|j                  d<   d|j                  d<   t        j                  | d       |S )z:Create CoreML pipeline with NMS for YOLO detection models.r   Nz$ starting pipeline with coremltools rx  )ImageRGBr  r   r}   r   r   z names found for nc=r(  
confidencecoordinatesr   iouThresholdconfidenceThresholdTr   )input_featuresoutput_features)zIoU thresholdzConfidence thresholdzInput imagez,(optional) IoU threshold override (default: )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)Gr+  r   r   r   r   r=  r   get_speciterr   outputr   PILr  newpredictro   r?  rG  r   r  	imageTyper  r  rI  multiArrayTyper0  MLModelproto	Model_pb2ModelspecificationVersionr5  _specSerializeToStringr  r  
shapeRange
sizeRanges
lowerBound
upperBoundnonMaximumSuppressionconfidenceInputFeatureNamecoordinatesInputFeatureNameconfidenceOutputFeatureNamecoordinatesOutputFeatureNameiouThresholdInputFeatureName#confidenceThresholdInputFeatureNamer   r  r"  r  r#  pickTopperClassstringClassLabelsvectorr   r  pipelinePipeline	datatypesArrayDouble	add_modelspecuserDefinedr;  r  input_descriptionoutput_description)r   r   r)  r   r<  re  hr  rK  out0out1r  r  out
out0_shape
out1_shaper   nxnyncnms_specidecoder_outputoutput_sizesma_typerC   	nms_modelrE  s                               ry   r8  zExporter._pipeline_coremlC  s    vhB2>>BRRUVW$''--(
1a ~~$**112
d!))EAq6*C--#/CTYY--JTYY--J**1-t/@/@/Ca/GGJ**1-q0J g&!!''*//99??AQAQAWAWXYAZA_A_AiAiApApB25zRHCJ</CB4!HH -7		  &&q),6		  &&q) 		!!$K!@ 88%%++-(,(A(A%q 	KA"[[44;;A>PPRN  &&**,  &&q)99.I  ''++-  ''*::>J	K /;##A&+.;##A&+Awq 	!A**11!499HHG))--/:;G))!,7:<G))!,7))--/:Fq/G))!,7:Fq/G))!,7a 	! ,,)-&*.))'*6'+8(+9(2G/99=="&))..#$$++ELLN;II%%h/	 99%%.."))--33Ar2>?!4!4!;!;!=>&		(;(;(B(B(DE
 *=9 / 
 	5!9% 	!!''*::5;;;R;R;X;XYZ;[;m;m;op!!((+;;IOO<W<W<^<^_`<a<s<s<uv!!((+;;IOO<W<W<^<^_`<a<s<s<uv .2-F-F*!!**66==!#"2"23SQTQhQhMij	

 		!!(--[!I+8(4`adaqaq`rrs2t/A#BYBYAZZ[\ 	 56 2s  .2k  /vh/01r{   eventc                 @    | j                   |   j                  |       y)z1Append the given callback to the specified event.N)r$   r   r   r^  callbacks      ry   add_callbackzExporter.add_callback  s    u$$X.r{   c                 V    | j                   j                  |g       D ]
  } ||         y)z(Execute all callbacks for a given event.N)r$   r   r`  s      ry   rH  zExporter.run_callbacks  s)    **5"5 	HTN	r{   r   )r   )r  r  r  r  r   r   r  rk  rv  r   r%   rJ  r1   rK  rR  rS  rT  rL  r0   rM  rN  rO  rP  rQ  rV  rU  re  r8  rb  rH  rm  r{   ry   r   r      s   0d '$4 2Pc Pd[. (0(@    !)'!2 8 8t %-k%: H HT #+O#<  .  ( 0  0 !)'!2 A AF #+I#6 L L\  $Xk-B ! !F (01I(J V# V#p ,45K,L   #+,>#?   *,Xk5J    D !)*:!;  @ !)'!2 ! !4  ( 0 n n`N 37xHZ?[ hT/# /3 r{   r   c                   (     e Zd ZdZ fdZd Z xZS )r.  z;Wrap an Ultralytics YOLO model for Apple iOS CoreML export.c                     t         |           |j                  \  }}}}|| _        t	        |j
                        | _        ||k(  rd|z  | _        yt        j                  d|z  d|z  d|z  d|z  g      | _        y)z
        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).
        g      ?N)
r  r   r   r   rI  r   rW  	normalizer   tensor)r   r   r=  re  rO  r  r  s         ry   r   zIOSDetectModel.__init__  ss     	XX
1a
ekk"6 1WDN"\\37C!GS1WcAg*NODNr{   c                     | j                  |      d   j                  dd      j                  d| j                  fd      \  }}||| j                  z  fS )zRNormalize predictions of object detection model with input size-dependent factors.r   r}   r   )r   r   rt  rW  rf  )r   rx   xywhclss       ry   r/  zIOSDetectModel.forward  sN    JJqM!$..q!4::Atww<K	cD4>>)))r{   r  r  r  r  r   r/  r  r  s   @ry   r.  r.    s    EP"*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 | _        y)z
        Initialize the NMSModel.

        Args:
            model (torch.nn.Module): The model to wrap with NMS postprocessing.
            args (Namespace): The export arguments.
        r  >   r^   rZ   rU   N)	r  r   r   r   r   r  r   	frozensetis_tf)r   r   r   r  s      ry   r   zNMSModel.__init__  sJ     	
	::&YY%%3T)UU
r{   c           	      :   ddl m} ddlm} | j	                  |      }t        |t              r|d   n|}t        |j                  |j                        }|j                  d   }|j                  dd      }|j                  d   dt        | j                  j                        z   z
  }| j                  j                  r| j                  j                   dkD  rt#        j$                  t#        j&                  t#        j(                  | j                  j                   |z
        t#        j(                  d            g|j                  dd	 i |}	t#        j*                  ||	f      }|j-                  dt        | j                  j                        |gd
      \  }
}}|j'                  d      \  }}t/        |j                  d   | j                  j0                        | j                  _        t#        j$                  |j                  d   | j                  j0                  |
j                  d   d
z   |z   fi |}t3        |      D ],  }|
|   ||   ||   ||   f\  }}}}|| j                  j4                  kD  }| j6                  rN||z  }|j9                  t/        | j                  j0                  dz  |j                  d               j:                  }||   ||   ||   ||   f\  }}}}|j=                         }| j>                  rdnd}| j                  j@                  dk(  r||z  }n7||z  t#        j(                  |j                  d
d	 fi |j'                         z  }| j                  jB                  sr| j>                  rd
nd}|jE                  dd      jG                  |j                  d   |      }|d	d	d	|f   ||z  z   }t#        j*                  ||d	d	|d	f   fd      }| j>                  rk |tH        | j6                  xsP | j                  jJ                  xs ddk  xs1 | j                  j@                  dk(  xr | j                  jL                         n|} || j>                  rt#        j*                  ||gd      n||| j                  jN                        d	| j                  j0                   }t#        j*                  ||   ||   jQ                  dd      ||   jQ                  dd      jS                  |j                        ||   gd      }ddd| j                  j0                  |j                  d   z
  f}	t"        jT                  jV                  jY                  ||	      ||<   / | j                  jZ                  dk(  r
|d	| |d   fS |d	| S )au  
        Perform inference with NMS post-processing. Supports Detect, Segment, OBB and Pose.

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

        Returns:
            (torch.Tensor): List of detections, each an (N, max_det, 4 + 2 + extra_shape) Tensor where N is the
                number of detections after NMS.
        r   )partial)rC   )r   r  r   r   r}   Nr   r   r   r  rZ   r	  rK   )use_triur  ).	functoolsrr  torchvision.opsrC   r   r   r   rv   r   r  r   r   rI  r   r   rG   r@   r   r!  rF  rg  r1  rt  minr,  r5  r  rp  topkr  cloner  r   agnostic_nmsreshaper  r5   rH   rM   r  viewr#  r]  r^  padr   )r   rx   rr  rC   predspredr   bsextra_shaper}  r  r  extrasclassesrR  rY  boxrj  scoreextramasknmsbox
multiplierend
cls_offsetoffboxnms_fnkeepdetss                                ry   r/  zNMSModel.forward  s    	&'

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

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

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

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

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

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

1=>CXX((,,T37CF].	8^ (,zz)'CCR%(#QSbQr{   rk  rl  s   @ry   r6  r6    s    LVLRr{   r6  )]r  r  r  r  r  r
  r  r7  copyr   r   pathlibr   r  r  r   ultralyticsr   ultralytics.cfgr   r   ultralytics.datar	   ultralytics.data.datasetr
   ultralytics.data.utilsr   r   ultralytics.nn.autobackendr   r   ultralytics.nn.modulesr   r   r   r   ultralytics.nn.tasksr   r   r   r   ultralytics.utilsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   ultralytics.utils.checksr'   r(   r)   r*   r+   r,   ultralytics.utils.downloadsr-   r.   r/   ultralytics.utils.exportr0   r1   ultralytics.utils.filesr2   r3   ultralytics.utils.opsr4   r5   ultralytics.utils.patchesr6   r)  r7   r8   r9   rz   r   r   r   r   r]  r  r.  r6  rm  r{   ry   <module>r     s   6p  	 	          # . - 0 G M G G c c    $  a ` ? = 6 2 U U"[Jn.h(i iX'*UXX__ *4]Ruxx ]Rr{   