Ë
    FêñiD;  ã                  óÜ   — d dl mZ d dlmZ d dlmZ d dlZd dlZd dl	m
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mZmZmZmZmZmZmZ dd	„Zddd
„Z  G d„ de
jB                  «      Z"y)é    )Úannotations)ÚPath)ÚAnyN)Úcheck_suffix)Úis_urlé   )ÚAxeleraBackendÚCoreMLBackendÚExecuTorchBackendÚ
MNNBackendÚNCNNBackendÚONNXBackendÚONNXIMXBackendÚOpenVINOBackendÚPaddleBackendÚPyTorchBackendÚRKNNBackendÚTensorFlowBackendÚTensorRTBackendÚTorchScriptBackendÚTritonBackendc                ó¨  — 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«      rEddlm}m} |j!                  |d	z  «      d
   }| j	                  «       D ��ci c]  \  }}|||   “Œ } }}| S c c}}w c c}}w )a8  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-r   z%, but you have invalid class indices ú-z defined in your dataset YAML.r   Ún0)ÚROOTÚYAMLzcfg/datasets/ImageNet.yamlÚmap)Ú
isinstanceÚlistÚdictÚ	enumerateÚitemsÚintÚstrÚlenÚmaxÚkeysÚKeyErrorÚminÚ
startswithÚultralytics.utilsr   r   Úload)ÚnamesÚkÚvÚnr   r   Ú	names_maps          ú\/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/nn/autobackend.pyÚcheck_class_namesr3   "   s*  € ô �%œÔÜ”Y˜uÓ%Ó&ˆÜ�%œÕà,1¯K©K«M×:¡D A q”�Q“œ˜Q›‘Ð:ˆÑ:Ü�‹JˆÜˆu�z‰z‹|Ó Ò!ÜØ�#Ð=¸aÀ!¹e¸WÐDiÜ�u—z‘z“|Ó$Ð% Q¤s¨5¯:©:«<Ó'8Ð&9Ð9WðYóð ô �e˜A‘h¤Ô$¨¨q©×)<Ñ)<¸TÔ)Bß4àŸ	™	 $Ð)EÑ"EÓFÀuÑMˆIØ16·±³×?©¨¨A�Q˜	 !™‘_Ð?ˆEÑ?Ø€Lùó ;ùó @s   Á	EÄ3Ec                ó¶   — | r'	 ddl m} ddlm} |j	                   || «      «      d   S t        d«      D �ci c]  }|d|› �“Œ
 c}S # t
        $ r Y Œ(w xY wc c}w )zðLoad class names from a 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   )r   )Ú
check_yamlr-   éç  Úclass)r+   r   Úultralytics.utils.checksr5   r,   Ú	ExceptionÚrange)Údatar   r5   Úis       r2   Údefault_class_namesr=   A   sb   € ñ ð	Ý.Ý;à—9‘9™Z¨Ó-Ó.¨wÑ7Ð7ô %*¨#£JÖ/˜qˆA��q�cˆ{‰NÒ/Ð/øô ò 	Ùð	üâ/s   „%A ·AÁ	AÁAc                  óz  ‡ — e Zd ZdZi de“de“de“de“de“de“de	“d	e
“d
e
“de
“de
“de“de“de“de“de“de“eedœ¥Z ej*                  «       d ej,                  d«      dddddf	 	 	 	 	 	 	 	 	 	 	 	 	 d!ˆ fd„«       Zd"ˆ fd„Z	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 d$d„Zd%d„Zd&d'd„Zed(d)d„«       Zd*ˆ fd„Zd*ˆ fd „Zˆ xZ S )+ÚAutoBackendai
  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/     |
            | Triton Inference      | triton://model    |
            | ExecuTorch            | *.pte             |
            | Axelera AI            | *_axelera_model/  |

    Attributes:
        backend (BaseBackend): The loaded inference backend instance.
        format (str): The model format (e.g., 'pt', 'onnx', 'engine').
        model: The underlying model (nn.Module for PyTorch backends, backend instance otherwise).
        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.

    Methods:
        forward: Run inference on an input image.
        from_numpy: Convert NumPy arrays to tensors on the model device.
        warmup: Warm up the model with a dummy input.
        _model_type: Determine the model type from file path.

    Examples:
        >>> model = AutoBackend(model="yolo26n.pt", device="cuda")
        >>> results = model(img)
    ÚptÚtorchscriptÚonnxÚdnnÚopenvinoÚengineÚcoremlÚsaved_modelÚpbÚtfliteÚedgetpuÚpaddleÚmnnÚncnnÚimxÚrknnÚtriton)Ú
