
    |h<                     Z   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZmZm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mZmZmZmZmZmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z( d	eeef   d
ee)e*f   fdZ+ddeee*ef      d
ee)e*f   fdZ, G d dejZ                        Z.y)    N)OrderedDict
namedtuple)Path)AnyDictListOptionalTupleUnion)Image)ARM64	IS_JETSONLINUXLOGGERPYTHON_VERSIONROOTYAML)check_requirementscheck_suffixcheck_version
check_yamlis_rockchip)attempt_download_assetis_urlnamesreturnc                    t        | t              rt        t        |             } t        | t              r| j	                         D ci c]  \  }}t        |      t        |       } }}t        |       }t        | j                               |k\  rHt        | d|dz
   dt        | j                                dt        | j                                d      t        | d   t              rY| d   j                  d      rEt        j                  t        dz        d	   }| j	                         D ci c]  \  }}|||    } }}| S c c}}w c c}}w )
a=  
    Check class names and convert to dict format if needed.

    Args:
        names (list | dict): Class names as list or dict format.

    Returns:
        (dict): Class names in dict format with integer keys and string values.

    Raises:
        KeyError: If class indices are invalid for the dataset size.
    z(-class dataset requires class indices 0-   z%, but you have invalid class indices -z defined in your dataset YAML.r   n0zcfg/datasets/ImageNet.yamlmap)
isinstancelistdict	enumerateitemsintstrlenmaxkeysKeyErrormin
startswithr   loadr   )r   kvn	names_maps        Y/var/www/html/test/engine/venv/lib/python3.12/site-packages/ultralytics/nn/autobackend.pycheck_class_namesr5      s'    %Yu%&%,1KKM:DAqQQ::Juzz|!#=a!eWDiuzz|$%Qs5::<'8&99WY  eAh$q)<)<T)B		$)E"EFuMI16?AQ	!_?E?L ; @s   	E3Edatac                     | r"	 t        j                  t        |             d   S t	        d      D ci c]  }|d| 
 c}S # t        $ r Y (w xY wc c}w )a  
    Apply default class names to an input YAML file or return numerical class names.

    Args:
        data (str | Path, optional): Path to YAML file containing class names.

    Returns:
        (dict): Dictionary mapping class indices to class names.
    r     class)r   r/   r   	Exceptionrange)r6   is     r4   default_class_namesr=   4   s\     	99Z-.w77 %*#J/qAqc{N//  		/s    A A	AAc                       e Zd ZdZ ej
                         d ej                  d      ddddddfdeee	e   ej                  j                  f   d	ej                  d
edeeeef      dedededef fd       Z	 	 	 ddej"                  dededee	   dedeej"                  e	ej"                     f   fdZdej*                  dej"                  fdZddeeeeef   ddfdZed dede	e   fd       Z xZS )!AutoBackenda$  
    Handle dynamic backend selection for running inference using Ultralytics YOLO models.

    The AutoBackend class is designed to provide an abstraction layer for various inference engines. It supports a wide
    range of formats, each with specific naming conventions as outlined below:

        Supported Formats and Naming Conventions:
            | Format                | File Suffix       |
            | --------------------- | ----------------- |
            | PyTorch               | *.pt              |
            | TorchScript           | *.torchscript     |
            | ONNX Runtime          | *.onnx            |
            | ONNX OpenCV DNN       | *.onnx (dnn=True) |
            | OpenVINO              | *openvino_model/  |
            | CoreML                | *.mlpackage       |
            | TensorRT              | *.engine          |
            | TensorFlow SavedModel | *_saved_model/    |
            | TensorFlow GraphDef   | *.pb              |
            | TensorFlow Lite       | *.tflite          |
            | TensorFlow Edge TPU   | *_edgetpu.tflite  |
            | PaddlePaddle          | *_paddle_model/   |
            | MNN                   | *.mnn             |
            | NCNN                  | *_ncnn_model/     |
            | IMX                   | *_imx_model/      |
            | RKNN                  | *_rknn_model/     |

    Attributes:
        model (torch.nn.Module): The loaded YOLO model.
        device (torch.device): The device (CPU or GPU) on which the model is loaded.
        task (str): The type of task the model performs (detect, segment, classify, pose).
        names (dict): A dictionary of class names that the model can detect.
        stride (int): The model stride, typically 32 for YOLO models.
        fp16 (bool): Whether the model uses half-precision (FP16) inference.
        nhwc (bool): Whether the model expects NHWC input format instead of NCHW.
        pt (bool): Whether the model is a PyTorch model.
        jit (bool): Whether the model is a TorchScript model.
        onnx (bool): Whether the model is an ONNX model.
        xml (bool): Whether the model is an OpenVINO model.
        engine (bool): Whether the model is a TensorRT engine.
        coreml (bool): Whether the model is a CoreML model.
        saved_model (bool): Whether the model is a TensorFlow SavedModel.
        pb (bool): Whether the model is a TensorFlow GraphDef.
        tflite (bool): Whether the model is a TensorFlow Lite model.
        edgetpu (bool): Whether the model is a TensorFlow Edge TPU model.
        tfjs (bool): Whether the model is a TensorFlow.js model.
        paddle (bool): Whether the model is a PaddlePaddle model.
        mnn (bool): Whether the model is an MNN model.
        ncnn (bool): Whether the model is an NCNN model.
        imx (bool): Whether the model is an IMX model.
        rknn (bool): Whether the model is an RKNN model.
        triton (bool): Whether the model is a Triton Inference Server model.

    Methods:
        forward: Run inference on an input image.
        from_numpy: Convert numpy array to tensor.
        warmup: Warm up the model with a dummy input.
        _model_type: Determine the model type from file path.

    Examples:
        >>> model = AutoBackend(weights="yolo11n.pt", device="cuda")
        >>> results = model(img)
    z
