
    9i#z                        S SK r S SKrS SKrS SKJr  S SKJr  S SKrS SKrS SK	r
S SKrS SKJs  Jr  S SKJr  S SKJrJr  S\S\4S jrS+S jrS,S	 jrS
 rS-S jr\R6                  " SSS9S 5       r\R6                  " SSS9S 5       rS.S jrS/S jrS0S jr S r!S r"S r#S1S jr$S r%S r&S r'S r(S r)S r*S2S jr+S r,S3S jr-S  r.S! r/S4S" jr0S,S# jr1S5S$ jr2S6S% jr3S& r4S' r5S( r6S7S) jr7S8S* jr8g)9    N)array)Image)loadmatsavemat	old_range	new_rangec                     [        U5      S:X  d   e[        U5      S:X  d   eXS   -
  US   US   -
  -  US   US   -
  -  US   -   n U $ )N   r      )len)imgr   r   s      n/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/cv/face_reconstruction/utils.pyimg_value_rescaler      sj    y>Qy>Q1)A,1"=
>!y|#%'0|4CJ    c                 6   U R                   S   nU R                   S   nX#:  a<  US-  U-  n[        R                  " U [        X4-  5      U4[        R                  S9nXT4$ US-  U-  n[        R                  " X[        X$-  5      4[        R                  S9nXT4$ )Nr   r         ?interpolation)shapecv2resizeintINTER_CUBIC)r   	long_side
src_height	src_widthscale_imgs         r   resize_on_long_sider      s    1J		!IC*,zz#i'()4//+ ; C)+zzS!345//+ ;r   c                     X -  U-
  S-   SU -  U -  SU -  -
  S-   -  nSX3S:  '   SX3S:  '   [         R                  " X-
  5      nSX4S:  '   Ub  SX2S:H  '   U$ )zS
