U
    ‰±Ëh¥  ã                   @   sD   d Z ddlZddlmZ ddd„Zdd	d
„Zddd„Zddd„ZdS )zP
Estimating parameters about vertices: shape para, exp para, pose para(s, R, t)
é    Né   )Úmeshé¸  c	                 C   sŠ  |   ¡ } |jd |jd ks t‚|jd | jd d ks<t‚|jd }	| jd }
|}t |¡}tjdddgdddggtjd}|| |¡ }t |j|	|
dg¡}t 	||	|
 dg¡}| |j  ¡ ¡}t 	||	dg¡j}t ||
dg¡j}|}| || ¡t 
|dd…tjf d|
g¡ }t 	|jddg¡}t |j|¡|t d|d  ¡  }t 	| jddg¡} t |j| | ¡}t tj |¡|¡}|S )aq  
    Args:
        x: (2, n). image points (to be fitted)
        shapeMU: (3n, 1)
        shapePC: (3n, n_sp)
        shapeEV: (n_sp, 1)
        expression: (3, n)
        s: scale
        R: (3, 3). rotation matrix
        t2d: (2,). 2d translation
        lambda: regulation coefficient

    Returns:
        shape_para: (n_sp, 1) shape parameters(coefficients)
    r   é   é   ©ZdtypeéÿÿÿÿNr   ©ÚcopyÚshapeÚAssertionErrorÚnpÚarrayÚfloat32ÚdotÚresizeÚTÚreshapeÚtileÚnewaxisZdiagflatZlinalgÚinv)ÚxÚshapeMUÚshapePCÚshapeEVÚ
expressionÚsÚRÚt2dÚlambÚdofÚnÚsigmaÚPÚAÚpc_3dÚpc_2dÚpcÚmu_3dZexp_3dÚbÚequation_leftÚequation_rightZ
shape_para© r,   úU/tmp/pip-unpacked-wheel-5oclok7i/insightface/thirdparty/face3d/morphable_model/fit.pyÚestimate_shape7   s,    


 ,$r.   éÐ  c	                 C   s†  |   ¡ } |jd |jd ks t‚|jd | jd d ks<t‚|jd }	| jd }
|}t |¡}tjdddgdddggtjd}|| |¡ }t |j|	|
dg¡}t 	||	|
 dg¡}| |j¡}t 	||	dg¡j}t ||
dg¡j}|}| || ¡t 
|dd…tjf d|
g¡ }t 	|jddg¡}t |j|¡|t d|d  ¡  }t 	| jddg¡} t |j| | ¡}t tj |¡|¡}|S )af  
    Args:
        x: (2, n). image points (to be fitted)
        shapeMU: (3n, 1)
        expPC: (3n, n_ep)
        expEV: (n_ep, 1)
        shape: (3, n)
        s: scale
        R: (3, 3). rotation matrix
        t2d: (2,). 2d translation
        lambda: regulation coefficient

    Returns:
        exp_para: (n_ep, 1) shape parameters(coefficients)
    r   r   r   r   r   Nr   r	   )r   r   ÚexpPCÚexpEVr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zshape_3dr)   r*   r+   Zexp_parar,   r,   r-   Úestimate_expressionl   s,    


 ,$r2   é   c                 C   s  |   ¡ j} tj|dftjd}tj|dftjd}t |tjdd…f ddg¡d }|ddd…f  d7  < |ddd…f  d7  < | d¡}	|d |	dd…f }
|d |	d|…f }|d	 |	d|…f }t|ƒD ]4}|
| 	|¡ | 	|¡ }t 
|tt|ƒd ƒdg¡j}tj |j| j¡}tj |¡\}}}tj |¡\}}}| 	|¡}t 
|tt|ƒd ƒdg¡j}t| |
||d
 d|…dd…f ||||dd… dd	}| 	|¡}t 
|tt|ƒd ƒdg¡j}|dkrÒt| |
||d d|…dd…f ||||dd… dd	}qÒ|||||fS )á   
    Args:
        x: (n, 2) image points
        X_ind: (n,) corresponding Model vertex indices
        model: 3DMM
        max_iter: iteration
    Returns:
        sp: (n_sp, 1). shape parameters
        ep: (n_ep, 1). exp parameters
        s, R, t
    r   r   Nr   r   ÚFr   r   r0   r1   é   ©r   r   r   é(   )r
   r   r   Úzerosr   r   r   ÚflattenÚranger   r   ÚintÚlenr   Ú	transformÚestimate_affine_matrix_3d22dÚP2sRtZmatrix2angler2   r.   )r   ÚX_indÚmodelÚn_spÚn_epÚmax_iterÚspÚepÚ	X_ind_allÚ	valid_indr   r   r0   ÚiÚXr#   r   r   ÚtÚrxZryZrzr   r   r,   r,   r-   Ú
fit_points¢   s0    
"

6
8rN   c                 C   sâ  |   ¡ j} tj|dftjd}tj|dftjd}t |tjdd…f ddg¡d }|ddd…f  d7  < |ddd…f  d7  < | d¡}	|d |	dd…f }
|d |	d|…f }|d	 |	d|…f }d
}tj	 
dddg¡}dddg}g }g }g }g }g }t|ƒD ]¬}|
| |¡ | |¡ }t |tt|ƒd ƒdg¡j}| |¡ | |¡ | |¡| |¡| |¡f tj	 |j| j¡}tj	 |¡\}}}| |¡ | |¡ | |¡| |¡| |¡f | |¡}t |tt|ƒd ƒdg¡j}t| |
||d d|…dd…f ||||dd… dd	}| |¡ | |¡ | |¡| |¡| |¡f | |¡}t |tt|ƒd ƒdg¡j}t| |
||d d|…dd…f ||||dd… dd	}qt |¡t |¡t |¡t |¡t |¡fS )r4   r   r   Nr   r   r5   r   r   r0   g-Cëâ6:?r   r1   r6   r7   r   r8   )r
   r   r   r9   r   r   r   r:   r   r>   Zangle2matrixr;   r   r   r<   r=   Úappendr?   r@   r2   r.   r   )r   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   r   r0   r   r   rL   ZlspZlepZlsZlRÚltrJ   rK   r#   r   r   r,   r,   r-   Úfit_points_for_showØ   sN    
"

    
 
 
 
 
6
 
 
:rQ   )r   )r/   )r3   )r3   )	Ú__doc__Znumpyr   Ú r   r.   r2   rN   rQ   r,   r,   r,   r-   Ú<module>   s   2
5
6
6