
    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        X/var/www/html/eduruby.in/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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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cpuFNTweightsdevicednnr6   fp16fuseverbosec                 F/  qr t         s|           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   r0tI        jJ                  |(d   d       }!n|rEtA        jB                  d| d       tM        d       tN        jP                  jS                  |      })n|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]                  ||+"      },ntM        g d#       t_        ta        |      jc                  d$            }tA        jB                  d| d%       ddl2}-dd&l3m4}. |-jk                         }/d|/_6        |*j]                  ||/dg"      },|,jo                         D 0cg c]  }0|0jp                   }1}0|,js                         jt                  }!t        |,jo                         d   jv                  d   t              }d'|,jy                         d   j                  v }|s|,j{                         }2g }3|,jo                         D ]  }4d'|4j                  v }5t        j|                  |4jv                  |5rt
        j~                  nt
        j                  (      j                  |      }6|2j                  |4jp                  |j                  |#r|j                  nd|5rt        j~                  nt        j                  t        |6jv                        |6j                         )       |3j                  |6        n|rPtA        jB                  d| d*       tM        d+       ddlG}7|7j                         }8d,}9t        |t              rq|j                  d-      r`|j                  d.      d/   j                         }9t        j                  d      }|9|8j                  vrtA        jZ                  d0|9 d1       d,}9ta        |      }|j                         st_        |jc                  d2            }|8j                  t        |      |j                  d3      4      }:|:j                         d   j                         j|                  r1|:j                         d   j                  |7j                  d5             |j                  d6z  }!|!j                         r<t        jF                  |!      }!|!d7   };|!j7                  d8i       j7                  d9|      };d/kD  r|rd:nd;}<|8j                  |:|9d<|<i=      }=tA        jB                  d>|< d?|; d@dAj                  |=j                  dB             dC       |=j                         j                         }>n|rHtA        jB                  d| dD       t        rt        t        dE      rtM        dF       	 ddl_}?t        |?j                  dHdI       t        |?j                  dJdKL       |j                  dk(  rt        j                  dM      }t        dNdO      }@|?j                  |?j                  j                        }At        |dP      5 }B|?j                  A      5 }C	 t(        j                  Bj                  dQ      dRS      }DtI        jJ                  |Bj                  |D      j                  dT            }!|!j7                  dUd      }E|Et)        E      C_k        Cj                  Bj                               } ddd       ddd       	 | j                         }Ft               }3g }1d}d}t#        | dX       }H|Hrt        | j                        nt        | j                        }I|ID ]5  }JHr| j                  J      }K|?j                  | j                  |K            }L| j                  |K      |?j                  j                  k(  }M|MrbdYt        | j                  K            v r0d}Fj                  Kt        | j                  |Kd      d/                Lt        j~                  k(  rd}n|1j                  K       t        Fj                  K            }Nn| j                  J      }K|?j                  | j                  |J            }L| j                  |J      }M| j                  |J      redYt        | j                  J            v r2d}Fj                  Jt        | j	                  d|J      d/                Lt        j~                  k(  rd}n|1j                  K       t        Fj                  J            }Nt        j
                  t        j|                  NL(            j                  |      }O @K|L|N|Ot)        |Oj                                     |3|K<   8 t        dZ |3j                         D              }PnR|rStA        jB                  d| d[       ddl}Q|Qj                  j                  |      } t        | j                        }!n|rutA        jB                  d| d\       ddlrd}R|Rr(rj                  j                  j                  |      nrj                  jG                  |      } ta        |      d6z  }!n|rtA        jB                  d| d]       ddlrdd^lm}S rfd_}Trj%                         j'                         }Ut        |dP      5 }BUj)                  |Bj                                ddd        TUd` S|U      a      }V	 t_        ta        |      j+                         j                  j-                  ta        |      j.                   db            }!n|s|r_	 ddclm}Wm}X |rut        |      j                  dd      r|dd nde}tA        jB                  d| df|d/d  dg       dhdidjdkt=        j>                            }Y W| X|Ydl|im      gn      }Zd}n"tA        jB                  d| do        W|p      }ZZjA                          |ZjC                         }[|ZjE                         }\	 tG        jH                  |dq      5 }]|]jK                         d   }K|]j                  |K      j                  dT      }^|Kdrk(  rtI        jJ                  ^      }!ntM        jN                  ^      }!ddd       n;|rtY        ds      |rtA        jB                  d| dt       tM        t
        j                  j                         rdun