yolo11n.ptcpuFNr   Tweightsdevicednnr6   fp16batchfuseverbosec	                 .  rs t         t|           t        t        |t              r|d   n|      }	t        |t
        j                  j                        }
| j                  |	      \  }}}}}}}}}}}}}}}}}||xs |xs |xs |xs
 |xs |
xs |z  }|xs |xs |xs
 |xs |xs |}d\  }}d\  }} d\  }!}"}#t        |t
        j                        xr/ t
        j                  j                         xr |j                  dk7  }$|$r(t        |
|||||g      st        j                  d      }d}$|s|s|
st        |	      }	|
r|j                  |      }!|r|!j!                  |      }!t#        |!d      r|!j$                  }%t'        t)        |!j*                  j'                               d	      }t#        |!d
      r|!j,                  j.                  n|!j.                  }&|r|!j1                         n|!j3                          |!j4                  j7                  dd      }|!| _        d}n|rddlm}'  |'t        |t              r|n|	|d|      }!t#        |!d      r|!j$                  }%t'        t)        |!j*                  j'                               d	      }t#        |!d
      r|!j,                  j.                  n|!j.                  }&|r|!j1                         n|!j3                          |!j4                  j7                  dd      }|!| _        n<|rddl}(tA        jB                  d|	 d       ddi})t
        jD                  jG                  |	|)|      }!|r|!j1                         n|!j3                          |)d   rtI        jJ                  |)d   d       }"n|rEtA        jB                  d|	 d       tM        d       tN        jP                  jS                  |	      }*nk|s|rtA        jB                  d|	 d       tM        d|$rdndf       ddl*}+dg},|$rQd|+jW                         v r|,jY                  dd       n,tA        jZ                  d        t        j                  d      }d}$tA        jB                  d!|,d           |r|+j]                  |	|,"      }-ntM        g d#       t_        ta        |	      jc                  d$            }	tA        jB                  d|	 d%       ddl2}.dd&l3m4}/ |.jk                         }0d|0_6        |+j]                  |	|0dg"      }-d'}#|-jo                         D 1cg c]  }1|1jp                   }2}1|-js                         jt                  }"t        |-jo                         d   jv                  d   t              } d(|-jy                         d   j                  v }| s|-j{                         }3g }4|-jo                         D ]  }5d(|5j                  v }6t        j|                  |5jv                  |6rt
        j~                  nt
        j                  )      j                  |      }7|3j                  |5jp                  |j                  |$r|j                  nd|6rt        j~                  nt        j                  t        |7jv                        |7j                         *       |4j                  |7        n|rtA        jB                  d|	 d+       tM        d,       ddlG}8|8j                         }9d-}:t        |t              rq|j                  d.      r`|j                  d/      d0   j                         }:t        j                  d      }|:|9j                  vrtA        jZ                  d1|: d2       d-}:ta        |	      }	|	j                         st_        |	jc                  d3            }	|9j                  t        |	      |	j                  d4      5      };|;j                         d   j                         j|                  r1|;j                         d   j                  |8j                  d6             |d0kD  rd7nd8}<tA        jB                  d9|< d:| d;       |9j                  |;|:d<|<i=      }=|=j                         j                         }>|	j                  d>z  }"n|rTtA        jB                  d|	 d?       t        rt        t        d@      rtM        dA       	 ddl[}?t        |?j                  dCdD       t        |?j                  dEdFG       |j                  dk(  rt        j                  dH      }t        dIdJ      }@|?j                  |?j                  j                        }At        |	dK      5 }B|?j                  A      5 }C	 t(        j                  Bj                  dL      dMN      }DtI        jJ                  |Bj                  |D      j                  dO            }"|"j7                  dPd      }E|Et)        E      C_g        Cj                  Bj                               }!ddd       ddd       	 |!j                         }Ft               }4g }2d}d} t#        |!dS       }H|Hrt        |!j                        nt        |!j                        }I|ID ]/  }JHr|!j                  J      }K|?j                  |!j                  |K            }L|!j                  |K      |?j                  j                  k(  }M|MrbdTt        |!j                  K            v r0d} Fj                  Kt        |!j                  |Kd      d0                Lt        j~                  k(  rd}n|2j                  K       t        Fj                  K            }Nn|!j                  J      }K|?j                  |!j                  |J            }L|!j                  |J      }M|!j                  |J      rcdTt        |!j                  J            v r1d} Fj                  Jt        |!j                  d|J      d0                Lt        j~                  k(  rd}n|2j                  K       t        Fj                  J            }Nt        j                  t        j|                  NL)            j                  |      }O @K|L|N|Ot)        |Oj                                     |4|K<   2 t        dU |4j                         D              }P|4dV   jv                  d   }QnR|rStA        jB                  d|	 dW       ddl}R|Rj                  j                  |	      }!t        |!j                        }"n|rutA        jB                  d|	 dX       ddlsd}S|Sr(sj                  j                  j                  |	      nsj                  jG                  |	      }!ta        |	      d>z  }"n|rtA        jB                  d|	 dY       ddlsddZlm}T sfd[}Usj                         j                         }Vt        |	dK      5 }BVj!                  |Bj                                ddd        UVd\ T|V      ]      }W	 t_        ta        |	      j#                         j                  j%                  ta        |	      j&                   d^            }"n|s|r_	 dd_lm}Xm}Y |rut        |      j                  d`      r|dd nda}tA        jB                  d|	 db|d0d  dc       dddedfdgt5        j6                            }Z X|	 Y|Zdh|ii      gj      }[d}n"tA        jB                  d|	 dk        X|	l      }[[j9                          |[j;                         }\|[j=                         }]	 t?        j@                  |	dm      5 }^|^jC                         d   }K|^j                  |K      j                  dO      }_|Kdnk(  rtI        jJ                  _      }"ntE        jF                  _      }"ddd       n;|rtQ        do      |rtA        jB                  d|	 dp       tM        t
        j                  j                         rdqn
