o
    *jL                     @   sr  d dl Z d dlZd dlZd dlmZmZ d dlZd dlZd dlZ	d dl
Zd dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZm Z m!Z! d dl"m#Z# d dl$m%Z% d d	l&m'Z' d d
l(m)Z)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 ej7dkrej8j9Ze:  e6 Z;e,j<e1j=ej=dG dd de*Z>dS )    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                       s   e Zd Zdedef fddZdedeeef fddZd!ddZ	dd Z
d"ddZdd Zdd Zdd Zd#ddZdd Zdeeef deeef fddZdeeef fdd Z  ZS )$FaceReconstructionPipelinemodeldevicec              
      s  t  j||d |}tj|d}tj|tj}d|v r!d| _n|| _| j | _tj|d}t	
|| jdk| _td| jd| _d}tjtjtj||d	d
d}| j| | j  t| j}| j| | j| | j  | j  | jjdd tjtjdd}	tj|	st|	 ttj|dd|	 ttj|dd|	 ttj|dd|	 tjtj j!dd| _"t#j$d
d}
d|
j%_&d
|
j%_'t#( }t#j)||
d| _*| j*+ Z |+ E t#j,-tj|dd(}t#. }|/|0  | j*j1+  t#j2|dd | j*3t#4  W d   n	1 s%w   Y  W d   n	1 s5w   Y  W d   n	1 sEw   Y  d| _5t6|| _7t8d9|| _:t;| j<}|| _dS )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"   ZassetsZgpucudazlarge_base_net.pth   )max_sizer"   z,retinaface_resnet50_2020-07-20_old_torch.pthcpuT)Zmap_locationZweights_only	image_res~z.cache/torch/hub/checkpointsface_alignmentzs3fd-619a316812.pthz3DFAN4-4a694010b9.zipzdepth-6c4283c0e0.zipF)Z
flip_input)Zallow_soft_placementg?)graphconfigzsegment_face.pbrb )nameNi   z {}/assets/BBRegressorParam_r.mat)=super__init__ospathjoinr   ZTORCH_MODEL_FILEdevice_name_lowerr   Zmodel_preloadlarge_base_lmks_modelr   detectortorchloaddirnameZload_state_dictevalr"   r!   Z
set_devicesetupZparallelizeZ
set_render
expanduserexistsmakedirsshutilcopyr*   ZFaceAlignmentZLandmarksTypeZTHREE_Dlm_sesstfZConfigProtoZgpu_optionsZper_process_gpu_memory_fractionZallow_growthZGraphSession	face_sessZ
as_defaultZgfileZ	FastGFileZGraphDefZParseFromStringreadr+   Zimport_graph_defrunZglobal_variables_initializerZtex_sizer   lm3d_stdr   formatalign_paramsr   Zdevice_name)selfr!   r"   Z
model_rootZ
bfm_folderZcheckpoint_pathZlmks_cpkt_pathZdetector_ckpt_nameZ
state_dictZsave_ckpt_dirr,   g1fZ	graph_def	__class__ u/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/face_reconstruction_pipeline.pyr1   ,   s   









z#FaceReconstructionPipeline.__init__inputreturnc                 C   s<   t |}t|jdkrt|tj}|t}d|i}|S )N   img)	r   Zconvert_to_ndarraylenshapecv2cvtColorZCOLOR_GRAY2BGRastypefloat)rL   rS   rV   resultrQ   rQ   rR   
preprocess   s   

z%FaceReconstructionPipeline.preprocessT   c                 C   sV  t j|dd d df }|j\}}|d |d d df  |d d df< t|||\}	}
}}	t||||d| d d\}	}}}	| jj| jjddt	
|
id	}|rtjt	
|
d
 tjddddd}
tjt	
|d
 tjddddd}tjt	
|d
 tjdd d d d d d f }t|d}t|d}|