executorchÚaxeleraz
yolo26n.ptÚcpuFNTc                ó  •— t         ‰| �  «        t        |t        j                  «      rdn| j                  ||«      }||dv z  }t        |t        j                  «      rFt        j                  j                  «       r(|j                  dk7  r|dvrt        j                  d«      }||dœ}	|dk(  rt        d«      ‚|| j                  vr dd	lm}
 t        d
|› d |
«       d   › d�«      ‚|dk(  r||	d<   ||	d<   n	|dv r||	d<    | j                  |   |fi |	¤Ž| _        |dv | _        || _        | j                   j&                  st)        |«      | j                   _        t+        | j                   j&                  «      | j                   _        y)af  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.
        r@   >   r@   rB   rE   rP   rD   rA   rS   >   r@   rB   rE   rK   rA   )ÚdeviceÚfp16Útfjsz7Ultralytics TF.js inference is not currently supported.r   ©Úexport_formatszmodel='z9' is not a supported model format. Ultralytics supports: ÚFormatz9
See https://docs.ultralytics.com/modes/predict for help.ÚfuseÚverbose>   rH   rC   rI   rJ   rG   Úformat>   rH   rO   rF   rI   rJ   rG   N)ÚsuperÚ__init__r   ÚnnÚModuleÚ_model_typeÚtorchrU   ÚcudaÚis_availableÚtypeÚNotImplementedErrorÚ_BACKEND_MAPÚultralytics.engine.exporterrY   Ú	TypeErrorÚbackendÚnhwcr]   r-   r=   r3   )ÚselfÚmodelrU   rC   r;   rV   r[   r\   r]   Úbackend_kwargsrY   Ú	__class__s              €r2   r_   zAutoBackend.__init__ž   s‰  ø€ ô, 	‰ÑÔä# E¬2¯9©9Ô5‘¸4×;KÑ;KÈEÐSVÓ;Wˆð 	�ÐWÐWÑWˆô �vœuŸ|™|Ô,Ü—
‘
×'Ñ'Ô)Ø—‘˜uÒ$ØÐOÑOä—\‘\ %Ó(ˆFð %+°DÑ9ˆà�VÒÜ%Ð&_Ó`Ð`Ø˜×*Ñ*Ñ*ÝBäØ˜%˜ð !)Ù)7Ó)9¸(Ñ)CÐ(Dð EKðLóð ð
 �TŠ>Ø%)ˆN˜6Ñ"Ø(/ˆN˜9Ò%ØÐHÑHØ'-ˆN˜8Ñ$Ø0�t×(Ñ(¨Ñ0°ÑI¸.ÑIˆŒàÐZÐZˆŒ	ØˆŒð �|‰|×!Ò!Ü!4°TÓ!:ˆD�L‰LÔÜ.¨t¯|©|×/AÑ/AÓBˆ�‰Õó    c                ó–   •— d| j                   v r,t        | j                  |«      rt        | j                  |«      S t        ‰| �  |«      S )aw  Delegate attribute access to the backend.

        This allows AutoBackend to transparently expose backend attributes
        without explicit copying.

        Args:
            name: Attribute name to look up.

        Returns:
            The attribute value from the backend.

        Raises:
            AttributeError: If the attribute is not found in backend.
        rk   )Ú__dict__Úhasattrrk   Úgetattrr^   Ú__getattr__)rm   Únamerp   s     €r2   rv   zAutoBackend.__getattr__à   s?   ø€ ð ˜Ÿ™Ñ%¬'°$·,±,ÀÔ*EÜ˜4Ÿ<™<¨Ó.Ð.Ü‰wÑ" 4Ó(Ð(rq   c                ó  — | j                   r|j                  dddd«      }| j                  j                  r-|j                  t
        j                  k7  r|j                  «       }i }| j                  dk(  r|||dœ|¥} | j                  j                  |fi |¤Ž}t        |t        t        f«      rÀt        | j                  «      dk(  rg| j                  dk(  st        |«      dk(  rJ|d   j                   d   |d   j                   d   z
  d	z
  }t#        |«      D �	ci c]  }	|	d
|	› �“Œ
 c}	| _        t        |«      dk(  r| j%                  |d   «      S |D �
cg c]  }
| j%                  |
«      ‘Œ c}
S | j%                  |«      S 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 layer indices to return embeddings from.
            **kwargs (Any): Additional keyword arguments for model configuration.

        Returns:
            (torch.Tensor | list[torch.Tensor]): The raw output tensor(s) from the model.
        r   é   é   r   r@   )ÚaugmentÚ	visualizeÚembedr6   Úsegmenté   r7   )rl   Úpermuterk   rV   Údtyperc   Úfloat16Úhalfr]   Úforwardr   r   Útupler%   r-   ÚtaskÚshaper:   Ú
