o
    ॵim                     @   s$  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	m
  mZ d dl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 d dl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& d dl'm(Z( dd Z)dd Z*dd Z+dd Z,ej-e#j.ej/dG dd deZ0dS )    N)AnyDict)Image)
transforms)Preprocessors)CannyDetectorHEDdetectorMidasDetectorMLSDdetectorOpenposeDetectorSegformerDetectornms)Preprocessor)PREPROCESSORS)
load_image)DEFAULT_MODEL_REVISIONFieldsInvokeModeKeysTasks)type_assertc                 C   s  | j tjksJ | jdkr| d d d d d f } | jdksJ | j\}}}|dks3|dks3|dks3J |dkr9| S |dkrGtj| | | gddS |dkr| d d d d ddf tj}| d d d d ddf tjd }|| dd|   }|dd	tj}|S d S )
N            axisr   g     o@g      ?   )	dtypenpuint8ndimshapeconcatenateastypefloat32clip)xHWCcoloralphay r.   m/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/preprocessors/cv/controllable_image_generation.pyHWC3   s"   
"&r0   c                 C   s   | j \}}}t|}t|}t|t|| }||9 }||9 }tt|d d }tt|d d }tj| ||f|dkrBtjntj	d}|S )Ng      P@@   r   interpolation)
r"   floatminintr   roundcv2resizeINTER_LANCZOS4
INTER_AREA)input_image
resolutionr(   r)   r*   kimgr.   r.   r/   resize_image.   s   r@   c                 C   s   | dkrd }|S | dkrt  }|S | dkrt||}|S | dkr't||}|S | dkr2t||}|S | dkr=t||}|S | dkrHt||}|S | dkrSt||}|S | d	kr^t||}|S t||}|S )
Nscribblecannyhoughheddepthnormalposesegfake_scribble)r   r
   r   r	   r   r   )control_type
model_pathdevicedetectorr.   r.   r/   build_detector=   s:   



	



rN   c           
      K   s  |dkrt j|t jd}d|t j|dddk < |S |dkr-| ||d |d	 }t|}|S |d
krA| ||d |d }t|}|S |dkrO| |}t|}|S |dkru|j\}}}t|d}| |\}}	t|}tj|||ftj	d}|S |dkr|j\}}}t|d}| ||d d\}	}t|}tj|||ftj	d}|d d d d d d df }|S |dkr| |\}}	t|}|S |dkr| |}|S |dkr| |}t|}t
|dd}t|dd}d||dk< d||dk < |S )NrA   )r   r   r   r      rB   low_thresholdhigh_thresholdrC   value_thresholddistance_thresholdrD   rE   i  r2   rF   bg_threshold)bg_thrG   rH   rI   g      @)r   r   r   r   )r   
zeros_liker    r5   r0   r"   r@   r8   r9   INTER_LINEARr   GaussianBlur)
rM   rJ   r?   kwargsdetected_mapr(   r)   r*   det_img_r.   r.   r/   get_detected_mapU   sl   (
$
 

	r^   )module_namec                       sF   e Zd Zejf fdd	Zeeedede	e
ef fddZ  ZS )'ControllableImageGenerationPreprocessorc                    sB   t  j|dtji| t|dd|dd |dd| _d S )NmoderJ   rD   rK   rL   cuda)super__init__r   	INFERENCErN   getrM   )selfra   argsrZ   	__class__r.   r/   rd      s
   

z0ControllableImageGenerationPreprocessor.__init__datareturnc                 K   s  | d|d }tt|d }tt||}td|  | dd}d| v r0|d }n| dd}td|  | d	d
}td|  | dd}|dkr\t| j	||}	n^|dkrw|d j
j}
|d j
j}t| j	|||
|d}	nC|dkr|d jj}|d jj}t| j	||||d}	n(|dv rt| j	||}	n|dkr|d jj}t| j	|||d}	nt| j	d
|d}	|||	||d}| D ]}|| vr|| ||< q|S )Nimage_resolutionimagezTest with image resolution: 
is_cat_imgTprompt zTest with prompt: rJ   rD   zTest with input type: save_memoryFrA   rB   modelsetting)rP   rQ   rC   )rR   rS   )rD   rE   rG   rH   rI   rF   )rT   )rJ   r?   )rn   rp   r[   rr   ro   )rf   r   arrayr   r@   r0   printkeysr^   rM   rB   rP   rQ   rC   rR   rS   rF   rT   )rg   rk   rZ   rm   rn   ro   model_promptrJ   rr   r[   rP   rQ   rR   rS   rT   
input_dictr>   r.   r.   r/   __call__   sz   

z0ControllableImageGenerationPreprocessor.__call__)__name__
__module____qualname__r   re   rd   r   objectinputr   strr   ry   __classcell__r.   r.   ri   r/   r`      s    $r`   )1mathostypingr   r   r8   numpyr   torchtorch.nn.functionalnn
functionalFPILr   torchvisionr   modelscope.metainfor   Fmodelscope.models.cv.controllable_image_generation.annotator.annotatorr   r   r	   r
   r   r   r   modelscope.preprocessors.baser    modelscope.preprocessors.builderr   modelscope.preprocessors.imager   modelscope.utils.constantr   r   r   r   r   modelscope.utils.type_assertr   r0   r@   rN   r^   register_modulecv*controllable_image_generation_preprocessorr`   r.   r.   r.   r/   <module>   s2   $.