o
    ߥi                     @   s
  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mZ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 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 )    N)OrderedDict)AnyDictListUnion)Models)Model)
TorchModel)MODELS)	ModelFileTasks)
get_logger   )HrnetSuperAndOcr)Unet)blend)module_namec                       sj   e Zd Z fddZdd Zdd Zdejdejd	ejd
ejdee	e
f f
ddZe dd Z  ZS )ImageSkychangec                    s   t  j|d|i| tj r td| _td| j ntd| _td| j d|t	j
}d|d}td tdi |d	 | _| | j| | j  td
 td tdi |d	 | _| | j| | j  td dS )z
        Args:
            model_dir (str): model directory to initialize some resource.
            refine_cfg: configuration of refine model.
            coarse_cfg: configuration of coarse model.
        	model_dircudazUse GPU: {}cpuzUse CPU: {}z{}/{}z unet_sky_matting_final_model.pklzK####################### load refine models ################################r   zL####################### load refine models done ############################zK####################### load coarse models ################################zL####################### load coarse models done ############################N )super__init__torchr   is_availabledeviceloggerinfoformatr   TORCH_MODEL_FILEr   refine_model
load_modelevalr   coarse_model)selfr   
refine_cfg
coarse_cfgargskwargscoarse_model_pathrefine_model_path	__class__r   h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/image_skychange/skychange_model.pyr      s<   


zImageSkychange.__init__c                 C   s   t j|std|  tdtj r/t	|}| 
|d }|| || j d S tj	|dd}| 
|d }|| d S )Nz9[checkModelPath]:model path dose not exits!!! model Path:z+[checkModelPath]:model path dose not exits!model_stater   )map_location)ospathisfiler   error	Exceptionr   r   r   loadconvert_state_dictload_state_dicttor   )r%   	seg_modelinput_model_path
checkpointr/   r   r   r.   r"   F   s   


zImageSkychange.load_modelc           	      C   sz   t t|ds|S t }d}| D ]\}}|dr d}n|dr'd} | D ]\}}||d }|||< q,|S )zConverts a state dict saved from a dataParallel module to normal
        module state_dict inplace
        :param state_dict is the loaded DataParallel model_state
        zmodule.r   zmodule.model   module   N)nextiter
startswithr   items)	r%   
state_dictnew_state_dictsplit_indexcur_key	cur_valuekvnamer   r   r.   r7   W   s   


z!ImageSkychange.convert_state_dict	sky_imagesky_image_refinescene_imagescene_image_refine	img_metasc                 C   s   t   }|d |d |d }}}	| |||	}
| |||	}t   }td||  t   }|d }|
d }
t||||
}t   }td||  |S )a&  
        Args:
            sky_image (`torch.Tensor`): batched image tensor, shape is [1, 3, h', w'].
            sky_image_refine (`torch.Tensor`): batched image tensor, shape is [1, 3, refine_net_h, refine_net_w].
            scene_image (`torch.Tensor`): batched image tensor, shape is [1, 3, h, w].
            scene_image_refine (`torch.Tensor`): batched image tensor, shape is [1, 3, refine_net_h, refine_net_w].
            img_metas (`Dict[str, Any]`): image meta info.
        Return:
            `IMAGE: shape is [h, w, 3] (0~255)`
        sky_img_metasscene_img_metas
input_sizez3Time of inferencing mask of sky and scene images:{}   zTime of blending: {})timeinference_maskr   r   r   r   )r%   rL   rM   rN   rO   rP   startrQ   rR   rS   sky_mask
scene_maskendresr   r   r.   forwardn   s6   
zImageSkychange.forwardc                 C   s  |    |d \}}|d }|d }|d }|d \}	}
tj||ddd}| |}t|ttfr5|d	 }tj||ddd
}tj|dd\}}|	d
|j}tj||gdd}~~~~tj  | |}~tj  t|dd}|   d }|j\}}||	ks||
krtj||	|
fddd
}||d |d |d  |d |d |d  f }t|||f}~tj  td |S )N	ori_shapepad_directioncoarse_input_sizerefine_input_sizerefine_shapebilinearT)modealign_corners)inputsizerc   rd   r   )dimr   nearest      zget refine mask done)r#   Finterpolater$   
isinstancetuplelistr   max	unsqueezetypedtypecatr   empty_cacher!   clipdetachr   numpyshapecv2resizeprint)r%   imgrP   rS   raw_hraw_wr^   r_   r`   hwresize_imagespred_scoresscore_coarse_pred
cur_scoresphpwvalid_cur_predr   r   r.   rV      sf   





zImageSkychange.inference_mask)__name__
__module____qualname__r   r"   r7   r   Tensorr   strr   r\   no_gradrV   __classcell__r   r   r,   r.   r      s"    (

&r   ))mathr1   pdbrU   collectionsr   typingr   r   r   r   r{   jsonr   torch.nn.functionalnn
functionalrl   modelscope.metainfor   modelscope.modelsr   modelscope.models.baser	   modelscope.models.builderr
   modelscope.utils.constantr   r   modelscope.utils.loggerr   ptsemseg.hrnet_super_and_ocrr   ptsemseg.unetr   	skychanger   r   register_moduleimage_skychanger   r   r   r   r.   <module>   s0    