o
    ॵia/                     @   sH  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m  mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlT 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%m&Z&m'Z' d dl(m)Z)m*Z* d dl+m,Z, e	j-dkre	j.j/Z	e	0  e, Z1e"j2e'j3ej3dG dd de Z4dS )    N)AnyDict)	Pipelines)DetectionUNet)RetouchingNet)UNet)*)
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eeef deeef fd	d
Z	dd Z
			dddZdeeef deeef fddZ  ZS )SkinRetouchingPipelinemodeldevicec              	      sX  t  j||d t| j}tj| jtj	}tj| jd}tj| jtj
}tdd|| _| jtj|ddd  | j  d}ttj|d| _| jj| || _tj| jdd}td	dd
|| _tddd|| _| j|d  | j|d  | j  | j  d| _|| _| jdurt| j| jU tj dd}d|j!_"d|j!_#tj$|d| _%tj&'| jd(}	t( }
|
)|	*  | j%j+,  tj-|
dd | j%.t/  W d   n1 sw   Y  W d   n1 sw   Y  t01t02 t03ddg| _4t5 | _6t7| j6|8 | _6| j69dddd | _6d| _:|| _;dS )z
        use `model` to create a skin retouching pipeline for prediction
        Args:
            model: model id on modelscope hub.
        )r   r   zjoint_20210926.pth   cpu)map_location	generatorz*damo/cv_resnet50_face-detection_retinaface)r      )in_channelsout_channels   )
n_channels	n_classesinpainting_netdetection_neti   NT)allow_soft_placementg333333?)configrb )name)      ?r)   r)      r   )N.)<super__init__r   device_nameospathjoinr   r   TORCH_MODEL_FILETF_GRAPH_FILEr   tor   load_state_dicttorchloadevalr
   r   face_detectiondetectorlocal_model_pathr   r"   r   r#   
patch_sizeskin_model_pathr   	frameworktfConfigProtogpu_optionsper_process_gpu_memory_fractionallow_growthSessionsessgfile	FastGFileGraphDefParseFromStringreadgraph
as_defaultimport_graph_defrunglobal_variables_initializer
transformsComposeToTensor	Normalizeimage_files_transformsgen_diffuse_maskdiffuse_mask
from_numpyfloatpermute
input_sizer   )selfr   r   
model_pathr:   r<   det_model_idckpt_dict_loadr%   f	graph_def	__class__ d/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/skin_retouching_pipeline.pyr,   (   sv   







zSkinRetouchingPipeline.__init__inputreturnc                 C   s<   t |}t|jdkrt|tj}|t}d|i}|S )Nr*   img)	r   convert_to_ndarraylenshapecv2cvtColorCOLOR_GRAY2BGRastyperW   )rZ   rd   rf   resultrb   rb   rc   
preprocessh   s   

z!SkinRetouchingPipeline.preprocessc                 C   s  |d  tj}d}d}d}d}d}t ] |r9|dkr9| jd ur9t|d\}}	| jj| jj	
dd	|id
}
t|| j}|rWtj|jd |jd dftjdd }| |}g }tt|d D ]7}i }t|d |  tj |d< |d | |d< t|d |  tjdd |d< || qft|}t|}|dkr|  d d d d d d df |d}|W  d    S d}|D ]j}t||\}}}t|}|jd d|jd  krd}|| j}t|}|r| jd ur|  |}| j!||d|d}|d }|||d |d |d |d f< |r6|d }|||d |d |d |d f< q|rM|dkrM| jd urMt"||
||d}t#|tj$sZ|  }|d d d d d d df }t%j&|iW  d    S 1 sxw   Y  d S )Nrf   T      ?g?Fr   i   zoutput_png:0zinput_image:0)	feed_dictr   r   )dtyper)   scoresboxesbboxscore	keypoints   r*   	landmarks)predface_numg?)degreesmooth_border	return_mgr{   pred_mg)flag_bigKernal)'rm   npuint8r5   no_gradr<   resize_on_long_siderD   rM   rJ   get_tensor_by_namerV   r3   r   onesri   float32r9   rangerh   arrayint32tolistreshapeappendget_crop_bboxr   numpyget_roi_without_paddingroi_to_tensorpreprocess_roir:   retouch_localpredict_roi
whiten_img
isinstancendarrayr	   
OUTPUT_IMG)rZ   rd   	rgb_imager   	whiteningr}   whitening_degreer   rgb_image_smallresize_scale	skin_maskoutput_pred	output_mgdet_resultsresultsi	info_dictcrop_bboxesr|   outputr   ru   roiexpand	crop_tblr
roi_outputroi_predroi_mgrb   rb   rc   forwardp   s   


