Ë
    FêñiJ!  ã                  ó|   — 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  G d„ d	e«      Z G d
„ de«      Zy)é    )Úannotations)ÚPathN)ÚLOGGER)Úcheck_requirementsé   )ÚBaseBackendc                  ó6   ‡ — e Zd ZdZddˆ fd„Zdd„Zdd„Zˆ xZS )	ÚONNXBackendaU  Microsoft ONNX Runtime inference backend with optional OpenCV DNN support.

    Loads and runs inference with ONNX models (.onnx files) using either Microsoft ONNX Runtime with CUDA/CoreML
    execution providers, or OpenCV DNN for lightweight CPU inference. Supports IO binding for optimized GPU inference
    with static input shapes.
    c                óT   •— |dv sJ d|› d�«       ‚|| _         t        ‰| �	  |||«       y)a]  Initialize the ONNX backend.

        Args:
            weight (str | Path): Path to the .onnx model file.
            device (torch.device): Device to run inference on.
            fp16 (bool): Whether to use FP16 half-precision inference.
            format (str): Inference engine, either "onnx" for ONNX Runtime or "dnn" for OpenCV DNN.
        >   ÚdnnÚonnxzUnsupported ONNX format: ú.N)ÚformatÚsuperÚ__init__)ÚselfÚweightÚdeviceÚfp16r   Ú	__class__s        €ú^/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/nn/backends/onnx.pyr   zONNXBackend.__init__   s:   ø€ ð ˜Ñ(ÐOÐ,EÀfÀXÈQÐ*OÓOÐ(ØˆŒÜ‰Ñ˜ ¨Õ.ó    c           
     ót  — t        | j                  t        j                  «      xr9 t        j                  j	                  «       xr | j                  j
                  dk7  }| j                  dk(  rIt        j                  d|› d�«       t        d«       ddl
}|j                  j                  |«      | _        yt        j                  d|› d�«       t        d	|rd
ndf«       ddl}|j                  «       }|r!d|v rdd| j                  j                   ifdg}nX| j                  j
                  dk(  r	d|v rddg}n6dg}|r1t        j"                  d«       t        j                  d«      | _        d}t        j                  d|j$                  › dt        |d   t&        «      r|d   n|d   d   › �«       |j)                  ||¬«      | _        | j*                  j-                  «       D �cg c]  }|j.                  ‘Œ c}| _        | j*                  j3                  «       j4                  }|r| j7                  t9        |«      «       t        | j*                  j-                  «       d   j:                  d   t&        «      | _        d| j*                  j?                  «       d   j
                  v | _         | j<                   xr || _!        | jB                  �rc| j*                  jE                  «       | _#        g | _$        | j*                  j-                  «       D �]  }	d|	j
                  v }
t        jJ                  |	j:                  |
rt        jL                  nt        jN                  ¬«      jQ                  | j                  «      }| jF                  jS                  |	j.                  | j                  j
                  |r| j                  j                   nd|
rtT        jL                  ntT        jN                  tW        |j:                  «      |jY                  «       ¬«       | jH                  j[                  |«       �Œ! yyc c}w )z‹Load an ONNX model using ONNX Runtime or OpenCV DNN.

        Args:
            weight (str | Path): Path to the .onnx model file.
        Úcpur   úLoading z! for ONNX OpenCV DNN inference...zopencv-python>=4.5.4r   Nz for ONNX Runtime inference...r   zonnxruntime-gpuÚonnxruntimeÚCUDAExecutionProviderÚ	device_idÚCPUExecutionProviderÚmpsÚCoreMLExecutionProviderzDCUDA requested but CUDAExecutionProvider not available. Using CPU...FzUsing ONNX Runtime z with ©Ú	providersÚfloat16)Údtype©ÚnameÚdevice_typer   Úelement_typeÚshapeÚ
