
    FPh                        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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 ddlm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m Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: d Z;d Z<d Z= G d d      Z> G d dej~                  j                        ZAy)af	  
Export a YOLOv8 PyTorch model to other formats. TensorFlow exports authored by https://github.com/zldrobit

Format                  | `format=argument`         | Model
---                     | ---                       | ---
PyTorch                 | -                         | yolov8n.pt
TorchScript             | `torchscript`             | yolov8n.torchscript
ONNX                    | `onnx`                    | yolov8n.onnx
OpenVINO                | `openvino`                | yolov8n_openvino_model/
TensorRT                | `engine`                  | yolov8n.engine
CoreML                  | `coreml`                  | yolov8n.mlpackage
TensorFlow SavedModel   | `saved_model`             | yolov8n_saved_model/
TensorFlow GraphDef     | `pb`                      | yolov8n.pb
TensorFlow Lite         | `tflite`                  | yolov8n.tflite
TensorFlow Edge TPU     | `edgetpu`                 | yolov8n_edgetpu.tflite
TensorFlow.js           | `tfjs`                    | yolov8n_web_model/
PaddlePaddle            | `paddle`                  | yolov8n_paddle_model/
ncnn                    | `ncnn`                    | yolov8n_ncnn_model/

Requirements:
    $ pip install "ultralytics[export]"

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

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

Inference:
    $ yolo predict model=yolov8n.pt                 # PyTorch
                         yolov8n.torchscript        # TorchScript
                         yolov8n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                         yolov8n_openvino_model     # OpenVINO
                         yolov8n.engine             # TensorRT
                         yolov8n.mlpackage          # CoreML (macOS-only)
                         yolov8n_saved_model        # TensorFlow SavedModel
                         yolov8n.pb                 # TensorFlow GraphDef
                         yolov8n.tflite             # TensorFlow Lite
                         yolov8n_edgetpu.tflite     # TensorFlow Edge TPU
                         yolov8n_paddle_model       # PaddlePaddle

TensorFlow.js:
    $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
    $ npm install
    $ ln -s ../../yolov5/yolov8n_web_model public/yolov8n_web_model
    $ npm start
    N)deepcopy)datetime)Path)get_cfg)YOLODataset)check_det_dataset)check_class_names)C2fDetectRTDETRDecoder)DetectionModelSegmentationModel)ARM64DEFAULT_CFGLINUXLOGGERMACOSROOTWINDOWS__version__	callbackscolorstrget_default_args	yaml_save)check_imgszcheck_requirementscheck_version)attempt_download_assetget_github_assets)	file_sizespaces_in_path)Profile)get_latest_opsetselect_devicesmart_inference_modec                      ddl } g dg dg dg dg dg dg d	g d
g dg dg dg dg dg}| j                  |g d      S )zYOLOv8 export formats.r   N)PyTorch-z.ptTT)TorchScripttorchscript.torchscriptTT)ONNXonnx.onnxTT)OpenVINOopenvino_openvino_modelTF)TensorRTengine.engineFT)CoreMLcoreml
.mlpackageTF)zTensorFlow SavedModelsaved_model_saved_modelTT)zTensorFlow GraphDefpb.pbTT)zTensorFlow Litetflite.tfliteTF)zTensorFlow Edge TPUedgetpu_edgetpu.tfliteTF)zTensorFlow.jstfjs
_web_modelTF)PaddlePaddlepaddle_paddle_modelTT)ncnnrE   _ncnn_modelTT)FormatArgumentSuffixCPUGPU)columns)pandas	DataFrame)rM   xs     fC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/engine/exporter.pyexport_formatsrQ   O   sL    +B-@67L8=J<?3	7A A'UVV    c           	          g g }}| j                   D ]8  }|j                  |j                         |j                  |j                         : t        d t        t        |      t        |      z
        D              S )z,TensorFlow GraphDef model output node names.c              3   J   K   | ]  }|j                  d       r| d  yw)NoOpz:0N)
startswith.0rO   s     rP   	<genexpr>zgd_outputs.<locals>.<genexpr>i   s(     g$JqRSR^R^_eRfQCr($Js   #
#)nodeappendnameextendinputsortedlistset)gd	name_list
input_listrZ   s       rP   
gd_outputsre   c   sb    zI#$**%  gDY#j/)I$JgggrR   c                 ,     t                fd}|S )z*YOLOv8 export decorator, i..e @try_export.c                  N   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.prefixNu    export success ✅ .1fzs, saved as 'z' ( MB)u    export failure ❌ zs: )r"   r   infotr    	Exception)	argskwargsrh   dtfmodele
inner_args
inner_funcs	          rP   
outer_funcztry_export.<locals>.outer_funcp   s    H%	b%t6v65 KK6("6rttCjaSPST]^_T`adSeeijke8O   	KK6("6rttCjA3GHG	s.   
A, A AA,  A)%A, ,	B$5*BB$)r   )ru   rv   rt   s   ` @rP   
try_exportrw   l   s    !*-J
 rR   c                      e Zd ZdZeddfdZ e       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 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d Zd e	d      fd Zd!efd"Zd!efd#Zy)%Exporterz
    A class for exporting a model.

    Attributes:
        args (SimpleNamespace): Configuration for the exporter.
        callbacks (list, optional): List of callback functions. Defaults to None.
    Nc                     t        ||      | _        | j                  j                  j                         dv rdt        j
                  d<   |xs t        j                         | _        t        j                  |        y)aH  
        Initializes the Exporter class.

        Args:
            cfg (str, optional): Path to a configuration file. Defaults to DEFAULT_CFG.
            overrides (dict, optional): Configuration overrides. Defaults to None.
            _callbacks (dict, optional): Dictionary of callback functions. Defaults to None.
        )r6   mlmodelpython&PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATIONN)	r   rn   formatlowerosenvironr   get_default_callbacksadd_integration_callbacks)selfcfg	overrides
_callbackss       rP   __init__zExporter.__init__   s`     C+	99!!#'<<CKBJJ?@#Hy'F'F'H++D1rR   c                 n   | j                  d       t        j                         }| j                  j                  j	                         }|dv rd}|dv rd}t        t               d   dd       }|D cg c]  }||k(  	 }}t        |      dk7  rt        d	| d
|       |\  }}}	}
}}}}}}}}|dk(  r<| j                  j                  &t        j                  d       d| j                  _	        t        | j                  j                  dn| j                  j                        | _	        t        |j                        |_        | j                  j                  r^|r\| j                  j                   dk(  rCt        j                  d       d| j                  _        | j                  j"                  rJ d       t%        | j                  j&                  |j(                  d      | _        | j                  j*                  r)|rJ d       | j                  j                   dk(  sJ d       |rt,        st/        d      t1        j2                  | j                  j4                  dg| j&                   j7                  | j                        }t9        t;        |dd      xs+ t;        |dd      xs |j<                  j?                  dd            }|j@                  dv rt9        |jB                        }tE        |      j7                  | j                        }|jG                         D ]	  }d|_$         |jK                          |jM                          |jO                         }|jQ                         D ]  }tS        |tT        tV        f      r>| j                  j"                  |_        d|_,        | j                  j                  |_        WtS        |tZ              sht]        |||||f      ry|j^                  |_0         d}tc        d      D ]
  } ||      } | j                  j                  r=|
