
    9iL                        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!  S SK"J#r#  S SK$J%r%  S S	K&J'r'  S S
K(J)r)J*r*  S SK+J,r,  S SK-J.r.  S SK/J0r0J1r1  S SK2J3r3J4r4  S SK5J6r6  \Rn                  S:  a'  \Rp                  Rr                  r\Rt                  " 5         \6" 5       r;\,Rx                  " \1Rz                  \Rz                  S9 " S S\*5      5       r>g)    N)AnyDict)loadmatsavemat)	Pipelines)LargeBaseLmkInfer)align_for_lm	align_img	draw_lineenlarged_bboximage_warp_grid1	load_lm3dmesh_to_stringread_objresize_on_long_sidespread_flow	write_obj)Model)
OutputKeys)pipeline)InputPipeline)	PIPELINES)	LoadImage)	ModelFileTasks)create_devicedevice_placement)
get_loggerz2.0)module_namec                      ^  \ rS rSrS\S\4U 4S jjrS\S\\\4   4S jr	SS jr
S	 rSS
 jrS rS rS rSS jrS rS\\\4   S\\\4   4S jrS\\\4   4S jrSrU =r$ )FaceReconstructionPipeline(   modeldevicec                 
  > [         TU ]  XS9  Un[        R                  R	                  US5      n[        R                  R	                  U[
        R                  5      nSU;   a  SU l        OX l        U R                  R                  5       U l        [        R                  R	                  US5      n[        R                  " X`R                  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                  R#                  U5        U R                  R%                  5         [        R&                  " U R                  5      nU R(                  R+                  U5        U R(                  R-                  U5        U R(                  R/                  5         U R(                  R%                  5         U R(                  R1                  SS9  [        R                  R	                  [        R                  R3                  S5      S5      n	[        R                  R5                  U	5      (       d  [        R6                  " U	5        [8        R:                  " [        R                  R	                  USS5      U	5        [8        R:                  " [        R                  R	                  USS5      U	5        [8        R:                  " [        R                  R	                  USS5      U	5        [<        R>                  " [<        R@                  RB                  SS9U l"        [F        RH                  " S
S9n
SU
RJ                  l&        S
U
RJ                  l'        [F        RP                  " 5       n[F        RR                  " XS9U l*        U RT                  RW                  5          URW                  5          [F        RX                  R[                  [        R                  R	                  US5      S5       n[F        R\                  " 5       nUR_                  URa                  5       5        U RT                  Rb                  RW                  5         [F        Rd                  " USS9  U RT                  Rg                  [F        Rh                  " 5       5        SSS5        SSS5        SSS5        SU l5        [m        U5      U l7        [q        SRs                  U5      5      U l:        [w        U Rx                  5      nX l        g! , (       d  f       Np= f! , (       d  f       Ny= f! , (       d  f       N= f)a  The inference pipeline for face 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_faceRecon = pipeline('face-reconstruction',
        model='damo/cv_resnet50_face-reconstruction')
    >>> result = pipeline_faceRecon(test_image)
    >>> mesh = result[OutputKeys.OUTPUT]['mesh']
    >>> texture_map = result[OutputKeys.OUTPUT_IMG]
    >>> mesh['texture_map'] = texture_map
    >>> write_obj('hrn_mesh_mid.obj', mesh)
)r$   r%   assetsgpucudazlarge_base_net.pth   )max_sizer%   z,retinaface_resnet50_2020-07-20_old_torch.pthcpuT)map_locationweights_only	image_res~z.cache/torch/hub/checkpointsface_alignmentzs3fd-619a316812.pthz3DFAN4-4a694010b9.zipzdepth-6c4283c0e0.zipF)
flip_input)allow_soft_placementg?)graphconfigzsegment_face.pbrb )nameNi   z {}/assets/BBRegressorParam_r.mat)=super__init__ospathjoinr   TORCH_MODEL_FILEdevice_name_lowerr   model_preloadlarge_base_lmks_modelr   detectortorchloaddirnameload_state_dictevalr%   r$   
set_devicesetupparallelize
set_render
expanduserexistsmakedirsshutilcopyr2   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readr5   import_graph_defrunglobal_variables_initializertex_sizer   lm3d_stdr   formatalign_paramsr   device_name)selfr$   r%   
model_root
bfm_foldercheckpoint_pathlmks_cpkt_pathdetector_ckpt_name
state_dictsave_ckpt_dirr6   g1f	graph_def	__class__s                 t/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/pipelines/cv/face_reconstruction_pipeline.pyr;   #FaceReconstructionPipeline.__init__,   s   & 	u4
WW\\*h7
'',,z93M3MN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%

)

 



,GGs#%CEww~~m,,KK&GGLL%57LM	 	GGLL%5023@	B 	GGLL%57MN	 &33((00UD T:=@:*.'XXZ"<^^&&(XX''Z1BC!" "I--affh7NN((335''	;NN&&r'F'F'HI ! ) !*-#.55jAC t//0!  ! )(s=   'U8?U7BT=UU=
UU
U	U
U-inputreturnc                     [         R                  " U5      n[        UR                  5      S:X  a%  [        R
                  " U[        R                  5      nUR                  [        5      nSU0nU$ )N   img)	r   convert_to_ndarraylenshapecv2cvtColorCOLOR_GRAY2BGRastypefloat)rm   r{   r   results       ry   
preprocess%FaceReconstructionPipeline.preprocess   sT    **51syy>Q,,sC$6$67Cjj    c                 (   [         R                  R                  USS S S24   5      nUR                  u  pxUS-
  US S 2S4   -
  US S 2S4'   [	        XbU5      u  pp[	        UUUUSU-  S-  S9u  ppU R
                  R                  U R
                  R                  R                  S5      S[        R                  " U
5      0S	9nU(       GaC  [        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[        R                  " U5      R                  S5      n[        R                  " U5      R                  S5      nXXU4$ )N.   g     Y@   )target_sizerescale_factorzoutput_alpha:0zinput_image:0)	feed_dict     o@dtyper~   r   )PILImage	fromarraysizer
   r^   rf   r5   get_tensor_by_namenparrayrE   tensorfloat32permute	unsqueeze)rm   r   lmri   	to_tensorr0   imWH_im_lrlm_lrim_hdlm_hdmask_lrs                  ry   	read_data$FaceReconstructionPipeline.read_data   s   YY  S$B$Y0wwEBq"uI%1b5	&rx8%&!)+c13% ..$$NN  334DE&8 % : LL$&mm%%,WQ1%5iil  LL$&mm%%,WQ1%5iil  ll!D(??C?CQ@JKG LL'11!4ELL'11!4EU722r   c                     [         R                  " [        R                  " U5      R	                  [        R
                  5      5      $ N)rE   r   r   r   r   r   )rm   labels     ry   parse_label&FaceReconstructionPipeline.parse_label   s(    ||BHHUO222::>??r   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	   rk   r   reshaper   r   get_landmarks_from_image)rm   r   rV   five_points	input_imgscalebboxlandmarks           ry   prepare_data'FaceReconstructionPipeline.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                    UR                  SSSS5      R                  5       R                  5       R                  5       S   S-  nUR	                  [
        R                  5      nU R                  USS9n[        R                  " [
        R                  " U5      S-  [        R                  S9R                  SSS5      R                  S5      nUR                  U R                  R                  5      nU$ )	Nr   r~   r   r   r   gQ?)degreer   )r   detachr,   numpyr   r   uint8fat_facerE   r   r   r   r   tor$   r%   )rm   input_img_tensorr   input_img_for_textureinput_img_for_texture_tensors        ry   get_img_for_texture.FaceReconstructionPipeline.get_img_for_texture   s    $,,q!Quuwq2489	$$RXX.	 $i E',||HH*+d2--(!!(Aq!1))A, 	% (D'F'FJJ($++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^@)valuer)   )j   r~   r   )r   r   COLOR_BGR2RGBrD   predict_jsonsappendmaxr   minintcopyMakeBorderBORDER_CONSTANTresizer   	infer_imgrC   r@   r   zerosrangerA   )!rm   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!                                    ry   
infer_lmks%FaceReconstructionPipeline.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   r   	enumerater   r   GaussianBlur)rm   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_kerneltargmasks                          ry   find_face_contour,FaceReconstructionPipeline.find_face_contourZ  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   r!  r   r   r   r   r   absr   r   r   r   r   dstackr   )rm   r   r   _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                         ry   r   #FaceReconstructionPipeline.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R                   S   S:  d  UR                   S   S:  a  [        US5      u  pU R                  U5      u  p4Ub'  [        R                  " U5      R                   S   S:X  a  0 $ / nUS   nS H   nUR                  XF   S   XF   S   /5        M"     [        R                  " U5      nU R                  XR                  US9nU R                  XU R                  SS9u  pxpnUU	UU
US	.nU R                  R                  U5        U R                  R                  5       nU$ )
Nr   i  r   i  )r  r  6   r  Z   )r   r*   r/   )imgsimgs_hdlmslms_hd	face_mask)r   r   r   r   r   r   r   rV   r   ri   r$   set_input_basepredict_results_base)rm   r   r   boxr   r   r   	im_tensor	lm_tensorim_hd_tensorlm_hd_tensorr   dataoutputs                 ry   predict_base'FaceReconstructionPipeline.predict_base  s-   99Q<$#))A,"5(d3FCs+?bhhw/55a8A=I	!*'Cgl1ow|A?@ (HHY'	%%c<<Y%O	AEDMMS BP B:>	l$ #"
 	

!!$'002r   c                    US   R                  5       R                  5       R                  [        R                  5      n[
        R                  " U[
        R                  5      nUnU R                  U5      nU R                  US   5      nUS   UUS   US   US   US   US   US   US	   US
   S.
nU R                  R                  U5        U R                  R                  5         U R                  SS9  U R                  R                  5       nUS   n	US   US   US   S.n[        R                  S [        R                   U	[        R"                  U0$ )Nr   r   input_img_hdr@  gt_lmcoeffsposition_maptexture_maptex_valid_maskde_retouched_albedo_map)
r   input_img_for_texrM  r@  rN  rO  rP  rQ  rR  rS  T)	visualize	face_mesh	vis_image
frame_list)meshrW  rX  )r,   r   r   r   r   r   r   COLOR_RGB2BGRrJ  r   r$   set_input_hrnget_edge_points_horizontalsave_results_hrnr   
OUTPUT_OBJ
OUTPUT_IMGOUTPUT)
rm   r{   r   	bgr_imager   base_model_outputrT  	hrn_inputr   rQ  s
             ry   forward"FaceReconstructionPipeline.forward  sa   %L$$&,,.55bhh?	LLC,=,=>	 --c2 44k*, +;7!2-n=*;7&w/'1-n=,];/0@A78
	 	

  +

--/

T
"**--/m,K( -!,/
 !!4!!;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renderFrY  zutf-8)encoding)
getr   r^  r_  r`  ioBytesIOr   encodewrite)
rm   inputskwargsrg  
output_objrQ  r   mesh_str
mesh_bytesr   s
             ry   postprocess&FaceReconstructionPipeline.postprocess  s    He,J112
Z223**+J%gfo6H!':JZ( !!:!!;vt

  4;

 r   )	rk   rD   r%   r@   r^   rC   ri   rV   rh   )Ti   r   )g?)__name__
__module____qualname____firstlineno__strr;   r   r   r   r   r   r   r   r   r   r!  r   rJ  rd  rs  __static_attributes____classcell__)rx   s   @ry   r"   r"   (   s    Xc X3 Xt $sCx. 3>@(,G R6%p5nB)
T#s(^ )
S#X )
VtCH~  r   r"   )?rj  r<   rQ   typingr   r   r   r2   r   r   	PIL.Imager   
tensorflowrW   rE   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   >modelscope.models.cv.skin_retouching.retinaface.predict_singler   modelscope.outputsr   modelscope.pipelinesr   modelscope.pipelines.baser   r   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.constantr   r   modelscope.utils.devicer   r   modelscope.utils.loggerr   __version__compatv1disable_eager_executionloggerregister_moduleface_reconstructionr"    r   ry   <module>r     s    	 	   
      % )   
 ) ) 5 2 . 6 C .>>U	B 	 	9+H+HJ| |J|r   