||||fS )N.   g     Y@   )Ztarget_sizeZrescale_factorzoutput_alpha:0zinput_image:0)Z	feed_dict     o@dtyperU   r   )PILZImageZ	fromarraysizer	   rF   rH   r+   Zget_tensor_by_namenparrayr9   tensorfloat32permute	unsqueeze)rL   rV   ZlmrI   Z	to_tensorr(   ZimWH_Zim_lrZlm_lrZim_hdZlm_hdZmask_lrrQ   rQ   rR   	read_data   sL   
$
z$FaceReconstructionPipeline.read_datac                 C   s   t t|tjS N)r9   rj   rh   ri   r[   rk   )rL   labelrQ   rQ   rR   parse_label   s   z&FaceReconstructionPipeline.parse_labelNc                 C   s   t ||| j\}}}|dkrd S t|g dtj}|dd d d d d d df }||d }|d d d df | }|d d df |d  |d d df< |d d df |d  |d d df< |S )Nr   )ra   rb   rb      r`   rU   ra   )r   rK   rh   Zreshaper[   rk   Zget_landmarks_from_image)rL   rV   rC   five_points	input_imgscalebboxlandmarkrQ   rQ   rR   prepare_data   s   
$$z'FaceReconstructionPipeline.prepare_datac                 C   sz   | dddd   d d }|tj}| j|dd}tj	t
|d tjd dddd}|| jj}|S )	Nr   rU   ru   ra   rc   gQ?)degreerd   )rl   detachr&   numpyr[   rh   uint8fat_facer9   rj   ri   rk   rm   tor!   r"   )rL   Zinput_img_tensorrw   Zinput_img_for_textureZinput_img_for_texture_tensorrQ   rQ   rR   get_img_for_texture   s&   z.FaceReconstructionPipeline.get_img_for_texturec           !   
   C   s  d}d}g }t |t j}| j|}g }|D ]$}|d dkr! n||d d |d d |d d |d d	 d
 q|D ]}	|	d }
|	d }|	d }|	d }||
 d }|| d }||
 d }|| d }t||| }||d  }
||d  }|
}|}|
| }|| }|j\}}}td|
 }td| }td|
}
td|}td|| }td|| }t||}t||}|t	|t	|t	|
t	|f }|dks|dks|dks|dkrt j
|t	|t	|t	|t	|t jdd}t |||f}t|| j| jdk}|| }td}tdD ]'} |d | d d  | | ||  d< |d | d d  | | ||  d< qt|d d df }
t|d d df }t|d d df }t|d d df }||
 d }|| d }||
 d }|| d }t||| }||d  }
||d  }|
}|}|
| }|| }|j\}}}td|
 }td| }td|
}
td|}td|| }td|| }t||}t||}|t	|t	|t	|
t	|f }|dks|dks|dks|dkrt j
|t	|t	|t	|t	|t jdd}t |||f}t|| j| j dk}|| }td}tdD ]'} |d | d d  | | ||  d< |d | d d  | | ||  d< q/|| q>||fS )Nrb   g?Zscorer`   ry   r   ra   rU   ru   )x1y1x2y2r   r   r   r   )g\(Y@gR1]@gQ^@)valuer#   )j   rU   r   )rY   rZ   ZCOLOR_BGR2RGBr8   Zpredict_jsonsappendmaxrX   minintZcopyMakeBorderZBORDER_CONSTANTresizer   Z	infer_imgr7   r5   rh   zerosranger6   )!rL   Zimg_bgrZ
INPUT_SIZEZENLARGE_RATIO	landmarks	rgb_imageresultsboxesannoZdetect_resultr   r   r   r   whZcxcyszZtrans_x1Ztrans_y1heightwidthrp   ZdxZdyZedxZedyZcrop_imgZ	base_lmksZ	inv_scaleZaffine_base_lmksidxrQ   rQ   rR   
infer_lmks   s   









$ 




$(
z%FaceReconstructionPipeline.infer_lmksc              	   C   sL  |  |\}}t|}g dg dg dg dg dg dg dg dg}g }tt|D ]/}t|| d	 || d
 || d || d g|jd |jd d}dd |D }|| q.g }t|jd D ]}||d d d d f }	g }
