o
    ߥi                     @   s   d 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mZ e Zdd Zd	d
 ZG dd dZG dd dZdddZG dd de
ZdS )zx
Part of the implementation is borrowed and modified from LaMa, publicly available at
https://github.com/saic-mdal/lama
    N)
get_logger   )BaseInpaintingTrainingModule)feature_matching_lossmasked_l1_lossc                 C   s   |   D ]}||_qd S N)
parametersrequires_grad)modulevalueparam r   a/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/image_inpainting/default.pyset_requires_grad   s   r   c                    s    fdd|   D S )Nc                    s   i | ]	\}} | |qS r   r   ).0kvprefixr   r   
<dictcomp>   s    z&add_prefix_to_keys.<locals>.<dictcomp>)items)dctr   r   r   r   add_prefix_to_keys   s   r   c                   @   s   e Zd Zd	ddZdd ZdS )

LinearRampr   r   c                 C   s   || _ || _|| _|| _d S r   )start_value	end_value
start_iterend_iter)selfr   r   r   r   r   r   r   __init__   s   
zLinearRamp.__init__c                 C   sN   || j k r| jS || jkr| jS || j  | j| j   }| jd|  | j|  S Nr   )r   r   r   r   )r   ipartr   r   r   __call__"   s   

zLinearRamp.__call__N)r   r   r   r   __name__
__module____qualname__r    r$   r   r   r   r   r      s    
r   c                   @   s   e Zd Zdd Zdd ZdS )
LadderRampc                 C   s8   || _ || _t|t|d ksJ t|t|fd S r!   )start_itersvalueslen)r   r*   r+   r   r   r   r    -   s
   
zLadderRamp.__init__c                 C   s   t | j|}| j| S r   )bisectbisect_rightr*   r+   )r   r"   	segment_ir   r   r   r$   3   s   
zLadderRamp.__call__Nr%   r   r   r   r   r)   +   s    r)   ladderc                 K   s:   | dkrt di |S | dkrtdi |S td|  )Nlinearr0   zUnexpected ramp kind: r   )r   r)   
ValueError)kindkwargsr   r   r   get_ramp8   s
   r5   c                       sX   e Zd Z												d fdd	Zd	d
 Zdd Zdd ZdddZ  ZS )DefaultInpaintingTrainingModule FTNpredicted_imager   c                    sr   t  j||d || _|d urtdi |nd | _|| _|| _|| _|| _d | _	|
| _
d| _d| _d| _|| _d S )N)	model_dirpredict_onlyd   
   r   r   )superr    concat_maskr5   rescale_size_getterimage_to_discriminatoradd_noise_kwargsnoise_fill_holeconst_area_crop_kwargsrefine_mask_for_losses distance_weighted_mask_for_discrfeature_matching_weightlosses_l1_weight_knownlosses_l1_weight_missingfake_fakes_proba)r   r9   r:   r>   rescale_scheduler_kwargsr@   rA   rB   rC   distance_weighter_kwargsrE   rI   fake_fakes_generator_kwargsr4   	__class__r   r   r    B   s$   
z(DefaultInpaintingTrainingModule.__init__c                 C   sn   |d }|d }|d|  }| j rtj||gdd}| ||d< ||d  d| |d   |d< ||d< |S )Nimagemaskr   )dimr8   	inpaintedmask_for_losses)r>   torchcat	generator)r   batchimgrP   
masked_imgr   r   r   forwarda   s   

z'DefaultInpaintingTrainingModule.forwardc                 C   s,  |d }|| j  }|d }|d }t|||| j| j}|}t|d}| jr'|n|}	| jj||| j| j	d | 	|\}
}| 	|\}}| jj
|||
||	d\}}|| }||d< |t|d | jd	krd
}|rk|nd }t|||d| j }|| }||d< | jd ur| ||}|| }||d< ||fS )NrO   rP   rS   )gen_l1
real_batch
fake_batchrV   discriminatorr]   r^   discr_real_preddiscr_fake_predrP   gen_advadv_r   F)rP   gen_fmgen_resnet_pl)r@   r   rG   rH   dictrE   adversarial_losspre_generator_steprV   r_   generator_lossupdater   rF   r   loss_resnet_pl)r   rW   rX   predicted_imgoriginal_masksupervised_maskl1_value
total_lossmetricsmask_for_discrra   discr_real_featuresrb   discr_fake_featuresadv_gen_lossadv_metricsneed_mask_in_fmmask_for_fmfm_valueresnet_pl_valuer   r   r   rj   r   s^   




z.DefaultInpaintingTrainingModule.generator_lossc                 C   s   d}i }|| j   }| jj|d || j| jd | |d \}}| |\}}| jj|d ||||d d\}	}
||	 d }|	|d< |t|
d ||fS )	Nr   rO   r\   rP   r`   g?	discr_advrd   )	r@   detachrh   pre_discriminator_steprV   r_   discriminator_lossrk   r   )r   rW   rq   rr   rm   ra   rt   rb   ru   adv_discr_lossrw   r   r   r   r      s4   
z2DefaultInpaintingTrainingModule.discriminator_lossc                 C   s   |dkrt | jd t | jd n|dkr!t | jd t | jd | |}d}|d u s/|dkr7| |\}}n|d u s?|dkrF| |\}}t|d}|S )Nr   TFr   )loss)r   rV   r_   rj   r   rg   )r   rW   optimizer_idxrq   rr   resultr   r   r   _do_step   s   
z(DefaultInpaintingTrainingModule._do_step)r7   FTNr8   NFNNFr   Nr   )	r&   r'   r(   r    rZ   rj   r   r   __classcell__r   r   rM   r   r6   @   s$    4r6   )r0   )__doc__r-   rT   torch.nn.functionalnn
functionalFmodelscope.utils.loggerr   baser   modules.feature_matchingr   r   LOGGERr   r   r   r)   r5   r6   r   r   r   r   <module>   s    
