o
    ॵi                     @   s  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m	Z	 d dl
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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  d dl!m"Z" e" Z#ej$e j%ej%dG dd deZ&dS )    )AnyDictN)	rearrange)Image)default_collate)Resize)	Pipelines)StablediffusionPaintbyexample)
OutputKeys)InputPipeline)	PIPELINES)
load_image)Tasks)
get_logger)module_namec                       s   e Zd Zdef fddZdddZdddZd	eeef 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eeef d
eeef fddZ  ZS )ImagePaintbyexamplePipelinemodelc                    sN   t |ts	J dddlm} t jd|dd| || jj| _d| _dS )z8
            model: model id on modelscope hub.
        zmodel must be a single strr   )PLMSSamplerF)r   auto_collateN )	
isinstancestrpaint_ldm.models.diffusion.plmsr   super__init__r   sampler
start_code)selfr   kwargsr   	__class__r   i/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/image_paintbyexample_pipeline.pyr       s
   
z$ImagePaintbyexamplePipeline.__init__Tc                 C   s<   g }|r|t j g7 }|r|t jddg7 }t j|S )N)      ?r#   r#   torchvision
transformsToTensor	NormalizeComposer   	normalizetoTensortransform_listr   r   r"   
get_tensor*   s   z&ImagePaintbyexamplePipeline.get_tensorc                 C   s<   g }|r|t j g7 }|r|t jddg7 }t j|S )N)g3<4'?gwgM?gy{ ?)gB91?gwt.?g	U?r$   r*   r   r   r"   get_tensor_clip6   s   z+ImagePaintbyexamplePipeline.get_tensor_clipinputreturnc           
      C   sd  t |d tr.|d |d |d }}}t|d}t|d}t|dd}n,t |d tjjrV|d dd}|d dd}|d dd}ntd|  |}|	d	}| 
 |}|	d	}t|d
 }d|tjd  }d	||dk < d||dk< t|}|| }i }	|| j|	d< || j|	d< || j|	d< |	S )Nimgmask	reference)   r5   )   r6   LRGBzRinput should be either str or PIL.Image, and both inputs should have the same typer   )NN        o@r#   inpaint_maskinpaint_image
ref_tensor)r   r   r   resizeconvertPILr   	TypeErrorr.   	unsqueezer/   nparrayastypefloat32torch
from_numpytodevice)
r   r0   
image_name	mask_nameref_namer2   refr3   r<   test_model_kwargsr   r   r"   
preprocessC   s>   



z&ImagePaintbyexamplePipeline.preprocessc                 C   s   |  |}tj|iS N)perform_inferencer
   
OUTPUT_IMG)r   r0   resultr   r   r"   forwardc   s   

z#ImagePaintbyexamplePipeline.forwardc                 C   s  t   | jj  |d }| jjj}| jj|t j}| jj|}| jj	|d }| jj
| }||d< t|jd |jd g|d |d< g d}| jjd|d|d	d
|d| j|d
\}}| jj|}	t j|	d d ddd}	|	 dddd }	|	}
t |
ddddd }dt|  d }|tj}t|tj}W d    n1 sw   Y  W d    |S W d    |S 1 sw   Y  |S )Nr=   r<   r;   )   @   rY   2   r9   F   g        )
Sconditioning
batch_sizeshapeverboseunconditional_guidance_scaleunconditional_conditioningetax_TrO   g      ?g       @)minmaxr         r:   zc h w -> h w c)rG   no_gradr   	ema_scopelearnable_vectorget_learned_conditioningrI   rF   proj_outencode_first_stageget_first_stage_encodingdetachr   r_   r   sampler   decode_first_stageclampcpupermutenumpyrH   r   rE   rC   uint8cv2cvtColorCOLOR_RGB2BGR)r   rO   r=   ucc	z_inpaintr_   samples_ddim_x_samples_ddimx_checked_imagex_checked_image_torchx_sampler2   r   r   r"   rR   g   s   




,
,,z-ImagePaintbyexamplePipeline.perform_inferenceinputsc                 C   s   |S rQ   r   )r   r   r   r   r"   postprocess   s   z'ImagePaintbyexamplePipeline.postprocess)TT)__name__
__module____qualname__r   r   r.   r/   r   r   rP   rU   rR   r   __classcell__r   r   r    r"   r      s    


"" */r   )'typingr   r   rx   rv   rC   r@   rG   torch.nnnnr%   einopsr   r   torch.utils.data._utils.collater   torchvision.transformsr   modelscope.metainfor   )modelscope.models.cv.image_paintbyexampler	   modelscope.outputsr
   modelscope.pipelines.baser   r   modelscope.pipelines.builderr   modelscope.preprocessors.imager   modelscope.utils.constantr   modelscope.utils.loggerr   loggerregister_moduleimage_paintbyexampler   r   r   r   r"   <module>   s0   