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
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)default_collate)	Pipelines)FFTInpainting)refine_predict)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage)Tasks)
get_logger)module_namec                       s   e Zd Z		ddef fddZdd Zdd	 Z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 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 )ImageInpaintingPipeline   Fmodelc                    s   t |ts	J dt jd	|dd| || _td|  t|dd| _| js1| j	| j
 | j  td| j  || _dS )
z8
            model: model id on modelscope hub.
        zmodel must be a single strF)r   auto_collatezloading model from dir T)predict_onlyz)loading model done, refinement is set to N )
isinstancestrsuper__init__refineloggerinfor   infer_modeltodeviceevalpad_out_to_modulo)selfr   r!   r   kwargs	__class__r   e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/image_inpainting_pipeline.pyr      s   

z ImageInpaintingPipeline.__init__c                    s   t |tjr| S t|r| S t |ttfr& fdd|D S t |tr7 fdd|	 D S t
dt| )Nc                    s   g | ]} | qS r   move_to_device).0elr   r"   r   r&   
<listcomp>5   s    z:ImageInpaintingPipeline.move_to_device.<locals>.<listcomp>c                    s   i | ]\}}| | qS r   r'   )r)   namevalr+   r   r&   
<dictcomp>7   s    z:ImageInpaintingPipeline.move_to_device.<locals>.<dictcomp>zUnexpected type )r   nnModuler   torch	is_tensortuplelistdictitems
ValueErrortype)r"   objr   r   r+   r&   r(   /   s   



z&ImageInpaintingPipeline.move_to_devicec                 C   s(   |j dkrt|d}|dd }|S )N   )   r      float32   )ndimnp	transposeastype)r"   imgout_imgr   r   r&   
transforms=   s   
z"ImageInpaintingPipeline.transformsc                 C   s    || dkr|S || d | S )Nr   r=   r   )r"   xmodr   r   r&   ceil_moduloC   s   z#ImageInpaintingPipeline.ceil_moduloc                 C   sJ   |j \}}}| ||}| ||}tj|dd|| fd|| ffddS )N)r   r   r   	symmetricmode)shaperI   rA   pad)r"   rD   rH   channelsheightwidth
out_height	out_widthr   r   r&   pad_img_to_moduloH   s   z)ImageInpaintingPipeline.pad_img_to_moduloinputreturnc                 C   s  t |d tr,|d |d }}t|}| |}ttdd|d }| |}n)t |d tjjrQ|d }| t|}|d 	d}| t|}nt
dt||d d}| jd ur| jdkr|d	 jdd  |d
< | |d	 | j|d	< | |d | j|d< | |}|S )NrD   maskLrK   zRinput should be either str or PIL.Image, and both inputs should have the same type)N.)imagerW   r=   rY   unpad_to_size)r   r   r   convert_to_ndarrayrF   rA   arrayPILImageconvert	TypeErrorr6   r!   rM   rT   perform_inference)r"   rU   
image_name	mask_namerD   rW   resultr   r   r&   
preprocessP   s2   




z"ImageInpaintingPipeline.preprocessc                 C   s
   t j|iS N)r   
OUTPUT_IMG)r"   rU   r   r   r&   forwardn   s   
zImageInpaintingPipeline.forwardc                 C   sX  t |g}| jrDd|v sJ ddt| jv sJ dt| jdd }t|| j|| jddd	d
dd	}|d ddd	 
  }nSt G | || j}|d dkd |d< | |}|d d ddd	 
  }|dd }|d ur|\}}|d |d |f }W d    n1 sw   Y  t|d ddd}t|tj}|S )NrZ   z,Unpadded size is required for the refinementcudazGPU is required for refinement:   gMb`?i   r;   i )gpu_idsmodulon_iterslrmin_side
max_scales	px_budgetr   r=   r<   rW   	inpaintedr?   uint8)r   r   r   r   splitr   r   r!   permutedetachcpunumpyr2   no_gradr(   getrA   cliprC   cv2cvtColorCOLOR_RGB2BGR)r"   databatchrm   cur_resrZ   orig_height
orig_widthr   r   r&   ra   q   sF   
 


z)ImageInpaintingPipeline.perform_inferenceinputsc                 C   s   |S rf   r   )r"   r   r   r   r&   postprocess   s   z#ImageInpaintingPipeline.postprocess)r   F)__name__
__module____qualname__r   r   r(   rF   rI   rT   r   r   re   rh   ra   r   __classcell__r   r   r$   r&   r      s    ""*!r   )#typingr   r   r~   rz   rA   r]   r2   torch.nnr0   torch.utils.data._utils.collater   modelscope.metainfor   %modelscope.models.cv.image_inpaintingr   0modelscope.models.cv.image_inpainting.refinementr   modelscope.outputsr   modelscope.pipelines.baser	   r
   modelscope.pipelines.builderr   modelscope.preprocessors.imager   modelscope.utils.constantr   modelscope.utils.loggerr   r   register_moduleimage_inpaintingr   r   r   r   r&   <module>   s*   