a
    þdz-  ã                   @   s¬   d dl 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mZ d dlmZmZ d dlmZ d	d
lmZ e ¡ G dd„ deƒƒZdS )é    N)ÚOrderedDict)Úpath)Úbuild_network)Ú
build_loss)Úg_path_regularizeÚ
r1_penalty)ÚimwriteÚ
tensor2img)ÚMODEL_REGISTRYé   )Ú	BaseModelc                       sp   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚStyleGAN2ModelzStyleGAN2 model.c                    sÌ   t t| ƒ |¡ t|d ƒ| _|  | j¡| _|  | j¡ | jd  dd ¡}|d ur„| jd  dd¡}|  	| j|| jd  dd¡|¡ |d d | _
| jd	  d
d¡}tj|| j
| jd| _| jrÈ|  ¡  d S )NÚ	network_gr   Úpretrain_network_gZparam_key_gÚparamsÚstrict_load_gTÚnum_style_featÚvalÚnum_val_samplesé   ©Údevice)Úsuperr   Ú__init__r   Únet_gÚmodel_to_deviceÚprint_networkÚoptÚgetÚload_networkr   ÚtorchÚrandnr   Úfixed_sampleÚis_trainÚinit_training_settings)Úselfr   Ú	load_pathÚ	param_keyr   ©Ú	__class__© úg/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/models/stylegan2_model.pyr      s     zStyleGAN2Model.__init__c                 C   s^  | j d }t| j d ƒ| _|  | j¡| _|  | j¡ | j d  dd ¡}|d ur€| j d  dd¡}|  | j|| j d  dd¡|¡ t| j d	 ƒ | j¡| _	| j d  d
d ¡}|d urÔ|  | j	|| j d  dd¡d¡ n
|  
d¡ | j ¡  | j ¡  | j	 ¡  t|d ƒ | j¡| _|d | _|d | _|d | _|d | _|d | _d| _|  ¡  |  ¡  d S )NÚtrainÚ	network_dr   Zpretrain_network_dZparam_key_dr   Zstrict_load_dTr   r   r   Ú
params_emar   Zgan_optÚr1_reg_weightÚpath_reg_weightÚnet_g_reg_everyÚnet_d_reg_everyÚmixing_prob)r   r   Únet_dr   r   r   r   Útor   Ú	net_g_emaÚ	model_emar   r,   Úevalr   Úcri_ganr/   r0   r1   r2   r3   Úmean_path_lengthÚsetup_optimizersZsetup_schedulers)r%   Ú	train_optr&   r'   r*   r*   r+   r$   *   s2    
 "








z%StyleGAN2Model.init_training_settingsc                 C   sx  | j d }| j| jd  }| j d d dkrÐg }g }g }| j ¡ D ]N\}}d|v r^| |¡ qBd|v rr| |¡ qBd|v r†| |¡ qB| |¡ qB||d	 d
 dœ||d	 d
 d dœ||d	 d
 d dœg}n6g }| j ¡ D ]\}}| |¡ qÞ||d	 d
 dœg}|d	  d¡}	|d	 d
 | }
d| d| f}| j|	||
|d| _| j | j¡ | j	| j	d  }| j d d dkrìg }g }| j
 ¡ D ]*\}}d|v rª| |¡ n
| |¡ qŒ||d d
 dœ||d d
 dt d¡  dœg}n8g }| j
 ¡ D ]\}}| |¡ qú||d d
 dœg}|d  d¡}	|d d
 | }
d| d| f}| j|	||
|d| _| j | j¡ d S )Nr,   r   r   ÚtypeZStyleGAN2GeneratorCZ
modulationZ	style_mlpZmodulated_convZoptim_gÚlr)r   r>   g{®Gáz„?é   r   g®Gáz®ï?)Úbetasr-   ZStyleGAN2DiscriminatorCZfinal_linearZoptim_di   )r   r1   r   Znamed_parametersÚappendÚpopZget_optimizerÚoptimizer_gZ
optimizersr2   r4   ÚmathÚsqrtÚoptimizer_d)r%   r<   Znet_g_reg_ratioZnormal_paramsZstyle_mlp_paramsZmodulation_conv_paramsÚnameÚparamZoptim_params_gZ
optim_typer>   r@   Znet_d_reg_ratioZlinear_paramsZoptim_params_dr*   r*   r+   r;   X   sz    

þþþ÷
þ