"%

&zSkinRetouchingPipeline.forwardc              	   C   s4  t  
 |jdd \}}tj|dddd}t | |}tj|||fdd}|d	k }|d
k }|d|  | }|| }d| }|| j dkrO|n	|| j d | j }|| j dkrb|n	|| j d | j }	tj	|d|	| d|| ddfddd}
tj	|d|	| d|| ddfddd}t
|
| j| jd}
t
|| j| jd}|
 \}}}}g }t|D ])}|
||d  }|||d  }|| }| ||}|d| |  }|| qt j|dd}t|tt|| j tt|	| j dddddd|d|f }|W  d   S 1 sw   Y  dS )z
        image: rgb
        r*   N)   r   bilinearT)sizemodealign_cornersnearest)r   r   gffffff?r)   r   r   constant)padr   value)p1p2)dim)hw)r5   r   ri   Finterpolatesigmoidr#   rW   r;   r   patch_partition_overlapr   r   r"   r   catpatch_aggregation_overlapintround)rZ   imagesub_Hsub_Wsub_image_standardsub_mask_predsub_mask_pred_hard_lowsub_mask_pred_hard_highsub_H_standardsub_W_standardsub_image_paddingsub_mask_pred_padding	B_padding	C_padding_sub_comp_padding_listwindow_itemsub_image_padding_windowsub_mask_pred_padding_windowsub_input_image_padding_windowsub_output_padding_windowsub_comp_padding_windowsub_comp_paddingsub_comprb   rb   rc   r      s   




&z$SkinRetouchingPipeline.retouch_localrp   Fc           	      C   s"  t   tj|| j| jfdd}| |}|d | d }|dd}tj||jdd  dd}|d ddd}t	|jdkrE|d	 }|rMt
| j|}|d dddd d }dd|  | | d| |  }|d
  }d|i}|r~|  |d< |W  d    S 1 sw   Y  d S )Nr   )r   r)   g        rp   r*   r   r   ).Ng     o@r{   r   )r5   r   r   r   rY   r   clampri   rX   rh   smooth_border_mgrU   byter   r   )	rZ   r   r}   r~   r   r   r   r{   r   rb   rb   rc   r     s:   



$z"SkinRetouchingPipeline.predict_roiinputsc                 C   s   |S )Nrb   )rZ   r   rb   rb   rc   postprocess4  s   z"SkinRetouchingPipeline.postprocess)rp   FF)__name__
__module____qualname__strr,   r   r   r   ro   r   r   r   r   __classcell__rb   rb   r`   rc   r   $   s    @"[J
*!r   )5r.   typingr   r   rj   r   r   PIL
tensorflowr>   r5   torch.nn.functionalnn
functionalr   torchvision.transformsrO   modelscope.metainfor   Fmodelscope.models.cv.skin_retouching.detection_model.detection_unet_inr   Emodelscope.models.cv.skin_retouching.inpainting_model.inpainting_unetr   0modelscope.models.cv.skin_retouching.unet_deployr   *modelscope.models.cv.skin_retouching.utils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skin_retouchingr   rb   rb   rb   rc   <module>   s<   