tZ        rdvndw       ddlm}_ ta        |      }dx\  }`}a|ja                         r9t_        |j-                  dy      d      }`t_        |j-                  dz      d      }an$|jb                  d{k(  r|je                  d|      }`|}a`r"ar `j                         raj                         stg        d}| d~      _ji                  t        `      t        a            }b|#rbjk                  dd       _jm                  b      }c|cjo                  |cjq                         d         }d|cjs                         }1|d6z  }!n|rtA        jB                  d| d       tM        d       ddl}eddlqdd|ejy                         d/z   dz  d}bqj                  j{                  |bf      }fqj                  j}                  |g g |fd      })qfd}gtI        jJ                  |)j                         d         }!n|rtA        jB                  d| d       tM        tZ        rdnd       ddl}h|hj                         })|#|)j                  _        ta        |      }|j                         st_        |jc                  d            }|)j                  t        |             |)j                  t        |j                  d3                   |j                  d6z  }!n|r'tM        d       ddlm}i  |i|      } | j                  }!n|rt               st        d      tA        jB                  d| d       tM        d       ddlm}j ta        |      }|j                         st_        |j-                  d            } j       }k|kj                  t        |             |kj                          |j                  d6z  }!n!ddlm}l t        d| d |l       d    d      t        |!t        t`        f      r.ta        |!      j                         rt        jF                  |!      }!|!rt        |!t              r|!j                         D ]=  \  }m}n|mdv rt)        n      |!m<   mdv st        nt              s/t        n      |!m<   ? |!d   }|!d   }"|!d7   };|!d   }o|!d   }%|!j7                  d      }$|!j7                  d8i       j7                  dd      }|!j7                  d8i       j7                  d9|      }|!j7                  dd      }n|
s|s|	stA        jZ                  d| d       dt               vrt        |      }%t        %      }%|
r| j                         D ]	  }pd|p_         | j                  j                  t                      yc c}0w # t        $ r t        rtM        dG       ddl_}?Y 4w xY w# t        $ r Bj                  d       Y 3w xY w# 1 sw Y   xY w# 1 sw Y   xY w# t        $ r*}GtA        j                  dV|?j                   dW       Gd}G~Gww xY w# 1 sw Y   _xY w# t0        $ r Y hw xY w# t        $ rC ddlrrj8                  j4                  rj8                  j:                  j6                  }X}WY Hw xY w# 1 sw Y   xY w# tF        jP                  tR        tT        tH        jV                  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.
            fuse (bool): Fuse Conv2D + BatchNorm layers for optimization.
            verbose (bool): Enable verbose logging.
        r   )       )FF)NNNr@   F)rF   	kpt_shaperH   modulechannelsrI   T)attempt_load_weights)rB   inplacerE   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.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)modelrA   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)rb   r`   rf   r6   ptrrb   little)	byteorderzutf-8dlaz6TensorRT model exported with a different version than 
num_bindingsc              3   >   K   | ]  \  }}||j                   f  y wrS   )ry   ).0r2   ds      r4   	<genexpr>z'AutoBackend.__init__.<locals>.<genexpr>  s     'Ptq!AEE
'Ps   z 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 )NrO   )rb   )compatv1import_graph_def)gdtfs   r4   rV   zAAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>  s!    ryy||7T7TUW^`7T7a rW   )r   r   wrap_functiongraphas_graph_elementprunenestmap_structure)r   inputsoutputsrU   ger   s   `    r4   wrap_frozen_graphz/AutoBackend.__init__.<locals>.wrap_frozen_graph  sc    IILL../acefWW--wwrww44R@"''BWBWXZ\cBdeerW   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_mbrd   z for MNN inference...MNNlowCPU   )	precisionbackend	numThread)runtime_manager	rearrangec                 l    j                   j                  | j                         | j                        S rS   )exprconstdata_ptrrf   )rU   r   s    r4   torch_to_mnnz*AutoBackend.__init__.<locals>.torch_to_mnn  s"    xx~~ajjlAGG<<rW   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.>   rm   striderL   >   rn   imgszr   rJ   r   taskr   r   nmszMetadata not found for 'model=')super__init__r(   r"   r#   torchnnModule_model_typerB   cudais_availabletypeanyr   torE   hasattrrJ   r*   r'   r   rK   r   halffloatyamlgetrk   ultralytics.nn.tasksrM   torchvisionr   infojitr/   jsonloadsr   cv2rC   readNetFromONNXrZ   get_available_providersinsertwarningInferenceSessionnextr   globmct_quantizerssony_custom_layers.pytorch.nmsr^   get_ort_session_optionsenable_mem_reuseget_outputsrb   get_modelmetacustom_metadata_maprf   
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   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evallocalsr=   r5   
parametersrequires_grad__dict__update)tselfrA   rB   rC   r6   rD   rE   rF   w	nn_moduleptr   rY   xmlenginecoremlr&  pbtfliteedgetputfjspaddlemnnr   imxrknntritonnhwcr   chend2endro   rk   rW  r   r   rJ   r   rM   r   extra_filesnetrZ   r]   sessionmctqr^   session_optionsrU   output_namesiobindingsoutputout_fp16y_tensorovcorers   ov_modelrm   inference_modeov_compiled_model
input_nametrtrx   loggerfruntimemeta_lenr~   contexteis_trt10numr<   rb   r`   is_inputrf   imbinding_addrsctr$  r   r   r   frozen_funcr   r   delegateinterpreterinput_detailsoutput_detailszfcontentspdi
model_fileparams_filert   	predictorinput_handlerM  rtr   pyncnnr   r   
rknn_modelr   r0   r1   r   pr   r   	__class__st                                                                                                                    @@r4   r   zAutoBackend.__init__   sO   . 	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"v 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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]>: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 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&m
 CH  '&'@A&'$ * FF1I	B 	B 	B 	B  UVYVeVeUffhijP- -
 !   e'-/WW-@-@"''BVBVBdBd]e.> > &&ZAUAUV s  !AYAY AZ-*AZ ,A=AY?)AZ AZ-AZ: 2!A[0-AA[= 	A\ A]* 6A'A]AA]* YAY<Y;AY<Y?AZZAZ ZAZZAZ Z AZ*	Z%AZ-Z-AZ7Z:	A[-[%A[([(A[-[0A[:[=
A\\
A\\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|}
n| j                  r| j                  |      }
n| j                  rU|j                         j                         }| j                  j!                  |       | j                  j#                         }
nE| 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| jL                  d	k(  r9tA        jN                  |
d   |
d   d
d
d
d
d
f   |
d   d
d
d
d
d
f   gd      }
nc| jL                  dk(  rStA        jN                  |
d   |
d   d
d
d
d
d
f   |
d   d
d
d
d
d
f   |
d   gd      }
n| jP                  r;|j                         j                         }| jR                  dv r|j                   d   }d
g|z  fd}| jT                  jW                  | jX                        }|j[                  |       t]        |      D ]'  }|j_                  | j`                  |||dz    i|       ) |jc                          D cg c]  }te        |jg                                }
}ti        |
 D cg c]  }tA        jN                  |       }
}	nte        | jY                  |      jg                               }
	n| jj                  r| j(                  r|j                   | jJ                  d   j                   k7  r| jl                  r| jn                  jq                  d|j                          | jJ                  d   js                  |j                         | jJ                  d<   | j.                  D ]L  }| jJ                  |   jt                  jw                  tE        | jn                  jy                  |                   N n| j                  j{                  d      }| jn                  j}                  ||j                          | jJ                  d   js                  |j                         | jJ                  d<   | j.                  D ]g  }| j                  j{                  |      }| jJ                  |   jt                  jw                  tE        | jn                  j                  |                   i | jJ                  d   j                   }|j                   |k(  s(J d|j                    d| j(                  rdnd d|        t        |jG                               | j                  d<   | jn                  j                  te        | j                  jg                                      t        | j.                        D cg c]  }| jJ                  |   jt                   }
}n| j                  r|d   j                         j                         }t        j                  |dz  j                  d            }| j                  j                  d|i      }
d|
v rt        d|	 d      te        |
jg                               }
t        |
      dk(  rCt        |
d   j                         dk7  r'te        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        |td        tD        f      r|n|g}| j                  j                  |      }
nY|j                         j                         }| j                  rP| j                  r| j                  |d       n| j                  j                  |      }
t        |
td              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<   | jL                  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<   | jL                  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te        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        
td        tD        f      rt        | j                        d)k(  rg| jL                  d*k(  st        |
      dk(  rJ|
d   j                   d   |
d   j                   d   z
  dz
  }t]        |      D ci c]  }|d+| 
 c}| _w        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 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   rI   r   )r  r  r  imagesr   ra   detectNr   )axispose>   
