o
    *j                     @   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)
parametersZrequires_grad)modulevalueparam r   n/var/www/html/Deteccion_Ine/venv/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!   Z	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|  )NZlinearr.   zUnexpected ramp kind: r   )r   r(   
ValueError)kindkwargsr   r   r   get_ramp8   s
   r2   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_maskr2   Zrescale_size_getterimage_to_discriminatoradd_noise_kwargsnoise_fill_holeconst_area_crop_kwargsZrefine_mask_for_losses distance_weighted_mask_for_discrfeature_matching_weightlosses_l1_weight_knownlosses_l1_weight_missingfake_fakes_proba)r   r6   r7   r;   Zrescale_scheduler_kwargsr<   r=   r>   r?   Zdistance_weighter_kwargsr@   rD   Zfake_fakes_generator_kwargsr1   	__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   )dimr5   Z	inpaintedmask_for_losses)r;   torchcat	generator)r   batchimgrH   Z
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 )NrG   rH   rJ   )Zgen_l1
real_batch
fake_batchrM   discriminatorrR   rS   discr_real_preddiscr_fake_predrH   Zgen_advadv_r   F)rH   Zgen_fmZgen_resnet_pl)r<   r   rB   rC   dictr@   adversarial_lossZpre_generator_steprM   rT   generator_lossupdater   rA   r   Zloss_resnet_pl)r   rN   rO   predicted_imgZoriginal_maskZsupervised_maskZl1_value
total_lossmetricsZmask_for_discrrV   discr_real_featuresrW   discr_fake_featuresZadv_gen_lossadv_metricsZneed_mask_in_fmZmask_for_fmZfm_valueZresnet_pl_valuer   r   r   r[   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   rG   rQ   rH   rU   g?Z	discr_advrX   )	r<   detachrZ   Zpre_discriminator_steprM   rT   discriminator_lossr\   r   )r   rN   r^   r_   r]   rV   r`   rW   ra   Zadv_discr_lossrb   r   r   r   rd      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   )Zloss)r   rM   rT   r[   rd   rY   )r   rN   Zoptimizer_idxr^   r_   resultr   r   r   _do_step   s   
z(DefaultInpaintingTrainingModule._do_step)r4   FTNr5   NFNNFr   Nr   )	r%   r&   r'   r   rP   r[   rd   rf   __classcell__r   r   rE   r   r3   @   s$    4r3   )r.   )__doc__r,   rK   Ztorch.nn.functionalnnZ
functionalFZmodelscope.utils.loggerr   baser   Zmodules.feature_matchingr   r   ZLOGGERr   r   r   r(   r2   r3   r   r   r   r   <module>   s    
