o
    ॵiv                     @   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" 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)batch_process)	LoadImage)	ModelFileTasks)
get_logger   )FaceProcessingBasePipeline)module_namec                       s   e Zd Zdef fddZ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 )FaceQualityAssessmentPipelinemodelc                    sX   t  jdd|i| t|tj}td|  | |\| _	| _
| _td dS )a  
        use `model` to create a face quality assessment pipeline for prediction
        Args:
            model: model id on modelscope hub.
        Example:
        FaceQualityAssessmentPipeline can measure the quality of an input face image,
        the higher output score represents the better quality

        ```python
        >>> from modelscope.pipelines import pipeline
        >>> fqa = pipeline('face-quality-assessment', 'damo/cv_manual_face-quality-assessment_fqa')
        >>> frfm("https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/face_recognition_1.png")
        {'scores': [0.99949193], 'boxes': [[157.72341918945312, 67.5608139038086,
            305.8574523925781, 271.25555419921875]]}

        ```
        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   l/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/face_quality_assessment_pipeline.pyr   "   s   z&FaceQualityAssessmentPipeline.__init__c                 C   s   t | j|S N)r   r   )r"   datar   r   r'   _batch;   s   z$FaceQualityAssessmentPipeline._batchc                 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   >   s   
z-FaceQualityAssessmentPipeline.load_onnx_modelinputreturnc                    s   t  |}|d u ri }d |d< |S |d }|d d d d d d df }|d d d }t|d }tj|dd}|tj}||d< |S )	Ninput_tensorimgg     o@g      ?r   )r      r      )axes)r   
preprocessnpexpand_dimscopy	transposeastypefloat32)r"   r5   resultrtn_dict	align_imgface_imgr%   r   r'   r=   L   s   z(FaceQualityAssessmentPipeline.preprocessc                 C   s   |d d u rt jd t jd iS i }|d   || jd < | jj| j|d}|d us,J t	
|d d g}|d   t	jd d f  }t j|t j|iS )Nr7   r   )
input_feedbbox)r   SCORESBOXEScpunumpyr    r   runr!   r>   meannewaxistolist)r"   r5   rH   rD   scoresboxesr   r   r'   forward[   s   "z%FaceQualityAssessmentPipeline.forwardinputsc                 C   s   |S r(   r   )r"   rU   r   r   r'   postprocessg   s   z)FaceQualityAssessmentPipeline.postprocess)__name__
__module____qualname__strr   r*   r   r	   r   r   r=   rT   rV   __classcell__r   r   r%   r'   r      s    "*r   ).os.pathpathr   typingr   r   cv2rM   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.pipelines.utilr   modelscope.preprocessorsr   modelscope.utils.constantr   r   modelscope.utils.loggerr    r   r   register_moduleface_quality_assessmentr   r   r   r   r'   <module>   s4   