s|r9| j                  j                   dk7  r |j                         |j                         }}te        jf                  dt0        jh                  jj                         te        jf                  dtl               te        jf                  dtn               || _8        || _9        || _:        tS        |t0        jv                        rt        |jx                        nt        d |D              | _=        t9        | jr                  j<                  j?                  d| jt                              j|                  j                  dd       | _@        t        |d!      r)tS        |j                  t              r|j                  d"   nd}d#| j                   d$|rd%| nd }|d&d't        j                         j                         t        t        t        |j(                              |j                  | j                  j4                  | j&                  |j                  d(
| _J        |j                  d)k(  r&|jr                  d*   j                  | j                  d+<   t        j                  d,t        d-       d.| d/t        |jx                         d0| jz                   d1t        |      d2d3       dgt        |      z  }|s|r| j                         \  |d4<   }|
r| j                         \  |d<   }|s|	r| j                         \  |d<   }|	r| j                         \  |d<   }|r| j                         \  |d5<   }t]        |||||f      r| j                  xj                  |z  c_U        | j                         \  |d6<   }|s|r| j                  |7      \  |d8<   }|r.| j                  |d| j                  j                  9      \  |d:<   }|r>| j                  t9        |d6         | jt                  j|                   d;z  <      \  |d=<   }|r| j                         \  |d><   }|r| j                         \  |d?<   }|r| j                         \  |d@<   }|D cg c]  }|st        |       }}t]        |      rot        t9        |d*               }| j&                  d4   | j&                  d   k(  }|rdn%dA| j&                   dBt        | j&                         dC}|r| j&                  d4   n't        | j&                        dd* j                  dDd      }|j                  dEk(  r
|dFk(  rdG| nd} | j                  j                  rdHn| j                  j                  rdInd}!t        j                  dJt        j                         |z
  d2dKt        dL|j                  j                                dM|j                   dN| dO| dD|! dD|  dP|j                   dN| dO| dQ| dD|! dD| dR       | j                  dS       |S c c}w c c}w )Tz<Returns list of exported files/dirs after running callbacks.on_export_start)tensorrttrtr3   )r{   	mlpackage	mlprogramappleiosr6   r6   rH      NzInvalid export format='z'. Valid formats are uM   WARNING ⚠️ TensorRT requires GPU export, automatically assigning device=00cpuuK   WARNING ⚠️ half=True only compatible with GPU export, i.e. use device=0Fz>half=True not compatible with dynamic=True, i.e. use only one.   )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'zTEdge TPU export only supported on Linux. See https://coral.ai/docs/edgetpu/compiler/   pt_path	yaml_file >   .yml.yamlTignore)categoryc              3   ~   K   | ]5  }t        t        |t        j                        r|j                  ng        7 y wN)tuple
isinstancetorchTensorshaperW   s     rP   rY   z$Exporter.__call__.<locals>.<genexpr>   s.      UNKLaEZ5<<8!''bA1s   ;=yoloYOLOrn   datazUltralytics z model ztrained on Ultralyticsz(AGPL-3.0 https://ultralytics.com/license)
descriptionauthorlicensedateversionr   taskbatchimgsznamespose	kpt_shape
zPyTorch:z starting from 'z' with input shape z BCHW and output shape(s) z (ri   rj   r         )keras_model   )r   nmsagnostic_nms   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. segmentr:   zdata=int8halfz
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)arun_callbackstimern   r~   r   r   rQ   sum
ValueErrordevicer   warningr$   r	   r   r   typedynamicr   r   r   optimizer   SystemErrorr   zerosr   tor   getattryamlgetsuffixr\   r   
parametersrequires_gradevalfloatfusemodulesr   r   r   exportr
   anyforward_splitforwardrangewarningsfilterwarningsjitTracerWarningUserWarningDeprecationWarningimrr   filer   r   output_shapestemreplacepretty_namehasattrdictr   now	isoformatr   intmaxr   metadatar   rk   r   r    lenexport_torchscriptexport_engineexport_onnxexport_openvinoexport_coremlr   export_saved_model	export_pbexport_tfliter   export_edgetpuexport_tfjsexport_paddleexport_ncnnstrparentresolve)"r   rr   rl   fmtfmtsrO   flagsr   r-   xmlr3   r6   r8   r:   r<   r>   r@   rC   rE   r   r   pmy_r   r   rq   r   squaresr   predict_dataqs"                                     rP   __call__zExporter.__call__   s    	,-IIKii$$&%%CQQC^%j1!"56#'(4ac4(u:?6se;PQUPVWXX_d\T3R$PVX\ (?tyy//7NNjk"DII#TYY-=-=-EE499K[K[\ (499>>dt{{'7'75'@NNhi"DIINyy((j*jj( qQ
