
    v-j                    j    d dl mZ d dlmZ d dlZd dlmZmZ d dlm	Z	 ddl
mZ  G d d	e          ZdS )
    )annotations)PathN)LOGGERYAML)check_requirements   )BaseBackendc                  "    e Zd ZdZddZdd
ZdS )
QNNBackenda  Qualcomm QNN inference backend for Snapdragon hardware.

    Loads and runs the QNN context binary produced by the Ultralytics QNN export (an `*_qnn.onnx` file inside a
    `_qnn_model` directory) using ONNX Runtime with the QNN Execution Provider plugin (`onnxruntime-qnn`). Inference
    runs on Qualcomm Snapdragon devices (Android, Windows on Snapdragon, or Qualcomm Linux boards) via the HTP (NPU)
    backend.
    weight
str | PathreturnNonec                ,   t          d           ddl}ddlm} t	          |          }|                                r|n!t          |                    d                    }t          j	        d| d           d |            \  }}|
                    |           fd	|                                D             }|st          d
          |                                }	|	                    |d|i           |                    t!          |          |	          | _        d | j                                        D             | _        |j        dz  }
|
                                r)|                     t/          j        |
                     dS dS )aR  Load a QNN context-binary model with ONNX Runtime's QNN Execution Provider plugin.

        Args:
            weight (str | Path): Path to the `*_qnn.onnx` file or the `_qnn_model` directory containing it.

        Raises:
            OSError: If the QNN Execution Provider cannot be registered (e.g. not on Snapdragon hardware).
        zonnxruntime-qnnr   N)qnn_library_pathsz
*_qnn.onnxzLoading z for Qualcomm QNN inference...QNNExecutionProviderc                *    g | ]}|j         k    |S  )ep_name).0dr   s     [/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/ultralytics/nn/backends/qnn.py
<listcomp>z)QNNBackend.load_model.<locals>.<listcomp>.   s%    SSSai7>R>R1>R>R>R    zQNN Execution Provider registered but no QNN devices were found. Run on a Qualcomm Snapdragon device with 'onnxruntime-qnn' installed.backend_path)sess_optionsc                    g | ]	}|j         
S r   )name)r   xs     r   r   z)QNNBackend.load_model.<locals>.<listcomp>7   s    HHHQVHHHr   zmetadata.yaml)r   onnxruntimeultralytics.utils.export.qnnr   r   is_filenextrglobr   info#register_execution_provider_libraryget_ep_devicesOSErrorSessionOptionsadd_provider_for_devicesInferenceSessionstrsessionget_outputsoutput_namesparentexistsapply_metadatar   load)selfr   r    r   w	onnx_file
ep_libraryhtp_backenddevicesoptionsmetadata_filer   s              @r   
load_modelzQNNBackend.load_model   s    	,---BBBBBBLLEAA$qww|/D/D*E*E	HyHHHIII )"3"3"5"5
K77LLLSSSSk88::SSS 	4   ,,..((>;2OPPP"33C	NNQX3YYHHT\-E-E-G-GHHH "(?:!! 	:	- 8 899999	: 	:r   imtorch.Tensorlistc                    | j                             | j        | j                                         d         j        |                                                                i          S )zRun inference on the Qualcomm QNN runtime.

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

        Returns:
            (list): Model predictions as a list of output arrays.
        r   )r-   runr/   
get_inputsr   cpunumpy)r4   r=   s     r   forwardzQNNBackend.forward>   sS     | 1DL4K4K4M4Ma4P4UWYW]W]W_W_WeWeWgWg3hiiir   N)r   r   r   r   )r=   r>   r   r?   )__name__
__module____qualname____doc__r<   rE   r   r   r   r   r      sM         $: $: $: $:L	j 	j 	j 	j 	j 	jr   r   )
__future__r   pathlibr   torchultralytics.utilsr   r   ultralytics.utils.checksr   baser	   r   r   r   r   <module>rP      s    # " " " " "        * * * * * * * * 7 7 7 7 7 7      8j 8j 8j 8j 8j 8j 8j 8j 8j 8jr   