
    .h                    $   d dl m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 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mZ d dlmZm Z m!Z!m"Z"m#Z# d d	l$m%Z%m&Z& d d
l'm(Z( ddZ)dddZ* G d dejV                        Z,y)    )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                   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   )nameskvn	names_maps        X/var/www/html/ai-service/venv/lib/python3.12/site-packages/ultralytics/nn/autobackend.pycheck_class_namesr2      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c                    | 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)datais     r1   default_class_namesr:   7   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 fd       Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZdd	Z	ddd
Z
edd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(model="yolo11n.pt", device="cuda")
        >>> results = model(img)
    z
yolo11n.ptcpuFNTc                .  rs t         t|           t        |t        j                  j
                        }| j                  |rdn|      \  }	}
}}}}}}}}}}}}}}}||	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}!|	rt        |      n|}"|s|	r7|rKd}	|r5t        rt        d	      r|j                  |      }|j!                  |
      }|j                  |      }nddlm}#  |#|||      \  }}$t'        |d      r|j(                  }%t+        t-        |j.                  j+                               d      }t'        |d      r|j0                  j2                  n|j2                  }&|r|j5                         n|j7                          |j8                  j;                  dd      }|j=                         D ]	  }'d|'_         || _         n|
rddl!}(tE        jF                  d|" d       ddi})t        jH                  jK                  |"|)|      }|r|j5                         n|j7                          |)d   rtM        jN                  |)d   d       }np|rEtE        jF                  d|" d       tQ        d       tR        jT                  jW                  |"      }*n)|s|rtE        jF                  d|" d       tQ        d|!rdndf       ddl,}+d g},|!rQd!|+j[                         v r|,j]                  dd!       n,tE        j^                  d"       t        j                  d      }d}!tE        jF                  d#|+j`                   d$|,d           |r|+jc                  |"|,%      }-n}tQ        d&       te        tg        |"      ji                  d'            }"tE        jF                  d|" d(       ddl5}.dd)l6m7}/ |.jq                         }0d|0_9        |+jc                  |"|0d g%      }-|-ju                         D 1cg c]  }1|1jv                   }2}1|-jy                         jz                  }t        |-ju                         d   j|                  d   t~              }d*|-j                         d   j                  v }|sT|-j                         }3g }4|-ju                         D ]  }5d*|5j                  v }6t        j                  |5j|                  |6rt        j                  nt        j                  +      j                  |      }7|3j                  |5jv                  |j                  |!r|j                  nd|6rt        j                  nt        j                  t        |7j|                        |7j                         ,       |4j                  |7        nB|rPtE        jF                  d|" d-       tQ        d.       ddlK}8|8j                         }9d/}:t        |t~              rq|j                  d0      r`|j                  d1      d2   j                         }:t        j                  d      }|:|9j                  vrtE        j^                  d3|: d4       d/}:tg        |"      }"|"j                         ste        |"ji                  d5            }"|9j                  t        |"      |"j                  d6      7      };|;j                         d   j                         j                  r1|;j                         d   j                  |8j                  d8             |"j                  d9z  }|j                         r<t        jJ                  |      }|d:   }<|j;                  d;i       j;                  d<|      }<d2kD  r|rd=nd>}=|9j                  |;|:d?|=i@      }>tE        jF                  dA|= dB|< dCdDj                  |>j                  dE             dF       |>j                         j                         }?n|rJtE        jF                  d|" dG       t        rt        t        dH      rtQ        dI       	 ddlb}@t        @j`                  dKdL       t        |@j`                  dMdNO       |j                  dk(  rt        j                  dP      }t        dQdR      }A@j                  |@j                  j                        }Bt        |"dS      5 }C@j                  B      5 }D	 t,        j                  Cj                  dT      dUV      }EtM        jN                  |Cj                  |E      j                  dW            }|j;                  dXd      }F|Ft-        F      D_m        Dj                  Cj                               }ddd       ddd       	 |j                         }Gt               }4g }2d}d}t'        |d[       }I|Irt        |j                        nt        |j                        }J|JD ]7  }KIr|j                  K      }L@j                  |j                  |L            }M|j                  |L      |@j                  j                  k(  }N|Nrcd\t        |j                  L            v r1d}Gj                  Lt        |j                  |Ld      d2                Mt        j                  k(  rd}n|2j                  L       t        Gj                  L            }On|j                  K      }L@j                  |j                  |K            }M|j                  |K      }N|j                  |K      red\t        |j	                  K            v r2d}Gj                  Kt        |j                  d|K      d2                Mt        j                  k(  rd}n|2j                  L       t        Gj	                  K            }Ot        j                  t        j                  OM+            j                  |      }P AL|M|O|Pt-        |Pj                                     |4|L<   : t        d] |4j                         D              }Qn|rtQ        d^       tE        jF                  d|" d_       ddl}R|Rj                  j                  |"      }|j                         j                  j                  d   j                  j                  d`      }t        |j                         }n|rutE        jF                  d|" da       ddlsd}S|Sr(sj$                  j                  j'                  |"      nsj(                  jK                  |"      }tg        |"      d9z  }n|rtE        jF                  d|" db       ddlsddclm}T sfdd}Usj/                         j1                         }Vt        |"dS      5 }CVj3                  |Cj                                ddd        UVde T|V      f      }W	 te        tg        |"      j5                         j                  j7                  tg        |"      j8                   dg            }n|s|r_	 ddhlm}Xm}Y |rut        |      j                  di      r|dd ndj}tE        jF                  d|" dk|d2d  dl       dmdndodptG        jH                            }Z X|" Y|Zdq|ir      gs      }[d}n"tE        jF                  d|" dt        X|"u      }[[jK                          |[jM                         }\|[jO                         }]	 tQ        jR                  |"dv      5 }^|^jU                         d   }L|^j                  |L      j                  dW      }_|Ldwk(  rtM        jN                  _      }ntW        jX                  _      }ddd       n=|rtc        dx      |rtE        jF                  d|" dy       tQ        t        j                  j                         rdzn
td        rd{nd|       ddlm}` tg        |"      }"d\  }a}b|"jk                         r9te        |"j7                  d}      d      }ate        |"j7                  d~      d      }bn$|"jl                  dk(  r|"jo                  d      }a|"}bar"br aj                         rbj                         stq        d|" d      `js                  t        a      t        b            }c|!rcju                  dd       `jw                  c      }d|djy                  |dj{                         d         }e|dj}                         }2|"d9z  }n|rtE        jF                  d|" d       tQ        d       ddl}fddlrdd|fj                         d2z   dz  d}crj                  j                  |cf      }grj                  j                  |"g g |gd      }*rfd}htM        jN                  |*j                         d         }n|rtE        jF                  d|" d       tQ        td        rdndd       ddl}i|ij                         }*|!|*j                  _        tg        |"      }"|"j                         ste        |"ji                  d            }"|*j                  t        |"             |*j'                  t        |"j                  d6                   |"j                  d9z  }n|r'tQ        d       ddlm}j  |j|"      }|j                  }n|rt               st        d      tE        jF                  d|" d       tQ        d       ddlm}k tg        |"      }"|"j                         ste        |"j7                  d            }" k       }l|lj                  t        |"             |lj                          |"j                  d9z  }n!ddlm}m t        d|" d |m       d    d      t        |t~        tf        f      r.tg        |      j                         rt        jJ                  |      }|rt        |t              r|j                         D ]=  \  }n}o|ndv rt-        o      |n<   ndv st        ot~              s/t        o      |n<   ? |d   }|d   } |d:   }<|d   }p|d   }&|j;                  d      }%|j;                  d      }q|j;                  d;i       j;                  dd      }|j;                  d;i       j;                  d<|      }|j;                  dd      }n|	s|s|stE        j^                  d|" d       dt               vrt        |      }&t        &      }&| j                  j                  t                      yc c}1w # t        $ r t        rtQ        dJ       ddlb}@Y xw xY w# t        $ r Cj                  d       Y ww xY w# 1 sw Y   ^xY w# 1 sw Y   cxY w# t        $ r*}HtE        j                  dY@j`                   dZ       Hd}H~Hww xY w# 1 sw Y   SxY w# t:        $ r Y Zw xY w# t        $ rC ddlssjB                  j>                  sjB                  jD                  j@                  }Y}XY <w xY w# 1 sw Y   xY w# tP        jZ                  t\        t^        tL        j`                  f$ r Y w xY w)ao  
        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_shaper@   modulechannelsrA   NzLoading z for TorchScript inference...z