99ggg8;;##u,u.uu,5tuu [[!9djj9<<T[[IE9d+swuk4/PsTYT^T^TbTbcnprTsu;;++		?D ""4;;/!!#A#AO $



A!fm45 II--	99++As#Cb&'SW0X,YOO	 ! qAb	A 99>>v4;;3C3Cu3L	5::<B 	5993J3JK;?3EF 
	.8ELL.IE!''Nu UNKLUN PN

 3 3K KLQQYYZ`bhi%,UF%;
5::W[@\uzz&!bd$T%5%5$6gVZD6>R`b=cd&#ALLN,,."#ell+,JJYY__ZZ[[
" ::).R)B)BDMM+&b*-..>tfDWX]^`^f^fXgWh i''+'8'8&9IdOC;PPTV 	W D3t9$--/GAaD!((*GAaD!3&&(GAaD!**,GAaD!((*GAaD!R$78IINNg%N $ 7 7 9AaD+T..[.A!a,,%^b^g^g^t^t,u!a--4!:499>>JZZtHu;u-v!a**,!a))+HAbE1'')HAbE1 $Q!SVQ$q6D2K AZZ]djjm3F$bcgcmcmbn o==@_<MMb#dA%+DJJqMTZZ21F1N1NsTV1WE-2ZZ9-DPTU4&>Z\L))..		fBAKK-diikAoc-B C..6vt{{?R?R?T.U-V?

|7STRUU\]b\ccdefdgghiuhv;EJJ<wqcQXY^X__efjekklmnloopqrps?	A B 	?+C )b %s   3h-h2h2zTorchScript:c                 .   t        j                  d| dt        j                   d       | j                  j                  d      }t        j                  j                  | 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 YOLOv8 TorchScript model export.r   z starting export with torch ...r+   Fstrictz
config.txtz optimizing for mobile...r   )optimize_for_mobile)_extra_filesN)r   rk   r   r   r   with_suffixr   tracerr   r   jsondumpsr   rn   r   torch.utils.mobile_optimizerr  _save_for_lite_interpreterr  save)r   rh   rq   tsextra_filesr  s         rP   r   zExporter.export_torchscript&  s     	b <U=N=N<OsSTII!!.1YY__TZZ_?#TZZ%>?99KK6(";<=H#>>s1vT_>` $w GGCFG5$wrR   zONNX:c                    dg}| j                   j                  r'|dt        j                  j	                         rdnd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$                  }|rVd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<   t        j                  j)                  |r| j                   j+                         n| j                   |r| j,                  j+                         n| j,                  |d|ddg||xs d	       |j/                  |      }| j                   j                  rH	 ddl}	t        j                  | d|	j                   d
       |	j                  |      \  }}
|
sJ d       	 | j4                  j7                         D ]7  \  }}|j8                  j;                         }|t        |      c|_        |_        9 |jA                  ||       ||fS # t2        $ r$}t        j                  | d|        Y d}~d}~ww xY w)zYOLOv8 ONNX export.zonnx>=1.12.0onnxsim>=0.4.33onnxruntime-gpuonnxruntimer   Nr   z starting export with onnx z opset r  r.   output0output1imagesr   heightwidth)r   r   r   anchors)r   r   mask_height
mask_widthFT)verboseopset_versiondo_constant_foldinginput_namesoutput_namesdynamic_axesz simplifying with onnxsim z,Simplified ONNX model could not be validatedz simplifier failure: )!rn   simplifyr   cudais_availabler   r-   opsetr#   r   rk   r   r  r   r  r   rr   r   r   r   r   r   r   loadonnxsimrm   r   itemsmetadata_propsaddkeyvaluer   )r   rh   requirementsr-   r0  rq   r3  r   
model_onnxr:  checkrs   kvmetas                  rP   r   zExporter.export_onnx6  s    ''99.UZZE\E\E^0AdqrrL<(		=+;+=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%?	"

 'DJJNNTZZ$DGGKKM$''' $!
% D 	 		* YYq\
 99Avh&@ATAT@UUXYZ$+$4$4Z$@!
ELLLu
 MM'')DAq,,002D#$c!f DHdj * 			*a *}  Avh&;A3?@@As   /AJ   	K)KKz	OpenVINO:c                 n    t        d       ddlm ddlm} t        j                  d| dj                   d       t         j                        j                   j                  j                  dt        j                         }t         j                        j                   j                  j                  d	t        j                         } j                  j                  d
      }t        t        |       j                  j                  d      j                   z        }t        t        |       j                  j                  d      j                   z        } fd}|j#                  | j$                  d j&                  j(                        }	 j&                  j*                  r j&                  j,                  sJ d       t        d       ddl}
