
    9iT                     p   S SK r S SKrS SKrS SKJrJr  S SKrS SKrS SKr	S SK
rS SKrS SKrS SKJrJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#  S SK$J%r%  S SK&J'r'  S S	K(J)r)  S S
K*J+r+  S SK,J-r-  S SK.J/r/J0r0  S SK1J2r2  S SK3J4r4  S SK5J6r6  S SK7J8r8J9r9  S SK:J;r;J<r<  S SK=J>r>   S SK?J@r@  \R                  S:  a'  \R                  R                  r\R                  " 5         \>" 5       rG\2R                  " \9R                  \R                  S9 " S S\05      5       rJg! \A a	    S SK?JBr@   Nf = f)    N)AnyDict)loadmatsavemat)	Pipelines)LargeBaseLmkInfer)POSalign_for_lm	draw_lineenlarged_bbox
extract_5pimage_warp_grid1	load_lm3dmesh_to_stringread_objresize_n_crop_imgresize_on_long_sidespread_flow	write_obj)HeadSegmentor)TexProcesser)Model)
OutputKeys)pipeline)InputPipeline)	PIPELINES)	LoadImage)Config)	ModelFileTasks)create_devicedevice_placement)
get_logger)get_dir)_get_torch_homez2.0)module_namec                      ^  \ rS rSrSS\S\4U 4S jjjrS\S\\\4   4S jr	   SS jr
     SS	 jrSS
 jrS rS rSS jrS\\\4   S\\\4   4S jrS\\\4   4S jrSrU =r$ )HeadReconstructionPipeline2   modeldevicec                   > [         TU ]  XS9  Un[        R                  R	                  US5      n[        R                  R	                  U[
        R                  5      n[        R                  R	                  U[
        R                  5      n[        R                  SU 35        [        R                  " U5      U l        X0l        SU;   a  SU l        OX l        U R                  R                  5       U l        [        R                  R	                  US5      n[         R"                  " XR                  S:H  5      U l        ['        SU R                  S9U l        S	n	[*        R,                  " [        R                  R	                  [        R                  R/                  U5      U	5      S
SS9n
U R(                  R1                  U
5        U R(                  R3                  5         [*        R4                  " U R                  5      nU R6                  R9                  U5        U R6                  R;                  U5        U R6                  R=                  5         U R6                  R3                  5         U R6                  R?                  5         [A        5       n[        R                  R	                  US5      n[        R                  RC                  U5      (       d  [        RD                  " U5        [F        RH                  " [        R                  R	                  USS5      U5        [F        RH                  " [        R                  R	                  USS5      U5        [F        RH                  " [        R                  R	                  USS5      U5        [J        RL                  " [J        RN                  RP                  SS9U l)        [T        RV                  " SS9nSURX                  l-        SURX                  l.        [T        R^                  " 5       n[T        R`                  " XS9U l1        U Rb                  Re                  5          URe                  5          [T        Rf                  Ri                  [        R                  R	                  US5      S5       n[T        Rj                  " 5       nURm                  URo                  5       5        U Rb                  Rp                  Re                  5         [T        Rr                  " USS9  U Rb                  Ru                  [T        Rv                  " 5       5        SSS5        SSS5        SSS5        [y        US9U l=        [}        US9U l?        [        U5      U lA        [        SR                  U5      5      U lD        [        U R                  5      nX l        g! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)a  The inference pipeline for head reconstruction task.

Args:
    model (`str` or `Model` or module instance): A model instance or a model local dir
        or a model id in the model hub.
    device ('str'): device str, should be either cpu, cuda, gpu, gpu:X or cuda:X.

Example:
    >>> from modelscope.pipelines import pipeline
    >>> test_image = 'data/test/images/face_reconstruction.jpg'
    >>> pipeline_headRecon = pipeline('head-reconstruction',
        model='damo/cv_HRN_head-reconstruction')
    >>> result = pipeline_headRecon(test_image)
    >>> mesh = result[OutputKeys.OUTPUT]['mesh']
    >>> texture_map = result[OutputKeys.OUTPUT_IMG]
    >>> mesh['texture_map'] = texture_map
    >>> write_obj('head_reconstruction.obj', mesh)
)r+   r,   assetszloading config from gpucudazlarge_base_net.pthi   )max_sizer,   z,retinaface_resnet50_2020-07-20_old_torch.pthcpuT)map_locationweights_onlycheckpointsface_alignmentzs3fd-619a316812.pthz3DFAN4-4a694010b9.zipzdepth-6c4283c0e0.zipF)
flip_input)allow_soft_placementg?)graphconfigzsegment_face.pbrb )nameN)
model_rootz {}/assets/BBRegressorParam_r.mat)Gsuper__init__ospathjoinr    TORCH_MODEL_FILECONFIGURATIONloggerinfor   	from_filecfghair_texdevice_name_lowerr   model_preloadlarge_base_lmks_modelr   detectortorchloaddirnameload_state_dictevalr,   r+   
set_devicesetupparallelize
set_renderr%   existsmakedirsshutilcopyr6   FaceAlignmentLandmarksTypeTHREE_Dlm_sesstfConfigProtogpu_optionsper_process_gpu_memory_fractionallow_growthGraphSession	face_sess
as_defaultgfile	FastGFileGraphDefParseFromStringreadr9   import_graph_defrunglobal_variables_initializerr   head_segmentorr   tex_processorr   lm3d_stdr   formatalign_paramsr"   device_name)selfr+   r,   rJ   r>   
bfm_foldercheckpoint_pathconfig_pathlmks_cpkt_pathdetector_ckpt_name
state_dicthub_dirsave_ckpt_dirr:   g1f	graph_def	__class__s                    t/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/pipelines/cv/head_reconstruction_pipeline.pyr@   #HeadReconstructionPipeline.__init__6   s   & 	u4
WW\\*h7
'',,z93M3MNggll:y/F/FG*;-89##K0 F? &D & --335j2FG%6%D%D--7&9"s43D3DEKZZGGLL8:LM
 	%%j1d//0

f%

)

 



)Wm<ww~~m,,KK&GGLL%57LM	 	GGLL%5023@	B 	GGLL%57MN	 &33((00 T:=@:*.'XXZ"<^^&&(XX''Z1BC!" "I--affh7NN((335''	;NN&&r'F'F'HI ! ) ,zB)Z@!*-#.55jAC t//0%  ! )(s=   <W	?V8BV'(V80W	'
V51V88
W	W		
Winputreturnc                 6   [        U[        5      (       aj  [        R                  " U5      n[	        UR
                  5      S:X  a%  [        R                  " U[        R                  5      nUR                  [        5      nOUR                  [        5      nSU0nU$ )N   img)
isinstancestrr   convert_to_ndarraylenshapecv2cvtColorCOLOR_GRAY2BGRastypefloat)rx   r   r   results       r   
preprocess%HeadReconstructionPipeline.preprocess   so    eS!!..u5C399~"ll3(:(:;**U#C,,u%C    c           	      *   UR                   u  pxUR                  S   S:w  a  [        U5      n	OUn	[        U	R	                  5       UR	                  5       5      u  pXk-  n[        XXXTS9u  pn[        R                  " XxXS   S   U
S   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      )target_sizemask   )sizer   r   r	   	transposer   nparray)rx   r   lmlm3Dr   r   rescale_factorw0h0lm5ptsimg_newlm_newmask_newtrans_paramss                   r   	align_img$HeadReconstructionPipeline.align_img   s    * 88A;!b>DD 4>>#T^^%56 %6Q{%?!xxaDGQqT!W =>f66r   c	                    [         R                  R                  USS S S24   5      n	U	R                  u  pUS-
  US S 2S4   -
  US S 2S4'   [         R                  R                  U5      n[         R                  R                  USS S S24   5      nU R	                  XU5      u  ppU R	                  XX7US9u  nnnnU R	                  UUUUX-  S-  S9u  nnnnU R
                  R                  U R
                  R                  R                  S5      S[        R                  " U5      0S	9nU(       Ga  [        R                  " [        R                  " U5      S
-  [        R                  S9R                  SSS5      R                  S5      n[        R                  " [        R                  " U5      S
-  [        R                  S9R                  SSS5      R                  S5      n[        R                  " [        R                  " U5      S
-  [        R                  S9S S S S 2S S 24   nUbE  [        R                  " [        R                  " U5      S
-  [        R                  S9S S S S 2S S 24   OS n[        R                  " U5      R                  S5      n[        R                  " U5      R                  S5      n[        R                  " [        R                  " U5      S
-  [        R                  S9R                  SSS5      R                  S5      n[        R                  " U5      R                  S5      nUUUUUUX4$ )N.r   )r   r      )r   r   zoutput_alpha:0zinput_image:0)	feed_dict     o@)dtyper   r   )PILImage	fromarrayr   r   rh   rp   r9   get_tensor_by_namer   r   rP   tensorfloat32permute	unsqueeze)rx   r   r   rt   	to_tensor	image_resimg_fat	head_maskr   imWHim_fat_im_lr_coefflm_lr_coeffim_lrlm_lrmask_lr_headim_hdlm_hdmask_lrs                         r   	read_data$HeadReconstructionPipeline.read_data   s    YY  S$B$Y0wwEBq"uI%1b5	II''	2	$$WS$B$Y%78)-)I&(,H^ )7 )M%5%!^^!)5; , =5% ..$$NN  334DE&8 % : LL$&mm%%,WQ1%5iil  LL$&mm%%,WQ1%5iil  ll!D(??C?CQ@JKG
 *6)A !<<&-U]]D$1$&GK  LL'11!4ELL'11!4E,,%,mm%%,WQ1%5iil   ,,{3==a@KeUE7L+ZZr   c                 n   [        XU R                  5      u  pEnUS:X  a  g [        R                  " U/ SQ5      R	                  [        R
                  5      nUSS S 2S S 2S S S24   nUR                  U5      S   nUS S 2S S24   U-  nUS S 2S4   US   -   US S 2S4'   US S 2S4   US   -   US S 2S4'   U$ )Nr   )r   r   r      r   r   r   )r
   rv   r   reshaper   r   get_landmarks_from_image)rx   r   r`   five_points	input_imgscalebboxlandmarks           r   prepare_data'HeadReconstructionPipeline.prepare_data   s    !-"	$ A: JJy*:;BB2::N	aAttm,	33I>qAArrE?U*!!Q$$q'1A!!Q$$q'1Ar   c                 l
   SnSn/ n[         R                  " U[         R                  5      nU R                  R	                  U5      n/ nU H<  nUS   S:X  a    O2UR                  US   S   US   S   US   S   US   S	   S
.5        M>     U GH  n	U	S   n
U	S   nU	S   nU	S   nX-
  S-   nX-
  S-   nX-   S-  nX-   S-  n[        X5      U-  nUUS-  -
  n
UUS-  -
  nU
nUnU
U-   nUU-   nUR                  u  nnn[        SU
* 5      n[        SU* 5      n[        SU
5      n
[        SU5      n[        SUU-
  5      n[        SUU-
  5      n[        UU5      n[        UU5      nU[        U5      [        U5      2[        U
5      [        U5      24   nUS:  d  US:  d  US:  d  US:  aL  [         R                  " U[        U5      [        U5      [        U5      [        U5      [         R                  SS9n[         R                  " UX"45      n[        R                  " UU R                  U R                   S:H  5      nUU-  n["        R$                  " S5      n['        S5       H7  n US   U S-  S-      U-  U-   UU    S'   US   U S-  S-      U-  U-   UU    S'   M9     ["        R                  " US S 2S4   5      n
["        R                  " US S 2S4   5      n["        R                  " US S 2S4   5      n["        R                  " US S 2S4   5      nX-
  S-   nX-
  S-   nX-   S-  nX-   S-  n[        X5      U-  nUUS-  -
  n
UUS-  -
  nU
nUnU
U-   nUU-   nUR                  u  nnn[        SU
* 5      n[        SU* 5      n[        SU
5      n
[        SU5      n[        SUU-
  5      n[        SUU-
  5      n[        UU5      n[        UU5      nU[        U5      [        U5      2[        U
5      [        U5      24   nUS:  d  US:  d  US:  d  US:  aL  [         R                  " U[        U5      [        U5      [        U5      [        U5      [         R                  SS9n[         R                  " UX"45      n[        R                  " UU R                  U R                   R)                  5       S:H  5      nUU-  n["        R$                  " S5      n['        S5       H7  n US   U S-  S-      U-  U-   UU    S'   US   U S-  S-      U-  U-   UU    S'   M9     UR                  U5        GM     Xt4$ )Nr   g?scorer   r   r   r   r   r   )x1y1x2y2r   r   r   r   )g\(Y@gR1]@gQ^@)valuer0   )j   r   r   )r   r   COLOR_BGR2RGBrO   predict_jsonsappendmaxr   minintcopyMakeBorderBORDER_CONSTANTresizer   	infer_imgrN   rK   r   zerosrangerL   )!rx   img_bgr
INPUT_SIZEENLARGE_RATIO	landmarks	rgb_imageresultsboxesannodetect_resultr   r   r   r   whcxcysztrans_x1trans_y1heightwidthr   dxdyedxedycrop_img	base_lmks	inv_scaleaffine_base_lmksidxs!                                    r   
infer_lmks%HeadReconstructionPipeline.infer_lmks  s   
	LL#*;*;<	----i8DG}"LL6l1o6l1o6l1o6l1o	   #Mt$Bt$Bt$Bt$B!A!A'QB'QBQ]*Bb1fBb1fBHHbBbB(FE1QBQBQBQBae$Caf%CUBBVRB RR#b'#b'/!ABHAva37cAg--GHGH''24 zz(Z,DEH)33$44!!V+-I ZI!xx1Sz"1cAgk2Y>I !% #1cAgk2Y>I !% " (A./B(A./B(A./B(A./B!A!A'QB'QBQ]*Bb1fBb1fBHHbBbB(FE1QBQBQBQBae$Caf%CUBBVRB RR#b'#b'/!ABHAva37cAg--GHGH''24 zz(Z,DEH)33$44!!'')V35I ZI!xx1Sz"1cAgk2Y>I !% #1cAgk2Y>I !% " -.c #f r   c           
         U R                  U5      u  p#[        R                  " U5      n/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/n/ n[        [	        U5      5       Ho  n[        X&   S	   X&   S
   X&   S   X&   S   /UR                  S   UR                  S   S5      nU Vs/ s H  n[        U5      PM     nnUR                  U5        Mq     / n	[        UR                  S   5       GH  nX6S S 2S S 24   n
/ n[        R                  " UR                  S   UR                  S   4[        R                  5      nXV   nUS   US   -
  nUS   US   -
  nX:  a  UOUnUS-  nUS:X  a  SnUS-  nUS-  S:X  a  UOUS-   n[        U5       H  u  nn[        R                  " UR                  S   UR                  S   4[        R                  5      n[        UU
US   US    SUUS   5        [        R                  " UUU4S5      nUS:  a  [        XUS   US    SUS-  US   5        UR                  U5        M     [        R                  " UUU4S5      nUR                  U5        U	R                  U5        GM     U	S   U4$ s  snf )N)r   !   F)r  &   F)*   /   F)3   7   F)9   @   F)B   J   T)K   S   T)T   `   Tr   r   r   r   r   r   g      ?r   r   
   )   r  r  )r  r   r   r   r   r   r   r   r   r   uint8	enumerater   r   GaussianBlur)rx   imager   r   args	roi_bboxsiroi_bboxxpeople_mapsr   maps
whole_maskroi_boxroi_box_widthroi_box_heightshort_side_length
line_widthkernel_sizegaussian_kernelr   argr   s                          r   find_face_contour,HeadReconstructionPipeline.find_face_contour  s   ??51HHY'	.0 	s5z"A$&{{1~u{{1~s4H )111AH1X& # yq)*A Aq)HD5;;q>5;;q>"BBHHMJlG#AJ3M$QZ'!*4N1>1OUc*b0JQ
$q.K-81_-Ak{UVO#D/3xxQQ @"((K$QA 7$c!f.'')8/(JAO6j3q6#a&*A-zA~s1vGD! * ))*+:O*L*+-J KK
#t$A +D 1~u$$O 2s   !Jc           	      `   [        US5      u  p4U R                  U5      u  pVUS   nUS   n[        R                  " UR                  S   UR                  S   S4[        R
                  S9nUS   US   -   S-  US   US	   -   S-  /n	[        [        US   US	   -
  5      [        US   US   -
  5      5      n
SUR                  S   U	S   -
  S-
  -  nSUR                  S   U	S   -
  S-
  -  nU
S-  SU	S   S-
  -  SU	S   S-
  -  X/n[        U5      n[        U5      n[        S
X-  5      n[        R                  " XU45      nUU[        U	S   US-  -
  5      [        U	S   US-  -   5      2[        U	S   US-  -
  5      [        U	S   US-  -   5      24'   U[        R                  " Xw45      -  S-  nUS   nUS[        R                  " UU45      S-  -
  -  n[        R                  " XR                  S   UR                  S   45      nX-  n[        US   US   US/ SQ5      u  nnnnnU$ )Ni   r   r   r   )r   r   r   r   r   r   d   r   r   g      ?).r   ).r   )r   r   r   r   )r   r3  r   r   r   r   r   absr   r   r   r   r   dstackr   )rx   r   degree_imgr   contour_mapsr   contour_mapFlow
box_center
box_lengthvalue_1value_2
value_listflow_box_lengthsfinter_face_mapspred	top_boundbottom_bound
left_boundright_bounds                         r   fat_face#HeadReconstructionPipeline.fat_face  s   )#s3"44T:"1oaxx$$Q'):):1)=qA** T{U4[0A5T{U4[0A57
 deDk)*CdeDk0I,JL
 tzz!}z!}4q89tzz!}z!}4q89NAA!23Q*Q-!:K5L

 j/o.o67ZZo>? GI 	SA"Q&' ((+JqM.=.A-B )CC A"Q&' ((+JqM.=.A-B )CCC 	D bii :;;eC&r*sRYYo.0278 8 9 zz$1syy| <=|AQL$v,S,B@>iz; r   c           	         US   R                  5       R                  5       R                  [        R                  5      n[
        R                  " U[
        R                  5      nUnUR                  S   S:  d  UR                  S   S:  a  [        US5      u  pEU R                  U5      u  pgUb'  [        R                  " U5      R                  S   S:X  a  0 $ U R                  U5      n/ n	US   nS H   n
U	R                  Xz   S   Xz   S   /5        M"     [        R                  " U	5      n	U R                  X@R                  U	S9n	U R                   R#                  U5      S   nU R%                  XIU R&                  XS9u  ppnnnnUUUUUUUUS	.nU R(                  R+                  U5        U R)                  5       nUc   eUS
   R                  [        R,                  5      nU R.                  R1                  UU R2                  S9nUS   US   S-   US   US   US   US.nSU0n[4        R6                  S [4        R8                  U[4        R:                  U0$ )Nr   r   i  r   i  )r  r  6   r  Z   )r   )r   r   )imgsimgs_hdlmslms_hd	face_maskr   
imgs_coeff	lms_coefftex_map)rJ   vertices	trianglesuvsfaces_uvnormals)rX  facesUVsr[  r\  texture_mapmesh)r2   numpyr   r   r  r   r   COLOR_RGB2BGRr   r   r  r   rK  r   r   r`   rr   processr   rt   r+   	set_inputr   rs   post_process_texturerJ   r   
OUTPUT_OBJ
OUTPUT_IMGOUTPUT)rx   r   r   	bgr_imager   r   boxr   fatbgrr   r  r   	im_tensor	lm_tensorim_hd_tensorlm_hd_tensorr   im_colm_codataoutputrW  	head_meshs                          r   forward"HeadReconstructionPipeline.forward
  s`   %L$$&,,.55bhh?	LLC,=,=>	99Q<$#))A,"5(d3FCs+?bhhw/55a8A=Is#	!*'Cgl1ow|A?@ (HHY'	%%c<<Y%O	''//4Q7	Z^ZhZhDMM6 [i [PW	l$	5RW #""	
 	

T"!!!#**2::6 $$99dmm : - z*K(1,%=z*i("
	 I

 !!4!!7w
 	
r   c                    UR                  SS5      nU[        R                     nU[        R                     nU[        R                     nU(       aC  [
        R                  " 5       n[        US   5      nUR                  SS9nUR                  U5        [        R                  U[        R                  U[        R                  U(       a  S 0n	U	$ U0n	U	$ )NrenderFr`  zutf-8)encoding)
getr   rf  rg  rh  ioBytesIOr   encodewrite)
rx   inputskwargsrx  
output_objr_  r   mesh_str
mesh_bytesr   s
             r   postprocess&HeadReconstructionPipeline.postprocessO  s    He,J112
Z223**+J%gfo6H!':JZ( !!:!!;vt

  4;

 r   )rv   rI   rO   r,   rK   rh   rJ   rr   rN   rt   r`   rs   )F)Ng      l@g     Y@)Ti   NNg     R@)N)g{Gz?)__name__
__module____qualname____firstlineno__r   r@   r   r   r   r   r   r   r   r  r3  rK  ru  r  __static_attributes____classcell__)r   s   @r   r)   r)   2   s    ac a3 a aF	 	$sCx. 	 "!%$7T !  !%2[h(G R6%p5nC
T#s(^ C
S#X C
JtCH~  r   r)   )Kr{  rA   r[   typingr   r   r   r6   ra  r   	PIL.Imager   
tensorflowra   rP   scipy.ior   r   modelscope.metainfor   Rmodelscope.models.cv.face_reconstruction.models.facelandmark.large_base_lmks_inferr   .modelscope.models.cv.face_reconstruction.utilsr	   r
   r   r   r   r   r   r   r   r   r   r   r   Amodelscope.models.cv.head_reconstruction.models.head_segmentationr   =modelscope.models.cv.head_reconstruction.models.tex_processorr   >modelscope.models.cv.skin_retouching.retinaface.predict_singler   modelscope.outputsr   modelscope.pipelinesr   modelscope.pipelines.baser   r   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.configr   modelscope.utils.constantr    r!   modelscope.utils.devicer"   r#   modelscope.utils.loggerr$   	torch.hubr%   BaseExceptionr&   __version__compatv1disable_eager_executionrF   register_modulehead_reconstructionr)    r   r   <module>r     s    	 	   
      % )1 1 1 1
 ) ) 5 2 . * 6 C .5! >>U	B 	 	9+H+HJl lJl  545s   .D& &D54D5