U
    hv&                     @   s   d dl Z d dlZd dlZd dlZd dlm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 dd	lmZ d dlZG d
d dZG dd deZedkredZejdd edZeeZe edeZ!e"de! dS )    N)ImageOnlyTransform   )FaceAnalysis   )get_model_dir)face3d)	get_image)DEFAULT_MP_NAMEc                   @   s   e Zd ZeddfddZd$dd	Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd ZddddddgfddZed d! Zed"d# ZdS )%MaskRendererz~/.insightfaceNc           	      C   s  || _ || _|| _t||}t|d}t|s:tdtj	
|| _| jj| _t|d}t|sptdtj	j|}d| _d| _d| _d| _d	| _| jd
 | jd d  | _| _| _t|}|d d df | jd
  |d d df< |d d d
f | jd
  |d d d
f< | j|d d d
f  d
 |d d d
f< t|t|jd d
ff| _| jj| _ddddg| _ddddg| _ d S )NzBFM.matz/should contains BFM.mat in your model directoryz
BFM_UV.matz2should contains BFM_UV.mat in your model directory)   r   皙?Q??ffffff?r   r      
mask_white	mask_blue
mask_black
mask_green皙?)!mp_namerootinsfar   ospjoinexistsAssertionErrorr   Zmorphable_modelZMorphabelModelbfmkpt_indZ	index_indloadZload_uv_coordsuv_sizeZ	mask_stxrZ	mask_styrZ	mask_etxrZ	mask_etyrZtex_hZtex_wZtex_cnpZ
zeros_likeZhstackzerosshapetexcoordX_indZmask_image_namesZmask_aug_probs)	selfnamer   r   Z	model_dirZbfm_fileZbfm_uv_fileZ	uv_coordsr$    r(   A/tmp/pip-unpacked-wheel-5oclok7i/insightface/app/mask_renderer.py__init__   s2    

"
&&& 
zMaskRenderer.__init__r         ?   r-   c                 C   s   || _ || _|| _d S N)
pre_ctx_idpre_det_threshpre_det_size)r&   ctx_id
det_threshdet_sizer(   r(   r)   prepare2   s    zMaskRenderer.preparec                 C   s<   d}|d dd d f |d dd d f< |t || }|S )N      ?r   )r!   dot)r&   Zshape3DRsr(   r(   r)   	transform7   s    $zMaskRenderer.transformc                 C   sR   t jjdddg}t| d | d dg}|j}||7 }| |j|j}|S )Nr      r   )r   meshr:   Zangle2matrixr!   arrayT)r&   verticeswhZR1tr(   r(   r)   
preprocess=   s    zMaskRenderer.preprocessc                 C   s.   | j ||||}| }|| j jd df S )Nr   )r   r:   copyr   )r&   r?   r9   ZanglesrB   transformed_verticesZprojected_verticesr(   r(   r)   project_to_2dE   s    zMaskRenderer.project_to_2dc                 C   sT   |\}}}}}| j ||}	| j |	|||}
| |
j||}
tjj|
||}|S r.   )r   Zgenerate_verticesr:   rC   r>   r   r<   Zto_image)r&   paramsHW	fitted_sp	fitted_epfitted_sfitted_anglesfitted_tZfitted_verticesrE   image_verticesr(   r(   r)   params_to_verticesJ   s    zMaskRenderer.params_to_verticesc                 C   s.   | j j|dd}t|dkr |S | j ||S )Nr   Zmax_numr   )r   getlenZdraw_on)r&   
face_imagefacesr(   r(   r)   draw_lmkS   s    zMaskRenderer.draw_lmkc           	      C   s   | j d kr:t| j| jddgd| _ | j j| j| j| jd | j j|dd}t	|dkrZd S |d j
d d d df }| jj|| jd	d
\}}}}}|||||gS )NZ	detectionlandmark_3d_68)r'   r   Zallowed_modules)r2   r3   r4   r   rQ   r   r   r   )Zmax_iter)r   r   r   r   r5   r/   r0   r1   rR   rS   rW   r   Zfitr%   )	r&   rT   rU   ZlandmarkrJ   rK   rL   rM   rN   r(   r(   r)   build_paramsY   s    
zMaskRenderer.build_paramsc                 C   s   | j d | j d df}|\}}}tj| j d | j d dftjd}|d |d  }}	|d |d  }
}t|| t||	  }}t||
 t||  }}|| }|| }t|||f}||||||f< |S )Nr   r   r   )r#   dtyper   )r    r!   r"   uint8intcv2resize)r&   mask	positionsr    rA   r@   cZuvZstxrZstyrZetxrZetyrZstxZstyZetxZetyheightwidthr(   r(   r)   generate_mask_uvh   s    