THROUGHPUTrp   c                 $    | j                   |<   y)z7Place result in preallocated list using userdata index.N)results)requestuserdatar  s     r4   callbackz%AutoBackend.forward.<locals>.callback  s    (/GH%rW   )r   r  )rf   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.r{   )r   F)trainingrT   r`   quantizationr            )r   rI   r   r   r8   segmentr9   )yrf   rD   r`   r   r_   r   rs  permuterf  re  rk   r   rC   r@   numpyrw  setInputforwardrY   rp  ro   rx  runr{  r   rb   r   r|  
bind_inputrB   r   r   r   r   r   r   run_with_iobindingr}  r   concatenaterg  r  r  AsyncInferQueuer  set_callbackr;   start_asyncr  wait_allr#   valuesziprh  r  r  r  _replacer6   resize_r  get_binding_indexr  r  r'   r  
execute_v2sortedri  r   	fromarrayastypepredictr\  r)   reversedrn  r  copy_from_cpur  get_output_handlecopy_to_cpuro  r   	onForwardr  r   r  Matcreate_extractorr   input_namesarrayextractrr  rq  r"   r  rB  r&  r$  serving_defaultrj  r  r   constantr  int8int16r  
set_tensorinvoker  
get_tensorndimru  r   	transposendarrayr   r  )rc  r  r  r  r  r  brt  hrd  yr2   r  async_queuer<   r   rU   rb   sim_pil	input_var
output_varmat_inexdetailsis_intscale
zero_pointr~  ncr  s                                 @r4   r  zAutoBackend.forwardg  so   * 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99(!ad1a:.>!Q4Z@P'QXZ[AYY&(!ad1a:.>!Q4Z@PRSTURV'W^`aA XX!B""&MMHHQK&1*8
 #gg55d6L6LM((2q aA++DOORAPQE]3S^_+`a $$&/67!T!((*%7703Q81R^^A&88//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 880 K6 _ / `` `~ K A=\sO    }	
} }0}}A}'1}"}'-3}4"}9}>"}''}1rU   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   )rc  rU   s     r4   r  zAutoBackend.from_numpyG  s4     3=Q

2Ku||A!!$++.RQRRrW   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@   )r`   rB   r   r   )r   rf  r   rY   rh  r&  rj  rr  re  r   rB   r   r   r   rD   r   r   r;   r  )rc  r   r   warmup_typesr  _s         r4   warmupzAutoBackend.warmupS  s     	ww$))T[[$BRBRTXT[T[]a]h]hjnjxjxx|$++"2"2e";t{{e5::\`\g\ghB1a0 !R ! @KrW   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   rb   endswithr   urllib.parser  boolnetlocpathscheme)	r  r   sfrb   r  typesrr  r  urls	            r4   r   zAutoBackend._model_typeb  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   rI     r  )zpath/to/model.pt)__name__
__module____qualname____doc__r   no_gradrB   r   r(   r   r   r   r  r	   r   r   Tensorr   r  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'(^' ^' ^' ^' ^'F  $^&LL^& ^& 	^&
 ~^& ^& 
u||T%,,//	0^&@
SBJJ 
S5<< 
S!E#sC"45 !T !  s  DJ    rW   r?   rS   )/r:  r   r2  r7  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?    rW   r4   <module>r!     s        /  : : 
     Y Y Y m m FU4:. 4S> <0huS$Y'78 0DcN 0$| ")) | rW   