buffer_ptr).Ú
isinstancer   ÚtorchÚcudaÚis_availableÚtyper   r   Úinfor   Úcv2r   ÚreadNetFromONNXÚnetr   Úget_available_providersÚindexÚwarningÚ__version__ÚstrÚInferenceSessionÚsessionÚget_outputsr'   Úoutput_namesÚget_modelmetaÚcustom_metadata_mapÚapply_metadataÚdictr*   ÚdynamicÚ
get_inputsr   Úuse_io_bindingÚ
io_bindingÚioÚbindingsÚemptyr$   Úfloat32ÚtoÚbind_outputÚnpÚtupleÚdata_ptrÚappend)r   r   r.   r2   r   Ú	availabler#   ÚxÚmetadata_mapÚoutputÚout_fp16Úy_tensors               r   Ú
load_modelzONNXBackend.load_model%   s`  € ô ˜$Ÿ+™+¤u§|¡|Ó4Òp¼¿¹×9PÑ9PÓ9RÒpÐW[×WbÑWb×WgÑWgÐkpÑWpˆà�;‰;˜%Òä�K‰K˜( 6 (Ð*KÐLÔMÜÐ5Ô6Ûà—w‘w×.Ñ.¨vÓ6ˆD�Hô �K‰K˜( 6 (Ð*HÐIÔJÜ ¹TÑ(9À}ÐUÔVÛð $×;Ñ;Ó=ˆIÙÐ/°9Ñ<Ø5¸ÀTÇ[Á[×EVÑEVÐ7WÐXÐZpÐq‘	Ø—‘×!Ñ! UÒ*Ð/HÈIÑ/UØ6Ð8NÐO‘	à3Ð4�	ÙÜ—N‘NÐ#iÔjÜ"'§,¡,¨uÓ"5�D”KØ �Dä�K‰KØ% k×&=Ñ&=Ð%>¸fÜ#-¨i¸©l¼CÔ#@�9˜Q’<ÀiÐPQÁlÐSTÁoÐVðXôð
 '×7Ñ7¸È)Ð7ÓTˆDŒLØ15·±×1IÑ1IÓ1KÖ L¨A §£Ò LˆDÔð  Ÿ<™<×5Ñ5Ó7×KÑKˆLÙØ×#Ñ#¤D¨Ó$6Ô7ô & d§l¡l×&>Ñ&>Ó&@ÀÑ&C×&IÑ&IÈ!Ñ&LÌcÓRˆDŒLØ! T§\¡\×%<Ñ%<Ó%>¸qÑ%A×%FÑ%FÐFˆDŒIð '+§l¡lÐ"2Ò";°tˆDÔØ×"Ó"ØŸ,™,×1Ñ1Ó3�”Ø "�”Ø"Ÿl™l×6Ñ6Ó8ó 3�FØ(¨F¯K©KÐ7�HÜ$Ÿ{™{¨6¯<©<ÑPX¼u¿}º}Ô^c×^kÑ^kÔl×oÑoØŸ™ó �Hð —G‘G×'Ñ'Ø#Ÿ[™[Ø$(§K¡K×$4Ñ$4Ù7; $§+¡+×"3Ò"3ÀÙ3;¤R§Z¢ZÄÇÁÜ# H§N¡NÓ3Ø#+×#4Ñ#4Ó#6ð (ô ð —M‘M×(Ñ(¨Ö2ñ3ð #ùò !Ms   Ç(P5c           	     óÀ  — | j                   dk(  rQ| j                  j                  |j                  «       j	                  «       «       | j                  j                  «       S | j                  �r	| j                  j                  dk(  r|j                  «       }| j                  j                  d|j                  j                  |j                  j                  dk(  r|j                  j                  nd| j                  rt        j                  nt        j                  t!        |j"                  «      |j%                  «       ¬«       | j&                  j)                  | j                  «       | j*                  S | j&                  j-                  | j.                  | j&                  j1                  «       d   j2                  |j                  «       j	                  «       i«      S )a;  Run ONNX inference using IO binding (CUDA) or standard session execution.

        Args:
            im (torch.Tensor): Input image tensor in BCHW format, normalized to [0, 1].

        Returns:
            (torch.Tensor | list[torch.Tensor] | np.ndarray): Model predictions as tensor(s) or numpy array(s).
        r   r   Úimagesr.   r   r&   )r   r4   ÚsetInputr   ÚnumpyÚforwardrD   r   r0   rF   Ú
bind_inputr6   r   rL   r$   rI   rM   r*   rN   r;   Úrun_with_iobindingrG   Úrunr=   rC   r'   )r   Úims     r   r[   zONNXBackend.forwardl   sB  € ð �;‰;˜%Òà�H‰H×Ñ˜bŸf™f›hŸn™nÓ.Ô/Ø—8‘8×#Ñ#Ó%Ð%ð ×ÓØ�{‰{×Ñ 5Ò(Ø—V‘V“X�Ø�G‰G×ÑØØŸI™IŸN™NØ-/¯Y©Y¯^©^¸vÒ-E˜"Ÿ)™)Ÿ/š/È1Ø+/¯9ª9œRŸZšZ¼"¿*¹*Ü˜BŸH™H“oØŸ;™;›=ð ô ð �L‰L×+Ñ+¨D¯G©GÔ4Ø—=‘=Ð à—<‘<×#Ñ# D×$5Ñ$5¸¿¹×8OÑ8OÓ8QÐRSÑ8T×8YÑ8YÐ[]×[aÑ[aÓ[c×[iÑ[iÓ[kÐ7lÓmÐmr   )Fr   )r   ú
str | Pathr   ztorch.devicer   Úboolr   r9   ©r   r`   ÚreturnÚNone)r_   útorch.Tensorrc   z.torch.Tensor | list[torch.Tensor] | np.ndarray)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rV   r[   Ú__classcell__)r   s   @r   r
   r
      s   ø„ ñö/óE3÷Nnr   r
   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚONNXIMXBackendzýONNX IMX inference backend for NXP i.MX processors.

    Extends `ONNXBackend` with support for quantized models targeting NXP i.MX edge devices. Uses MCT (Model Compression
    Toolkit) quantizers and custom NMS operations for optimized inference.
    c                óú  — t        d«       t        d«       ddl}ddl}ddlm} t        |«      }t        |j                  d«      «      }t        j                  d|› d�«       |j                  «       }d	|_        |j                  ||d