t|jd |jd ftj	}|| }|d |d  }|d |d  }||k r|n|}|d }|dkrd}|d }|d dkr|n|d }t
|D ]L\}}t|jd |jd ftj	}t||	|d |d  d||d  t|||fd}|dkrt||	|d |d  d|d |d  |
| qt|||fd}|
| ||
 qg|d |fS )N)r   !   F)r   &   F)*   /   F)3   7   F)9   @   F)B   J   T)K   S   T)T   `   Tr   r   r   r   ra   r   g      ?c                 S   s   g | ]}t |qS rQ   )r   ).0xrQ   rQ   rR   
<listcomp>i  s    z@FaceReconstructionPipeline.find_face_contour.<locals>.<listcomp>rU   ru   
   )   r   r   )r   rh   ri   r   rW   r   rX   r   r   r   	enumerater
   rY   ZGaussianBlur)rL   imager   r   argsZ	roi_bboxsiZroi_bboxZpeople_mapsrz   mapsZ
whole_maskZroi_boxZroi_box_widthZroi_box_heightZshort_side_lengthZ
line_widthZkernel_sizeZgaussian_kerneltargmaskrQ   rQ   rR   find_face_contourZ  sb   
(

z,FaceReconstructionPipeline.find_face_contour皙?c                 C   s  t |d\}}| |\}}|d }|d }tj|jd |jd dftjd}|d |d  d |d |d	  d g}	tt|d |d	  t|d |d  }
d|jd |	d  d  }d|jd |	d  d  }|
d d|	d d  d|	d d  ||g}t|}t	|}t
d
|| }t|||f}||t	|	d |d  t	|	d |d  t	|	d |d  t	|	d |d  f< |t||f d }|d }|dt||fd   }t||jd |jd f}|| }t|d |d |dg d\}}}}}|S )Ni   r   ra   rU   )rX   re   r   r   r   r   d   rc   r`   g      ?).r   ).ra   )r   r   r   r   )r   r   rh   r   rX   rk   r   absr   r   r   rY   r   Zdstackr   )rL   rV   r|   Z_imgrx   Zcontour_mapsr   Zcontour_mapZFlowZ
box_centerZ
box_lengthZvalue_1Zvalue_2Z
value_listZflow_box_lengthZsfZinter_face_mapspredZ	top_boundZbottom_boundZ
left_boundZright_boundrQ   rQ   rR   r     sh   $"
z#FaceReconstructionPipeline.fat_facec                 C   s   |j d dks|j d dkrt|d\}}| |\}}|d u s*t|j d dkr,i S g }|d }dD ]}||| d || d g q4t|}| j|| j|d}| j||| j	dd\}}}	}
}||	||
|d	}| j
| | j
 }|S )
Nr   i  ra   i  )r   r   6   r   Z   )rv   r$   r'   )ZimgsZimgs_hdZlmsZlms_hd	face_mask)rX   r   r   rh   ri   r   r{   rC   rq   rI   r!   Zset_input_baseZpredict_results_base)rL   rV   rp   boxr   r   r   Z	im_tensorZ	lm_tensorZim_hd_tensorZlm_hd_tensorr   dataoutputrQ   rQ   rR   predict_base  s.    


z'FaceReconstructionPipeline.predict_basec           
      C   s   |d    tj}t|tj}|}| |}| 	|d }|d ||d |d |d |d |d |d |d	 |d
 d
}| j
| | j
  | j
dd | j
 }|d }	|d |d |d d}tjd tj|	tj|iS )NrV   rw   input_img_hdr   gt_lmcoeffsposition_maptexture_maptex_valid_maskde_retouched_albedo_map)
rw   input_img_for_texr   r   r   r   r   r   r   r   T)Z	visualizeZ	face_mesh	vis_image
frame_list)meshr   r   )r&   r~   r[   rh   r   rY   rZ   ZCOLOR_RGB2BGRr   r   r!   Zset_input_hrnZget_edge_points_horizontalZsave_results_hrnr   
OUTPUT_OBJ
OUTPUT_IMGOUTPUT)
rL   rS   r   Z	bgr_imagerV   Zbase_model_outputr   Z	hrn_inputr   r   rQ   rQ   rR   forward  s>   


z"FaceReconstructionPipeline.forwardc           
      K   s   | dd}|tj }|tj }|tj }|r,t }t|d }|jdd}|	| tj|tj|tj|r;d i}	|	S |i}	|	S )NrenderFr   zutf-8)encoding)
getr   r   r   r   ioBytesIOr   encodewrite)
rL   Zinputskwargsr   Z
output_objr   r   Zmesh_strZ
mesh_bytesr]   rQ   rQ   rR   postprocess  s"   




z&FaceReconstructionPipeline.postprocess)Tr_   rr   )r   )__name__
__module____qualname__strr1   r   r   r   r^   rq   rt   r{   r   r   r   r   r   r   r   __classcell__rQ   rQ   rO   rR   r    (   s    Z

 

87"!+r    )?r   r2   rA   typingr   r   rY   r*   r~   rh   Z	PIL.Imagerf   Z
tensorflowrD   r9   Zscipy.ior   r   Zmodelscope.metainfor   ZRmodelscope.models.cv.face_reconstruction.models.facelandmark.large_base_lmks_inferr   Z.modelscope.models.cv.face_reconstruction.utilsr   r	   r
   r   r   r   r   r   r   r   r   Z>modelscope.models.cv.skin_retouching.retinaface.predict_singler   Zmodelscope.outputsr   Zmodelscope.pipelinesr   Zmodelscope.pipelines.baser   r   Zmodelscope.pipelines.builderr   Zmodelscope.preprocessorsr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.devicer   r   Zmodelscope.utils.loggerr   __version__compatZv1Zdisable_eager_executionloggerZregister_moduleZface_reconstructionr    rQ   rQ   rQ   rR   <module>   s>   4
