a
    yµÿfU{  ã                   @   sè   d dl Z d dlZd dlZd dlZd dlZd dlmZ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 d dlmZmZmZmZ d dlm Z m!Z! dd	„ Z"dd
d„Z#G dd„ dej$ƒZ%dS )é    N)ÚOrderedDictÚ
namedtuple)ÚPath)ÚImage)ÚARM64Ú	IS_JETSONÚIS_RASPBERRYPIÚLINUXÚLOGGERÚROOTÚ	yaml_load)Úcheck_requirementsÚcheck_suffixÚcheck_versionÚ
check_yaml)Úattempt_download_assetÚis_urlc              
      sÄ   t | tƒrtt| ƒƒ} t | tƒrÀdd„ |  ¡ D ƒ} t| ƒ}t|  ¡ ƒ|kr~t|› d|d › dt	|  ¡ ƒ› dt|  ¡ ƒ› dƒ‚t | d t
ƒrÀ| d  d	¡rÀttd
 ƒd ‰ ‡ fdd„|  ¡ D ƒ} | S )zw
    Check class names.

    Map imagenet class codes to human-readable names if required. Convert lists to dicts.
    c                 S   s   i | ]\}}t |ƒt|ƒ“qS © )ÚintÚstr©Ú.0ÚkÚvr   r   úV/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/nn/autobackend.pyÚ
<dictcomp>    ó    z%check_class_names.<locals>.<dictcomp>z(-class dataset requires class indices 0-é   z%, but you have invalid class indices ú-z defined in your dataset YAML.r   Zn0zcfg/datasets/ImageNet.yamlÚmapc                    s   i | ]\}}|ˆ | “qS r   r   r   ©Z	names_mapr   r   r   )   r   )Ú
isinstanceÚlistÚdictÚ	enumerateÚitemsÚlenÚmaxÚkeysÚKeyErrorÚminr   Ú
startswithr   r   )ÚnamesÚnr   r    r   Úcheck_class_names   s"    


ÿ
ÿÿr.   c                 C   sP   | r>t  t¡  tt| ƒƒd W  d  ƒ S 1 s40    Y  dd„ tdƒD ƒS )zSApplies default class names to an input YAML file or returns numerical class names.r,   Nc                 S   s   i | ]}|d |› “qS ©Úclassr   ©r   Úir   r   r   r   2   r   z'default_class_names.<locals>.<dictcomp>éç  )Ú
contextlibÚsuppressÚ	Exceptionr   r   Úrange)Údatar   r   r   Údefault_class_names-   s    .r9   c                	       sj   e Zd ZdZe ¡ de d¡ddddddf‡ fdd	„	ƒZdd
d„Zdd„ Z	ddd„Z
eddd„ƒZ‡  ZS )ÚAutoBackendaQ  
    Handles 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   |
            | NCNN                  | *_ncnn_model     |

    This class offers dynamic backend switching capabilities based on the input model format, making it easier to deploy
    models across various platforms.
    z
