o
    *j                     @   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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 e ZG dd deZ dS )    N)AnyDict)	Pipelines)
align_face)
OutputKeys)pipeline)InputPipeline)	PIPELINES)	LoadImage)	ModelFileTasks)
get_loggerc                       s   e Zd Zddef fddZ				dd	d
Zdedeeef fddZ	d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 )FaceProcessingBasePipelineTmodelc                    s<   || _ t jdd|i| |rd}ttj|d| _dS dS )z
        use `model` to create a face processing pipeline and output cropped img, scores, bbox and lmks.

        Args:
            model: model id on modelscope hub.

        r   z*damo/cv_ddsar_face-detection_iclr23-damofd)r   N )use_detsuper__init__r   r   face_detection)selfr   r   kwargsZdet_model_id	__class__r   v/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/face_processing_base_pipeline.pyr      s   z#FaceProcessingBasePipeline.__init__
      FNc              	   C   s  t |tj }t |tj }t |tj }|jd dkr&td dS g }	t	|jd D ]}
||
 }|d |d  |krN|d |d  |krN|	|
g7 }	q/t
|	dkrctd| d| d	 dS ||	 }||	 }||	 }t |}|dddf |dddf  |dddf |dddf   }t || d }|dkr|r|jd dkr|r|d d |d d g}td
}d}|D ]6}|| }t t |d |d  d |d  t t |d |d  d |d   }||k r|}|}q|g}|d }|| || || fS )aD  
        choose face with maximum area
        Args:
            det_result: output of face detection pipeline
            min_face: minimum size of valid face w/h
            top_face: take faces with top max areas
            center_face: choose the most centered face from multi faces, only valid if top_face > 1
        r   zWarning: No face detected!N      r   z)Warning: Face size not enough, less than x!inf)nparrayr   BOXES	KEYPOINTSSCORESshapeloggerinforangelenZargsortfloatZsquareabs)r   
det_resultZmin_faceZtop_faceZcenter_face	img_shapebboxesZ	landmarksscoresZface_idxiboxZboxesZareaZsort_idx
img_centerZmin_distZsel_idxZ_idxdistZmain_idxr   r   r   _choose_face)   sV   
(

@  z'FaceProcessingBasePipeline._choose_faceinputreturnc                 C   s   t |}|d d d d d d df }| jrV| | }| j||jd}|d urT|\}}}|dd}t|d|\}}	i }
t	
||
d< |g|
d< ||
d< ||
d	< |
S d S i }
t|d}t	
||
d< |
S )
Nr"   )r0      r   )p   r;   imgr2   bboxlmks)r   Zconvert_to_ndarrayr   r   copyr7   r(   reshaper   r#   Zascontiguousarraycv2resize)r   r8   r<   r/   Zrtnr2   r1   Z	face_lmksZ	align_img_resultZresized_imgr   r   r   
preprocess`   s(   


z%FaceProcessingBasePipeline.preprocess      c           !      C   s  t |d}|d u rd S |jdkrD|j\}}t j||dft jd}| |d d d d df<  |d d d d df< |d d d d df< |}|d d d d ddf }|dd d df }t jd	t jd}|}	|	jd }
|
dkr|	d d dd
f }t |jdd }d}|
dkr|d }t 	|d d df |d d df  d |d  |d d df |d d df  d |d  g}t 
t |dd}t d|d  }|	|dd
f }|d  d7  < n|d  d7  < |d u r|d  d7  < d S t|d t|d t|d t|d g}|d t|d |d  d | d d  }|d t|d |d  d | d d  }|d t|d |d  d | d d  }|d t|d |d  d | d d  }td||d< td||d< t|jd d ||d< t|jd d ||d< |d |d  d }|d |d  d }||krt|| d }|d | |d< |d | d |d< td|d |d< t|jd d |d |d< |}n3t|| d }|d | |d< |d | d |d< td|d |d< t|jd d |d |d< |}t j||df|t jd}t||d |d  d  d }t||d |d  d  d }|}||d  d |d  }|}||d  d |d  } ||d |d d |d |d d d d f ||||| d d f< tj|dtjd}|S )N)r"      r   r   )Zdtyper   r   .r"   )r:   rH   g       @g      ?r;   )   rI   )interpolation)r#   r@   ndimr(   emptyZuint8ZzerosZint32ZasarrayZvstacksumpowerZargmaxintmaxminfullrA   rB   ZINTER_LINEAR)!r   r<   rectZpadding_sizeZ	pad_pixelwhretZnrofZbounding_boxesZ
nrof_facesZdetZimg_sizeZbindexr5   offsetsZoffset_dist_squaredZ_bboxx1Zx2y1y2Z	padding_hZ	padding_woffsetZdst_sizedstZdst_x_offsetZdst_y_offsetZy_startZy_endZx_startZx_endr   r   r   align_face_paddingy   s   

B
**,
  z-FaceProcessingBasePipeline.align_face_paddingc              	   C   sP   t j|d   t j|d   t j|d   gt j|d   giS )Nr<   r2   r=   r>   )r   Z
OUTPUT_IMGcpunumpyr'   tolistr%   r&   )r   r8   r   r   r   forward   s
   z"FaceProcessingBasePipeline.forwardinputsc                 C   s   |S )Nr   )r   rb   r   r   r   postprocess   s   z&FaceProcessingBasePipeline.postprocess)T)r   r   FN)rF   rG   )__name__
__module____qualname__strr   r7   r   r   r   rE   r]   ra   rc   __classcell__r   r   r   r   r      s    
7
"O*r   )!Zos.pathpathZosptypingr   r   rA   r_   r#   ZPILZtorchZmodelscope.metainfor   Z0modelscope.models.cv.face_recognition.align_facer   Zmodelscope.outputsr   Zmodelscope.pipelinesr   Zmodelscope.pipelines.baser   r	   Zmodelscope.pipelines.builderr
   Zmodelscope.preprocessorsr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.loggerr   r)   r   r   r   r   r   <module>   s"   