g¬«      | _        | j                  j                  «       D �cg c]  }|j                  ‘Œ c}| _        t#        | j                  j                  «       d   j$                  d   t&        «      | _        d| j                  j+                  «       d   j,                  v | _        | j                  j1                  «       j2                  }	|	r| j5                  t7        |	«      «       yyc c}w )z¬Load a quantized ONNX model from an IMX model directory.

        Args:
            weight (str | Path): Path to the IMX model directory containing the .onnx file.
        )z model-compression-toolkit>=2.4.1zedge-mdt-cl<1.1.0zonnxruntime-extensions)r   r   r   N)Únms_ortz*.onnxr   z for ONNX IMX inference...Fr   r"   r$   )r   Úmct_quantizersr   Úedgemdt_cl.pytorch.nmsrn   r   ÚnextÚglobr   r1   Úget_ort_session_optionsÚenable_mem_reuser:   r;   r<   r'   r=   r,   r*   r9   rB   rC   r0   r   r>   r?   r@   rA   )
r   r   Úmctqr   rn   ÚwÚ	onnx_fileÚsession_optionsrQ   rR   s
             r   rV   zONNXIMXBackend.load_model“   s0  € ô 	ÐnÔoÜÐ2Ô3Û%ÛÝ2ä�‹LˆÜ˜Ÿ™ Ó)Ó*ˆ	Ü�‰�h˜y˜kÐ)CÐDÔEà×6Ñ6Ó8ˆØ+0ˆÔ(à"×3Ñ3°I¸Ð[qÐZrÐ3ÓsˆŒØ-1¯\©\×-EÑ-EÓ-GÖH¨˜QŸV›VÒHˆÔÜ! $§,¡,×":Ñ":Ó"<¸QÑ"?×"EÑ"EÀaÑ"HÌ#ÓNˆŒØ §¡×!8Ñ!8Ó!:¸1Ñ!=×!BÑ!BÐBˆŒ	Ø—|‘|×1Ñ1Ó3×GÑGˆÙØ×Ñ¤ \Ó 2Õ3ð ùò	 Is   Â0E8c                óÎ  — | j                   j                  | j                  | j                   j                  «       d   j                  |j                  «       j                  «       i«      }| j                  dk(  r7t        j                  |d   |d   dd…dd…df   |d   dd…dd…df   gd¬«      S | j                  dk(  rIt        j                  |d   |d   dd…dd…df   |d   dd…dd…df   |d	   gd|d   j                  ¬
«      S | j                  dk(  rNt        j                  |d   |d   dd…dd…df   |d   dd…dd…df   |d	   gd|d   j                  ¬
«      |d   fS |S )aH  Run IMX inference with task-specific output concatenation for detect, pose, and segment tasks.

        Args:
            im (torch.Tensor): Input image tensor in BCHW format, normalized to [0, 1].

        Returns:
            (np.ndarray | list[np.ndarray] | tuple[np.ndarray, ...]): Task-formatted model predictions.
        r   Údetectr   Né   éÿÿÿÿ)ÚaxisÚposeé   )r}   r%   Úsegmenté   )r;   r^   r=   rC   r'   r   rZ   ÚtaskrL   Úconcatenater%   )r   r_   Úys      r   r[   zONNXIMXBackend.forward®   sd  € ð �L‰L×Ñ˜T×.Ñ.°·±×1HÑ1HÓ1JÈ1Ñ1M×1RÑ1RÐTV×TZÑTZÓT\×TbÑTbÓTdÐ0eÓfˆà�9‰9˜Ò ä—>‘> 1 Q¡4¨¨1©ªa²°D¨jÑ)9¸1¸Q¹4ÂÂ1ÀdÀ
Ñ;KÐ"LÐSUÔVÐVØ�Y‰Y˜&Ò ä—>‘> 1 Q¡4¨¨1©ªa²°D¨jÑ)9¸1¸Q¹4ÂÂ1ÀdÀ
Ñ;KÈQÈqÉTÐ"RÐY[ÐcdÐefÑcg×cmÑcmÔnÐnØ�Y‰Y˜)Ò#ä—‘  !¡ a¨¡dª1ªa°¨:Ñ&6¸¸!¹ºQÂÀ4¸ZÑ8HÈ!ÈAÉ$ÐOÐVXÐ`aÐbcÑ`d×`jÑ`jÔkØ�!‘ðð ð ˆr   Nrb   )r_   re   rc   z6np.ndarray | list[np.ndarray] | tuple[np.ndarray, ...])rf   rg   rh   ri   rV   r[   © r   r   rl   rl   Œ   s   „ ñó4ô6r   rl   )Ú
__future__r   Úpathlibr   rZ   rL   r-   Úultralytics.utilsr   Úultralytics.utils.checksr   Úbaser   r
   rl   r…   r   r   ú<module>r‹      s9   ðõ #å ã Û å $Ý 7å ôyn�+ô ynôx8�[õ 8r   