yolov8n.ptÚcpuFNr   Tc	           Z         s   t ƒ  ¡  tt|tƒr|d n|ƒ}	t|tjjƒ}
|  |	¡\}}}}}}}}}}}}}}||pt|pt|pt|pt|pt|
pt|M }|pŠ|pŠ|pŠ|pŠ|}d}d\}}tj	 
¡ oª|jdk}|rÐt|
||||gƒsÐt d¡}d}|sä|sä|
sät|	ƒ}	|
rj| |¡}|r|j|d}t|dƒr|j}tt|j ¡ ƒdƒ}t|dƒr@|jjn|j}|rT| ¡ n| ¡  || _d	}
nn|rüdd
lm}  | t|tƒrŽ|n|	|d	|d}t|dƒr®|j}tt|j ¡ ƒdƒ}t|dƒrÖ|jjn|j}|rê| ¡ n| ¡  || _	nÜ|rht d|	› d¡ ddi}!tjj |	|!|d}|r<| ¡ n| ¡  |!d rØt!j"|!d dd„ d}	np|r˜t d|	› d¡ t#dƒ t$j% &|	¡}"	n@|r$t d|	› d¡ t#d|r¾dndfƒ t'sÒt(rÚt#dƒ ddl)}#|rðddgndg}$|#j*|	|$d}%dd „ |% +¡ D ƒ}&|% ,¡ j-}n´|rt d|	› d!¡ t#d"ƒ ddl.}'|' /¡ }(t0|	ƒ}	|	 1¡ stt2|	 3d#¡ƒ}	|(j4t|	ƒ|	 5d$¡d%})|) 6¡ d  7¡ j8r¸|) 6¡ d  9|' :d&¡¡ |d'krÆd(nd)}*t d*|*› d+|› d,¡ |(j;|)d-d.|*id/}+|+ <¡  =¡ },|	j>d0 }nÈ|rxt d|	› d1¡ zddl?}-W n* t@y^   tArRt#d2ƒ ddl?}-Y n0 tB|-jCd3d	d4 tB|-jCd5d6d7 |jdkr–t d8¡}tDd9d:ƒ}.|- E|-jEjF¡}/tG|	d;ƒ˜}0|- H|/¡l}1z.tjI|0 Jd<¡d=d>}2t! "|0 J|2¡ Kd?¡¡}W n tLy   |0 Md¡ Y n0 |1 N|0 J¡ ¡}W d  ƒ n1 s80    Y  W d  ƒ n1 sX0    Y  z| O¡ }3W n> tPy¬ }4 z$t Qd@|-jC› dA¡ |4‚W Y d}4~4n
d}4~40 0 tRƒ }5g }&d}d}6t|dBƒ }7|7rÜtS|jTƒntS|jUƒ}8|8D ]b}9|7rˆ| V|9¡}:|- W| X|:¡¡};| Y|:¡|-jZj[k}<|<rndCt\| ]|:¡ƒv rxd	}6|3 ^|:t\| _|:d¡d' ƒ¡ |;t`jakrxd	}n
|& b|:¡ t\|3 ]|:¡ƒ}=nŽ| c|9¡}:|- W| d|9¡¡};| e|9¡}<| e|9¡rþdCt\| f|9¡ƒv rìd	}6|3 g|9t\| hd|9¡d' ƒ¡ |;t`jakrd	}n
|& b|:¡ t\|3 f|9¡ƒ}=t it`j8|=|;dD¡ |¡}>|.|:|;|=|>t|> j¡ ƒƒ|5|:< qêtRdEdF„ |5 k¡ D ƒƒ}?|5dG jld }@n`|r²t d|	› dH¡ ddlm}A|Ajn o|	¡}tp|jqƒ}n&|rt d|	› dI¡ ddlr‰ d}B|Brêˆ jsjn t|	¡n
ˆ ju  |	¡}t0|	ƒd0 }nÒ|rêt d|	› dJ¡ ddlr‰ ddKlvmw}C ‡ fdLdM„}Dˆ  x¡  y¡ }EtG|	d;ƒ}0|E z|0 J¡ ¡ W d  ƒ n1 sz0    Y  |D|EdN|C|EƒdO}Ft{ |t}¡4 t2t0|	ƒ ~¡ j> t0|	ƒj€› dP¡ƒ}W d  ƒ n1 sÜ0    Y  nî|sö|
r2zddQlm‚}Gmƒ}H W n0 t@	y:   ddlr‰ ˆ j„j‚ˆ j„j…jƒ }G}HY n0 |	r|t d|	› dR¡ dSdTdUdVœt† ‡¡  }I|G|	|H|IƒgdW}Jnt d|	› dX¡ |G|	dY}J|J ˆ¡  |J ‰¡ }K|J Š¡ }Lt{ |t‹jŒ¡` t‹ |	dZ¡2}| Ž¡ d }Mt | J|M¡ Kd?¡¡}W d  ƒ n1 
s0    Y  W d  ƒ n1 
s$0    Y  n¦|
rDt‘d[ƒ‚n”|
rüt d|	› d\¡ t#|
rhd]nd^ƒ ddl’m“}N t0|	ƒ}	|	 1¡ 
sšt2|	 d_¡ƒ}	|N ”t|	ƒt|	 5d`¡ƒ¡}O|
rÈ|Oj•daddb |N –|O¡}P|P —|P ˜¡ d ¡}Q|P ™¡ }&|	jšd' d0 }nÜ|rŒt d|	› dc¡ t#t›r ddndeƒ ddlœ}R|R ¡ }"||"jž_Ÿt0|	ƒ}	|	 1¡ s^t2|	 3df¡ƒ}	|"  t|	ƒ¡ |" tt|	 5d$¡ƒ¡ |	j>d0 }nL|r°t#dgƒ ddhl¡m¢}S |S|	ƒ}n(ddilvm£}T t¤dj|	› dk|Tƒ dl › dmƒ‚t|tt0fƒrþt0|ƒ ¥¡ rþt¦|ƒ}|r’t|tpƒr’| k¡ D ]D\}U}V|Udnv r8t|Vƒ||U< n"|Udov rt|Vtƒrt§|Vƒ||U< q|dp }|dq }W|dr }|ds }X|dt }| ¨d¡}n$|s¶|s¶|
s¶t ©du|› dv¡ dttªƒ vrÊt«|ƒ}t¬|ƒ}|rî| ­¡ D ]}Yd|Y_®qà| j¯ °tªƒ ¡ dS )wa  
        Initialize the AutoBackend for inference.

        Args:
            weights (str): Path to the model weights file. Defaults to 'yolov8n.pt'.
            device (torch.device): Device to run the model on. Defaults to CPU.
            dnn (bool): Use OpenCV DNN module for ONNX inference. Defaults to False.
            data (str | Path | optional): Path to the additional data.yaml file containing class names. Optional.
            fp16 (bool): Enable half-precision inference. Supported only on specific backends. Defaults to False.
            batch (int): Batch-size to assume for inference.
            fuse (bool): Fuse Conv2D + BatchNorm layers for optimization. Defaults to True.
            verbose (bool): Enable verbose logging. Defaults to True.
        r   é    )NNr;   F)ÚverboseÚ	kpt_shapeÚmoduleT)Úattempt_load_weights)ÚdeviceZinplaceÚfusezLoading z for TorchScript inference...z