d }t        j                  | d j&                  j,                   d       t1         j&                  j,                        }t3        |d   | j4                  d   d      }|
j7                  ||      }|
j9                  g d      }|
j;                  |	||
j<                  j>                  |      } |||       |dfS  ||	|       |dfS )zYOLOv8 OpenVINO export.zopenvino-dev>=2023.0r   N)mor   z starting export with openvino r  r1   _int8_openvino_modelr.   z.xmlc           	         | 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                  | |       t        t        |      j                  dz  j                         yc c}w )z.Set RT info, serialize and save metadata YAML.YOLOv8
model_info
model_typeTreverse_input_channelsr   	pad_value     o@scale_valuesiou_thresholdr   r  labelsclassifyfit_to_window_letterboxresize_typemetadata.yamlN)set_rt_inforn   iourr   r   valuesr   r   	serializer   r   r  r   )ov_modelr   rD  ovr   s      rP   r[  z+Exporter.export_openvino.<locals>.serialize~  s     L,+GH  6N'OP  |[&AB  %<*HI  0OP  tzz?O?O?V?V?X!Y?X!!))C"5?X!Y\hjr[stzz*,$$%>}@]^LL4(d4j''/94==I "Zs   ,D;r-   )
model_name	frameworkcompress_to_fp16zLINT8 export requires a data argument for calibration, i.e. 'data=coco8.yaml'znncf>=2.5.0c                     | d   j                         j                  t        j                        dz  }|j                  dk(  rt        j
                  |d      S |S )z Quantization transform function.imgrP  r   r   )numpyastypenpfloat32ndimexpand_dims)	data_itemr   s     rP   transform_fnz.Exporter.export_openvino.<locals>.transform_fn  sI    u%++-44RZZ@5H021r~~b!,D"DrR   / collecting INT8 calibration images from 'data='valFr   r   augment)MultiplySubtractSigmoid)types)presetignored_scope) r   openvino.runtimeruntimeopenvino.toolsrG  r   rk   r   r  r   r   r   r   sepr  r   r\   convert_modelr   rn   r   r   r   nncfr   r   r   DatasetIgnoredScopequantizeQuantizationPresetMIXED)r   rh   rG  rq   fqf_onnxf_ovfq_ovr[  r\  r{  rj  r   datasetquantization_datasetru  quantized_ov_modelr]  s   `                @rP   r   zExporter.export_openvinop  s7    	12%%b ??OsST		N""499#3#3rvvh5OP^##DII$4$48LRVVH6UV&&w/47TYY226:???@DHtyy44V<AAAB	J ##F/3/?/?.459YY^^ $ E
 99>>99>>q#qq>}-E KK6("QRVR[R[R`R`Qaabcd$TYY^^4D!$u+D

1W\]G#'<<#F  --4W-XM!%x/C6:6M6M6S6S=J "/ "L (%0t8O(D!$wrR   zPaddlePaddle:c                    t        d       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        t!        |      dz  | j"                         |dfS )zYOLOv8 Paddle export.)paddlepaddlex2paddler   N)pytorch2paddler   z starting export with X2Paddle r  rD   r  )modulesave_dirjit_typeinput_examplesrW  )r   r  x2paddle.convertr  r   rk   r   r  r   r   r   r   ry  rr   r   r   r   r   )r   rh   r  r  rq   s        rP   r  zExporter.export_paddle  s     	783b ?@T@T?UUXYZ		N""499#3#3}RVVH5MNdjj1wX\X_X_W`a$q'O+T]];$wrR   zncnn:c                    t        t        rdnd       ddl}t        j                  d| d|j
                   d       t        t        | j                        j                  | j                  j                  dt        j                               }| j                  j                  d	      }t        rd
nd}t        |      j                         r|}nt         |z  j                         r
t         |z  }nt        j"                  | dt          d       t%        dd      \  }}t&        rdn	t(        rdnd}	|r|D 
cg c]	  }
|	|
v s|
 c}
d   nd|	 d}t+        |dd      }t        |      j                  d      }t         |z  }||z  j-                  |       t/        j0                  |       t        |      j3                          |j5                  d       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(t7        | j8                  j:                         d)| j<                  j>                   d*| j8                  j@                  d+g| jB                   d,}|jE                  d-       t        j                  | d.d/jG                  |       d0       tI        jJ                  |d1       |D 
cg c]  }
|
jM                  d2      d3    }}
d4d5d6d7g|D ]  }t        |      j3                  d8        tO        |d9z  | jP                         t        |      dfS c c}
w c c}
w ):zM
        YOLOv8 ncnn export using PNNX https://github.com/pnnx/pnnx.
        z'git+https://github.com/Tencent/ncnn.gitrE   r   Nr   z starting export with ncnn r  rF   r+   zpnnx.exepnnxu    WARNING ⚠️ 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.z	pnnx/pnnxT)reporetrymacosubuntuwindowszFhttps://github.com/pnnx/pnnx/releases/download/20230816/pnnx-20230816-z.ziplatest)r  releaser   i  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   rl  )rB  =r   z	debug.binzdebug.paramz
