
    /jJ!                        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dS )    )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.
    Fonnxweight
str | Pathdevicetorch.devicefp16boolformatstrc                    |dv sJ d| d            || _         t                                          |||           dS )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.
        >   dnnr   zUnsupported ONNX format: .N)r   super__init__)selfr   r   r   r   	__class__s        a/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/ultralytics/nn/backends/onnx.pyr   zONNXBackend.__init__   sS     (((*Of*O*O*O(((.....    returnNonec           
        t          | j        t          j                  o-t          j                                        o| j        j        dk    }| j        dk    rLt          j        d| d           t          d           ddl
}|j                            |          | _        dS t          j        d| d           t          d	|rd
ndf           ddl}|                                }|rd|v rdd| j        j        ifdg}nM| j        j        dk    r	d|v rddg}n4dg}|r/t          j        d           t          j        d          | _        d}t          j        d|j         dt          |d         t&                    r|d         n|d         d                     |                    ||          | _        d | j                                        D             | _        | j                                        j        }|r"|                     t7          |                     t          | j                                        d         j        d         t&                    | _        d| j                                        d         j        v | _        | j         o|| _         | j         r(| j        !                                | _"        g | _#        | j                                        D ]}d|j        v }	t          j$        |j        |	rt          j%        nt          j&                  '                    | j                  }
| j"        (                    |j)        | j        j        |r| j        j        nd|	rtT          j%        ntT          j&        tW          |
j                  |
,                                           | j#        -                    |
           dS dS )zLoad 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 	providersc                    g | ]	}|j         
S  name.0xs     r   
<listcomp>z*ONNXBackend.load_model.<locals>.<listcomp>M   s     L L LA L L Lr   float16)dtyper-   device_typer$   element_typeshape
buffer_ptr).
isinstancer   torchcudais_availabletyper   r   infor   cv2r   readNetFromONNXnetr"   get_available_providersindexwarning__version__r   InferenceSessionsessionget_outputsoutput_namesget_modelmetacustom_metadata_mapapply_metadatadictr7   dynamic
get_inputsr   use_io_binding
io_bindingiobindingsemptyr2   float32tobind_outputr-   nptupledata_ptrappend)r   r   r;   r?   r"   	availabler)   metadata_mapoutputout_fp16y_tensors              r   
load_modelzONNXBackend.load_model%   s    $+u|44p9P9P9R9RpW[WbWgkpWp;%KL6LLLMMM5666JJJw..v66DHHH KI6IIIJJJT(T(9(9}UVVV $;;==I 	!/9<<5T[EV7WXZpq		!U**/HI/U/U68NO		34	 !N#ijjj"',u"5"5DK DKXk&= X X#-ilC#@#@U9Q<<iPQlSToX X  
 '77)7TTDL L L1I1I1K1K L L LD  <5577KL 8##D$6$6777 &dl&>&>&@&@&C&I!&LcRRDL!T\%<%<%>%>q%A%FFDI '+l"2";tD" 3,1133 ""l6688 3 3F(FK7H${6<PX?ku}}^c^kllloo   H G''#[$(K$47;"B$+"3"33;%KRZZ#HN33#+#4#4#6#6 (    M((2222!3 33 3r   imtorch.Tensor.torch.Tensor | list[torch.Tensor] | np.ndarrayc           	     F   | j         dk    rW| j                            |                                                                           | j                                        S | j        r| j        j        dk    r|                                }| 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        S | j                            | j        | j                                        d         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   r4   )r   rA   setInputr    numpyforwardrP   r   r=   rR   
bind_inputrC   r   rX   r2   rU   rY   r7   rZ   rG   run_with_iobindingrS   runrI   rO   r-   )r   rb   s     r   ri   zONNXBackend.forwardl   sT    ;%Hbffhhnn..///8##%%%  	n{5((VVXXGIN-/Y^v-E-E")//1+/9DRZZ"*BHoo;;==     L++DG444= <##D$58O8O8Q8QRS8T8Y[][a[a[c[c[i[i[k[k7lmmmr   )Fr   )r   r   r   r   r   r   r   r   r   r   r   r   )rb   rc   r   rd   )__name__
__module____qualname____doc__r   ra   ri   __classcell__)r   s   @r   r
   r
      s         / / / / / / /E3 E3 E3 E3Nn n n n n n n nr   r
   c                  "    e Zd ZdZddZdd
ZdS )ONNXIMXBackendzONNX 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.
    r   r   r   r   c                   t          d           t          d           ddl}ddl}ddlm} t          |          }t          |                    d                    }t          j	        d| d           |
                                }d	|_        |                    ||d
g          | _        d | j                                        D             | _        t!          | j                                        d         j        d         t$                    | _        d| j                                        d         j        v | _        | j                                        j        }|r$|                     t5          |                     dS dS )zLoad 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(   c                    g | ]	}|j         
S r+   r,   r.   s     r   r1   z-ONNXIMXBackend.load_model.<locals>.<listcomp>   s    HHHQVHHHr   r2   )r   mct_quantizersr"   edgemdt_cl.pytorch.nmsrv   r   nextglobr   r>   get_ort_session_optionsenable_mem_reuserF   rG   rH   rI   r9   r7   r   rN   rO   r=   r   rJ   rK   rL   rM   )	r   r   mctqr"   rv   w	onnx_filesession_optionsr]   s	            r   ra   zONNXIMXBackend.load_model   s    	nooo2333%%%%222222LL))**	DyDDDEEE6688+0("33I[qZr3ssHHT\-E-E-G-GHHH!$,":":"<"<Q"?"Ea"H#NN!8!8!:!:1!=!BB	|1133G 	4\ 2 233333	4 	4r   rb   rc   6np.ndarray | list[np.ndarray] | tuple[np.ndarray, ...]c                   | j                             | j        | j                                         d         j        |                                                                i          }| j        dk    rEt          j	        |d         |d         dddddf         |d         dddddf         gd          S | j        dk    rXt          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    r`t          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   r3   segment   )rG   rl   rI   rO   r-   r    rh   taskrX   concatenater3   )r   rb   ys      r   ri   zONNXIMXBackend.forward   s    LT.1H1H1J1J11M1RTVTZTZT\T\TbTbTdTd0eff9  >1Q41aaaDj)91Q4111d
;K"LSUVVVVY&  >1Q41aaaDj)91Q4111d
;KQqT"RY[cdefcgcmnnnnY)##!ad111aaa:&6!QQQ4Z8H!A$OVX`abc`d`jkkk!  r   Nrm   )rb   rc   r   r   )rn   ro   rp   rq   ra   ri   r+   r   r   rt   rt      sF         4 4 4 46     r   rt   )
__future__r   pathlibr   rh   rX   r:   ultralytics.utilsr   ultralytics.utils.checksr   baser   r
   rt   r+   r   r   <module>r      s    # " " " " "            $ $ $ $ $ $ 7 7 7 7 7 7      yn yn yn yn yn+ yn yn ynx8 8 8 8 8[ 8 8 8 8 8r   