o
    *j                     @   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   Zauto_collatezloading model from dir T)Z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   r/var/www/html/Deteccion_Ine/venv/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   torchZ	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      Zfloat32   )ndimnpZ	transposeastype)r    imgZ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   Z	symmetricmode)shaperC   r=   pad)r    r?   rB   ZchannelsheightwidthZ
out_heightZ	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 )Nr?   maskLrD   zRinput should be either str or PIL.Image, and both inputs should have the same type)N.)imagerM   r:   rO   unpad_to_size)r   r   r   Zconvert_to_ndarrayr@   r=   arrayPILZImageconvert	TypeErrorr3   r   rF   rJ   perform_inference)r    rK   Z
image_nameZ	mask_namer?   rM   resultr   r   r$   
preprocessP   s2   




z"ImageInpaintingPipeline.preprocessc                 C   s
   t j|iS N)r   Z
OUTPUT_IMG)r    rK   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 )NrP   z,Unpadded size is required for the refinementcudazGPU is required for refinement:   gMb`?i   r8   i )gpu_idsZmoduloZn_iterslrZmin_sideZ
max_scalesZ	px_budgetr   r:   r9   rM   Z	inpaintedr;   Zuint8)r   r   r   r   splitr   r   r   Zpermutedetachcpunumpyr0   Zno_gradr&   getr=   Zclipr>   cv2ZcvtColorZCOLOR_RGB2BGR)r    databatchr^   Zcur_resrP   Zorig_heightZ
orig_widthr   r   r$   rU   q   sF   
 


z)ImageInpaintingPipeline.perform_inferenceinputsc                 C   s   |S rX   r   )r    rh   r   r   r$   postprocess   s   z#ImageInpaintingPipeline.postprocess)r   F)__name__
__module____qualname__r   r   r&   r@   rC   rJ   r   r   rW   rY   rU   ri   __classcell__r   r   r"   r$   r      s    ""*!r   )#typingr   r   re   rc   r=   rR   r0   Ztorch.nnr.   Ztorch.utils.data._utils.collater   Zmodelscope.metainfor   Z%modelscope.models.cv.image_inpaintingr   Z0modelscope.models.cv.image_inpainting.refinementr   Zmodelscope.outputsr   Zmodelscope.pipelines.baser	   r
   Zmodelscope.pipelines.builderr   Zmodelscope.preprocessors.imager   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr   r   Zregister_moduleZimage_inpaintingr   r   r   r   r$   <module>   s*   