debug2.binzdebug2.param
missing_okrW  ))r   r   rE   r   rk   r   r   r  r   r   r   r   ry  r  r   is_filer   r   r   r   r   r   renameshutilrmtreeunlinkchmodr   rn   r   r   r   r   r   mkdirjoin
subprocessrunsplitr   r   )r   rh   rE   rq   f_tspnnx_filenamer  r  assetssystemrO   asset	unzip_dir	ncnn_args	pnnx_argscmd
pnnx_filesf_debugs                     rP   r  zExporter.export_ncnn  su   
 	DSYZb ;D<L<L;MSQRTYY''		(8(8Kx:PQRyy$$^4&-
6&&( D]"++--'DNN( QST *{$GIAv %Wu8)F=C61&A+Q6q9XY_X``de *5{HUEU//3I-'D&..t4MM)$K JJu //01q++,-a/)*+/	 //01q++,-a/)*+--./	3	 IIC C 	C
 C		'()C dkk&&'(C DIIOOQ<<=Q?C 	
vhj#q9:s$' 1::	1aggcl2&	
:#]L.^S]^GM  D 1 _ 	!o%t}}51vt|O 7D ;s   ;	MM"MzCoreML:c           
      t	   | j                   j                  j                         dk(  }t        |rdnd       ddl}t        j                  d| d|j                   d       | j                  j                  |rd	nd
      }|j                         rt        j                  |       g d}d}d}| j                  j                  dk(  ra| j                   j                  r<|j!                  t#        | j                  j$                  j'                                     nd}| j                  }n| j                  j                  dk(  rC| j                   j                  r t)        | j                  | j*                        n| j                  }n:| j                   j                  rt        j,                  | d       | j                  }t.        j0                  j3                  |j5                         | j*                  d      }	|j7                  |	|j9                  d| j*                  j:                  ||      g||rdnd      }
| j                   j<                  rdn| j                   j>                  rdnd\  }}|dk  rd|v rt        d       |r2|j@                  jB                  jD                  jG                  |
||      }
nG|dk(  rBddl$m%c m&} |jO                  d|d      }|jQ                  |       }|jS                  |
|!      }
| j                   j                  rz| j                  j                  dk(  ra|r$ddl*}tW        |jY                         d"d#d$%       d}n(|
j[                  t]        |             t]        |d&z        }| j_                  |
|'      }
| j`                  }|jc                  d(      |
_2        |jc                  d)      |
_3        |jc                  d*      |
_4        |jc                  d+      |
_5        |
jl                  jo                  |jq                         D ci c]  \  }}|t]        |       c}}       	 |
j[                  t]        |             ||
fS c c}}w # tr        $ rS}t        j,                  | d,| d-       |j                  d	      }|
j[                  t]        |             Y d}~||
fS d}~ww xY w).zYOLOv8 CoreML export.r{   zcoremltools>=6.0,<=6.2zcoremltools>=7.0r   Nr   z" starting export with coremltools r  z.mlmodelr7   )        r  r  gp?rT  detectuQ    WARNING ⚠️ 'nms=True' is only available for Detect models like 'yolov8n.pt'.Fr  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<3.11zPython T)r\   hardzData/com.apple.CoreML/weightsweights_dirr   r   r   r   u5    WARNING ⚠️ 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.):rn   r~   r   r   coremltoolsr   rk   r   r   r  is_dirr  r  rr   r   r   ClassifierConfigr`   r   rZ  IOSDetectModelr   r   r   r   r  r   convert	ImageTyper   r   r   modelsneural_networkquantization_utilsquantize_weightscoremltools.optimize.coremlr   r6   OpPalettizerConfigOptimizationConfigpalettize_weightsplatformr   python_versionr   r  _pipeline_coremlr   popshort_descriptionr   r   r   user_defined_metadataupdater;  rm   )r   rh   r{   ctrq   r  r  r  rr   r!  ct_modelbitsr  cto	op_configr  r  r  r  rC  rD  rs   s                         rP   r   zExporter.export_coreml  s    ))""((*i7w3DVW b B2>>BRRUVWII!!*\J88:MM! ::??j(X\XaXaXeXe 3 3D9I9I9P9P9R4S TkoJJEZZ__(;?99==N4::tww7djjEyy}}&)z{|JJEYY__UZZ\4775_A::b&(ll7$''--W\cgl&h%i0A<C  V '+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 h557yW[\"c!f%!!&E"EF,,X;,OHMM%&UU=%9"%%/55+55+&&--QWWY.OYTQq#a&yY.OP	"MM#a&! ({ /P  	"NN(OPQs Ss tu j)AMM#a&!!({	"s   Q
7Q 	R7$AR22R7z	TensorRT:c           
      F
   | j                   j                  j                  dk7  sJ d       	 ddl}t        |j                  dd	
       d	| j                  _
        | j                         \  }}t        j                  d| d|j                   d       t        |      j                         s