src, gt shape: [h, w, 3] value: [0, 1]
return: mg, shape: [h, w, 1] value: [0, 1]
g|=r
   g|=      ?r   r   gp?)npabs)srcgt	skin_maskmgdiff_abss        r   get_mg_layerr)   ,   sy    
 )b.5
 QWs]QW%<u%D	EBBAvJBAvJvvbhH!$B9 >Ir   c                     [        U [        5      (       a  U $ U R                  5       S;   a  gU R                  5       S;   a  g[        R                  " S5      e)N)yestruety1T)nofalsefn0FzBoolean value expected.)
isinstanceboollowerargparseArgumentTypeError)vs    r   str2boolr;   >   sJ    !Twwy22	
4	4(()BCCr   c                    [         R                  " X S4[         R                  S9n[         R                  " X 4[         R                  S9nU S-  n[        UR                  S   5       H  n[        UR                  S   5       H  nXPS-  -
  S-  X`S-  -
  S-  -   US-  ::  d  M!  X`S-  -
  * X%US4'   XPS-  -
  * X%US4'   [         R
                  " X`S-  -
  S-  XPS-  -
  S-  -   5      nXtS-  ::  a  SU-  U-  X5U4'   Mz  SU-  U-  S-   X5U4'   M     M     [        R                  " US   S	-   US
   S	-   5      u  pX1-  n[        R                  " X9SS9u  p[         R                  " X45      nU$ )Nr
   )r   dtyper!   r   r          @g       ).r   g:0yE>.r   F)angleInDegrees)
r"   zerosfloat32ranger   sqrtr   cartToPolarpolarToCartdstack)lengthspread_ratioFlowmagradiushwdistance_angxr.   s               r   spread_flowrS   I   sq   8861-RZZ@D
((&)
<Cc\F4::a=!tzz!}%AaK!#qQ;&::faiG"#k/ 21W"#k/ 21W77A!Oa#71{?Q:N#NO|+ #fx 7C1I $v 83 >C1I & " __T&\D0$v,2EFFAC??3E:DA99aVDKr   T)nopythonparallelc                     SnX:  a  X:  a  U$ X:  a  USU-
  :  a  U$ U SU-
  :  a  X:  a  U$ U SU-
  :  a  USU-
  :  a  U$ USU-
  -  X1-  -   SU -
  -  USU-
  -  XQ-  -   U -  -   nUS:  a  SnUS:  a  SnU$ )N皙?r   r       )rR   r.   v11v12v21v22r-   results           r   bilinear_interpr_   f   s    Au
	
1q1u9
	
QUqu
	
QUq1q5y
Q-#')a!e4Q-#')Q./A:FC<Fr   c                 V   UR                   S   nUR                   S   nUu  pxpU	S-   nXZ-
  nXh-
  nUS-   nUR                  5       n[        U5       GHP  n[        U5       GH<  nUnUnU UU4   nUUU4   n[        U5      S:  a  [        U5      S:  a  M6  UUU-  -   nUUU-  -   nUXZ-
  :  a  UUS-
  :  a  US-
  nUU:  a  UnUXh-
  :  a  UUS-
  :  a  US-
  nUU:  a  UnUU	:  a  US:  a  SnUS-   U:  a  US-   nUU:  a  US:  a  SnUS-   U:  a  US-   n[	        [
        R                  " U5      5      n[	        [
        R                  " U5      5      n[	        [
        R                  " U5      5      n[	        [
        R                  " U5      5      nUS:  a  SnUUR                   S   S-
  :  a  UR                   S   S-
  nUS:  a  SnUUR                   S   S-
  :  a  UR                   S   S-
  nUS:  a  SnUUR                   S   S-
  :  a  UR                   S   S-
  nUS:  a  SnUUR                   S   S-
  :  a  UR                   S   S-
  n[        S5       H7  n[        UU-
  UU-
  UUUU4   UUUU4   UUUU4   UUUU4   5      UUUU4'   M9     GM?     GMS     XXU4$ )Nr   r   rW      )	r   copyrC   r#   r   mathfloorceilr_   )rDxrDyoriImg
transRatiopadssrcWsrcHpadTop	padBottompadLeftpadRight
left_boundright_boundbottom_bound	top_boundnewImgij_i_jdeltaXdeltaYnxnynxinyinxi1nyi1lls                                r   image_warp_grid1r   }   s    <<?D<<?D+/(Fw1J/K#L
I[[]F4[tABBR[FR[F6{S S[3%6fz))Bfz))BT_$q=B#"$KT%%q=B$#%LG|6B6J&!#aJF{6B6I% "QIdjjn%Cdjjn%Ctyy}%Dtyy}%DQwV\\!_q((ll1o)axfll1o))||A*QwV\\!_q((ll1o)axfll1o))||A*Ah,R#XrCx-3C4657 .89?T29N-3D#4657 .89?d@BAC :D	E r2  E  X lCCr   c                    U R                  5       u  pVpx[        R                  " [        R                  " U5      [        R                  " U5      /5      u  pU
R	                  5       US-
  -  S-  S-
  n
U	R	                  5       US-
  -  S-  S-
  n	 [        R
                  R                  5       (       aU  [        R                  " U
R                  S5      U	R                  S5      4S5      R                  S5      R                  5       nOF[        R                  " U
R                  S5      U	R                  S5      4S5      R                  S5      nUSU-  U-  -   n[        R                  " XX#S9nU$ )zd

Args:
    x: [n, c, h, w]
    flow: [n, h, w, 2]
    mode:
    padding_mode:
    coff:

Returns:

r   r>   r   r
   )modepadding_mode)sizetorchmeshgridarangefloatcudais_availablecat	unsqueezeFgrid_sample)rR   flowr   r   coffr3   crM   rN   yvxvgridgrid_xwarp_xs                 r   warpr      s%    JA!^^U\\!_ell1o>?FB	q1u		#a	'B	q1u		#a	'B zz  yy",,r*BLL,<=&Yq\$$& 	 yy",,r*BLL,<=rBLLQOAHtO#F]]14KFMr   c                    Sn[        [        R                  " U S5      S5      n[        S5      nUR	                  US5        [        S5      n[        S5      nUR	                  USU-  5        UR	                  USUS   -  U-  5        UR                  5         [        R                  " U5      n[        R                  " XSS   S	/5      n[        R                  " U5      n[        R                  " [        R                  " U S
5      5      nXV4$ )Ni  zExp_Pca.binrbrv   r   r2   ra   r   r   zstd_exp.txt)
openospjoinr   fromfilecloser"   reshape	transposeloadtxt)
bfm_foldern_vertexExpbinexp_dimexpMUexpPCexpEVs          r   LoadExpBasisr     s    H#((:}5t<FCjGVQ#JE#JE	NN61x<(	NN61wqz>H45
LLNHHUOEJJuqz2./ELLEJJsxx
M:;E<r   c                    [        S5        [        [        R                  " U S5      5      nUS   nUS   nUS   nUS   nUS   nUS   n[	        5       u  pU[
        R                  " US	S
/5      -  n
U
S-  n
U
S S 2S S24   n
U[
        R                  " U	S	S/5      -  nUS-  nUS S 2S S24   nU[
        R                  " US	S
/5      -  nUS S 2S S24   n[        [        R                  " U S5      5      nUS   R                  [
        R                  5      S-
  n[        [        R                  " U S5      5      nUS   R                  [
        R                  5      S-
  nX   n[
        R                  " U
/ SQ5      n
XS S 2S S 24   n
[
        R                  " U
S	S/5      n
[
        R                  " U/ SQ5      nXS S 2S S 24   n[
        R                  " US	S/5      n[
        R                  " U/ SQ5      nXS S 2S S 24   n[
        R                  " US	S/5      n[
        R                  " US	S/5      S-  nXS S 24   n[
        R                  " USS	/5      n[
        R                  " US	S/5      nUUS S 24   n[
        R                  " USS	/5      n[        [        R                  " U S5      5      nUS   nUS   nUS   nUS   nUS   nUS   n[        [        R                  " U S5      UUU
UUUUUUUUS.5        g ) Nz'Transfer BFM09 to BFM_model_front......z01_MorphableModel.matshapePCshapeEVshapeMUtexPCtexEVtexMUr      g     j@P   O   @   zBFM_front_idx.matidxr   zBFM_exp_idx.mat	trimIndex)r   ra   r   )r   ra   r   ra   zfacemodel_info.matfrontmask2_idxskinmask	keypoints	point_buftri	tri_mask2zBFM_model_front.mat)	meanshapemeantexidBaseexBasetexBaser   r   r   r   r   r   )
printr   r   r   r   r"   r   astypeint32r   )r   original_BFMr   r   r   r   r   r   r   r   r   r   r   	index_expindex_shaper   r   
other_infor   r   r   r   r   r   s                           r   transferBFM09r     s   	
34388J0GHIL9%G9%G9%G!E!E!E>LE rzz'B955Fc\FAssF^FRZZBx00Fc\FAssF^FbjjS	22Ga"foG -@ABI% ''
I #((:/@ABKk*11
K(KZZ,FA%&FZZR)Fjj+.G1a'(Gjj2r(+GZZ,Fq!O$FZZR)F

7RG,s2Iq.)I

9q"g.IjjQ(Gk1n%Gjj1b'*G *.BCDJ 01N*%H;'I;'I
U
C;'I 23"""", 6
r   c                    [        [        R                  " U S5      5      nUS   n[        R                  " / SQ5      S-
  nXS   S S 24   [        R
                  " XSS/   S S 24   S5      [        R
                  " XSS/   S S 24   S5      XS	   S S 24   XS
   S S 24   /n[        R                  " USS9nU/ SQS S 24   nU$ )Nzsimilarity_Lm3D_all.matlm   %   (   +   .   1   7   r   r   r
   ra            axisr   r
   r   ra   r   )r   r   r   r"   r   meanstack)r   Lm3Dlm_idx
value_lists       r   	load_lm3dr   o  s    388J(ABCD:D XX23a7FAY\
QF^Q&'+
QF^Q&'+T)Q,-?AY\	J 88JQ'D"#DKr   c                    SnUS-  nSU ;   aU  [        U S   5       HB  u  p#USR                  US   US   US   U S   U   S   U S   U   S   U S   U   S   5      -  nMD     O+U S    H"  nUS	R                  US   US   US   5      -  nM$     S
U ;   a'  U S
    H  nUSR                  US   US   5      -  nM      SU ;   a+  U S    H"  nUSR                  US   US   US   5      -  nM$     SU ;   a  [        U S   5       H  u  pgSU ;   d  SU ;   d  S
U ;   at  SU ;   a	  U S   U   nOUnSU ;   a	  U S   U   n	OUn	SSR                  [        [	        U5      5       Vs/ s H  nSR                  Xr   X   X   5      PM     sn5      -   S-   n
OKSSR                  [        [	        U5      5       Vs/ s H  nSR                  Xr   5      PM     sn5      -   S-   n
X-  nM     U$ s  snf s  snf )N # Create by HRN
colorsvertices,v {:.6f} {:.6f} {:.6f} {:.6f} {:.6f} {:.6f}
r   r   r
   v {:.6f} {:.6f} {:.6f}
UVsvt {:.6f} {:.6f}
normalsvn {:.6f} {:.6f} {:.6f}
facesfaces_uvfaces_normalf  {}/{}/{}
{})	enumerateformatr   rC   r   )mesh
out_stringrv   r:   uvvnindfaceface_uvface_normalrows              r   mesh_to_stringr    sg   J%%J4d:./DA?FFaD!A$!d8nQ&7&:N1%a($x.*;A*>@@J 0 j!A4;;AaD!A$!MMJ " }u+B.55beRUCCJ  Dy/B5<<1r!ube% %J " $"4=1ICT!^t%;u}%":.s3G"G!T)"&~"6s";K"&KSXX"3t9-'- %%dgwz;>J-'   
 SXX38T3CD3CaT[[)3CDF FHLMJ# 2& ' Es   #G -G%c                    [         R                  R                  U 5      n[         R                  R                  [         R                  R	                  U 5      5      S   nSU;   Ga  [
        R                  " [         R                  R                  X#S-   5      US   5        [        [         R                  R                  X#S-   5      S5       nUR                  S5        UR                  S5        UR                  S5        UR                  S	5        UR                  S
5        UR                  S5        UR                  S5        UR                  S5        UR                  SR                  US-   5      5        S S S 5        [        U S5       nSU;   a1  UR                  S5        UR                  SR                  U5      5        SU;   aa  [        US   5       HN  u  pVUR                  SR                  US   US   US   US   U   S   US   U   S   US   U   S   5      5        MP     O7US    H.  nUR                  SR                  US   US   US   5      5        M0     SU;   a3  US    H*  nUR                  SR                  US   US   5      5        M,     SU;   a7  US    H.  nUR                  SR                  US   US   US   5      5        M0     SU;   a  [        US   5       H  u  pSU;   d  SU;   d  SU;   at  SU;   a	  US   U	   nOU
nSU;   a	  US   U	   nOU
nSSR                  [        [        U
5      5       Vs/ s H  nS R                  X   X   X   5      PM     sn5      -   S!-   nOKSSR                  [        [        U
5      5       Vs/ s H  nS"R                  X   5      PM     sn5      -   S!-   nUR                  U5        M     S S S 5        g ! , (       d  f       GNo= fs  snf s  snf ! , (       d  f       g = f)#Nr   texture_mapz.jpgz.mtlrN   z# Created by HRN
znewmtl material_0
zKa 1.000000 0.000000 0.000000
zKd 1.000000 1.000000 1.000000
zKs 0.000000 0.000000 0.000000
zTr 0.000000
zillum 0
zNs 0.000000
z
map_Kd {}
r   zmtllib ./{}.mtl
r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   )ospathdirnamesplitextbasenamer   imwriter   r   writer   r   rC   r   )	save_pathr   save_dir	save_namewfrv   r:   r   r   r   r   r   r   r  s                 r   	write_objr    s   wwy)H  !1!1)!<=a@IGGLLv#56]8K	M "'',,xV);<cBbHH)*HH*+HH67HH67HH67HH_%HH[!HH_%HH])))f*<=> C 
i	D HH()HH(//	:;t!$z"23CJJ!adAaD$x.*;A*>Xq)!,d8nQ.?.BDE 4 *%3::1Q41qtLM & D=5k-44RUBqEBC " 9o4;;qE2a5"Q%) * & d?&tG}5	%4)?5D=!T)"&z"23"7"&%-&*>&:3&?&*!&s4y!1+!1A #))$'7:{~N!1+ "  C
 "'D	"24"2Q TW-"24"5 57;<C % 63 
	 CB\+4S 
	s8   B,O F;O<#O2*/O<O76!O< 
O/2
O<<
P
c           	      
   [        U S5       nUR                  5       nS S S 5        / n/ n/ n/ n/ n/ n	Sn
W GH  nUS S S:X  a]  UR                  5       R                  S5      SS   Vs/ s H  n[	        U5      S:  d  M  [        U5      PM!     nnUR                  U5        US S S:X  Ga  UR                  5       R                  S5      SS  nU Vs/ s H1  n[	        U5      S:  d  M  [        UR                  S5      S   5      PM3     nn[        U
[	        U5      5      n
[	        U5      S:  a  [	        U5      [	        US   5      :w  a  GM  UR                  U5        SUS   ;   as  [	        US   R                  S5      S   5      S:  aO  U Vs/ s H1  n[	        U5      S:  d  M  [        UR                  S5      S   5      PM3     nnUR                  U5        SUS   ;   a  [	        US   R                  S5      5      S	:  as  [	        US   R                  S5      S   5      S:  aO  U Vs/ s H1  n[	        U5      S:  d  M  [        UR                  S5      S   5      PM3     nnU	R                  U5        US S	 S
:X  a_  UR                  5       R                  S5      SS  nU Vs/ s H  n[	        U5      S:  d  M  [        U5      PM!     nnUR                  U5        US S	 S:X  d  GM  UR                  5       R                  S5      SS  nU Vs/ s H  n[	        U5      S:  d  M  [        U5      PM!     nnUR                  U5        GM     [        R                  " U5      R                  [        R                  5      nU
S	::  a3  [        R                  " U5      R                  [        R                  5      nUR                  S   S	:X  a  UUS.nOUS S 2S S	24   US S 2S	S 24   US.n[	        U5      S:  a8  [        R                  " U5      R                  [        R                  5      nUUS'   [	        U5      S:  a8  [        R                  " U5      R                  [        R                  5      nUUS'   [	        U5      S:  a>  U
S	::  a3  [        R                  " U5      R                  [        R                  5      nUUS'   [	        U	5      S:  a>  U
S	::  a3  [        R                  " U	5      R                  [        R                  5      n	U	US'   U$ ! , (       d  f       GN= fs  snf s  snf s  snf s  snf s  snf s  snf )Nrr   r
   zv r   r   r   /ra   zvt zvn )r   r   )r   r   r   uvsvnsr   r   )r   	readlinesstripsplitr   r   appendr   maxr"   r   r   rB   r   r   )obj_pathprint_shaper2   	bfm_linesr   r   r  r  r   r   max_face_lengthlineavertexitemsr   r   r   r   r   r   s                        r   read_objr#    s   	h	KKM	 
 HE
C
CHLO8t"&**,"4"4S"9!""="=QQ!a"=   OOF#8tJJL&&s+AB/E27F%Q3q6A:(CQ(%DF!/3t9=O5zA~#d)s58}"<LLeAh3uQx~~c':1'=#>#B9>MA#a&1*/3qwws|A/M(eAh3uQx~~c':#;q#@S!HNN3'*F,./F0 3827Q3q6A:(CQ(%   ##K08uJJL&&s+AB/E$)8EqSVaZ(%(EB8JJrN8uJJL&&s+AB/E$)8EqSVaZ(%(EB8JJrNE H xx!((4H!&&rxx0~~aA 
 !BQBq!"uo
 3x!|hhsm""2::.U
3x!|hhsm""2::.U
8}qaxx)00:H#Z
<1a88L188BL+^Ka 
	 G N
 9
 9sS   T'T'>T'T,'!T,T1%!T1+T6!T6%T;<T;U 'U 
T$c                    U R                   S   n[        R                  " SU-  S/5      nUR                  5       USSU-  S-
  S2SS24'   SUSSU-  S-
  S2S4'   UR                  5       USSU-  S2SS24'   SUSSU-  S2S4'   [        R                  " U R                  5       SU-  S/5      n[        R
                  R                  X45      u  n    nUSS nUSS nUS   n	US   n
[        R
                  R                  U5      [        R
                  R                  U5      -   S-  n[        R                  " X/SS9nX4$ )	Nr   r
      r   ra   r      r   )	r   r"   rA   r   r   linalglstsqnormr   )xprR   nptsAbkrP   R1R2sTxsTysr-   s                r   POSr4  F  sH   88A;D
!d(AA {{}AaD1Q!AaD1Q;;=AaDlAaCAaDlAo


2<<>AHa=1A&JAq!Q	
1QB	
1QB
A$C
A$C		biinnR0	0A5A
#!$A4Kr   c                 6   US   nUS   nUS   nUS   nU R                  5       nUR                  SS/5      n[        R                  " USS9nUS   nUS	   n	US S 2S4   U-
  US S 2S4'   US S 2S	4   U	-
  US S 2S	4'   [        R                  " [        R
                  " US-  5      S-  5      n
Xj-  nUR                  S	S
/5      n[        R                  " U5      n[        R                  " X&5      U-   nSS	[        R                  " SU-  5      -   -  S	-
  n[        R                  " XK5      U-   n[        R                  " U5      nUS S 2S4   U
-  U-   nUS S 2S	4   U
-  U	-   nSUS S 2S4   -  U
-  nXX/n[        R                  " U5      R                  S/5      $ )NW1B1W2B2r   r
   r   r   r   
      r   )
rb   r   r"   r   rD   sumr   matmulexpr   )pointsparamsw1b1w2b2data	data_meanx_meany_meanrmsinputsrR   r.   rN   rectss                   r   BBRegressionrM  `  s   	B	B	B	B;;=D<<AD1%Iq\Fq\Fadf$DAJadf$DAJ
''"&&q/A%
&C:D<<B D<<DYYr 2%F!bffR&[))*Q.FYYr"R'F\\&!Fq!tsV#Aq!tsV#AfQTlS A1LE88E?""A3''r   c                    SnUR                  5       n[        R                  " SU R                  S   -  SU R                  S   -  S/5      nU X@R                  S   S-  U R                  S   U R                  S   S-  -   2U R                  S   S-  U R                  S   U R                  S   S-  -   24'   US   U R                  S   S-  -   US'   US   U R                  S   S-  -   US'   US   S:  d	  US   S:  a  SnXCU4$ )NTr
   r   r   ra   F)rb   r"   rA   r   )r   boxsuccessbboxress        r   img_paddingrS  }  s   G88:D
((A		!$a#))A,&6:
;C>A 		!#))A,1):::		!#))A,1):::	; < 1g		!))DG1g		!))DGAw{d1gkgr   c                    [        X5      u  p#nU(       an  X#S   US   US   -   2US   US   US   -   24   n[        R                  " UR                  [        R
                  5      S[        R                  S9nSUS   -  nXV4$ US4$ )Nr   ra   r   r
   )r<  r<  r   r<  )rS  r   r   r   r"   uint8r   )r   rQ  
padded_imgpadded_bboxflagcrop_imgr   s          r   croprZ    s    $/$:!JT!n[^k!n-LL)!n[^k!n-LLM N::OOBHH%z//+ k!n$1}r   c                 \   U R                   S   nU R                   S   n[        R                  " SSUS   * US-  -   S-   /SSU* S-  US   -   //[        R                  S9n[        R
                  " XXE45      n [        XC-  S-  5      n[        XS-  S-  5      n[        R                  " XU45      n [        R                  " US S 2S4   US   -
  US-  -   US S 2S4   US   -
  US-  -   /SS9U-  S-  nUS-  S-
  n	US-  S-
  n
XS	S	/n[        X5      u  pUS:w  d   e[        R                  " US   US   /5      n[        R                  " US-  S-
  US-  S-
  /5      nUS-  n[        R                  " US   US-  -
  US   US-  -
  /5      nX-  X-  UR                  S/5      -   4nUU4$ )
Nr   r   r
   r!   r=   d   r   p   r<  )r   r"   r   rB   r   
warpAffiner   r   r   rZ  r   )r   r   r-   r3  imgwimghM_srN   rM   leftuprQ  cropped_imgscale2t1r   t2invs                     r   scale_transrj    s   99Q<D99Q<D
((
Q1	!C'	(1a$!ad1B*CDjjC ..D<
0CDHsNADHsNA
**Sa&
!C	2ad8ad?TQY.1a41Q4$!)0KL

 #
$B 6C<D	
a#Bc3Ds/KaKK	47DG$	%B 
16C<a#.	/BGE	1Q4$(?AaD4!8O4	5B>5:

A37
8Cr   c                    [         R                  " U5      R                  SS/5      n[        X5      nUS   S:w  d   e[         R                  " U5      R                  [         R                  5      n[        X5      u  pEXEU4$ )Nr   r:  r
   r   )r"   r   r   rM  roundr   r   rZ  )r   five_pointsrA  rQ  rY  r   s         r   align_for_lmrn    sk    ((;'//B8K,DGqLL88D>  *D3oOHD  r   c           	         U R                   u  pgXc-  R                  [        R                  5      nXs-  R                  [        R                  5      n	US-  US-  -
  [	        US   US-  -
  U-  5      -   R                  [        R                  5      n
X-   nU	S-  US-  -
  [	        US-  US   -
  U-  5      -   R                  [        R                  5      nX-   nU R                  X4[        R                  S9nUR                  XX45      nUb2  UR                  X4[        R                  S9nUR                  XX45      n[        R                  " US S 2S4   US   -
  US-  -   US S 2S4   US   -
  US-  -   /SS9U-  nU[        R                  " [        R                  " US-  US-  -
  U	S-  US-  -
  /5      SS/5      -
  nXU4$ )Nr
   r   r   )resampler   )r   r   r"   r   r   r   r   BICUBICrZ  r   r   r   )r   r   r-   r3  target_sizemaskw0h0rN   rM   rc  rightrd  belownew_imgnew_lms                   r   resize_n_crop_imgrz    s   XXFB	!A	!AEK!O#e	
1Q!' $fRXX. 	E
a%+/
!E	a!A$!% $fRXX. Ejj!%--j8GllDe34G{{A6EMM{:yy$E12XXr!Q$x!A$a/AqDAaD261IJ !"Fbjj
1q5;?*q5;?*- 	.011v7 7F D  r   c                 @   [         R                  " / SQ5      S-
  nXS   S S 24   [         R                  " XSS/   S S 24   S5      [         R                  " XSS/   S S 24   S5      XS   S S 24   XS   S S 24   /n[         R                  " USS	9nU/ S
QS S 24   nU$ )Nr   r   r   r
   ra   r   r   r   r   r   )r"   r   r   r   )r   r   r   lm5ps       r   
extract_5pr}    s    XX23a7F
!9a<
1a&>1$%q)
1a&>1$%q)2Qil+;Rq	1=MJ
 88JQ'D"#DKr   c           	      >   U R                   u  pgUR                  S   S:w  a  [        U5      nOUn[        UR	                  5       UR	                  5       5      u  pU	R                  5       n	XZ-  n
[        XXXCS9u  pn[        R                  " XgXS   U	S   /5      nXX4$ )a   
Return:
    transparams        --numpy.array  (raw_W, raw_H, scale, tx, ty)
    img_new            --PIL.Image  (target_size, target_size, 3)
    lm_new             --numpy.array  (68, 2), y direction is opposite to v direction
    mask_new           --PIL.Image  (target_size, target_size)

Parameters:
    img                --PIL.Image  (raw_H, raw_W, 3)
    lm                 --numpy.array  (68, 2), y direction is opposite to v direction
    lm3D               --numpy.array  (5, 3)
    mask               --PIL.Image  (raw_H, raw_W, 3)
r   r   )rr  rs  r   )	r   r   r}  r4  r   squeezerz  r"   r   )r   r   lm3Drs  rr  rescale_factorrt  ru  r|  r-   r3  img_newlm_newmask_newtrans_paramss                  r   	align_imgr    s     XXFB	xx{a"~ t~~!12DA			AA !2;!;GX88RQ!ad34L&22r   c                     [         R                  " U SS2S4   S-  U SS2S4   S-  -   U SS2S4   S-  -   5      SS2S4   nX-  n U $ )z;Normalize a numpy array of 3 component vectors shape=(n,3) Nr   r
   r   )r"   rD   )arrlenss     r   normalize_v3r    sS    773q!t9a<#ad)Q,.QTA=>q$wGDKCJr   c                 0   [         R                  " U R                  U R                  S9nX   n[         R                  " US S 2S4   US S 2S4   -
  US S 2S4   US S 2S4   -
  5      n/ SQXDS S 2S4   S:H  US S 2S4   S:H  -  US S 2S4   S:H  -  '   [        U5      n[        S5       H4  n[        UR                  S   5       H  nX!Xe4   ==   XF   -  ss'   M     M6     US S 2S4   S:H  US S 2S4   S:H  -  US S 2S4   S:H  -  n/ SQX''   [        U5      nU$ )Nr\  r   r   r
   )r   r   r   ra   )r"   rA   r   r=   crossr  rC   )	r   r   r)  trisr3   rv   rw   indsr^   s	            r   estimate_normalsr    s    88HNN(..9D?D
b!etBE{*DQK$r1u+,EFA:EAAw!|!Q$1%1a4A67QA1Xu{{1~&Aqt% '  AJ!OQT
a0DAJ!ODDDJ$FMr   c           
         US:X  a  [         R                  " / SQ5      nO[         R                  " / SQ5      nU R                  u  pVpuU R                  5       UR                  5       pUS-
  US   -
  US'   [         R                  " U5      R                  [         R                  5      n[        UR                  S   5       H  nUSS2US4   USS2US4   p[        U* U5       H{  n[        U* U5       Hg  n[         R                  " X-   SUS-
  5      n[         R                  " X-   SUS-
  5      n[        UR                  S   5       H  nX@XU   X   4'   M     Mi     M}     M     U $ )aQ  
Return:
    img              -- numpy.array, (B, H, W, 3) img with landmark, RGB order, range (0, 255)


Parameters:
    img              -- numpy.array, (B, H, W, 3), RGB order, range (0, 255)
    landmark         -- numpy.array, (B, 68, 2), y direction is opposite to v direction
    color            -- str, 'r' or 'b' (red or blue)
r  )     o@r   r   )r   r   r  r   r?   Nr   )	r"   r   r   rb   rl  r   r   rC   clip)r   landmarkcolorstepr   rP   HWrv   rR   r.   rw   r.  ur:   ms                   r   draw_landmarksr  $  s8    |HH\"HH\"JA!HHJ1ux//HVxx!((2H8>>!$%1a (1a7"31ud#AD5$'GGAE1a!e,GGAE1a!e,x~~a01A)*Q4& 2 ( $ & Jr   c                    [         R                  " U 5      nUR                  S S u  p4XC-  nUc  [        R                  R                  U 5      n[        R                  R                  [        R                  R                  U 5      5      S   n[        U5       Ha  nUS S 2Xs-  US-   U-  2S S 24   n[         R                  " [        R                  R                  USR                  UUS-   5      5      U5        Mc     g )Nr
   r   r   z{}_{:0>2d}.jpg)r   imreadr   r  r  r  r  r	  rC   r
  r   r   )	img_path
target_dirr   rM   rN   n_split	base_namerv   img_is	            r   	split_visr  C  s    
**X
C99Ra=DAfGWW__X.
  !1!1(!;<Q?I7^Aqua!eq[(!+,GGLL%5%<%<Y=>U&D EFK	M r   c                     [         R                  " S6 nU S   R                  S S u  pE[         R                  " XX%U4S5      nU  H  nUR	                  U5        M     UR                  5         g )Nmp4vr   r
   T)r   VideoWriter_fourccr   VideoWriterr  release)
image_listr  fpsfourccrM   rN   outframes           r   write_videor  Q  sc    ##V,F a=r"DA
//)Sa&$
?C		%  KKMr   c                 j   / n[        X!S-
  U-
  5       Hz  n[        X0S-
  U-
  5       Hb  nXq-  U-   Xq-  U-   S-   US-   U-  U-   /nXq-  U-   S-   US-   U-  U-   S-   US-   U-  U-   /n	UR                  U5        UR                  U	5        Md     M|     [        R                  " U5      nUS S 2/ SQ4   nU$ )Nr   )r   r
   r   )rC   r  r"   r   )
rM   rN   margin_xmargin_yrs  	trianglesrR   r.   	triangle0	triangle1s
             r   generate_trianglesr  `  s     I8UX-.xQ!12AAEAIMAEQ;?CIQQ!a!(;a!eq[1_MIY'Y'	 3 / #I!Y,'Ir   c                    U R                  5       S:X  d   eUR                  5       S:X  d   eU R                  S   UR                  S   :X  d   eU R                  S   S:X  d   eUR                  S   S:X  d   eU R                  SS u  p#UR                  SS u  p$U R                  nU[        R                  " U[        R
                  S9R                  U5      U-  SS2SS4   -   nU R                  X#-  S45      n XR                  5          $ )z
:param vertices: [batch size, number of vertices, 3]
:param faces: [batch size, number of faces, 3]
:return: [batch size, number of faces, 3, 3]
ra   r   r
   Nr\  )	
ndimensionr   devicer   r   r   tor   long)r   r   bsnvnfr  s         r   face_verticesr  r  s    !Q&'&!#$#NN1Q/0/NN1"#"KKNa ^^BQFB[[!_FB__FU\\"EKK8;;FCdD=* *E!-HJJL!!r   c                 D   U R                  5       S:X  d   eUR                  5       S:X  d   eU R                  S   UR                  S   :X  d   eU R                  S   S:X  d   eUR                  S   S:X  d   eU R                  SS u  p#UR                  SS u  p$U R                  n[        R                  " X#-  S5      R                  U5      nU[        R                  " U[        R                  S9R                  U5      U-  SS2SS4   -   nU R                  X#-  S45      UR                  5          nUR                  SS5      nUR                  SSS5      nUR                  SUSS2S4   R                  5       [        R                  " USS2S4   USS2S4   -
  USS2S4   USS2S4   -
  5      5        UR                  SUSS2S4   R                  5       [        R                  " USS2S4   USS2S4   -
  USS2S4   USS2S4   -
  5      5        UR                  SUSS2S4   R                  5       [        R                  " USS2S4   USS2S4   -
  USS2S4   USS2S4   -
  5      5        [        R                  " USSS	9nUR                  X#S45      nU$ )
z
:param vertices: [batch size, number of vertices, 3]
:param faces: [batch size, number of faces, 3]
:return: [batch size, number of vertices, 3]
ra   r   r
   Nr\  r   r   gư>)epsdim)r  r   r  r   rA   r  r   r   r   r  
index_add_r  r   	normalize)r   r   r  r  r  r  r   vertices_facess           r   vertex_normalsr    s    !Q&'&!#$#NN1Q/0/NN1"#"KKNa ^^BQFB[[!_FB__Fkk"'1%((0GU\\"EKK8;;FCdD=* *E%%rwl3EJJLANMM"a E#++B15N	5A;N1a4(>!Q$+??"1a4(>!Q$+??	AB 	5A;N1a4(>!Q$+??"1a4(>!Q$+??	AB 	5A;N1a4(>!Q$+??"1a4(>!Q$+??	AB
 kk't3Goorqk*GNr   c                     [        U [        5      (       d  U $  " S S[        5      nU" 5       nU  H  n[        X   5      UR                  U'   M     U$ )Nc                       \ rS rSrSrg)dict2obj.<locals>.Ci  rY   N)__name__
__module____qualname____firstlineno____static_attributes__rY   r   r   Cr    s    r   r  )r5   dictobjectdict2obj__dict__)dr  or.  s       r   r  r    sM     aF  	
A 

1 Hr   c                 R   U S   nU S   nU S   nU S   nXd-
  nXu-
  n	U[        X-  5      -
  n
U
S:  a  SOU
n
U[        X-  5      -
  nUS:  a  SOUnU[        X-  5      -   nX:  a  UOUnU[        X-  5      -   nX:  a  UOUnXX/n U  Vs/ s H  n[        U5      PM     n nU $ s  snf )zI
:param bbox: [xmin,ymin,xmax,ymax]
:return: bbox: [xmin,ymin,xmax,ymax]
r   r   r
   ra   )r   )rQ  	img_width
img_heightenlarge_ratiorc  toprv  bottom	roi_width
roi_heightnew_leftnew_top	new_right
new_bottomrR   s                  r   enlarged_bboxr    s     7D
q'CGE!WFIJc)344HqLqhHC
233GQ;aGGI566I&2		I#j899J)6JJy5D !DqCFDD!K "s   B$c           
      V   UR                  [        R                  5      n[        [	        U5      S-
  5       H6  n[
        R                  " U [        X   5      [        XS-      5      UU5        M8     U(       a2  [
        R                  " U [        US   5      [        US   5      X#5        g g )Nr   r   r   )r   r"   r   rC   r   r   r  tuple)imr@  r  stroke_sizeclosedrv   s         r   	draw_liner    s    ]]288$F3v;?#U69%uVE]';U	 $ U6!9%uVBZ'8%M r   )i   )N)r
   )bilinearrA   g?)z	asset/BFM)BFM)T)      l@N)Nr  g     Y@)r  r
   )g      4@)r
   r   N)rW   )r
   F)9r8   rc   r  os.pathr  r   r   r   numbanumpyr"   r   torch.nn.functionalnn
functionalr   PILr   scipy.ior   r   listr   r   r)   r;   rS   jitr_   r   r   r   r   r   r  r  r#  r4  rM  rS  rZ  rj  rn  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  rY   r   r   <module>r     s*     	   
       %d t &$D: D4( ), D4(ZD )ZDz%R*Rl&+\>BQj4(::!!8	3D >M$",'TDNr   