from_numpy)rm   Úimr{   r|   r}   ÚkwargsÚforward_kwargsÚyÚncr<   Úxs              r2   r„   zAutoBackend.forwardó   sQ  € ð( �9Š9Ø—‘˜A˜q ! QÓ'ˆBØ�<‰<×Ò §¡¬U¯]©]Ò!:Ø—‘“ˆBð ˆØ�;‰;˜$ÒØ)0¸yÐSXÑcÐ\bÐcˆNà ˆD�L‰L× Ñ  Ñ6 ~Ñ6ˆä�aœ$¤˜Ô'Ü�4—:‘:‹ #Ò%¨4¯9©9¸	Ò+AÄSÈÃVÈqÂ[Ø�q‘T—Z‘Z ‘] Q q¡T§Z¡Z°¡]Ñ2°QÑ6�Ü6;¸B³iÖ@°˜a 5¨¨ ™nÒ@�”
Ü,/°«F°aªK�4—?‘? 1 Q¡4Ó(Ð\ÐZ[Ö=\ÐUV¸d¿o¹oÈaÕ>PÒ=\Ð\à—?‘? 1Ó%Ð%ùò AùÚ=\s   ÄFÅFc                ó–   — t        |t        j                  «      r.t        j                  |«      j                  | j                  «      S |S )zÝConvert a NumPy array to a torch tensor on the model device.

        Args:
            x (np.ndarray | torch.Tensor): Input array or tensor.

        Returns:
            (torch.Tensor): Tensor on `self.device`.
        )r   ÚnpÚndarrayrc   ÚtensorÚtorU   )rm   rŽ   s     r2   rˆ   zAutoBackend.from_numpy  s4   € ô 3=¸QÄÇ
Á
Ô2KŒu�|‰|˜A‹×!Ñ! $§+¡+Ó.ÐRÐQRÐRrq   c                óú  — ddl m} | j                  dv rç| j                  j                  dk7  s| j                  dk(  r¾t        j                  || j                  rt
        j                  nt
        j                  | j                  dœŽ}t        | j                  dk(  rdnd	«      D ]T  }| j                  |«       t        j                  d	d