J d|        | j                   j#                  d      }|j%                  |j$                  j&                        }| j                  j(                  r%|j$                  j*                  j,                  |_        |j1                  |      }|j3                         }| j                  j4                  dz  dz  |_        dt9        |j:                  j<                        z  }	|j?                  |	      }
|jA                  |
|      }|jC                  |      stE        d|       tG        |
jH                        D cg c]  }|
jK                  |       }}tG        |
jL                        D cg c]  }|
jO                  |       }}|D ]@  }t        j                  | d|jP                   d|jR                   d|jT                          B |D ]@  }t        j                  | d|jP                   d|jR                   d|jT                          B | j                  jV                  r| j                   jR                  }|d   dk  rt        jX                  | d       |j[                         }|D ]>  }|j]                  |jP                  dg|dd t_        d|d   dz        g|dd |       @ |ja                  |       t        j                  | d|jb                  r| j                  jd                  rdnd d|        |jb                  r;| j                  jd                  r%|jg                  |jh                  jj                         | `6tn        jp                  js                          |ju                  |
|      5 }tw        |d      5 }ty        jz                  | j|                        }|j                  t        |      j                  ddd	              |j                  |j                                |j                  |j                                ddd       ddd       |dfS # t        $ r t
        rt        dd       ddl}Y w xY wc c}w c c}w # 1 sw Y   FxY w# 1 sw Y   |dfS xY w)!z=YOLOv8 TensorRT export https://developer.nvidia.com/tensorrt.r   z=export running on CPU but must be on GPU, i.e. use 'device=0'r   Nznvidia-tensorrtz*-U --index-url https://pypi.ngc.nvidia.comcmdsz7.0.0T)r  r   z starting export with TensorRT r  zfailed to export ONNX file: r4   r      zfailed to load ONNX file: z input "z" with shaper   z	 output "uM    WARNING ⚠️ 'dynamic=True' model requires max batch size, i.e. 'batch=16'r   z building FPr  r  z engine as wbr   little)	byteordersigned)Dr   r   r   r   ImportErrorr   r   r   r   rn   r5  r   r   rk   r   existsr   r  LoggerINFOr/  SeverityVERBOSEmin_severityBuildercreate_builder_config	workspacemax_workspace_sizer   NetworkDefinitionCreationFlagEXPLICIT_BATCHcreate_network
OnnxParserparse_from_fileRuntimeErrorr   
num_inputs	get_inputnum_outputs
get_outputr\   r   dtyper   r   create_optimization_profile	set_shaper   add_optimization_profileplatform_has_fast_fp16r   set_flagBuilderFlagFP16rr   r   r6  empty_cachebuild_engineopenr  r  r   writer   to_bytesencoder[  )r   rh   r   r  r  rq   loggerbuilderr  flagnetworkparserir  outputsinpoutr   profiler3   rl   rE  s                         rP   r   zExporter.export_engine@  sC    ww~~""e+l-ll+	#" 	coowT:!		$$&	b ??PPSTUF|""$M(DVH&MM$II!!),CJJOO,99"%**"5"5"="=F++f%..0$(II$7$7!$;r$A! S::IIJJ((.0%%f-!;F8DEE05g6H6H0IJ0I1'##A&0IJ278K8K2LM2LQ7%%a(2LMCKK6((388*L1SYYKXY CKK6()CHH:\#))Acii[YZ  99GGMMEQx1}&)vwx99;G!!#((QOqrOc!U1XQR]>S=`V[\]\^V_=`bgh ++G4hl)G)GDIINN2`b"ccnopnqr	t))diinnOOCOO001J

  !!'62fd1dmq::dmm,DGGCI&&qHT&JKGGDKKM"GGF$$&' ?L2 $wy  	#"#4;gh"	#6 KM0 ?Lm2 $wsB   S -S>T,T9B
