o
    *j                     @   sx   d dl 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Z G dd dZ	G dd dZ
G dd	 d	ZG d
d dZdS )    N   )utilityc                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )GetCropMatrixz(
    from_shape -> transform_matrix
    Fc                 C   s   || _ || _|| _d S N
image_sizetarget_face_scalealign_corners)selfr   r   r	    r   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/facial_68ldk_detection/infer.py__init__   s   
zGetCropMatrix.__init__c                 C   s   t |}t |}|\}}	|\}
}|| }|| }|}| }|
||  ||	  |d  }|}|}|||  ||	  |d  }t|||g|||gg dgtj}|S )Nr   r   )        r         ?)mathcossinnparrayfloat32)r
   ZanglescaleZshift_xyfrom_center	to_centerZcosvZsinvZfxfyZtxtyacosasinZa0Za1Za2Zb0b1b2Zrot_scale_mr   r   r   _compose_rotate_and_scale   s    

z'GetCropMatrix._compose_rotate_and_scalec           
      C   sp   | j r| jd | jd }}n| j| j}}d}| j|| j d  }d}| j|||||g|d |d gd}	|	S )Nr   r   g      i@)r   r          @)r   r   )r	   r   r   r   )
r
   r   center_wcenter_hZto_wZto_hZrot_muZscale_muZshift_xy_mumatrixr   r   r   process.   s   zGetCropMatrix.processNF)__name__
__module____qualname____doc__r   r   r$   r   r   r   r   r      s
    
r   c                   @   s    e Zd ZdZdd Zdd ZdS )TransformPerspectivez/
    image, matrix3x3 -> transformed_image
    c                 C   s
   || _ d S r   r   )r
   r   r   r   r   r   E   s   
zTransformPerspective.__init__c                 C   s   t j||| j| jft jddS )Nr   )ZdsizeflagsZborderValue)cv2ZwarpPerspectiver   ZINTER_LINEAR)r
   imager#   r   r   r   r$   H   s   
zTransformPerspective.processN)r&   r'   r(   r)   r   r$   r   r   r   r   r*   @   s    r*   c                   @   s   e Zd ZdZdd ZdS )TransformPoints2Dz4
    points (nx2), matrix (3x3) -> points (nx2)
    c                 C   sh   t j|t |d d dgf gdd}|t | }|d d d df |d d ddgf  }||jS )Nr   r   )Zaxis   )r   ZconcatenateZ	ones_likeZ	transposeZastypedtype)r
   	srcPointsr#   Z	desPointsr   r   r   r$   V   s   (zTransformPoints2D.processN)r&   r'   r(   r)   r$   r   r   r   r   r/   Q   s    r/   c                   @   s@   e Zd Zdd ZdddZdddZdd	 Zd
d Zdd ZdS )	Alignmentc                 C   s   d| _ d| _|| _| jdkrYt|| _|d | j_t| j t| j}|dgkr3t	j
|dd}nt	
|}||d  | jjdkrJ| }n|| jj}|  || _nJ t| j | jd
d| _t| j d| _t | _d S )N   r   pytorchr   cpu)Zmap_locationnetFTr   r+   )
input_sizer   dl_frameworkr   Z
get_configconfig	device_idZset_environmentZget_nettorchloadZload_state_dictr7   toeval	alignmentr   getCropMatrixr*   transformPerspectiver/   ZtransformPoints2D)r
   argsZ
model_pathr:   Z
device_idsr8   
checkpointr   r   r   r   a   s6   



zAlignment.__init__Fc                 C   sl   |r|t | jd | jd g|ddd d d S |d d t | j| jg|ddd d S Nr   r0   r=   Ztensorr9   r?   viewr
   Zpointsr	   r   r   r   norm_points   s"   zAlignment.norm_pointsc                 C   sl   |r|d d t | jd | jd g|ddd S |d t | j| jg|ddd d d S rF   rG   rI   r   r   r   denorm_points   s"   

zAlignment.denorm_pointsc                 C   s   | j |||}| j||}|tjd d f }t|}| dddd}|d d d }| j	j
dkr=| }||fS || j	j
}||fS )	Nr      r   r0   g     o@r    r   r6   )rB   r$   rC   r   Znewaxisr=   Z
from_numpyfloatZpermuter;   r<   r7   r?   )r
   r.   r   r!   r"   r#   input_tensorr   r   r   
preprocess   s   
zAlignment.preprocessc                 C   s   t j|jt jd}t|jd D ]F}|d d || d  |d d || d   |d d  || d< |d d || d  |d d || d   |d d  || d< q|S )N)r1   r   r   r0   )r   Zzerosshaper   range)r
   r2   ZcoeffZ	dstPointsir   r   r   postprocess   s"   



zAlignment.postprocessc           	      C   s   |  ||||\}}| jdkr/t  | |}W d    n1 s#w   Y  |d d }nJ | |}|j  d }| 	|t
j|}|S )Nr5   r6   r   )rO   r:   r=   Zno_gradrA   rK   datar7   numpyrS   r   Zlinalginv)	r
   r.   r   r!   r"   rN   r#   outputZ	landmarksr   r   r   analyze   s   



zAlignment.analyzeNr%   )	r&   r'   r(   r   rJ   rK   rO   rS   rX   r   r   r   r   r3   _   s    
'
r3   )argparsecopyr   r-   rU   r   r=   libr   r   r*   r/   r3   r   r   r   r   <module>   s    3