d| j                  ¬«      }|dd…dd…fxx   |d   z  cc<    ||«       ŒV yyy)zÆWarm up the model by running forward pass(es) with a dummy input.

        Args:
            imgsz (tuple[int, int, int, int]): Dummy input shape in (batch, channels, height, width) format.
        r   )Únon_max_suppression>   rH   r@   rB   rE   rP   rG   rA   rS   rP   )r�   rU   rA   ry   r   éT   é   )rU   Nr   éÿÿÿÿ)Úultralytics.utils.nmsr•   r]   rU   rf   rc   ÚemptyrV   rƒ   Úfloatr:   r„   Úrand)rm   Úimgszr•   r‰   Ú_Úwarmup_boxess         r2   ÚwarmupzAutoBackend.warmup&  sÏ   € õ 	>à�;‰;Ð`Ñ`Ø�K‰K×Ñ Ò%¨¯©¸Ò)@ä—‘˜e¸¿º¬5¯:ª:ÌÏÉÐ\`×\gÑ\gÒhˆBÜ §¡¨}Ò <™1À!ÓDò 2�Ø—‘˜RÔ Ü$Ÿz™z¨!¨R°¸D¿K¹KÔH�ØšQ   ˜UÓ# u¨R¡yÑ0Ó#Ù# LÕ1ñ	2ð *Að arq   c                óB  ‡	— ddl m}  |«       d   }t        | «      st        | t        «      st        | |«       t        | «      j                  }|D �cg c]  }||v ‘Œ c}Š	‰	dxx   |j                  d«      z  cc<   ‰	dxx   ‰	d    z  cc<   t        ˆ	fd„t         |«       d	   «      D «       d
«      }|dk(  rd}|S |dk(  r|rd}|S t        ‰	«      sHddlm}  || «      }t        |j                  «      r%t        |j                   «      r|j"                  dv rd}|S c c}w )a°  Take a path to a model file and return the model format string.

        Args:
            p (str): Path to the model file.
            dnn (bool): Whether to use OpenCV DNN module for ONNX inference.

        Returns:
            (str): Model format string (e.g., 'pt', 'onnx', 'engine', 'triton').

        Examples:
            >>> fmt = AutoBackend._model_type("path/to/model.onnx")
            >>> assert fmt == "onnx"
        r   rX   ÚSuffixé   z.mlmodelé   é	   c              3  ó4   •K  — | ]  \  }}‰|   sŒ|–— Œ y ­w©N© )Ú.0r<   ÚfÚtypess      €r2   ú	<genexpr>z*AutoBackend._model_type.<locals>.<genexpr>P  s   øè ø€ ÒY™T˜Q ÐPUÐVWÓPX”qÑYùs   ƒ‘ÚArgumentNr   r@   rB   rC   )Úurlsplit>   ÚgrpcÚhttprP   )ri   rY   r   r   r$   r   r   rw   ÚendswithÚnextr!   ÚanyÚurllib.parser®   ÚboolÚnetlocÚpathÚscheme)
ÚprC   rY   Úsfrw   Úsr]   r®   Úurlr«   s
            @r2   rb   zAutoBackend._model_type8  s  ø€ õ 	?áÓ˜hÑ'ˆÜ�aŒy¤¨A¬sÔ!3Ü˜˜BÔÜ�A‹w�|‰|ˆØ$&Ö'˜q��d’Ò'ˆØˆa‹�D—M‘M *Ó-Ñ-‹Øˆa‹˜˜a™�LÑ ‹ÜÓY¤Y©~Ó/?À
Ñ/KÓ%LÔYÐ[_Ó`ˆØ�SŠ=ØˆFð ˆð �vÒ¡#ØˆFð ˆô �U”Ý-á˜1“+ˆCÜ�C—J‘JÔ¤D¨¯©¤N°s·z±zÐEUÑ7UØ!�Øˆùò (s   ÁDc                óÔ   •— t        | j                  d«      rDt        | j                  j                  d«      r$| j                  j                  j                  «        t        ‰| �  «       S )z6Set the backend model to evaluation mode if supported.rn   Úeval)rt   rk   rn   r¾   r^   )rm   rp   s    €r2   r¾   zAutoBackend.eval]  sF   ø€ ä�4—<‘< Ô)¬g°d·l±l×6HÑ6HÈ&Ô.QØ�L‰L×Ñ×#Ñ#Ô%Ü‰w‰|‹~Ðrq   c                ó„  •— t         ‰| �  |«      } t        | j                  d«      r™t	        | j                  j
                  t        j                  «      rk| j                  j
                  j                  |«       t        | j                  j
                  j                  «       «      j                  | j                  _
        | S )a™  Apply a function to backend.model parameters, buffers, and tensors.

        This method extends the functionality of the parent class's _apply method by additionally resetting the
        predictor and updating the device in the model's overrides. It's typically used for operations like moving the
        model to a different device or changing its precision.

        Args:
            fn (Callable): A function to be applied to the model's tensors. This is typically a method like to(), cpu(),
                cuda(), half(), or float().

        Returns:
            (AutoBackend): The model instance with the function applied and updated attributes.
        rn   )r^   Ú_applyrt   rk   r   rn   r`   ra   r²   Ú
parametersrU   )rm   Úfnrp   s     €r2   rÀ   zAutoBackend._applyc  s   ø€ ô ‰w‰~˜bÓ!ˆÜ�4—<‘< Ô)¬j¸¿¹×9KÑ9KÌRÏYÉYÔ.WØ�L‰L×Ñ×%Ñ% bÔ)Ü"& t§|¡|×'9Ñ'9×'DÑ'DÓ'FÓ"G×"NÑ"NˆD�L‰LÔØˆrq   )rn   zstr | torch.nn.ModulerU   ztorch.devicerC   rµ   r;   ústr | Path | NonerV   rµ   r[   rµ   r\   rµ   )rw   r$   Úreturnr   )FFN)r‰   útorch.Tensorr{   rµ   r|   rµ   r}   zlist | NonerŠ   r   rÄ   z!torch.Tensor | list[torch.Tensor])rŽ   znp.ndarray | torch.TensorrÄ   rÅ   ))r   rz   é€  rÆ   )r�   ztuple[int, int, int, int]rÄ   ÚNone)zpath/to/model.ptF)r¹   r$   rC   rµ   rÄ   r$   )rÄ   r?   )!Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r	   rh   rc   Úno_gradrU   r_   rv   r„   rˆ   r    Ústaticmethodrb   r¾   rÀ   Ú__classcell__)rp   s   @r2   r?   r?   U   sõ  ø„ ñ0ðdØˆnðàÐ)ðð 	�ðð 	ˆ{ð	ð
 	�Oðð 	�/ðð 	�-ðð 	Ð(ðð 	Ððð 	Ð#ðð 	Ð$ðð 	�-ðð 	ˆzðð 	�ðð 	ˆ~ðð  	�ð!ð" 	�-ð#ð$ (Ø!ò'€Lð, €U‡]�]ƒ_ð (4Ø+˜uŸ|™|¨EÓ2ØØ"&ØØØð?Cà$ð?Cð ð?Cð ð	?Cð
  ð?Cð ð?Cð ð?Cð ô?Có ð?CõB)ð, ØØ!ð&&àð&&ð ð&&ð ð	&&ð
 ð&&ð ð&&ð 
+ó&&óP	Sô2ð$ ó"ó ð"õH÷ñ rq   r?   )r-   zlist | dictrÄ   údict[int, str]r§   )r;   rÃ   rÄ   rÏ   )#Ú
__future__r   Úpathlibr   Útypingr   Únumpyr�   rc   Útorch.nnr`   r8   r   Úultralytics.utils.downloadsr   Úbackendsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r=   ra   r?   r¨   rq   r2   ú<module>r×      sT   ðõ #å Ý ã Û Ý å 1Ý .÷÷ ÷ ÷ ñ ó&ô>0ô(`�"—)‘)õ `rq   