config.txtÚ )Z_extra_filesZmap_locationc                 S   s   t |  ¡ ƒS ©N)r#   r%   ©Úxr   r   r   Ú<lambda>®   r   z&AutoBackend.__init__.<locals>.<lambda>)Úobject_hookz! for ONNX OpenCV DNN inference...zopencv-python>=4.5.4z for ONNX Runtime inference...Úonnxzonnxruntime-gpuÚonnxruntimeznumpy==1.23.5NZCUDAExecutionProviderZCPUExecutionProvider)Ú	providersc                 S   s   g | ]
}|j ‘qS r   ©Úname©r   rF   r   r   r   Ú
<listcomp>Á   r   z(AutoBackend.__init__.<locals>.<listcomp>z for OpenVINO inference...zopenvino>=2024.0.0z*.xmlz.bin)ÚmodelÚweightsZNCHWr   ÚCUMULATIVE_THROUGHPUTZLATENCYzUsing OpenVINO z mode for batch=z inference...ZAUTOZPERFORMANCE_HINT)Zdevice_nameÚconfigzmetadata.yamlz for TensorRT inference...ztensorrt>7.0.0,<=10.1.0z>=7.0.0)Úhardz<=10.1.0z5https://github.com/ultralytics/ultralytics/pull/14239)Úmsgzcuda:0ÚBinding)rM   ÚdtypeÚshaper8   ÚptrÚrbé   Úlittle)Ú	byteorderzutf-8z=ERROR: TensorRT model exported with a different version than Ú
Únum_bindingséÿÿÿÿ)rW   c                 s   s   | ]\}}||j fV  qd S rD   )rY   )r   r-   Údr   r   r   Ú	<genexpr>  r   z'AutoBackend.__init__.<locals>.<genexpr>Úimagesz for CoreML inference...z' for TensorFlow SavedModel inference...z% for TensorFlow GraphDef inference...)Ú
gd_outputsc                    sB   ˆj j ‡ ‡fdd„g ¡}|jj}| ˆj ||¡ˆj ||¡¡S )z"Wrap frozen graphs for deployment.c                      s   ˆj jjˆ ddS )NrC   rL   )ÚcompatÚv1Zimport_graph_defr   )ÚgdÚtfr   r   rG   <  r   zAAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>)re   rf   Zwrap_functionÚgraphZas_graph_elementZpruneÚnestZmap_structure)rg   ÚinputsÚoutputsrF   Úge©rh   )rg   r   Úwrap_frozen_graph:  s    z/AutoBackend.__init__.<locals>.wrap_frozen_graphzx:0)rk   rl   z_saved_model*/metadata.yaml)ÚInterpreterÚload_delegatez* for TensorFlow Lite Edge TPU inference...zlibedgetpu.so.1zlibedgetpu.1.dylibzedgetpu.dll)ÚLinuxÚDarwinÚWindows)Ú
model_pathZexperimental_delegatesz! for TensorFlow Lite inference...)ru   Úrz2YOLOv8 TF.js inference is not currently supported.z for PaddlePaddle inference...zpaddlepaddle-gpuZpaddlepaddlez	*.pdmodelz
.pdiparamsi   )Zmemory_pool_init_size_mbZ	device_idz for NCNN inference...z'git+https://github.com/Tencent/ncnn.gitÚncnnz*.paramztritonclient[all])ÚTritonRemoteModel©Úexport_formatszmodel='z9' is not a supported model format. Ultralytics supports: ZFormatz9
See https://docs.ultralytics.com/modes/predict for help.>   ÚstrideÚbatch>   r,   r>   Úimgszr{   Útaskr|   r}   r,   u-   WARNING âš ï¸ Metadata not found for 'model=ú')±ÚsuperÚ__init__r   r!   r"   ÚtorchÚnnÚModuleÚ_model_typeÚcudaZis_availableÚtypeÚanyrA   r   ÚtorB   Úhasattrr>   r'   r   r{   r?   r,   ÚhalfÚfloatrP   Zultralytics.nn.tasksr@   r
   ÚinfoÚjitÚloadÚjsonÚloadsr   Úcv2ÚdnnZreadNetFromONNXr   r   rJ   ZInferenceSessionÚget_outputsZget_modelmetaZcustom_metadata_mapZopenvinoZCorer   Úis_fileÚnextÚglobZ