config.txt)_extra_filesmap_locationc                4    t        | j                               S N)r    r"   xs    r1   <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)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\   rb   r8   ptrrb   little)	byteorderzutf-8dlaz6TensorRT model exported with a different version than 
num_bindingsc              3  >   K   | ]  \  }}||j                   f  y wrN   )rv   ).0r/   ds      r1   	<genexpr>z'AutoBackend.__init__.<locals>.<genexpr>  s     'Ptq!AEE
'Ps   zcoremltools>=8.0z for CoreML inference...multiArrayTypez' 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 )Nr?   )r^   )compatv1import_graph_def)gdtfs   r1   rQ   zAAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>  s!    ryy||7T7TUW^`7T7a rR   )r   r   wrap_functiongraphas_graph_elementprunenestmap_structure)r   inputsoutputsrP   ger   s   `    r1   wrap_frozen_graphz/AutoBackend.__init__.<locals>.wrap_frozen_graph  sc    IILL../acefWW--wwrww44R@"''BWBWXZ\cBdeerR   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WindowsrF   )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_mbr`   z for MNN inference...MNNlowCPU   )	precisionbackend	numThread)runtime_manager	rearrangec                l    j                   j                  | j                         | j                        S rN   )exprconstdata_ptrrb   )rP   r   s    r1   torch_to_mnnz*AutoBackend.__init__.<locals>.torch_to_mnn  s"    xx~~ajjlAGG<<rR   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.>   rj   striderJ   >   rk   imgszr,   	kpt_namesrH   r   taskr   r,   r   nmszMetadata not found for 'model=')super__init__r   torchnnModule_model_typerF   cudais_availabletypeanyr   r
   r   torG   ultralytics.nn.tasksrE   hasattrrH   r&   r#   r   rI   r,   halffloatyamlget
