
    h                    *   S SK Jr  S SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  S SKJr  S SKrS SKrS SKrS SKJr  S SKJr  S SKJrJrJrJrJrJrJrJr  S SKJrJ r J!r!J"r"J#r#  S S	K$J%r%J&r&  S S
K'J(r(  SS jr)SSS jjr* " S S\RV                  5      r,g)    )annotationsN)OrderedDict
namedtuple)Path)Any)Image)ARM64	IS_JETSONLINUXLOGGERPYTHON_VERSIONROOTYAML	is_jetson)check_requirementscheck_suffixcheck_version
check_yamlis_rockchip)attempt_download_assetis_url)non_max_suppressionc                   [        U [        5      (       a  [        [        U 5      5      n [        U [        5      (       Ga  U R	                  5        VVs0 s H  u  p[        U5      [        U5      _M     n nn[        U 5      n[        U R                  5       5      U:  aH  [        U SUS-
   S[        U R                  5       5       S[        U R                  5       5       S35      e[        U S   [        5      (       a`  U S   R                  S5      (       aG  [        R                  " [        S-  5      S	   nU R	                  5        VVs0 s H
  u  pXU   _M     n nnU $ s  snnf s  snnf )
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   )nameskvn	names_maps        T/home/james-whalen/.local/lib/python3.13/site-packages/ultralytics/nn/autobackend.pycheck_class_namesr2      s/    %Yu%&%,1KKM:MDAQQM:Juzz|!#=a!eWDiuzz|$%Qs5::<'8&99WY  eAh$$q)<)<T)B)B		$)E"EFuMI16?Q!_E?L ; @s   !E!E'c                    U (       a#   [         R                  " [        U 5      5      S   $ [	        S5       Vs0 s H  oSU 3_M
     sn$ ! [         a     N+f = fs  snf )z
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)datais     r1   default_class_namesr:   7   s^     	99Z-.w77 %*#J/Jqqc{NJ//  		/s   !A
 A

AAc                     ^  \ rS rSrSr\R                  " 5       S\R                  " S5      SSSSS4             SU 4S jjj5       r   S           SS	 jjr	SS
 jr
SSS jjr\SSS jj5       rSrU =r$ )AutoBackendI   aB  
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(model="yolo11n.pt", device="cuda")
    >>> results = model(img)
z
yolo11n.ptcpuFNTc                N2  >^r^s [         TtU ]  5         [        U[        R                  R
                  5      nU R                  U(       a  SOU5      u  n	n
nnnnnnnnnnnnnnnXY=(       d/    U
=(       d&    U=(       d    U=(       d    U=(       d    U=(       d    U-  nU=(       d&    U=(       d    U=(       d    U=(       d    U=(       d    UnSu  nnSu  nnSu  nn [        U[        R                  5      =(       a4    [        R                  R                  5       =(       a    UR                  S:g  n!U!(       a,  [        XXUU/5      (       d  [        R                  " S5      nSn!U	(       a  [        U5      OUn"U(       d  U	(       GaQ  U(       aT  Sn	U(       a9  [        (       a  [        SS	9(       a  UR                  U5      nUR!                  US
9nUR                  U5      nOSSKJn#  U#" XUS9u  nn$['        US5      (       a  UR(                  n%[+        [-        UR.                  R+                  5       5      S5      n['        US5      (       a  UR0                  R2                  OUR2                  n&U(       a  UR5                  5       OUR7                  5         UR8                  R;                  SS5      nUR=                  5        H
  n'SU'l        M     Xl         GOU
(       a  SSK!n([D        RF                  " SU" S35        SS0n)[        RH                  RK                  U"U)US9nU(       a  UR5                  5       OUR7                  5         U)S   (       a  [L        RN                  " U)S   S S9nGOtU(       aF  [D        RF                  " SU" S35        [Q        S5        [R        RT                  RW                  U"5      n*GO'U(       d  U(       Ga  [D        RF                  " SU" S35        [Q        SU!(       a  SOS45        SSK,n+S /n,U!(       aU  S!U+R[                  5       ;   a  U,R]                  SS!5        O.[D        R^                  " S"5        [        R                  " S5      nSn![D        RF                  " S#U+R`                   S$U,S    35        U(       a  U+Rc                  U"U,S%9n-O{[Q        S&5        [e        [g        U"5      Ri                  S'5      5      n"[D        RF                  " SU" S(35        SSK5n.SS)K6J7n/  U.Rq                  5       n0SU0l9        U+Rc                  U"U0S /S%9n-U-Ru                  5        V1s/ s H  n1U1Rv                  PM     n2n1U-Ry                  5       Rz                  n[        U-Ru                  5       S   R|                  S   [~        5      nS*U-R                  5       S   R                  ;   nU(       Gd  U-R                  5       n3/ n4U-Ru                  5        H  n5S*U5R                  ;   n6[        R                  " U5R|                  U6(       a  [        R                  O[        R                  S+9R                  U5      n7U3R                  U5Rv                  UR                  U!(       a  UR                  OSU6(       a  [        R                  O[        R                  [        U7R|                  5      U7R                  5       S,9  U4R                  U75        M     GOU(       Gap  [D        RF                  " SU" S-35        [Q        S.5        SSKKn8U8R                  5       n9S/n:[        U[~        5      (       az  UR                  S05      (       ad  UR                  S15      S2   R                  5       n:[        R                  " S5      nU:U9R                  ;  a  [D        R^                  " S3U: S435        S/n:[g        U"5      n"U"R                  5       (       d  [e        U"Ri                  S55      5      n"U9R                  [        U"5      U"R                  S65      S79n;U;R                  5       S   R                  5       R                  (       a1  U;R                  5       S   R                  U8R                  S85      5        U"R                  S9-  nUR                  5       (       a=  [        RJ                  " U5      nUS:   n<UR;                  S;0 5      R;                  S<U5      nW<S2:  a	  U(       a  S=OS>n=U9R                  U;U:S?U=0S@9n>[D        RF                  " SAU= SBU< SCSDR                  U>R                  SE5      5       SF35        U>R                  5       R                  5       n?GOU(       Gao  [D        RF                  " SU" SG35        [        (       a   [        [        SH5      (       a  [Q        SI5         SSKbn@[        W@R`                  SKSSL9  [        U@R`                  SMSNSO9  UR                  S:X  a  [        R                  " SP5      n[        SQSR5      nAW@R                  U@R                  R                  5      nB[        U"SS5       nCU@R                  UB5       nD [,        R                  UCR                  ST5      SUSV9nE[L        RN                  " UCR                  UE5      R                  SW5      5      nUR;                  SXS5      nFUFb  [-        WF5      WDlm        WDR                  WCR                  5       5      nSSS5        SSS5         UR                  5       nG[        5       n4/ n2SnSn['        US[5      (       + nIUI(       a  [        UR                  5      O[        UR                  5      nJUJ GHL  nKWI(       a  UR                  WK5      nLW@R                  UR                  UL5      5      nMUR                  UL5      U@R                  R                  :H  nNUN(       af  S\[        UR                  WL5      5      ;   a1  SnWGR                  WL[        UGR                  ULS5      S2   5      5        WM[        R                  :X  a  SnOU2R                  WL5        [        WGR                  WL5      5      nOOUGR                  WK5      nLW@R                  UGR                  UK5      5      nMUGR                  UK5      nNUGR                  UK5      (       ah  S\[        UGR	                  WK5      5      ;   a2  SnWGGR                  WK[        UGR                  SUK5      S2   5      5        WM[        R                  :X  a  SnOU2R                  WL5        [        WGGR	                  WK5      5      nO[        GR                  " [        R                  " WOWMS+95      R                  U5      nPWA" WLUMUOUP[-        UPR                  5       5      5      U4UL'   GMO     [        S] U4GR                  5        5       5      nQGO!U(       a  [Q        S^5        [D        RF                  " SU" S_35        SSKnRURGR                  GR                  U"5      nUGR                  5       GR                  R                  S   R                  GR                  S`5      nG[        UGR                   5      nGOxU(       a{  [D        RF                  " SU" Sa35        SSKmsSnSUS(       a(  TsGR$                  GR                  GR'                  U"5      OTsGR(                  RK                  U"5      n[g        U"5      S9-  nGOU(       a  [D        RF                  " SU" Sb35        SSKmsSScKJnT  Us4Sd jnUTsGR/                  5       GR1                  5       nV[        U"SS5       nCUVGR3                  UCR                  5       5        SSS5        WU" WVSeWT" UV5      Sf9nW [e        [g        U"5      GR5                  5       R                  GR7                  [g        U"5      GR8                   Sg35      5      nGOU(       d  U(       Gag   SShKJnXJnY  U(       av  [        U5      R                  Si5      (       a  USS OSjn[D        RF                  " SU" SkUS2S  Sl35        SmSnSoSp.G[F        GRH                  " 5          nZWX" U"WY" UZSqU0Sr9/Ss9n[SnO [D        RF                  " SU" St35        WX" U"Su9n[W[GRK                  5         U[GRM                  5       n\U[GRO                  5       n] G[P        GRR                  " U"Sv5       n^U^GRU                  5       S   nLU^R                  UL5      R                  SW5      n_ULSw:X  a  [L        RN                  " W_5      nOG[V        GRX                  " W_5      nSSS5        GOU(       a  G[c        Sx5      eU(       Ga  [D        RF                  " SU" Sy35        [Q        [        R                  R                  5       (       a  SzOG[d        (       a  S{OS|5        SSKJn`  [g        U"5      n"Su  nanbU"GRk                  5       (       a9  [e        U"GR7                  S}5      S5      na[e        U"GR7                  S~5      S5      nbO%U"GRl                  S:X  a  U"GRo                  S5      naU"nbWa(       a1  Wb(       a*  WaR                  5       (       a  WbR                  5       (       d  G[q        SU" S35      eW`GRs                  [        Wa5      [        Wb5      5      ncU!(       a  WcGRu                  SSS9  W`GRw                  Wc5      ndUdGRy                  UdGR{                  5       S   5      neUdGR}                  5       n2U"S9-  nGOU(       a  [D        RF                  " SU" S35        [Q        S5        SSKnfSSKmrSSUfGR                  5       S2-   S-  S.ncTrR                  GR                  Uc45      ngTrR                  GR                  U"/ / UgSS9n*Ur4S jnh[L        RN                  " U*GR                  5       S   5      nGOU(       a  [D        RF                  " SU" S35        [Q        G[d        (       a  SOSSS9  SSKniUiGR                  5       n*U!U*GR                  l        [g        U"5      n"U"R                  5       (       d  [e        U"Ri                  S5      5      n"U*GR                  [        U"5      5        U*GR'                  [        U"R                  S65      5      5        U"R                  S9-  nGOU(       a'  [Q        S5        SSKJnj  Uj" U"5      nUGR                  nOU(       a  G[        5       (       d  G[        S5      e[D        RF                  " SU" S35        [Q        S5        SSKJnk  [g        U"5      n"U"R                  5       (       d  [e        U"GR7                  S5      5      n"Wk" 5       nlUlGR                  [        U"5      5        UlGR                  5         U"R                  S9-  nO!SSKJnm  G[        SU" SUm" 5       S    S35      e[        U[~        [f        45      (       a4  [g        U5      R                  5       (       a  [        RJ                  " U5      nU(       Ga  [        UG[        5      (       a  UGR                  5        HJ  u  nnnoUnS;   a  [-        Wo5      UWn'   M  WnS;   d  M$  [        Wo[~        5      (       d  M;  G[        Wo5      UWn'   ML     US   nUS   n US:   n<US   npUS   n&UR;                  S5      n%UR;                  S5      nqUR;                  S;0 5      R;                  SS5      nUR;                  S;0 5      R;                  S<U5      nUR;                  SS5      nO/U	(       d(  U(       d!  U(       d  [D        R^                  " SU" S35        SG[        5       ;  a  G[        U5      n&G[        W&5      n&U GR                  GR                  G[        5       5        gs  sn1f ! [         a    [        (       a  [Q        SJ5        SSKbn@ GNMf = f! [         a    WCR                  S5         GNRf = f! , (       d  f       GN>= f! , (       d  f       GNH= f! [         a+  nH[D        R                  " SYW@R`                   SZ35        UHeSnHAHff = f! , (       d  f       G	N= f! G[:         a     GNf = f! [         aC    SSKmsTsGRB                  GR>                  TsGRB                  GRD                  GR@                  nYnX GNf = f! , (       d  f       GN= f! G[P        GRZ                  G[\        G[^        [L        GR`                  4 a     GNEf = f)a  
Initialize the AutoBackend for inference.

Args:
    model (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.
    fuse (bool): Fuse Conv2D + BatchNorm layers for optimization.
    verbose (bool): Enable verbose logging.
 )       )FF)NNr>   FT   )jetpack)verboser   )load_checkpoint)devicefuse	kpt_shaperA   modulechannelsrB   NzLoading z for TorchScript inference...z
config.txt)_extra_filesmap_locationc                4    [        U R                  5       5      $ N)r    r"   xs    r1   <lambda>&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.4.1z sony-custom-layers[torch]>=0.3.0zonnxruntime-extensionsz*.onnxz for ONNX IMX inference...)nms_ort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)modelweightsNCHWzmetadata.yamlbatchargsdynamicCUMULATIVE_THROUGHPUTLATENCYPERFORMANCE_HINT)device_nameconfigzUsing OpenVINO z mode for batch=z inference on z, EXECUTION_DEVICESz...z 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)r`   r^   rd   r8   ptrrb   little)	byteorderzutf-8dlaz6TensorRT model exported with a different version than 
num_bindingsc              3  @   #    U  H  u  pXR                   4v   M     g 7frO   )rx   ).0r/   ds      r1   	<genexpr>'AutoBackend.__init__.<locals>.<genexpr>  s     'P?OtqEE
?Os   zcoremltools>=8.0z for CoreML inference...multiArrayTypez' for TensorFlow SavedModel inference...z% for TensorFlow GraphDef inference...)
gd_outputsc                  >^  TR                   R                  R                  U U4S j/ 5      nUR                  R                  nUR                  TR                  R                  XA5      TR                  R                  XB5      5      $ )z"Wrap frozen graphs for deployment.c                 L   > TR                   R                  R                  T SS9$ )Nr@   )r`   )compatv1import_graph_def)gdtfs   r1   rR   AAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>  s    ryy||7T7TUW^`7T7arT   )r   r   wrap_functiongraphas_graph_elementprunenestmap_structure)r   inputsoutputsrQ   ger   s   `    r1   wrap_frozen_graph/AutoBackend.__init__.<locals>.wrap_frozen_graph  s^    IILL../acefWW--wwrww44R@"''BWBWXZBdeerT   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WindowsrG   )options)
model_pathexperimental_delegatesz! for TensorFlow Lite inference...)r   rzmetadata.jsonz7Ultralytics TF.js inference is not currently supported.z for PaddlePaddle inference...zpaddlepaddle-gpuzpaddlepaddle==3.0.0zpaddlepaddle>=3.0.0z*.jsonz*.pdiparamsz
.pdiparamsz
model.jsonzPaddle model not found in z/. Both .json and .pdiparams files are required.i   )memory_pool_init_size_mbrb   z for MNN inference...MNNlowCPU   )	precisionbackend	numThread)runtime_manager	rearrangec                l   > TR                   R                  U R                  5       U R                  5      $ rO   )exprconstdata_ptrrd   )rQ   r   s    r1   torch_to_mnn*AutoBackend.__init__.<locals>.torch_to_mnn  s"    xx~~ajjlAGG<<rT   bizCodez for NCNN inference...z'git+https://github.com/Tencent/ncnn.gitncnnz	--no-deps)cmdsz*.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.>   rl   striderK   >   rm   imgszr,   	kpt_namesrI   r   taskr   r,   r   nmszMetadata not found for 'model=')super__init__r   torchnnModule_model_typerG   cudais_availabletypeanyr   r
   r   torH   ultralytics.nn.tasksrF   hasattrrI   r&   r#   r   rJ   r,   halffloatyamlget
parametersrequires_gradri   torchvisionr   infojitr+   jsonloadsr   cv2dnnreadNetFromONNXrW   get_available_providersinsertwarning__version__InferenceSessionnextr   globmct_quantizerssony_custom_layers.pytorch.nmsr\   get_ort_session_optionsenable_mem_reuseget_outputsr`   get_modelmetacustom_metadata_maprd   r$   
get_inputs
io_bindingemptyr]   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parentexistsr   compile_modeljoinget_propertyinputget_any_namer   r   tensorrtImportErrorr   r   LoggerINFOopenRuntime
from_bytesreaddecodeDLA_coreUnicodeDecodeErrorseekdeserialize_cuda_enginecreate_execution_contextr6   errorr   r7   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MLModelget_specdescriptionHasFieldr    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evallocalsr:   r2   __dict__update)uselfri   rG   r   r8   fp16rH   rE   	nn_moduleptr   rV   xmlenginecoremlr2  pbtfliteedgetputfjspaddlemnnr   imxrknntritonnhwcr   chend2endrn   rc  r   r   wrF   _rI   r,   pr   extra_filesnetrW   r[   sessionmctqr\   session_optionsrQ   output_namesiobindingsoutputout_fp16y_tensorovcorerr   ov_modelrl   inference_modeov_compiled_model
input_nametrtrw   loggerfruntimemeta_lenr}   contexteis_trt10numr9   r`   r^   is_inputrd   imbinding_addrsctr0  r   r   r   frozen_funcr   r   delegateinterpreterinput_detailsoutput_detailszfcontentspdi
model_fileparams_filers   	predictorinput_handlerY  rtr   pyncnnr   r   
rknn_modelr   r-   r.   r   r   r   r   	__class__su                                                                                                                     @@r1   r   AutoBackend.__init__   s   . 	uehhoo6	& 9R%8%	
IcITISIFIiI6IGGGfGG4
'#$ &%,,/fEJJ4K4K4MfRXR]R]afRfYCvFGG\\%(FD .0"5)U  yYq%9 % 0!JJwJ7E(@*5dKq uk**!OO	U\\--/0"5F*1%*B*BELL&&E EJJLekkm
A.B%%'"' (J 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-k.E.E-Fa	RS~VW%66qI6N"v ah/0hqc)CDE-B"&">">"@380%66q/VlUm6n,3,?,?,AB,AqAFF,ALB,,.BBH !4!4!6q!9!?!?!BCHG 2 2 4Q 7 < <<D'')%113F(FKK7H${{6<<PXu}}^c^k^kloopvwHNN#[[$*KK26&,,A3;RZZ#HNN3#+#4#4#6 #  OOH- 4 KK(1#%?@A34!779D K&#&&6+<+<W+E+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xx/1H  99X. )",,vr266y'J8=	g4S\N $ 2 2'*N; !3 !
 KK!.!11A%W[W`W`araa  AT  bU  XV  WW  WZ  [ +002??AJ KK(1#%?@Ay]>:FF"?3'&
 #//94@#//:;rs{{e#h/ ,UVGZZ

0Fa!S[[%8G"~~affQi8~LH#zz!&&*:*A*A'*JKH",,ud3C+.s8(  77A &988:
 #}HLDG"5.99H19%,,-uUEWEW?XC 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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 : ('Px~~?O'PPM 12KK(1#%=>?$II%%a(Enn&2288;@@IIJZ[G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'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#= -, %&_`` KK(1#%CDE::**,, # 5 +* +QA&0#Jxxzz!!''("3T:
"177=#94@\)[[6
;:3E3E3G3GKL_L_LaLa'*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#%;<=EEHW]dop!**,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1F1F1H1Hyy*H
8T22 (177"%a&HQKNNS]^_adSeSe"&q'HQK	 )
 h'FF#DW%EW%EW%E [1I [1Ill62.225%@Gll62.229gFGj!,B)NN;A3a@A &("'-E!%(VX&i
 CH  '5&'@A&'$ * FF1I &9%8  UVYVeVeUffhijT 
 !   e'-/WW-@-@"''BVBVBdBd]]e. -, &&ZAUAUV s  'A^9A^> %A`7A`9A<A_)5A`A`%A`/ !Aa'=AAa9 #Ab B<Ac- CA*AcD?Ac- ^>$A_&_%A_&_)A``A``A``A``
A`	`A``
A`,`/
Aa$`9&AaaAa$a'
Aa6a9AbbAbbA	AccAcc
Ac*c%Ac- c*Ac- c-3Ad$d#Ad$c           	     !  ^  UR                   u  pgpU R                  (       a.  UR                  [        R                  :w  a  UR                  5       nU R                  (       a  UR                  SSSS5      nU R                  (       d  U R                  (       a  U R                  " U4X#US.UD6n
GOU R                  (       a  U R                  U5      n
GOU R                  (       aU  UR                  5       R                  5       nU R                  R!                  U5        U R                  R#                  5       n
GOTU R$                  (       d  U R&                  (       Ga%  U R(                  (       am  UR                  5       R                  5       nU R*                  R-                  U R.                  U R*                  R1                  5       S   R2                  U05      n
GOU R4                  (       d  UR                  5       nU R6                  R9                  SUR:                  R<                  UR:                  R<                  S:X  a  UR:                  R>                  OSU R                  (       a  [@        R                  O[@        RB                  [E        UR                   5      URG                  5       S9  U R*                  RI                  U R6                  5        U RJ                  n
U R&                  (       a  U RL                  S	:X  a7  [@        RN                  " U
S   U
S   S
S
2S
S
2S
4   U
S   S
S
2S
S
2S
4   /SS9n
GOWU RL                  S:X  a9  [@        RN                  " U
S   U
S   S
S
2S
S
2S
4   U
S   S
S
2S
S
2S
4   U
S   /SS9n
GOU RP                  (       GaC  UR                  5       R                  5       nU RR                  S;   a  UR                   S   nS
/U-  m U 4S jnU RT                  RW                  U RX                  5      nUR[                  U5        []        U5       H$  nUR_                  U R`                  XUS-    0US9  M&     URc                  5         T  Vs/ s H  n[e        URg                  5       5      PM     n
n[i        U
6  Vs/ s H  n[@        RN                  " U5      PM     n
nG
O[e        U RY                  U5      Rg                  5       5      n
G
OU Rj                  (       Ga  U R(                  (       Ga  UR                   U RJ                  S   R                   :w  Ga  U Rl                  (       a  U Rn                  Rq                  SUR                   5        U RJ                  S   Rs                  UR                   S9U RJ                  S'   U R.                   HM  nU RJ                  U   Rt                  Rw                  [E        U Rn                  Ry                  U5      5      5        MO     OU R                  R{                  S5      nU Rn                  R}                  XR                   5        U RJ                  S   Rs                  UR                   S9U RJ                  S'   U R.                   Hh  nU R                  R{                  U5      nU RJ                  U   Rt                  Rw                  [E        U Rn                  R                  U5      5      5        Mj     U RJ                  S   R                   nUR                   U:X  d-   SUR                    SU R(                  (       a  SOS SU 35       e[        URG                  5       5      U R                  S'   U Rn                  R                  [e        U R                  Rg                  5       5      5        [        U R.                  5       Vs/ s H  nU RJ                  U   Rt                  PM     n
nGOU R                  (       GaK  UR                  5       R                  5       nU R(                  (       a  UR                  SSSS5      nO+[        R                  " US   S-  R                  S5      5      nU R                  R                  SU05      n
SU
;   a_  SSKJJKn  U" U
S   XX//-  5      nU
S   R                  SSS9n[@        RN                  " U[@        R                  " U
S   USS9U4S5      S
   n
O[e        U
Rg                  5       5      n
[        U
5      S:X  a0  [        U
S   R                   5      S:w  a  [e        [        U
5      5      n
GOeU R                  (       a  UR                  5       R                  5       R                  [@        RB                  5      nU R                  R                  U5        U R                  R-                  5         U R.                   Vs/ s H,  nU R                  R                  U5      R                  5       PM.     n
nGOU R                  (       aO  U R                  U5      nU R                  R                  U/5      nU Vs/ s H  nUR                  5       PM     n
nGO?U R                  (       a  U R                  R                  US   R                  5       R                  5       5      nU R                  R                  5        nUR                  U R                  R                  5       S   U5        [        U R                  R/                  5       5       Vs/ s H.  n[@        R                  " UR                  U5      S   5      S
   PM0     n
nS
S
S
5        GOFU R                  (       a1  UR                  5       R                  5       nU R                  U5      n
GOU R                  (       ak  UR                  5       R                  5       S-  R                  S5      n[        U[d        [D        45      (       a  UOU/nU R                  R                  US 9n
GOUR                  5       R                  5       nU R                  (       aV  U R                  (       a  U R                  US!S"9OU R                  R                  U5      n
[        U
[d        5      (       d  U
/n
GOIU R                  (       a*  U R                  U R                  R                  U5      S#9n
GOU R                  S   nUS$   [@        R                  [@        R                  1;   nU(       a"  US%   u  nnUU-  U-   R                  US$   5      nU R                  R                  US&   U5        U R                  R                  5         / n
U R                   GHd  nU R                  R                  US&   5      nU(       a-  US%   u  nnUR                  [@        RB                  5      U-
  U-  nUR                  S:X  a  UR                   S   S':X  d  U R                  (       ak  US
S
2S
S
2SS/4==   U	-  ss'   US
S
2S
S
2SS/4==   U-  ss'   U RL                  S:X  a.  US
S
2S
S
2S'S
S24==   U	-  ss'   US
S
2S
S
2S(S
S24==   U-  ss'   O^US
S
2SS/4==   U	-  ss'   US
S
2SS/4==   U-  ss'   U RL                  S:X  a(  US
S
2S)S
S24==   U	-  ss'   US
S
2S'S
S24==   U-  ss'   U
R                  U5        GMg     [        U
5      S:X  aj  [        U
S   R                   5      S:w  a  [e        [        U
5      5      n
U
S   R                   S   S':X  a  U
S   /n
O[@        R                  " U
S   S*5      U
S'   U
 Vs/ s H4  n[        U[@        R                  5      (       a  UOUR                  5       PM6     n
n[        W
[d        [D        45      (       a  [        U R                  5      S+:X  ak  U RL                  S,:X  d  [        U
5      S:X  aL  U
S   R                   S   U
S   R                   S   -
  S-
  n[]        U5       Vs0 s H  oS-U 3_M
     snU lz        [        U
5      S:X  a  U R                  U
S   5      $ U
 Vs/ s H  nU R                  U5      PM     sn$ U R                  U
5      $ s  snf s  snf s  snf s  snf s  snf s  snf ! , (       d  f       GN"= fs  snf s  snf s  snf ).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   rB   r   )augment	visualizeembedimagesr   r_   detectNr   )axispose>   
THROUGHPUTro   c                $   > U R                   TU'   g)z7Place result in preallocated list using userdata index.N)results)requestuserdatar  s     r1   callback%AutoBackend.forward.<locals>.callback  s    (/GH%rT   )r   r  )rd   zinput size rZ   >znot equal toz max model size    uint8image
confidence)	xywh2xyxycoordinatesT)keepdimsrz   )r   F)trainingrP   r^   quantizationr         rC   )r   rB   r   r   r4   segmentr5   )|rd   rn  r^   r   r]   r   r}  permuterp  ro  ri   r   r   r>   numpyr  setInputforwardrV   rz  rn   r  runr  r   r`   r   r  
bind_inputrG   r   r   r   r   r   r   run_with_iobindingr  r   concatenaterq  r  r  AsyncInferQueuer  set_callbackr7   start_asyncr  wait_allr   valuesziprr  r  r  r  _replacer8   resize_r  get_binding_indexr%  r$  r#   r  
execute_v2sortedrs  	transposer   	fromarrayastypepredictultralytics.utils.opsr  argmaxtake_along_axisr%   reversedrx  r  copy_from_cpur  get_output_handlecopy_to_cpury  r   	onForwardr  r   r  Matcreate_extractorr  input_namesarrayextractr|  r{  r   r  rN  r2  r0  serving_defaultrt  r  r   constantr  int8int16r  
set_tensorinvoker  
get_tensorndimr  r   ndarrayr,   r'  )!rm  r  r  r  r  kwargsbr~  hr  yr/   r  async_queuer9   r   rQ   r`   sr  boxcls	input_var
output_varmat_inexdetailsis_intscale
zero_pointr  ncr  s!                                   @r1   r  AutoBackend.forwardc  s   * hhq99U]]2B99Aq!Q'B 77dnn

2[w5[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99(!ad1a:.>!Q4Z@P'QXZ[AYY&(!ad1a:.>!Q4Z@PRSTURV'W^`aA XXX!B""&MMHHQK&1*8
 #gg55d6L6LM((2qA++DOORAPQE]3S^_+` " $$&/67w!T!((*%w703Q81R^^A&8//3::<= [[[|||DMM(,C,I,I I==LL00288D.2mmH.E.N.NUWU]U].N.^DMM(+ $ 1 1d+0088t||?\?\]a?b9cd !2 

44X>ALL221hh?.2mmH.E.N.NUWU]U].N.^DMM(+ $ 1 1 JJ88>d+0088t||?]?]^_?`9ab !2 h'--A88q=wKz$,,3Tb:ccstusv"ww=+.r{{}+=Dx(LL##D););)B)B)D$EF06t7H7H0IJ0I1q!&&0IAJA [[[!B||\\!Q1-__beck%9%9'%BC

""GR=1Aq ;- 0Q1L> ABo,,Q,>NNC););AlOSWX)Y[^#_abcdhi$1v{s1Q4::!3!% [[!((4B++B/NN LPL]L]^L]q11!4@@BL]A^A XX))"-I++YK8J#-.:a: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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1F((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) 2, 1v{qtzz?a'Xa[)AQ4::b>Q&1A<<!l;AaDHIJ1jBJJ//QWWY>AJ a$''4::#%499	+ASVq[qTZZ]QqTZZ]2Q66;Bi@i5ni@
,/FaK4??1Q4(\Z[=\Z[UVdooa>PZ[=\\??1%%Q 880 K6 _ / ` -,~ K A=\s`   #AB AB$#AB73AB0AB3AAB 5AB;AB ;AB2@AB7AAB<BAB B 
AB/c                    [        U[        R                  5      (       a/  [        R                  " U5      R                  U R                  5      $ U$ )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   rG   )rm  rQ   s     r1   r'  AutoBackend.from_numpyC  s7     3=Q

2K2Ku||A!!$++.RQRRrT   c                   U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  4n[        U5      (       a  U R                  R                  S:w  d  U R                  (       a  [        R                  " XR                  (       a  [        R                  O[        R                  U R                  S.6n[!        U R                  (       a  SOS5       HV  nU R#                  U5        [        R$                  " SSSU R                  S9nUSS2SS	24==   US
   -  ss'   ['        U5        MX     ggg)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>   )r^   rG   r   r   T      )rG   Nrz   r   )rp  r   rV   rr  r2  rt  r|  ro  r   rG   r   r   r   rn  r   r   r7   r  randr   )rm  r   warmup_typesr  r  warmup_boxess         r1   warmupAutoBackend.warmupO  s     ww$))T[[$BRBRTXT[T[]a]h]hjnjxjxx|$++"2"2e";t{{e5::\`\g\ghB1a0R $zz!RDKKHQU#uRy0##L1	 1 @KrT   c                   SSK Jn  U" 5       S   n[        U 5      (       d   [        U [        5      (       d  [        X5        [        U 5      R                  nU Vs/ s H  oDU;   PM	     nnUS==   UR                  S5      -  ss'   US==   US   (       + -  ss'   [        U5      (       a  SnOUSS	K
Jn  U" U 5      n[        UR                  5      =(       a+    [        UR                  5      =(       a    UR                  S
;   nXV/-   $ s  snf )a*  
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(model="path/to/model.onnx")
    >>> model_type = model._model_type()  # returns "onnx"
r   r   SuffixrC   z.mlmodel   	   F)urlsplit>   grpchttp)r3  r   r   r   r$   r   r   r`   endswithr   urllib.parser  boolnetlocpathscheme)	r  r   sfr`   r   typesr|  r  urls	            r1   r   AutoBackend._model_type_  s     	?h'ayyAs!3!3Aw||$&'BqdB'aDMM*--aaL u::F-1+C#**%[$sxx.[SZZK[=[Fx (s   D)ri   r,   )ri   zstr | torch.nn.ModulerG   ztorch.devicer   r!  r8   str | Path | Nonern  r!  rH   r!  rE   r!  )FFN)r  torch.Tensorr  r!  r  r!  r  zlist | Noner  r   returnz!torch.Tensor | list[torch.Tensor])rQ   z
np.ndarrayr+  r*  ))r   rB     r,  )r   ztuple[int, int, int, int]r+  None)zpath/to/model.pt)r  r$   r+  z
list[bool])__name__
__module____qualname____firstlineno____doc__r   no_gradrG   r   r  r'  r  staticmethodr   __static_attributes____classcell__)r  s   @r1   r<   r<   I   s   =~ ]]_ (4$||E2"&W'$W' W' 	W'
  W' W' W' W' W'x !^&^& ^& 	^&
 ^& ^& 
+^&@
S2     rT   r<   )r,   zlist | dictr+  dict[int, str]rO   )r8   r)  r+  r7  )-
__future__r   rF  r   r>  rC  collectionsr   r   pathlibr   typingr   r   r  r   r   torch.nnr   PILr   ultralytics.utilsr	   r
   r   r   r   r   r   r   ultralytics.utils.checksr   r   r   r   r   ultralytics.utils.downloadsr   r   ultralytics.utils.nmsr   r2   r:   r   r<    rT   r1   <module>rC     s_    # 
    /   
     d d d m m F 5<0$v ")) v rT   