read_modelÚwith_suffixZget_parametersZ
get_layoutÚemptyZ
set_layoutZLayoutZcompile_modelÚinputZget_any_nameÚparentZtensorrtÚImportErrorr	   r   Ú__version__r   ÚLoggerÚINFOÚopenZRuntimeÚ
from_bytesÚreadÚdecodeÚUnicodeDecodeErrorÚseekZdeserialize_cuda_engineZcreate_execution_contextr6   Úerrorr   r7   Znum_io_tensorsr_   Zget_tensor_nameZnptypeZget_tensor_dtypeZget_tensor_modeZTensorIOModeZINPUTÚtupleÚget_tensor_shapeÚset_input_shapeZget_tensor_profile_shapeÚnpÚfloat16ÚappendZget_binding_nameZget_binding_dtypeZbinding_is_inputÚget_binding_shapeÚset_binding_shapeZget_profile_shapeÚ
from_numpyÚdata_ptrr%   rX   ZcoremltoolsÚmodelsZMLModelr#   Zuser_defined_metadataZ
tensorflowÚkerasZ
load_modelÚsaved_modelÚultralytics.engine.exporterrd   ZGraphZas_graph_defZParseFromStringr4   r5   ÚStopIterationÚresolveÚrglobÚstemZtflite_runtime.interpreterrp   rq   ZliteZexperimentalÚplatformÚsystemZallocate_tensorsZget_input_detailsZget_output_detailsÚzipfileÚ
BadZipFileÚZipFileÚnamelistÚastÚliteral_evalÚNotImplementedErrorZpaddle.inferenceZ	inferenceZConfigZenable_use_gpuZcreate_predictorZget_input_handleZget_input_namesZget_output_namesÚparentsr   rw   ZNetÚoptZuse_vulkan_computeZ
load_paramZultralytics.utils.tritonrx   rz   Ú	TypeErrorÚexistsr   ÚevalÚgetÚwarningÚlocalsr9   r.   Ú
parametersZrequires_gradÚ__dict__Úupdate)ZÚselfrQ   rA   r“   r8   Úfp16r|   rB   r=   ÚwÚ	nn_moduleÚptrŽ   rI   ÚxmlÚengineÚcoremlr³   ÚpbZtfliteZedgetpuZtfjsÚpaddlerw   ÚtritonÚnhwcr{   rP   Úmetadatar†   r>   r,   r@   Zextra_filesÚnetrJ   rK   ÚsessionÚoutput_namesÚovÚcoreZov_modelÚinference_modeÚov_compiled_modelÚ
input_nameZtrtrV   ÚloggerÚfÚruntimeZmeta_lenÚcontextÚeÚbindingsÚdynamicÚis_trt10Únumr2   rM   rW   Zis_inputrX   ÚimÚbinding_addrsZ
batch_sizeÚctr²   rd   ro   rg   Úfrozen_funcrp   rq   ZdelegateÚinterpreterÚinput_detailsÚoutput_detailsZ	meta_fileZpdirS   Ú	predictorÚinput_handleÚpyncnnrx   rz   r   r   r~   r}   Úp©Ú	__class__rn   r   r   Q   sü   
ñ 

