o
    ॵiK                     @   s  d dl mZ d dlmZmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlm  mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lm Z  d dl!m"Z"m#Z# d dl$m%Z% ddl&m'Z' e% Z(ej)e#j*ej+dG dd de'Z,dS )    N)AnyDict)	Pipelines)
align_face)FacialLandmarkConfidence)
OutputKeys)pipeline)InputPipeline)	PIPELINES)	LoadImage)	ModelFileTasks)
get_logger   )FaceProcessingBasePipeline)module_namec                       s   e Zd Zdef fddZdd Zdedeeef f fdd	Z	deeef deeef fd
dZ
deeef deeef fddZ  ZS )FaceLivenessXcPipelinemodelc                    sX   t  jdd|i| t|tj}td|  | |\| _	| _
| _td dS )a|  
        FaceLivenessXcPipeline can judge the input face is a real or fake face.
        use `model` to create a face lievness ir pipeline for prediction
        Args:
            model: model id on modelscope hub.
        ```python
        >>> from modelscope.pipelines import pipeline
        >>> fl_xc = pipeline('face_liveness', 'damo/cv_manual_face-liveness_flxc')
        >>> fl_xc("https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/face_liveness_xc.png")
        {'scores': [0.03821974992752075], 'boxes': [[12.569677352905273, 6.428711891174316,
            94.17887115478516, 106.74441528320312]]}
        ```
        r   zloading model from zload model doneN )super__init__ospjoinr   ONNX_MODEL_FILEloggerinfoload_onnx_modelsessinput_node_nameout_node_name)selfr   kwargs	onnx_path	__class__r   e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/face_liveness_xc_pipeline.pyr       s   zFaceLivenessXcPipeline.__init__c                 C   sX   t j|ddgd}g }g }| D ]}||j q| D ]}||j q|||fS )NCUDAExecutionProviderCPUExecutionProvider)	providers)onnxruntimeInferenceSessionget_outputsappendname
get_inputs)r!   r#   r   r    r   noder   r   r&   r   5   s   
z&FaceLivenessXcPipeline.load_onnx_modelinputreturnc                    s   t  |}|d u ri }d |d< |S |d }|d d }t|d }tj||||gdd}tj|dd	tj}||d< |S )
Ninput_tensorimgg     _@g      ?r      )axis)r   r5   r      )axes)	r   
preprocessnpexpand_dimscopyconcatenate	transposeastypefloat32)r!   r1   resultrtn_dictr4   r3   r$   r   r&   r9   C   s    z!FaceLivenessXcPipeline.preprocessc                 C   s   |d d u rt jd t jd iS i }|d   || jd < | jj| j|d}|d d d 	 g}|d   t
jd d f 	 }t j|t j|iS )Nr3   r   )
input_feedbbox)r   SCORESBOXEScpunumpyr   r   runr    tolistr:   newaxis)r!   r1   rC   rA   scoresboxesr   r   r&   forwardR   s   "zFaceLivenessXcPipeline.forwardinputsc                 C   s   |S )Nr   )r!   rO   r   r   r&   postprocess^   s   z"FaceLivenessXcPipeline.postprocess)__name__
__module____qualname__strr   r   r	   r   r   r9   rN   rP   __classcell__r   r   r$   r&   r      s    "*r   )-os.pathpathr   typingr   r   cv2rH   r:   r*   PILtorchtorch.nn.functionalnn
functionalFmodelscope.metainfor   0modelscope.models.cv.face_recognition.align_facer   /modelscope.models.cv.facial_landmark_confidencer   modelscope.outputsr   modelscope.pipelinesr   modelscope.pipelines.baser	   r
   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.constantr   r   modelscope.utils.loggerr    r   r   register_moduleface_livenessface_liveness_xcr   r   r   r   r&   <module>   s0   