parametersrequires_gradrg   torchvisionr   infojitr+   jsonloadsr   cv2dnnreadNetFromONNXrU   get_available_providersinsertwarning__version__InferenceSessionnextr   globmct_quantizerssony_custom_layers.pytorch.nmsrZ   get_ort_session_optionsenable_mem_reuseget_outputsr^   get_modelmetacustom_metadata_maprb   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selfrg   rF   r   r8   fp16rG   rD   	nn_moduleptr   rT   xmlenginecoremlr,  pbtfliteedgetputfjspaddlemnnr   imxrknntritonnhwcr   chend2endrl   r]  r   r   wrE   _rH   r,   pr   extra_filesnetrU   rY   sessionmctqrZ   session_optionsrP   output_namesiobindingsoutputout_fp16y_tensorovcorerp   ov_modelrj   inference_modeov_compiled_model
input_nametrtru   loggerfruntimemeta_lenr{   contexteis_trt10numr9   r^   r\   is_inputrb   imbinding_addrsctr*  r   r   r   frozen_funcr   r   delegateinterpreterinput_detailsoutput_detailszfcontentspdi
model_fileparams_filerq   	predictorinput_handlerS  rtr   pyncnnr   r   
rknn_modelr   r-   r.   r   r   r   r   	__class__su                                                                                                                     @@r1   r   zAutoBackend.__init__   s   . 	uehhoo6	& 9R%8%	
IcITISIFIiI6IGGGfGG4
'#$ &%,,/fEJJ4K4K4MfRXR]R]afRfYCvFG\\%(FD .0"5)U  Yq%9 % 0!JJwJ7E(@*5dKq 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-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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 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$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::**, #  +* +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]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1F1F1Hyy*H
8T2 ( *177"%a&HQKNNS]^_adSe"&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  '&'@A&'$ * FF1I	B 	B 	B 	B  UVYVeVeUffhijT- -
 !   e'-/WW-@-@"''BVBVBdBd]e.> > &&ZAUAUV s  AW>(AX =AYAY	A=AX(AY	-AY>AY# '!AZ"AAZ& >AZ7 A\ +A'A\@A\ XAX%X$AX%X(AYYAY	YAYYAY	Y	AY	YAYYAY Y#	AZY,%AZZAZZAZ#Z&
AZ4Z3AZ4Z7AA\\A\\A\\A\ \2A]	]A]	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#                         }
n| j$                  s| j&                  r| j(                  rl|j                         j                         }| j*                  j-                  | j.                  | j*                  j1                         d   j2                  |i      }
n| j4                  s|j                         }| j6                  j9                  d|j:                  j<                  |j:                  j<                  dk(  r|j:                  j>                  nd| j                  rt@        j                  nt@        jB                  tE        |j                         |jG                                | j*                  jI                  | j6                         | jJ                  }
| j&                  r#| jL                  d	k(  r9tA        jN                  |
d   |
d   d
d
d
d
d
f   |
d   d
d
d
d
d
f   gd      }
n| jL                  dk(  rtA        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                  |       }
}
npte        | jY                  |      jg                               }

nF| 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                   }
}ng| j                  rI|j                         j                         }| j(                  r|j                  dddd      }n*t        j                  |d   dz  j                  d            }| j                  j                  d|i      }
d|
v reddlJmK}  ||
d   |	||	|ggz        }|
d   j                  dd      }tA        jN                  |tA        j                  |
d   |d      |fd      d
   }