ÿ


ý

N





  .H
ÿ
Z



ÿ

zAutoBackend.__init__c                    s€  |j \}}}}ˆjr(|jtjkr(| ¡ }ˆjr>| dddd¡}ˆjsJˆj	r`ˆj
||||d}	nVˆjrtˆ 
|¡}	nBˆjr | ¡  ¡ }ˆj |¡ ˆj ¡ }	nˆjrÖ| ¡  ¡ }ˆj ˆjˆj ¡ d j|i¡}	nàˆjr”| ¡  ¡ }ˆjdv r~|j d }
dg|
 ‰‡fdd	„}ˆjj ˆj¡}| |¡ t|
ƒD ]&}|j ˆj!|||d … i|d
 q8| "¡  t# $dd„ ˆD ƒ¡}	nt%ˆ |¡ &¡ ƒ}	n"ˆj'r
ˆj(s¸|j ˆj)d j kr†ˆj*rˆj+ ,d|j ¡ ˆj)d j-|j dˆj)d< ˆjD ]$}ˆj)| j. /t0ˆj+ 1|¡ƒ¡ qðnnˆj
 2d¡}ˆj+ 3||j ¡ ˆj)d j-|j dˆj)d< ˆjD ]0}ˆj
 2|¡}ˆj)| j. /t0ˆj+ 4|¡ƒ¡ qTˆj)d j }|j |ksÆJ d|j › dˆj(r¶dnd› d|› ƒ‚t5| 6¡ ƒˆj7d< ˆj+ 8t%ˆj7 &¡ ƒ¡ ‡fdd„t9ˆjƒD ƒ}	n¬ˆj:r |d  ¡  ¡ }t; <|d  =d¡¡}ˆj
 >d|i¡}	d|	v rbt?d|› dƒ‚n:t@|	ƒdkr~t%|	 &¡ ƒ}	nt@|	ƒdkr¶t%tA|	 &¡ ƒƒ}	nˆjBrê| ¡  ¡  =t#jC¡}ˆjD E|¡ ˆjF ¡  ‡fdd„ˆjD ƒ}	nÌˆjGrlˆjH I|d  ¡  ¡ ¡}ˆj J¡ B‰ ˆ  Kˆj L¡ d |¡ ‡ fdd„t9ˆj ¡ ƒD ƒ}	W d  ƒ n1 s^0    Y  nJˆjMrŽ| ¡  ¡ }ˆ 
|¡}	n(| ¡  ¡ }ˆjNrØˆjOr¸ˆj
|ddnˆ 
|¡}	tP|	t%ƒsF|	g}	nnˆjQrøˆjRˆjS T|¡d}	nNˆjUd }|d  t#jVt#jWhv }|r>|d! \}}|| |  =|d  ¡}ˆjX Y|d" |¡ ˆjX Z¡  g }	ˆj[D ]à}ˆjX \|d" ¡}|rž|d! \}}| =t#jC¡| | }|j]dkr8|j d# d$kr |dd…dd…ddgf  |9  < |dd…dd…ddgf  |9  < n8|dd…ddgf  |9  < |dd…ddgf  |9  < |	 ^|¡ qdt@|	ƒdkr¨t@|	d j ƒd%krtt%tA|	ƒƒ}	|	d j d# d$kr”|	d g}	nt# _|	d d&¡|	d< d'd„ |	D ƒ}	tP|	t%t0fƒrrt@ˆj`ƒd(krDˆjad)ksðt@|	ƒdkrDt@|	d j ƒd%krd*nd+\}}|	| j d |	| j d  d% }d,d-„ t|ƒD ƒˆ_`t@|	ƒdkr`ˆ b|	d ¡S ‡fd.d„|	D ƒS ˆ b|	¡S dS )/a:  
        Runs inference on the YOLOv8 MultiBackend model.

        Args:
            im (torch.Tensor): The image tensor to perform inference on.
            augment (bool): whether to perform data augmentation during inference, defaults to False
            visualize (bool): whether to visualize the output predictions, defaults to False
            embed (list, optional): A list of feature vectors/embeddings to return.

        Returns:
            (tuple): Tuple containing the raw output tensor, and processed output for visualization (if visualize=True)
        r   é   é   r   )ÚaugmentÚ	visualizeÚembed>   Z