TT S;:S;T	TT zTensorFlow SavedModel:c           	         t         j                  j                         }	 ddl}t        dd	d
ddd|rdndfd       t        j                  d| d|j                   d       t        t        | j                        j                  | j                  j                  d            }|j!                         rddl} |j$                  |       d| j&                  _        | j+                         \  }}|dz  }| j&                  j,                  r7d}	| j&                  j.                  rt        j                  | d| j&                  j.                   d       t1        | j&                  j.                        }
t3        |
d   |
| j4                  d   d      }g }t7        |      D ]6  \  }}|dk\  r n,|d   j9                  d d!d      d   }|j;                  |       8 |j=                          t        j>                  |d      jA                         }tC        jD                  t        |      |jG                                d"| d#}nd$}nd%}	d}d&| d'| d(|	 d)| jI                         }t        j                  | d*| d       tK        jL                  |d+       tO        |d,z  | jP                         | j&                  j,                  r|jS                  d-       |jU                  d.      D ]I  }|jW                  |jY                  |jZ                  j                  d/d0      |j                  z                K |jU                  d1      D ]  }|jS                           |jU                  d2      D ]0  }d3t        |      v r|jS                         n| j]                  |       2 t        |      |j^                  ja                  |dd4      fS # t        $ r* t        dt        rdnt        rdn|rdnd        ddl}Y w xY w)5z$YOLOv8 TensorFlow SavedModel export.r   N
tensorflowz-macosz-aarch64r   z-cpur-   zonnx2tf>=1.15.4,<=1.17.5zsng4onnx>=1.0.1r$  zonnx_graphsurgeon>=0.3.26tflite_supportr%  r&  z---extra-index-url https://pypi.ngc.nvidia.comr  r   ! starting export with tensorflow r  r9   Tz&tmp_tflite_int8_calibration_images.npyz--verbosity infork  rl  rm  Frn  d   rb  r   r   z#-oiqt -qt per-tensor -cind images "z+" "[[[[0, 0, 0]]]]" "[[[[255, 255, 255]]]]"z-oiqt -qt per-tensorz--non_verbosezonnx2tf -i "z" -o "z" -nuo r   r  shellrW  r  z*_dynamic_range_quant.tflite_dynamic_range_quant_int8z%*_integer_quant_with_int16_act.tflitez*.tflitezquant_with_int16_act.tflite)tagsoptions)1r   r6  r7  r  r  r   r   r   r   rk   r   r   r  r   r   r   r  r  r  rn   r5  r   r   r   r   r   r   	enumeratepermuter[   r  catr   re  r   rc  stripr  r  r   r   r  rglobr  	with_namer   _add_tflite_metadatar8   r9  )r   rh   r6  tfrq   r  r  r  tmp_file	verbosityr   r  r)  r  r   r   r   r  r   s                      rP   r   zExporter.export_saved_model  sp    zz&&(	$# 	/1BDUWrD0mM@	B
 	b A"..AQQTUVTYY''		(8(8.IJ88:FMM! "		$$&	 ??99>>*Iyy~~vh&UVZV_V_VdVdUeefgh(8%d5kDJJqM[`a )' 2HAuCxu--aA6t<BMM"%	 !3
 	61-335 Hv||~6<XJFqr-'IDVHF1#WYKqGMMOvhjQ/0s$'!o%t}}5 99>>OOtO, >?DNN499+<+<=SU\+]`d`k`k+klm @ GH I GGJ'D73q6AAHHJtG`G`aeGf ( 1vr~~**14*FFF}  	$HQV:bf\^lr+stu#	$s   O /O76O7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 )zYYOLOv8 TensorFlow GraphDef *.pb export https://github.com/leimao/Frozen_Graph_TensorFlow.r   N)!convert_variables_to_constants_v2r   r  r  r;   c                      |       S r    )rO   r   s    rP   <lambda>z$Exporter.export_pb.<locals>.<lambda>  s	    +a.rR   F)graph_or_graph_deflogdirr\   as_text)r  0tensorflow.python.framework.convert_to_constantsr1  r   rk   r   r   r  functionget_concrete_function
TensorSpecr  r   r  graphas_graph_defiowrite_graphr  r  r\   )r   r   rh   r-  r1  rq   r  frozen_funcs    `      rP   r   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rR   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YOLOv8 TensorFlow Lite export.r   Nr   r  r  r9   z_int8.tflitez_float16.tflitez_float32.tflite)r  r   rk   r   r   r  r   r   r   rn   r   r   r   )r   r   r   r   rh   r-  r8   rq   s           rP   r   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|rR   r   z	Edge TPU:c                 z   t        j                  | d       d}d}t        s
J d|        t        j                  |t        j
                  t        j
                  d      j                  dk7  rrt        j                  d| d	|        t        j                  d
d      j                  dk(  }dD ].  }t        j                  |r|n|j                  dd      dd       0 t        j                  |ddd      j                  j                         j                         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 )zCYOLOv8 Edge TPU export https://coral.ai/docs/edgetpu/models-intro/.uY    WARNING ⚠️ Edge TPU known bug https://github.com/ultralytics/ultralytics/issues/1185zedgetpu_compiler --versionz'https://coral.ai/docs/edgetpu/compiler/z$export only supported on Linux. See T)stdoutstderrr!  r   r   z< export requires Edge TPU compiler. Attempting install from zsudo --version >/dev/nullr   )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!  rB  )r!  capture_outputrB  r   z( starting export with Edge TPU compiler r  r=   r?   z(edgetpu_compiler -s -d -k 10 --out_dir "" "r  r  rl  N)r   r   r   r  r  DEVNULL
returncoderk   r   rC  decoder  r  r   r  r,  )	r   r   rh   r  help_urlsudocverrq   s	            rP   r   zExporter.export_edgetpu  s    	&!z{|*<G<XJGGu>>#j&8&8ASAS[_`kkoppKK"VH$`ai`jkl>>"=TJUUYZZD? Dqaii.DDX\]	?
 nnSTNUU\\^ddfgijb HSQR%%i1BC8a8HL>YZ[vhjQ/0s$'!!!$$wrR   zTensorFlow.js:c           	         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|        t%        |      5 }	t%        |      5 }
d| d|	 d|
 d}t        j                  | d| d       t'        j(                  |d       ddd       ddd       d|v rt        j*                  | d| d       t-        t/        |      dz  | j0                         |dfS # 1 sw Y   xY w# 1 sw Y   bxY w# 1 sw Y   fxY w)zYOLOv8 TensorFlow.js export.tensorflowjsr   Nr   z# starting export with tensorflowjs r  rA   r;   rb,z output node names: zJtensorflowjs_converter --input_format=tf_frozen_model --output_node_names=z "rF  r  r  rl  Tr   r   uG    WARNING ⚠️ your model may not work correctly with spaces in path 'z'.rW  )r   r  rO  r   rk   r   r  r   r   r   r  Graphr=  r  ParseFromStringreadr  re   r!   r  r  r   r   r   r   )r   rh   r-  r@   rq   f_pbrb   r   r  fpb_f_r  s               rP   r  zExporter.export_tfjs  s    	>*#b CDDTDTCUUXYZ		N""499#3#3\B499((/0XXZ$$&$tyy{+ ((:b>*b 4WI>?D!T>!+<^_f^ggijnioorsurvvwxCKK6(*SE34NN3d+ ,=!
 !8NNfX%lmnlooqrs  	$q'O+T]];$w9 
 ,=+<!!s0    G	)G!5?G4G!	GG	G!!G*c                 H   ddl m} ddl m} ddl m} |j	                         }| j                  d   |_        | j                  d   |_        | j                  d   |_        | j                  d   |_        t        |      j                  d	z  }t        |d
      5 }|j                  t        | j                               ddd       |j                         }|j
                  |_        |j                  j                   |_        |j%                         }	d|	_        d|	_        |j)                         |	_        |j-                         |	j*                  _        |j0                  j2                  |	j*                  j.                  _        |j6                  j8                  |	j*                  _        |j%                         }