n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}| _z        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   rA   r   )augment	visualizeembedimagesr   r]   detectNr~   )axispose>   
THROUGHPUTrm   c                $    | j                   |<   y)z7Place result in preallocated list using userdata index.N)results)requestuserdatar  s     r1   callbackz%AutoBackend.forward.<locals>.callback  s    (/GH%rR   )r   r  )rb   zinput size rX   >znot equal toz max model size    uint8image
confidence)	xywh2xyxycoordinatesT)keepdimsrx   )r   F)trainingrO   r\   quantizationr         rB   )r   rA   r   r   r4   segmentr5   )|rb   rh  r\   r   r[   r   rw  permuterj  ri  rg   r   r   r=   numpyr~  setInputforwardrT   rt  rl   r  runr  r   r^   r   r  
bind_inputrF   r   r   r   r   r   r   run_with_iobindingr  r   concatenaterk  r  r  AsyncInferQueuer  set_callbackr7   start_asyncr  wait_allr   valuesziprl  r  r  r  _replacer8   resize_r  get_binding_indexr  r  r#   r  
execute_v2sortedrm  	transposer   	fromarrayastypepredictultralytics.utils.opsr  argmaxtake_along_axisr%   reversedrr  r  copy_from_cpur  get_output_handlecopy_to_cpurs  r   	onForwardr	  r   r  Matcreate_extractorr   input_namesarrayextractrv  ru  r   r  rH  r,  r*  serving_defaultrn  r  r   constantr  int8int16r  
set_tensorinvoker  
get_tensorndimry  r   ndarrayr,   r!  )!rg  r  r  r  r  kwargsbrx  hrz  yr/   r  async_queuer9   r   rP   r^   sr  boxcls	input_var
output_varmat_inexdetailsis_intscale
zero_pointr  ncr  s!                                   @r1   r  zAutoBackend.forwardc  s   * hh2q!99U]]2B99Aq!Q'B 77dnn

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

2A XX!BHHb!  "A YY$((||VVX^^%LL$$T%6%69P9P9RST9U9Z9Z\^8_`yyB""! "		1361Ibiiooq/3yybjj/!{{} #  //8MMxx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 [[!B||\\!Q1-__beck%9%9'%BC

""GR=1Aq ;- 0Q1aL> ABo,,Q,>NNC););AlOSWX)Y[^#_abcdhi$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,16)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   rF   )rg  rP   s     r1   r!  zAutoBackend.from_numpyC  s4     3=Q

2Ku||A!!$++.RQRRrR   c                   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  f}t        |      r| j                  j                  dk7  s| j                  rt        j                  || j                  rt        j                  nt        j                  | j                  d}t!        | j                  rdnd      D ]W  }| j#                  |       t        j$                  ddd| j                        }|dddd	fxx   |d
   z  cc<   t'        |       Y 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=   )r\   rF   r   r   T      )rF   Nrx   r~   )rj  r   rT   rl  r,  rn  rv  ri  r   rF   r   r   r   rh  r   r   r7   r  randr   )rg  r   warmup_typesr  r{  warmup_boxess         r1   warmupzAutoBackend.warmupO  s     ww$))T[[$BRBRTXT[T[]a]h]hjnjxjxx|$++"2"2e";t{{e5::\`\g\ghB1a0 2R $zz!RDKKHQU#uRy0##L1	2 @KrR   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 )ar  
        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   SuffixrB   z.mlmodel   	   F)urlsplit>   grpchttp)r-  r   r   r   r$   r   r   r^   endswithr   urllib.parser  boolnetlocpathscheme)	r|  r   sfr^   r  typesrv  r  urls	            r1   r   zAutoBackend._model_type_  s     	?h'ayAs!3BAw||$&'qd''aDMM*--aaL u:F-1+C#**%[$sxx.[SZZK[=[Fx (s   C))rg   zstr | torch.nn.ModulerF   ztorch.devicer   r  r8   str | Path | Nonerh  r  rG   r  rD   r  )FFN)r  torch.Tensorr  r  r  r  r  zlist | Noner  r   returnz!torch.Tensor | list[torch.Tensor])rP   z
np.ndarrayr  r  ))r   rA     r   )r   ztuple[int, int, int, int]r  None)zpath/to/model.pt)r|  r$   r  z
list[bool])__name__
__module____qualname____doc__r   no_gradrF   r   r  r!  r  staticmethodr   __classcell__)r  s   @r1   r<   r<   I   s   =~ U]]_ (4+u||E2"&W'$W' W' 	W'
  W' W' W' W' W'x !^&^& ^& 	^&
 ^& ^& 
+^&@
S2     rR   r<   )r,   zlist | dictr  dict[int, str]rN   )r8   r  r  r)  )-
__future__r   r@  r   r8  r=  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<    rR   r1   <module>r5     s_    # 
    /   
     d d d m m F 5<0$v ")) v rR   