THROUGHPUTrR   Nc                    s   | j ˆ |< dS )z8Places result in preallocated list using userdata index.N©Úresults)ÚrequestÚuserdatarý   r   r   Úcallbacká  s    z%AutoBackend.forward.<locals>.callback)rk   r   c                 S   s   g | ]}t | ¡ ƒd  ‘qS )r   )r"   Úvalues)r   rv   r   r   r   rO   ì  r   z'AutoBackend.forward.<locals>.<listcomp>rc   )rX   zinput size ú ú>znot equal toz max model size c                    s   g | ]}ˆ j | j‘qS r   )rç   r8   rN   ©rÍ   r   r   rO     r   éÿ   Z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.c                    s   g | ]}ˆ j  |¡ ¡ ‘qS r   )rò   Zget_output_handleZcopy_to_cpurN   r  r   r   rO   !  r   c                    s$   g | ]}t  ˆ  |¡d  ¡d ‘qS )r   N)rª   ÚarrayÚextractrN   )Úexr   r   rO   )  r   F)ZtrainingrE   rW   ZquantizationÚindexr`   é   r[   )r   rù   r   rø   c                 S   s$   g | ]}t |tjƒr|n| ¡ ‘qS r   )r!   rª   ÚndarrayÚnumpyrN   r   r   r   rO   Y  r   r3   Úsegment)r   r   )r   r   c                 S   s   i | ]}|d |› “qS r/   r   r1   r   r   r   r   a  r   z'AutoBackend.forward.<locals>.<dictcomp>c                    s   g | ]}ˆ   |¡‘qS r   )r¯   rN   r  r   r   rO   b  r   )crX   rÎ   rW   r‚   r«   r‹   rØ   ZpermuterÑ   rÐ   rP   rŽ   r“   r;   r  rÚ   ZsetInputÚforwardrI   rÛ   ÚrunrÜ   Ú
get_inputsrM   rÒ   rß   rÝ   rä   ZAsyncInferQueuerà   Zset_callbackr7   Zstart_asyncrá   Zwait_allrª   Zconcatenater"   r  rÓ   rè   rç   ré   rå   r©   Ú_replacer8   Zresize_r§   r¨   Zget_binding_indexr®   r­   r   r°   rì   Z
execute_v2ÚsortedrÔ   r   Z	fromarrayZastypeZpredictrÄ   r&   ÚreversedrÖ   Zfloat32ró   Zcopy_from_cpurò   rw   rô   ZMatZcreate_extractorrš   Zinput_namesr×   r³   r²   r!   rÕ   rî   rh   Zconstantrð   Zint8Zint16rï   Z
set_tensorZinvokerñ   Z
get_tensorÚndimr¬   Z	transposer,   r~   r¯   )rÍ   rë   rú   rû   rü   ÚbÚchÚhrÏ   Úyr-   r  Zasync_queuer2   rM   ÚsZim_pilZmat_inÚdetailsZis_intÚscaleZ
zero_pointÚoutputrF   ÚipÚibÚncr   )r  rþ   rÍ   r   r  ³  sæ    $