tR        rdrnds       ddlm}` ta        |	      }	dt\  }a}b|	jY                         r9t_        |	j%                  du      d      }at_        |	j%                  dv      d      }bn$|	jZ                  dwk(  r|	j]                  dx      }a|	}bar"br aj                         rbj                         st_        dy|	 dz      `ja                  t        a      t        b            }c|$rcjc                  d{d|       `je                  c      }d|djg                  |dji                         d         }e|djk                         }2|	d>z  }"n|rtA        jB                  d|	 d}       tM        d~       ddl}fddlrdd|fjq                         d0z   dz  d}crj                  js                  |cf      }grj                  ju                  |	g g |gd      }*rfd}htI        jJ                  |*jw                         d         }"n|rtA        jB                  d|	 d       tM        tR        rdnd       ddl}i|ij{                         }*|$|*j|                  _        ta        |	      }	|	j                         st_        |	jc                  d            }	|*j                  t        |	             |*j                  t        |	j                  d4                   |	j                  d>z  }"n|r'tM        d       ddlm}j  |j|	      }!|!j                  }"n|rt               st        d      tA        jB                  d|	 d       tM        d       ddlm}k ta        |	      }	|	j                         st_        |	j%                  d            }	 k       }l|lj                  t        |	             |lj                          |	j                  d>z  }"n!ddlm}m t        d|	 d |m       d    d      t        |"t        t`        f      r0ta        |"      j                         rt        jF                  |"      }"|"rt        |"t              r|"j                         D ]=  \  }n}o|ndv rt)        o      |"n<   ndv st        ot              s/t        o      |"n<   ? |"d   }|"d   }#|"d   }|"d   }p|"d   }&|"j7                  d      }%|"j7                  di       j7                  dd      }|"j7                  di       j7                  d|       } |"j7                  dd      }n|s|s|
stA        jZ                  d| d       dt               vrt        |      }&t        &      }&|r|!j                         D ]	  }qd|q_         | j                  j                  t                      yc c}1w # t        $ r t        rtM        dB       ddl[}?Y Bw xY w# t        $ r Bj                  d       Y Aw xY w# 1 sw Y   (xY w# 1 sw Y   -xY w# t        $ r*}GtA        j                  dQ|?j                   dR       Gd}G~Gww xY w# 1 sw Y   axY w# t(        $ r Y jw xY w# t        $ rC ddlssj0                  j,                  sj0                  j2                  j.                  }Y}XY Jw xY w# 1 sw Y   xY w# t>        jH                  tJ        tL        tH        jN                  f$ r Y w xY w)a  
        Initialize the AutoBackend for inference.

        Args:
            weights (str | List[str] | torch.nn.Module): Path to the model weights file or a module instance.
            device (torch.device): Device to run the model on.
            dnn (bool): Use OpenCV DNN module for ONNX inference.
            data (str | Path, optional): Path to the additional data.yaml file containing class names.
            fp16 (bool): Enable half-precision inference. Supported only on specific backends.
            batch (int): Batch-size to assume for inference.
            fuse (bool): Fuse Conv2D + BatchNorm layers for optimization.
            verbose (bool): Enable verbose logging.
        r   )       )FF)NNNr@   F)rG   	kpt_shaperI   modulechannelsrJ   T)attempt_load_weights)rB   inplacerF   NzLoading z for TorchScript inference...z