"zMaskRenderer.generate_mask_uvFTr   r   r   r   c              
   C   s   t |tr"|rdnd}t||d}| ||}|j\}	}
}| ||	|
}dtjj	|| j
j|| j| j
j|	|
 d }|tj}|r|dktj}|| d| |  }|S |S )NTF)to_rgbr      )
isinstancestrins_get_imagerc   r#   rP   r   r<   renderZrender_texturer   Zfull_trianglesr$   Zastyper!   rZ   )r&   rT   Z
mask_imagerG   input_is_rgbZ
auto_blendr_   rd   Zuv_mask_imagerA   r@   r`   rO   outputZmask_bdfinalr(   r(   r)   render_maskv   s    
,zMaskRenderer.render_maskc                 C   sR   t | d }t | d }t| d g}t | d }t | d }|| | | | S )Nr   r   r   r      )listfloatrG   Zp0p1p2Zp3Zp4r(   r(   r)   encode_params   s    zMaskRenderer.encode_paramsc                 C   s   | dd }t j|t jdd}| dd }t j|t jdd}| d }t| dd }| dd }t j|t jdd}|||||fS )	Nr      )rY   )r               )r!   r=   Zfloat32Zreshapetuplerq   r(   r(   r)   decode_params   s    zMaskRenderer.decode_params)r   r+   r,   )__name__
__module____qualname__r	   r*   r5   r:   rC   rF   rP   rV   rX   rc   rm   staticmethodrt   r|   r(   r(   r(   r)   r
      s   $
	
r
   c                       s^   e Zd Zddddgddddgddd	d
f fdd	Zdd Zedd Zdd Zdd Z  Z	S )MaskAugmentationr   r   r   r   r   r   r   gffffff?Fr6   c                    sZ   t t| || t | _t|dks*tt|t|ks>t|| _|| _|| _	|| _
d S )Nr   )superr   r*   r
   rendererrS   r   
mask_names
mask_probsh_lowh_high)r&   r   r   r   r   Zalways_applyp	__class__r(   r)   r*      s    	zMaskAugmentation.__init__c              	   K   sv   t |dks t |dks tdt |dkrH|d dk r<|S |dd  }| j|}| jj|||dd|d	d
gd}|S )N   rz   z.make sure the rec dataset includes mask paramsr   g        r   Tr   r   r   )rj   r_   )rS   r   r   r|   rm   )r&   imagehlabel	mask_nameh_posrG   Zmask_paramsr(   r(   r)   apply   s     zMaskAugmentation.applyc                 C   s   ddgS )Nr   r   r(   r&   r(   r(   r)   targets_as_params   s    z"MaskAugmentation.targets_as_paramsc                 C   s:   |d }t jj| j| jd}t j| j| j}|||dS )Nr   )r   )r   r   r   )r!   randomchoicer   r   uniformr   r   )r&   rG   r   r   r   r(   r(   r)   get_params_dependent_on_targets   s    z0MaskAugmentation.get_params_dependent_on_targetsc                 C   s   dS )N)r   r   r   r   r(   r   r(   r(   r)   get_transform_init_args_names   s    z.MaskAugmentation.get_transform_init_args_names)
r}   r~   r   r*   r   propertyr   r   r   __classcell__r(   r(   r   r)   r      s   


r   __main__Zanteloper,   )r4   zTom_Hanks_54745.pngr   zoutput_mask.jpg)#ossysdatetimeZnumpyr!   os.pathpathr   ZalbumentationsAZ(albumentations.core.transforms_interfacer   Zface_analysisr   utilsr   Z
thirdpartyr   datar   rh   r	   r\   r
   r   r}   Ztoolr5   Zimreadr   rX   rG   rm   Zmask_outZimwriter(   r(   r(   r)   <module>   s(    2