$
$
"4
ÿÿ	
@ 



"$*  .zAutoBackend.forwardc                 C   s"   t |tjƒrt |¡ | 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‚   Ztensorr‰   rA   )rÍ   rF   r   r   r   r¯   f  s    
zAutoBackend.from_numpy©r   rù   é€  r$  c                 C   sŽ   ddl }| j| j| j| j| j| j| j| jf}t	|ƒrŠ| j
jdksF| jrŠtj|| jrXtjntj| j
dœŽ}t| jrtdndƒD ]}|  |¡ qzdS )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;   )rW   rA   rø   r   )ÚtorchvisionrÑ   rŽ   rI   rÓ   r³   rÕ   r×   rÐ   rˆ   rA   r‡   r‚   r™   rÎ   r‹   rŒ   r7   r  )rÍ   r}   r%  Zwarmup_typesrë   Ú_r   r   r   Úwarmupr  s    $"zAutoBackend.warmupúpath/to/model.ptc                    sÄ   ddl m} |ƒ d }t| ƒs2t| tƒs2t| |ƒ t| ƒj‰ ‡ fdd„|D ƒ}|d  ˆ  d¡O  < |d  |d	  M  < t	|ƒrˆd
}n2ddl
m} || ƒ}t|jƒo¸t|jƒo¸|jdv }||g S )a­  
        Takes a path to a model file and returns the model type. Possibles types are pt, jit, onnx, xml, engine, coreml,
        saved_model, pb, tflite, edgetpu, tfjs, ncnn or paddle.

        Args:
            p: path to the model file. Defaults to path/to/model.pt

        Examples:
            >>> model = AutoBackend(weights="path/to/model.onnx")
            >>> model_type = model._model_type()  # returns "onnx"
        r   ry   ZSuffixc                    s   g | ]}|ˆ v ‘qS r   r   )r   r  rL   r   r   rO   ”  r   z+AutoBackend._model_type.<locals>.<listcomp>é   z.mlmodelé   é	   F)Úurlsplit>   ZgrpcÚhttp)r´   rz   r   r!   r   r   r   rM   Úendswithrˆ   Úurllib.parser,  ÚboolÚnetlocÚpathÚscheme)rõ   rz   ZsfÚtypesr×   r,  Úurlr   rL   r   r…     s    


zAutoBackend._model_type)FFN)r#  )r(  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‚   Zno_gradrA   r   r  r¯   r'  Ústaticmethodr…   Ú__classcell__r   r   rö   r   r:   5   s&   ÷  c
 4
r:   )N)&r¿   r4   r   r¹   r»   Úcollectionsr   r   Úpathlibr   r’   r  rª   r‚   Ztorch.nnrƒ   ZPILr   Zultralytics.utilsr   r   r   r	   r
   r   r   Zultralytics.utils.checksr   r   r   r   Zultralytics.utils.downloadsr   r   r.   r9   r„   r:   r   r   r   r   Ú<module>   s"   $