config.txt )_extra_filesmap_locationc                 4    t        | j                               S N)r$   r&   xs    r4   <lambda>z&AutoBackend.__init__.<locals>.<lambda>   s    W[\]\c\c\eWf     )object_hookz! for ONNX OpenCV DNN inference...zopencv-python>=4.5.4z for ONNX Runtime inference...onnxzonnxruntime-gpuonnxruntimeCPUExecutionProviderCUDAExecutionProviderz4Failed to start ONNX Runtime with CUDA. Using CPU...zUsing ONNX Runtime )	providers)z'model-compression-toolkit>=2.3.0,<2.4.1z sony-custom-layers[torch]>=0.3.0zonnxruntime-extensionsz*.onnxz for ONNX IMX inference...)nms_ortdetectfloat16)dtypenamedevice_type	device_idelement_typeshape
buffer_ptrz for OpenVINO inference...zopenvino>=2024.0.0AUTOintel:r   zOpenVINO device 'z&' not available. Using 'AUTO' instead.z*.xmlz.bin)modelrA   NCHWCUMULATIVE_THROUGHPUTLATENCYzUsing OpenVINO z mode for batch=z inference...PERFORMANCE_HINT)device_nameconfigzmetadata.yamlz for TensorRT inference...z<=3.8.10znumpy==1.23.5ztensorrt>7.0.0,!=10.1.0z>=7.0.0)hardz!=10.1.0z5https://github.com/ultralytics/ultralytics/pull/14239)msgzcuda:0Binding)rd   rb   rh   r6   ptrrb   little)	byteorderzutf-8dlaz6TensorRT model exported with a different version than 
num_bindingsc              3   >   K   | ]  \  }}||j                   f  y wrT   )rw   ).0r2   ds      r4   	<genexpr>z'AutoBackend.__init__.<locals>.<genexpr>  s     'Ptq!AEE
'Ps   imagesz for CoreML inference...z' for TensorFlow SavedModel inference...z% for TensorFlow GraphDef inference...)
gd_outputsc                     j                   j                  j                   fdg       }|j                  j                  }|j                  j                  j                  ||      j                  j                  ||            S )z"Wrap frozen graphs for deployment.c                  R    j                   j                  j                   d      S )NrP   )rd   )compatv1import_graph_def)gdtfs   r4   rW   zAAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>  s!    ryy||7T7TUW^`7T7a rX   )r   r   wrap_functiongraphas_graph_elementprunenestmap_structure)r   inputsoutputsrV   ger   s   `    r4   wrap_frozen_graphz/AutoBackend.__init__.<locals>.wrap_frozen_graph  sc    IILL../acefWW--wwrww44R@"''BWBWXZ\cBdeerX   zx:0)r   r   z_saved_model*/metadata.yaml)Interpreterload_delegatetpuz:0z on device z* for TensorFlow Lite Edge TPU inference...zlibedgetpu.so.1zlibedgetpu.1.dylibzedgetpu.dll)LinuxDarwinWindowsrB   )options)
model_pathexperimental_delegatesz! for TensorFlow Lite inference...)r   rzmetadata.jsonz2YOLOv8 TF.js inference is not currently supported.z for PaddlePaddle inference...zpaddlepaddle-gpuzpaddlepaddle==3.0.0zpaddlepaddle>=3.0.0)NNz*.jsonz*.pdiparamsz
.pdiparamsz
model.jsonzPaddle model not found in z/. Both .json and .pdiparams files are required.i   )memory_pool_init_size_mbrf   z for MNN inference...MNNlowCPU   )	precisionbackend	numThread)runtime_manager	rearrangec                 l    j                   j                  | j                         | j                        S rT   )exprconstdata_ptrrh   )rV   r   s    r4   torch_to_mnnz*AutoBackend.__init__.<locals>.torch_to_mnn  s"    xx~~ajjlAGG<<rX   bizCodez for NCNN inference...z'git+https://github.com/Tencent/ncnn.gitncnnz*.paramztritonclient[all])TritonRemoteModelz5RKNN inference is only supported on Rockchip devices.z for RKNN inference...zrknn-toolkit-lite2)RKNNLitez*.rknnexport_formatszmodel='z9' is not a supported model format. Ultralytics supports: Formatz9
See https://docs.ultralytics.com/modes/predict for help.>   rE   striderM   >   argsimgszr   rK   r   taskrE   r   r   r   nmsdynamiczMetadata not found for 'model=')super__init__r(   r"   r#   torchnnModule_model_typerB   cudais_availabletypeanyr   torF   hasattrrK   r*   r'   r   rL   r   halffloatyamlgetrm   ultralytics.nn.tasksrN   torchvisionr   infojitr/   jsonloadsr   cv2rC   readNetFromONNXr[   get_available_providersinsertwarningInferenceSessionnextr   globmct_quantizerssony_custom_layers.pytorch.nmsr_   get_ort_session_optionsenable_mem_reuseget_outputsrd   get_modelmetacustom_metadata_maprh   
get_inputs
io_bindingemptyra   float32bind_outputindexnptupler   appendopenvinoCorer.   splitupperavailable_devicesis_file
read_modelwith_suffixget_parameters
get_layout
set_layoutLayoutcompile_modelinputget_any_nameparentr   r   r   tensorrtImportErrorr   __version__r   LoggerINFOopenRuntime
from_bytesreaddecodeDLA_coreUnicodeDecodeErrorseekdeserialize_cuda_enginecreate_execution_contextr:   errorr   r;   num_io_tensorsr~   get_tensor_namenptypeget_tensor_dtypeget_tensor_modeTensorIOModeINPUTget_tensor_shapeset_input_shapeget_tensor_profile_shapeget_binding_nameget_binding_dtypebinding_is_inputget_binding_shapeset_binding_shapeget_profile_shape
from_numpyr&   coremltoolsmodelsMLModelr$   user_defined_metadata
tensorflowkeras
load_modelsaved_modelultralytics.engine.exporterr   Graphas_graph_defParseFromStringresolverglobstemStopIterationtflite_runtime.interpreterr   r   liteexperimentalplatformsystemallocate_tensorsget_input_detailsget_output_detailszipfileZipFilenamelistastliteral_eval
BadZipFileSyntaxError
ValueErrorJSONDecodeErrorNotImplementedErrorr   paddle.inference	inferenceis_dirsuffix	with_nameFileNotFoundErrorConfigenable_use_gpucreate_predictorget_input_handleget_input_namesget_output_namesosr   	cpu_countcreate_runtime_managerload_module_from_fileget_infor   Netoptuse_vulkan_compute
load_paramultralytics.utils.tritonr   metadatar   OSErrorrknnlite.apir   	load_rknninit_runtimer   	TypeErrorexistsr   evallocalsr=   r5   
parametersrequires_grad__dict__update)uselfrA   rB   rC   r6   rD   rE   rF   rG   w	nn_moduleptr   rZ   xmlenginecoremlr$  pbtfliteedgetputfjspaddlemnnr   imxrknntritonnhwcr   chend2endr   rm   rU  r   r   rK   r   rN   r   extra_filesnetr[   r^   sessionmctqr_   session_optionsrV   output_namesiobindingsoutputout_fp16y_tensorovcorerr   ov_modelinference_modeov_compiled_model
input_nametrtrv   loggerfruntimemeta_lenr|   contexteis_trt10numr<   rd   rb   is_inputrh   imbinding_addrs
batch_sizectr"  r   r   r   frozen_funcr   r   delegateinterpreterinput_detailsoutput_detailszfcontentspdi
model_fileparams_filers   	predictorinput_handlerK  rtr   pyncnnr   r   
rknn_modelr   r0   r1   r   pr   r   	__class__su                                                                                                                     @@r4   r   zAutoBackend.__init__   s   2 	j$7
WEw8	& Q%	
IcITISIFIiI6IGGGfGG4
' 0x &%,,/fEJJ4K4K4MfRXR]R]afRfYCvFG\\%(FD f	&q)A JJv&E

7
3uk*!OO	U\\--/0"5F*1%*BELL&&E EJJLekkm
A.BDJB A(%gt4!FTX_cE uk*!OO	U\\--/0"5F*1%*BELL&&E EJJLekkm
A.BDJ KK(1#%BCD',KIINN1;VNTE EJJLekkm<(::k,&?Mfg KK(1#%FGH56''))!,C SKK(1#%CDET(9}UV/0I*k.Q.Q.SS$$Q(?@NN#YZ"\\%0F DKK-il^<=%66qI6N" ah/0hqc)CDE-B"&">">"@380%66q/VlUm6n,3,?,?,ABqAFFBLB,,.BBH !4!4!6q!9!?!?!BCHG 2 2 4Q 7 < <<D'')%113 .F(FKK7H${{6<<PXu}}^c^k^kloopvwHNN#[[$*KK26&,,A3;RZZ#HNN3#+#4#4#6 #  OOH-. KK(1#%?@A34!779D K&#&6+<+<W+E$ll3/288:e,d&<&<<NN%6{mCi#jk"(KQA99;)SVQ]]6=RSH&&(+668>>'')!,77		&8IJ 9>	4yNKK/.)99I%P]^_ $ 2 2'*N; !3 !
 +002??AJxx/1H KK(1#%?@A]>:F"?3'&
 #//94@#//:;rs{{e#h/ ,UVGZZ

0Fa 	B!S[[%8 	BG"~~affQi8~LH#zz!&&*:*A*A'*JKH",,ud3C+.s8(  77A	B 	B88:
 #}HLDG"5.99H19%,,-uUEWEW?XC U 003DJJu'='=d'CDE$44T:c>N>N>T>TTHu'='=d'C!DD&*G#33D%@^@^_cef@ghi@j:kl BJJ.#'D$++D1!'":":4"@AE 11!4DJJu'>'>q'ABE$55a8H--a0u'>'>q'A!BB&*G#55au?V?VWXZ[?\]^?_9`a BJJ.#'D$++D1!'";";A">?E%%bhhuE&BCFFvN!(ueRR[[]AS!T9U: ('Px~~?O'PPM!(+11!4J KK(1#%=>?$II%%a(EE778H KK(1#%LMN#E5:BHHOO..q1@S@STU@VEAw0H KK(1#%JKL#>f ((*Ba -!""1668,-+BujQSnUKQ 1 8 8 > >$q',,Oj?k lm
 weQ
 '*6{'='=e'D$hqcVABZL@jkl%6BVcpqOO% * ,9(XW]L^,_+` hqc)JKL)Q7((*'99;M(;;=N	__Q, >;;=+D!wwt}33G<H.#'::h#7#&#3#3H#=> %&Z[[ KK(1#%CDE::**, #  +* +QA&0#Jxxz!!''("3T:
"177=#94@\)[[6
;:3E3E3GKL_L_La'*DQCGv(wxxZZJ[1ABF%%tq%Q,,V4I$55i6O6O6QRS6TUL$557L?*H KK(1#%:;<u%#(U",,.[\J\abIbcF..y9B&&..q"b"X\.]C= zz#,,.";<H KK(1#%;<=EHW]^!**,C)-CGG&QA99;	*+NN3q6"NN3q}}V456xx/1H 23B%a(E~~H =UVVKK(1#%;<=34-QA99;*+!J  Q(##%xx/1H C!UVdVfgoVpUq rK L  hd,h1F1F1Hyy*H
8T2 ( *177"%a&HQKAAjQRTWFX"&q'HQK	*
 h'FF#DW%EW%EW%E [1Ill62.225%@Gll62.229gFGj!,B)NN;G9AFG &("'-E!%( %%' ("'( 	VX&c
 C|  '&'@A&'$ * FF1I	B 	B 	B 	B  UVYVeVeUffhijR- -
 !   e'-/WW-@-@"''BVBVBdBd]e.> > &&ZAUAUV s  #AW6AW; +AY=AY?A=AX <AYAY,AY !AZAAZ (AZ/ =A\ A'A[><A\ W;AXXAXX AX>X:AYX=AX>X>AYYAY	YAYYAYY	AZY$%AZ	Z	AZZAZZ
AZ,Z+AZ,Z/AA[;[:A[;[>A\\A\ \2A]] A]r  augment	visualizeembedkwargsr   c           	      "   |j                   \  }}}}	| j                  r-|j                  t        j                  k7  r|j                         }| j                  r|j                  dddd      }| j                  s| j                  r | j                  |f|||d|}
nX| j                  r| j                  |      }
n9| j                  rU|j                         j                         }| j                  j!                  |       | j                  j#                         }
n| j$                  s| j&                  r| j(                  rl|j                         j                         }| j*                  j-                  | j.                  | j*                  j1                         d   j2                  |i      }
n| j4                  s|j                         }| j6                  j9                  d|j:                  j<                  |j:                  j<                  dk(  r|j:                  j>                  nd| j                  rt@        j                  nt@        jB                  tE        |j                         |jG                                | j*                  jI                  | j6                         | jJ                  }
| j&                  r>tA        jL                  |
d   |
d   d	d	d	d	d	f   |
d   d	d	d	d	d	f   gd
      }
n| jN                  r*|j                         j                         }| jP                  dv r|j                   d   }d	g|z  fd}| jR                  jU                  | jV                        }|jY                  |       t[        |      D ]'  }|j]                  | j^                  |||dz    i|       ) |ja                          tA        jL                  D cg c]  }tc        |je                               d     c}      }
	ntc        | jW                  |      je                               }
	n| jf                  r| j(                  r|j                   | jJ                  d   j                   k7  r| jh                  r| jj                  jm                  d|j                          | jJ                  d   jo                  |j                         | jJ                  d<   | j.                  D ]L  }| jJ                  |   jp                  js                  tE        | jj                  ju                  |                   N n| j                  jw                  d      }| jj                  jy                  ||j                          | jJ                  d   jo                  |j                         | jJ                  d<   | j.                  D ]g  }| j                  jw                  |      }| jJ                  |   jp                  js                  tE        | jj                  j{                  |                   i | jJ                  d   j                   }|j                   |k(  s(J d|j                    d| j(                  rdnd d|        t}        |jG                               | j~                  d<   | jj                  j                  tc        | j~                  je                                      t        | j.                        D cg c]  }| jJ                  |   jp                   }
}n| j                  r|d   j                         j                         }t        j                  |dz  j                  d            }| j                  j                  d|i      }
d|
v rt        d|	 d      tc        |
je                               }
t        |
      dk(  rCt        |
d   j                         dk7  r'tc        t        |
            }
n| j                  r|j                         j                         j                  t@        jB                        }| j                  j                  |       | j                  j-                          | j.                  D cg c]+  }| j                  j                  |      j                         - }
}nS| j                  rL| j                  |      }| j                  j                  |g      }|D cg c]  }|j                          }
}n| j                  r| j                  j                  |d   j                         j                               }| j                  j                         5 }|j                  | j                  j                         d   |       t        | j                  j/                               D cg c],  }tA        j                  |j                  |      d         d	   . }
}d	d	d	       n| j                  r1|j                         j                         }| j                  |      }
n| j                  ri|j                         j                         dz  j                  d      }t        |tb        tD        f      r|n|g}| j                  j                  |      }
nY|j                         j                         }| j                  rP| j                  r| j                  |d      n| j                  j                  |      }
t        |
tb              s6|
g}
n1| j                  r-| j                  | j                  j                  |            }
n| j                  d   }|d    t@        j                  t@        j                  hv }|r"|d!   \  }}||z  |z   j                  |d          }| j                  j                  |d"   |       | j                  j                          g }
| j                  D ]U  }| j                  j                  |d"         }|r-|d!   \  }}|j                  t@        jB                        |z
  |z  }|j                  dk(  r|j                   d
   d#k(  s| j                  rj|d	d	d	d	ddgfxx   |	z  cc<   |d	d	d	d	ddgfxx   |z  cc<   | j                  d$k(  r|d	d	d	d	d#d	dfxx   |	z  cc<   |d	d	d	d	d%d	dfxx   |z  cc<   n]|d	d	ddgfxx   |	z  cc<   |d	d	ddgfxx   |z  cc<   | j                  d$k(  r(|d	d	d&d	dfxx   |	z  cc<   |d	d	d#d	dfxx   |z  cc<   |
j                  |       X t        |
      dk(  rgt        |
d   j                         dk7  rtc        t        |
            }
|
d   j                   d
   d#k(  r|
d   g}
ntA        j                  |
d   d'      |
d<   |
D cg c].  }t        |t@        j                        r|n|j                         0 }
}t        
tb        tD        f      rt        | j                        d(k(  rg| j                  d)k(  st        |
      dk(  rJ|
d   j                   d   |
d   j                   d   z
  dz
  }t[        |      D ci c]  }|d*| 
 c}| _v        t        |
      dk(  r| j                  |
d         S |
D cg c]  }| j                  |       c}S | j                  |
      S c c}w c c}w c c}w c c}w c c}w # 1 sw Y   
xY wc c}w c c}w c c}w )+a@  
        Run inference on an AutoBackend model.

        Args:
            im (torch.Tensor): The image tensor to perform inference on.
            augment (bool): Whether to perform data augmentation during inference.
            visualize (bool): Whether to visualize the output predictions.
            embed (list, optional): A list of feature vectors/embeddings to return.
            **kwargs (Any): Additional keyword arguments for model configuration.

        Returns:
            (torch.Tensor | List[torch.Tensor]): The raw output tensor(s) from the model.
        r   r   rJ   r   )r  r  r  r   r   rc   Nr   )axis>   
THROUGHPUTro   c                 $    | j                   |<   y)z7Place result in preallocated list using userdata index.N)results)requestuserdatar  s     r4   callbackz%AutoBackend.forward.<locals>.callback  s    (/GH%rX   )r   r  )rh   zinput size  >znot equal toz max model size    uint8image
confidenceziUltralytics only supports inference of non-pipelined CoreML models exported with 'nms=False', but 'model=z6' has an NMS pipeline created by an 'nms=True' export.ry   )r   F)trainingrU   rb   quantizationr      pose      )r   rJ   r   r   r8   segmentr9   )xrh   rD   rb   r   ra   r   rr  permutere  rd  rm   r   rC   r@   numpyrv  setInputforwardrZ   ro  r   rw  runrz  r   rd   r   r{  
bind_inputrB   r   r   r   r   r   r   run_with_iobindingr|  concatenaterf  r  r  AsyncInferQueuer  set_callbackr;   start_asyncr  wait_allr#   valuesrg  r  r  r  _replacer6   resize_r  get_binding_indexr  r  r'   r  
execute_v2sortedrh  r   	fromarrayastypepredictrZ  r)   reversedrm  r  copy_from_cpur  get_output_handlecopy_to_cpurn  r   	onForwardr  r   r  Matcreate_extractorr   input_namesarrayextractrq  rp  r"   r  r@  r$  r"  serving_defaultri  r  r   constantr  int8int16r  
set_tensorinvoker  
get_tensorndimrt  r   r   	transposendarrayr   r  )rb  r  r  r  r  r  brs  hrc  yr2   r  async_queuer<   r   rd   srV   im_pil	input_var
output_varmat_inexdetailsis_intscale
zero_pointr}  ncr  s                                 @r4   r  zAutoBackend.forwardi  s   * hh2q!99U]]2B99Aq!Q'B 77dnn

2[w)5[TZ[A XX

2A XX!BHHb!  "A YY$((||VVX^^%LL$$T%6%69P9P9RST9U9Z9Z\^8_`yyB""! "		1361Ibiiooq/3yybjj/!{{} #  //8MMxxNNAaD!A$q!Tz*:AaDAt<L#MTVW XX!B""&MMHHQK&1*8
 #gg55d6L6LM((2q aA++DOORAPQE]3S^_+`a $$&NN#IAD$4Q$7#IJ //3::<= [[||DMM(,C,I,I I==LL00288D.2mmH.E.N.NUWU]U].N.^DMM(+ $ 1 1 ed+0088t||?\?\]a?b9cde 

44X>ALL221bhh?.2mmH.E.N.NUWU]U].N.^DMM(+ $ 1 1 c JJ88>d+0088t||?]?]^_?`9abc h'--A88q=wKz$,,3Tb:ccstusv"ww=+.r{{}+=Dx(LL##D););)B)B)D$EF06t7H7H0IJ1q!&&JAJ [[A""$B__b3h%6%6w%?@F

""GV#45Aq //0c1gi  QXXZ A1v{s1Q4::!3!% [[!((4B++B/NN LPL]L]^q11!4@@B^A^ XX))"-I++YK8J#-.a.A. YY[[__RUYY[%6%6%89F**, `--/2F;?EdhhF[F[F]?^_!RXXbjjmA./5__` ` [[!B

2A YY&&(.."S(009B!"tUm42$B)))4A !B6:jjDJJrEJ2djjF`F`acFd!!T*A$$tww'7'7';$<,,Q/ )bggrxx-@@(/(?%E:u*z199'':JKB  ++GG,<bA  '')"11  F((33F7ODA,2>,B)zXXbjj1J>%Gvv{ 772;!+t||aQFlOq0OaQFlOq0O#yyF2 !!Q1* 2 !!Q1* 2a!QiLA-La!QiLA-L#yyF2 !!QTT'
a
 !!QTT'
a
HHQK) , 1v{qtzz?a'Xa[)AQ4::b>Q&1A<<!l;AaDHIJ1jBJJ/QWWY>JAJ a$'4::#%499	+ASVq[qTZZ]QqTZZ]2Q66;Bi@a5n@
,/FaK4??1Q4(\Z[=\UVdooa>P=\\??1%%Q $J2 K6 _ / `` `~ K A=\sI   #{" {!.0{&{+A{5-1{0{5 3|5|0|0{55{?rV   c                     t        |t        j                        r.t        j                  |      j                  | j                        S |S )z
        Convert a numpy array to a tensor.

        Args:
            x (np.ndarray): The array to be converted.

        Returns:
            (torch.Tensor): The converted tensor
        )r"   r   r  r   tensorr   rB   )rb  rV   s     r4   r  zAutoBackend.from_numpyE  s4     3=Q

2Ku||A!!$++.RQRRrX   r   c                    ddl }| j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  f}t        |      r| j                  j                  dk7  s| j                  rzt        j                  || j                  rt        j                  nt        j                   | j                  d}t#        | j                  rdnd      D ]  }| j%                  |        yyy)z
        Warm up the model by running one forward pass with a dummy input.

        Args:
            imgsz (tuple): The shape of the dummy input tensor in the format (batch_size, channels, height, width)
        r   Nr@   )rb   rB   r   r   )r   re  r   rZ   rg  r$  ri  rq  rd  r   rB   r   r   r   rD   r   r   r;   r  )rb  r   r   warmup_typesr  _s         r4   warmupzAutoBackend.warmupQ  s     	ww$))T[[$BRBRTXT[T[]a]h]hjnjxjxx|$++"2"2e";t{{e5::\`\g\ghB1a0 !R ! @KrX   r  c                    ddl m}  |       d   }t        |       st        | t              st        | |       t        |       j                  }|D cg c]  }||v  }}|dxx   |j                  d      z  cc<   |dxx   |d    z  cc<   t        |      rd}nJdd	l
m}  ||       }t        |j                        xr% t        |j                        xr |j                  d
v }||gz   S c c}w )at  
        Take a path to a model file and return the model type.

        Args:
            p (str): Path to the model file.

        Returns:
            (List[bool]): List of booleans indicating the model type.

        Examples:
            >>> model = AutoBackend(weights="path/to/model.onnx")
            >>> model_type = model._model_type()  # returns "onnx"
        r   r   Suffixr  z.mlmodel   	   F)urlsplit>   grpchttp)r%  r   r   r"   r(   r   r   rd   endswithr   urllib.parser   boolnetlocpathscheme)	r  r   sfrd   r  typesrq  r   urls	            r4   r   zAutoBackend._model_type`  s     	?h'ayAs!3BAw||$&'qd''aDMM*--aaL u:F-1+C#**%[$sxx.[SZZK[=[Fx (s   C))FFN))r   rJ     r  )zpath/to/model.pt)__name__
__module____qualname____doc__r   no_gradrB   r   r(   r   r   r   r  r	   r   r'   r   Tensorr   r  r   r  r  r
   r  staticmethodr   __classcell__)r  s   @r4   r?   r?   F   s   =~ U]]_ ;G+u||E2+/`'sDIuxx67`' `' 	`'
 uS$Y'(`' `' `' `' `' `'J  $Z&LLZ& Z& 	Z&
 ~Z& Z& 
u||T%,,//	0Z&x
SBJJ 
S5<< 
S!E#sC"45 !T !  s  DJ    rX   r?   rT   )/r8  r   r0  r5  collectionsr   r   pathlibr   typingr   r   r   r	   r
   r   r   r  r   r   torch.nnr   PILr   ultralytics.utilsr   r   r   r   r   r   r   ultralytics.utils.checksr   r   r   r   r   ultralytics.utils.downloadsr   r   r'   r(   r5   r=   r   r?    rX   r4   <module>r     s        /  : : 
     Y Y Y m m FU4:. 4S> <0huS$Y'78 0DcN 0$z ")) z rX   