d|
_        d|
_        |g|
_        | j>                  j@                  dk(  r&|j%                         }d|_        d|_        |g|_        |jC                         }|	g|_"        | j>                  j@                  dk(  r|
gn|
g|_#        |g|_$        |jK                  d      }|jM                  |jO                  |      |jP                  jR                         |jU                         }|jP                  jW                  t        |            }|jY                  |       |j[                  t        |      g       |j]                          |j_                          y# 1 sw Y   ]xY w)z\Add metadata to *.tflite models per https://www.tensorflow.org/lite/models/convert/metadata.r   )flatbuffers)r   )metadata_schema_py_generatedr   r   r   r   ztemp_meta.txtwNr  zInput image to be detected.outputzCCoordinates of detected objects, class labels, and confidence scorer   zMask protos)0r  rY  r   rZ  ModelMetadataTr\   r   r   r   r   r  r  r  r  AssociatedFileTAssociatedFileTypeTENSOR_AXIS_LABELSr   TensorMetadataTr   ContentTcontentImagePropertiesTcontentPropertiesColorSpaceTypeRGB
colorSpaceContentPropertiesImagePropertiescontentPropertiesTypeassociatedFilesrr   r   SubGraphMetadataTinputTensorMetadataoutputTensorMetadatasubgraphMetadatar  FinishPackMetadataPopulatorMETADATA_FILE_IDENTIFIEROutputwith_model_fileload_metadata_bufferload_associated_filespopulater  )r   r   rY  	_metadata_metadata_fb
model_metar.  rq   
label_file
input_metar(  output2subgraphbmetadata_buf	populators                   rP   r,  zExporter._add_tflite_metadata.  s   .8O "002
--6
!]]95
 MM(3
!]]95
 :$$6(C AGGC&' ! "113
"--
&99LL
 "113
!
!>
)224
/;/L/L/N
,:F:U:U:Y:Y
,,73?3Q3Q3a3a
0 ..0c#-,::??i'"224G#GL"/G'1lG#  113(2|$>BjjooQZ>Z'(:ah`i%'/j
#"	#Y%@%@%Y%YZxxz//??D	J	&&|4''X8S ! s   %LL!zCoreML Pipeline:c                 T   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=                         }d|_        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|_/        d|_0        d|_1        d|jd                  _3        |jh                  jj                  jm                  |jo                                |j4                  j7                  |      }|j4                  jp                  js                  d|j4                  jt                  jw                  d||      fd|j4                  jt                  jy                         fd|j4                  jt                  jy                         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                                d|j|                  _        |j|                  j                  j$                  j~                  j                  t        |j`                        t        |jb                        d       |j4                  j7                  |j|                  |      }d|j                  d<   d|j`                   d|j                  d<   d|jb                   d|j                  d<   d|j                  d<   d|j                  d<   t        j                  | d        |S )!zYOLOv8 CoreML pipeline.r   Nz$ starting pipeline with coremltools r  )Imagerg  r  r   r   r   r   z names found for nc=r  r   
confidencecoordinatesr   iouThresholdconfidenceThresholdg?g      ?Tr   )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)Dr  r   rk   r   r`   r   r   get_speciterr   r\  r   PILr  newpredictr\   r   r   r^   r   	imageTyper+  r*  r   multiArrayTyper  MLModelproto	Model_pb2ModelspecificationVersionr   _specSerializeToStringr=  rS  
shapeRange
sizeRanges
lowerBound
upperBoundnonMaximumSuppressionconfidenceInputFeatureNamecoordinatesInputFeatureNameconfidenceOutputFeatureNamecoordinatesOutputFeatureNameiouThresholdInputFeatureName#confidenceThresholdInputFeatureNamer  r  pickTopperClassstringClassLabelsvectorr]   rZ  pipelinePipeline	datatypesArrayDouble	add_modelspecuserDefinedr  r  input_descriptionoutput_description)r   rr   r  rh   r  r  hr[  r  out0out1r  rb  r  
out0_shape
out1_shaper   nxnyncnms_specr  decoder_outputoutput_sizesma_typer   	nms_modelr  s                               rP   r  zExporter._pipeline_coremlh  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%%++-()%qA"[[44;;A>PPRN  &&**,  &&q)99.I  ''++-  ''*::>J  /;##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/"&#$$++ELLN;II%%h/	 99%%..I\I\IbIbcdfhjlIm?n@NPRPYPYPcPcPjPjPl?m@UWYW`W`WjWjWqWqWs?t?v AMm?\ / ^ 	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 ./*!!**66== !1!12$'(?(?$@?B 	C
 		!!(--[!I+8(4`adaqaq`rrs2t/A#BYBYAZZ[\ 	 561r  .2k  /vh/01rR   eventc                 @    | j                   |   j                  |       y)zAppends the given callback.N)r   r[   r   r  callbacks      rP   add_callbackzExporter.add_callback  s    u$$X.rR   c                 V    | j                   j                  |g       D ]
  } ||         y)z(Execute all callbacks for a given event.N)r   r   r  s      rP   r   zExporter.run_callbacks  s$    **5"5HTN 6rR   r   )__name__
__module____qualname____doc__r   r   r%   r  rw   r   r   r   r   r  r  r   r   r   r   r   r   r  r,  r  r  r  r   r3  rR   rP   ry   ry      s    '$4 2  K KZ (0(@   !)'!2 7 7r %-k%: 8 8t #+O#<   !)'!2 > >@ #+I#6 C CJ #+K#8 A AF (01I(J CG CGJ ,45K,L   CKL^C_   *,Xk5J  4 !)*:!; ' 'R8t 37xHZ?[ rh/# /3 rR   ry   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)zHInitialize the IOSDetectModel class with a YOLO model and example image.g      ?N)
superr   r   rr   r   r   r  	normalizer   tensor)r   rr   r   r  r  r[  	__class__s         rP   r   zIOSDetectModel.__init__  sq    XX
1a
ekk"6 1WDN"\\37C!GS1WcAg*NODNrR   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   )rr   	transposer  r  r  )r   rO   xywhclss       rP   r   zIOSDetectModel.forward  sN    JJqM!$..q!4::Atww<K	cD4>>)))rR   )r  r  r  r  r   r   __classcell__)r  s   @rP   r  r    s    E	P*rR   r  )Br  r  r   r  r  r   r   copyr   r   pathlibr   rc  re  r   ultralytics.cfgr   ultralytics.data.datasetr   ultralytics.data.utilsr   ultralytics.nn.autobackendr	   ultralytics.nn.modulesr
   r   r   ultralytics.nn.tasksr   r   ultralytics.utilsr   r   r   r   r   r   r   r   r   r   r   r   ultralytics.utils.checksr   r   r   ultralytics.utils.downloadsr   r   ultralytics.utils.filesr    r!   ultralytics.utils.opsr"   ultralytics.utils.torch_utilsr#   r$   r%   rQ   re   rw   ry   nnModuler  r3  rR   rP   <module>r     s   0b  	          # 0 4 8 = = BF F F F S S Q = ) _ _W(h&d dN*UXX__ *rR   