þþû
þzStyleGAN2Model.setup_optimizersc                 C   s   |d   | j¡| _d S )NÚgt)r5   r   Úreal_img)r%   Údatar*   r*   r+   Ú	feed_data©   s    zStyleGAN2Model.feed_datac                 C   s>   |dkrt j|| j| jd}nt j||| j| jd d¡}|S )Nr   r   r   )r    r!   r   r   Zunbind)r%   ÚbatchZ	num_noiseZnoisesr*   r*   r+   Ú
make_noise¬   s    zStyleGAN2Model.make_noisec                 C   s*   t   ¡ |k r|  |d¡S |  |d¡gS d S )Né   r   )ÚrandomrN   )r%   rM   Zprobr*   r*   r+   Úmixing_noise³   s    zStyleGAN2Model.mixing_noisec                 C   sR  t ƒ }| j ¡ D ]
}d|_q| j ¡  | j d¡}|  || j	¡}|  
|¡\}}|  | ¡ ¡}|  | j¡}	| j|	ddd| j|ddd }
|
|d< |	 ¡  ¡ |d< | ¡  ¡ |d< |
 ¡  || j dkr d| j_|  | j¡}	t|	| jƒ}| jd | | j d|	d   }| ¡  ¡ |d	< | ¡  | j ¡  | j ¡ D ]}d|_q4| j ¡  |  || j	¡}|  
|¡\}}|  |¡}| j|ddd}||d
< | ¡  || j dkr,td|| jd d  ƒ}|  || j	¡}| j
|dd\}}t||| jƒ\}}| _| j| j | d|d   }| ¡  | ¡  ¡ |d< ||d< | j ¡  |  |¡| _| jdd d S )NTr   )Zis_discFÚl_dZ
real_scoreZ
fake_scorerO   Úl_d_r1Úl_gr   r,   Zpath_batch_shrink)Zreturn_latents)r   r   r   r   Úl_g_pathZpath_lengthgå…Ùíï?)Zdecay)r   r4   Ú
parametersZrequires_gradrF   Z	zero_gradrJ   ÚsizerQ   r3   r   Údetachr9   ÚmeanZbackwardr2   r   r/   ÚsteprC   r1   Úmaxr   r   r:   r0   Zreduce_loss_dictZlog_dictr7   )r%   Úcurrent_iterZ	loss_dictÚprM   ZnoiseZfake_imgÚ_Z	fake_predZ	real_predrR   rS   rT   Zpath_batch_sizeZlatentsrU   Zpath_lengthsr*   r*   r+   Úoptimize_parameters¹   sV    
  




z"StyleGAN2Model.optimize_parametersc                 C   sJ   t  ¡ . | j ¡  |  | jg¡\| _}W d   ƒ n1 s<0    Y  d S )N)r    Zno_gradr6   r8   r"   Úoutput)r%   r^   r*   r*   r+   Útest   s    

zStyleGAN2Model.testc                 C   s"   | j d dkr|  ||||¡ d S )NZrankr   )r   Únondist_validation)r%   Ú
dataloaderr\   Ú	tb_loggerÚsave_imgr*   r*   r+   Údist_validation  s    zStyleGAN2Model.dist_validationc                 C   s¾   |d u sJ dƒ‚|   ¡  t| jdd}| jd rRt | jd d dd|› d	¡}n&t | jd d d
d| jd › d	¡}t||ƒ |d  tj	¡}t
 |t
j¡}|d urº|jd||dd d S )Nz%Validation dataloader should be None.)éÿÿÿÿr   )Zmin_maxr#   r   Zvisualizationr,   Ztrain_z.pngra   Ztest_rG   g     ào@ZsamplesZHWC)Zglobal_stepZdataformats)ra   r	   r`   r   ÚospÚjoinr   ZastypeÚnpÚfloat32Úcv2ZcvtColorZCOLOR_BGR2RGBZ	add_image)r%   rc   r\   rd   re   ÚresultZsave_img_pathr*   r*   r+   rb   	  s    
"&
z!StyleGAN2Model.nondist_validationc                 C   s>   | j | j| jgd|ddgd |   | jd|¡ |  ||¡ d S )Nr   r   r.   )r'   r4   )Zsave_networkr   r6   r4   Zsave_training_state)r%   Úepochr\   r*   r*   r+   Úsave  s    zStyleGAN2Model.save)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r;   rL   rN   rQ   r_   ra   rf   rb   ro   Ú__classcell__r*   r*   r(   r+   r      s   .QGr   )rl   rD   Únumpyrj   rP   r    Úcollectionsr   Úosr   rh   Zbasicsr.archsr   Zbasicsr.lossesr   Zbasicsr.losses.gan_lossr   r   Zbasicsr.utilsr   r	   Zbasicsr.utils.registryr
   Z
base_modelr   Úregisterr   r*   r*   r*   r+   Ú<module>   s   