o
    ߥiN                     @   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mZmZmZ G dd dejZd	d
 ZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd  d ejZG d!d" d"ejZG d#d$ d$ejZ G d%d& d&ejZ!dS )'    N)nn)Function)
functional   )FusedLeakyReLUconv2d_gradfixfused_leaky_relu	upfirdn2dc                       s$   e Zd Z fddZdd Z  ZS )	PixelNormc                    s   t    d S N)super__init__self	__class__ b/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/face_generation/stylegan2.pyr      s   zPixelNorm.__init__c                 C   s"   |t t j|d dddd  S )N   r   T)dimkeepdim:0yE>)torchrsqrtmeanr   inputr   r   r   forward   s   zPixelNorm.forward__name__
__module____qualname__r   r   __classcell__r   r   r   r   r
      s    r
   c                 C   sJ   t j| t jd} | jdkr| d d d f | d d d f  } | |   } | S )N)dtyper   )r   tensorfloat32ndimsum)kr   r   r   make_kernel   s
   
 r)   c                       &   e Zd Zd fdd	Zdd Z  ZS )Upsampler   c                    sd   t    || _t||d  }| d| |jd | }|d d | d }|d }||f| _d S )Nr   kernelr   r   r   r   factorr)   register_buffershapepadr   r,   r.   ppad0pad1r   r   r   r   '   s   
zUpsample.__init__c                 C   s   t || j| jd| jd}|S Nr   )updownr1   r	   r,   r.   r1   r   r   outr   r   r   r   5      zUpsample.forwardr   r   r   r   r   r   r+   %       r+   c                       r*   )
Downsampler   c                    sT   t    || _t|}| d| |jd | }|d d }|d }||f| _d S )Nr,   r   r   r   r-   r2   r   r   r   r   >   s   
zDownsample.__init__c                 C   s   t || jd| j| jd}|S r6   r9   r:   r   r   r   r   L   r<   zDownsample.forwardr=   r   r   r   r   r   r?   <   r>   r?   c                       r*   )Blurr   c                    s<   t    t|}|dkr||d  }| d| || _d S )Nr   r   r,   )r   r   r)   r/   r1   )r   r,   r1   upsample_factorr   r   r   r   U   s   

zBlur.__init__c                 C   s   t || j| jd}|S )Nr1   )r	   r,   r1   r:   r   r   r   r   a   s   zBlur.forward)r   r   r   r   r   r   r@   S   s    r@   c                       s4   e Zd Z			d
 fdd	Zdd Zdd	 Z  ZS )EqualConv2dr   r   Tc                    sj   t    tt||||| _dt||d   | _	|| _
|| _|r0tt|| _d S d | _d S )Nr   r   )r   r   r   	Parameterr   randnweightmathsqrtscalestridepaddingzerosbias)r   
in_channelout_channelkernel_sizerJ   rK   rM   r   r   r   r   i   s   

zEqualConv2d.__init__c                 C   s&   t j|| j| j | j| j| jd}|S )N)rM   rJ   rK   )r   conv2drF   rI   rM   rJ   rK   r:   r   r   r   r      s   
zEqualConv2d.forwardc                 C   sH   | j j d| jjd  d| jjd  d| jjd  d| j d| j dS )	N(r   , r   r   z	, stride=z
, padding=))r   r   rF   r0   rJ   rK   r   r   r   r   __repr__   s   &
zEqualConv2d.__repr__)r   r   Tr   r    r!   r   r   rU   r"   r   r   r   r   rC   g   s    rC   c                       s6   e Zd Z				d fdd	Zdd Zd	d
 Z  ZS )EqualLinearTr   r   Nc                    sl   t    tt|||| _|r!tt|	|| _
nd | _
|| _dt| | | _|| _d S Nr   )r   r   r   rD   r   rE   div_rF   rL   fill_rM   
activationrG   rH   rI   lr_mul)r   in_dimout_dimrM   	bias_initr\   r[   r   r   r   r      s   

zEqualLinear.__init__c                 C   sT   | j rt|| j| j }t|| j| j }|S tj|| j| j | j| j d}|S )NrM   )r[   FlinearrF   rI   r   rM   r\   r:   r   r   r   r      s   zEqualLinear.forwardc                 C   s*   | j j d| jjd  d| jjd  dS )NrR   r   rS   r   rT   )r   r   rF   r0   r   r   r   r   rU      s   (zEqualLinear.__repr__)Tr   r   NrV   r   r   r   r   rW      s    rW   c                       s<   e Zd Zdddg ddf fdd	Zdd Zdd	 Z  ZS )
ModulatedConv2dTFr      re   r   c
              	      s   t    d| _|| _|| _|| _|| _|| _|r?d}
t||
 |d  }|d d |
 d }|d d }t	|||f|
d| _
|r`d}
t||
 |d  }|d d }|d }t	|||fd| _
||d  }dt| | _|d | _ttd||||| _t||dd| _|| _|	| _d S )Nr   r   r   )r1   rA   rB   )r_   )r   r   epsrP   rN   rO   upsample
downsamplelenr@   blurrG   rH   rI   rK   r   rD   r   rE   rF   rW   
modulation
demodulatefused)r   rN   rO   rP   	style_dimrl   rg   rh   blur_kernelrm   r.   r3   r4   r5   fan_inr   r   r   r      s<   



zModulatedConv2d.__init__c                 C   s6   | j j d| j d| j d| j d| j d| j dS )NrR   rS   z, upsample=z, downsample=rT   )r   r   rN   rO   rP   rg   rh   r   r   r   r   rU      s   "zModulatedConv2d.__repr__c                 C   s  |j \}}}}| js| j| jd }| |}| jr4|d||d|dd }|	 
dd  }	||||dd }| jrV|dd}tj||ddd}
| |
}
n| jrh| |}tj||ddd}
n	tj||| jd}
| jr~|
|	|ddd }
|
S | ||d|dd}| j| j | }| jrt|d
g dd }|||| jddd }||| j || j| j}| jr|d|| ||}||| j|| j| j}|dd|| | j| j| j}tj||dd|d	}
|
j \}}}}|
|| j||}
| |
}
|
S | jrA| |}|j \}}}}|d|| ||}tj||dd|d	}
|
j \}}}}|
|| j||}
|
S |d|| ||}tj||| j|d
}
|
j \}}}}|
|| j||}
|
S )Nr   r   r   re      r   r   )rK   rJ   )rK   )rK   rJ   groups)rK   rt   )r0   rm   rI   rF   squeezerk   rl   	unsqueezeviewsquarer'   r   reshaperg   	transposer   conv_transpose2drj   rh   rQ   rK   r   powrO   rP   )r   r   stylebatchrN   heightwidthrF   wdcoefsr;   demod_r   r   r   r      s   





	
zModulatedConv2d.forward)r   r    r!   r   rU   r   r"   r   r   r   r   rc      s    2rc   c                       s&   e Zd Z fddZdddZ  ZS )NoiseInjectionc                    s    t    ttd| _d S rX   )r   r   r   rD   r   rL   rF   r   r   r   r   r   A  s   
zNoiseInjection.__init__Nc                 C   s8   |d u r|j \}}}}||d|| }|| j|  S rX   )r0   	new_emptynormal_rF   )r   imagenoiser~   r   r   r   r   r   r   r   F  s   zNoiseInjection.forwardr   r   r   r   r   r   r   ?  s    r   c                       r*   )ConstantInputrr   c                    s&   t    ttd|||| _d S rX   )r   r   r   rD   r   rE   r   )r   channelsizer   r   r   r   P  s   
zConstantInput.__init__c                 C   s    |j d }| j|ddd}|S )Nr   r   )r0   r   repeat)r   r   r~   r;   r   r   r   r   U  s   
zConstantInput.forward)rr   r   r   r   r   r   r   N  s    r   c                       s2   e Zd Zdg ddf fdd	Zd	ddZ  ZS )

StyledConvFrd   Tc              	      s8   t    t|||||||d| _t | _t|| _d S )N)rg   ro   rl   )r   r   rc   convr   r   r   activate)r   rN   rO   rP   rn   rg   ro   rl   r   r   r   r   ^  s   


zStyledConv.__init__Nc                 C   s(   |  ||}| j||d}| |}|S )Nr   )r   r   r   )r   r   r}   r   r;   r   r   r   r   y  s   
zStyledConv.forwardr   r   r   r   r   r   r   \  s    r   c                       s0   e Zd Zdg df fdd	ZdddZ  ZS )	ToRGBTrd   c                    sH   t    |rt|| _t|dd|dd| _tt	dddd| _
d S )Nre   r   F)rl   )r   r   r+   rg   rc   r   r   rD   r   rL   rM   )r   rN   rn   rg   ro   r   r   r   r     s   


zToRGB.__init__Nc                 C   s4   |  ||}|| j }|d ur| |}|| }|S r   )r   rM   rg   )r   r   r}   skipr;   r   r   r   r     s   

zToRGB.forwardr   r   r   r   r   r   r     s
    r   c                       sX   e Zd Zdg ddf fdd	Zdd Zdd	 Zd
d Z							dddZ  ZS )	Generatorr   rd   g{Gz?c                    s  t    || _|| _t g}t|D ]}|t|||dd qtj	| | _
ddddd| d| d| d| d| d		| _t| jd
 | _t| jd
 | jd
 d||d| _t| jd
 |dd| _tt|d| _| jd d d | _t | _t | _t | _t | _| jd
 }	t| jD ]}
|
d d }ddd| d| g}| jd|
 tj|  qtd| jd D ]/}| jd|  }| jt|	|d|d|d | jt||d||d | jt|| |}	q| jd d | _ d S )Nfused_lrelu)r\   r[            @          	rr      r   r   r   r   r   r   i   rr   re   )ro   F)rg   r   r      noise_T)rg   ro   )!r   r   r   rn   r
   rangeappendrW   r   
Sequentialr}   channelsr   r   r   conv1r   to_rgb1intrG   loglog_size
num_layers
ModuleListconvs	upsamplesto_rgbsModulenoisesr/   r   rE   n_latent)r   r   rn   n_mlpchannel_multiplierro   lr_mlplayersirN   	layer_idxresr0   rO   r   r   r   r     s   
	





zGenerator.__init__c                 C   sj   | j j j}tjdddd|dg}td| jd D ]}tdD ]}|tjddd| d| |d qq|S )Nr   rr   devicere   r   )r   r   r   rE   r   r   r   )r   r   r   r   r   r   r   r   
make_noise  s   
$zGenerator.make_noisec                 C   s0   t j|| j| jjjd}| |jddd}|S )Nr   r   T)r   )r   rE   rn   r   r   r}   r   )r   r   	latent_inlatentr   r   r   mean_latent  s
   zGenerator.mean_latentc                 C   s
   |  |S r   r}   r   r   r   r   
get_latent  s   
zGenerator.get_latentFNr   Tc	                    s&  |s fdd|D }|d u r$|rd g j  }n fddt j D }|dk r<g }	|D ]}
|	|||
|    q,|	}t|dk r^ j}|d jdk rY|d dd|d}n5|d }n0|d u rkt	d jd }|d dd|d}|d dd j| d}t
||gd} |} j||d d df |d d} ||d d df }d}t jd d d  jdd d |dd d |dd d  jD ]5\}}}}}|||d d |f |d}|||d d |d f |d}|||d d |d f |}|d7 }q|}|r||fS |d fS )	Nc                    s   g | ]}  |qS r   r   ).0sr   r   r   
<listcomp>  s    z%Generator.forward.<locals>.<listcomp>c                    s   g | ]}t  jd | qS )r   )getattrr   )r   r   r   r   r   r   "  s    r   r   r   re   r   )r   r   r   ri   r   r&   rv   r   randomrandintr   catr   r   r   zipr   r   )r   stylesreturn_latentsinject_index
truncationtruncation_latentinput_is_latentr   randomize_noisestyle_tr}   r   latent2r;   r   r   r   conv2noise1noise2to_rgbr   r   r   r   r     sV   



 4
zGenerator.forward)FNr   NFNT)	r   r    r!   r   r   r   r   r   r"   r   r   r   r   r     s     [r   c                       s*   e Zd Zdg dddf fdd	Z  ZS )	ConvLayerFrd   Tc              
      s   g }|r+d}	t ||	 |d  }
|
d d }|
d }|t|||fd d}d| _nd}|d | _|t|||| j||o?| d |rN|t||d t j|  d S )Nr   r   rB   r   )rK   rJ   rM   r`   )ri   r   r@   rK   rC   r   r   r   )r   rN   rO   rP   rh   ro   rM   r   r   r.   r3   r4   r5   rJ   r   r   r   r   ]  s0   


zConvLayer.__init__)r   r    r!   r   r"   r   r   r   r   r   [  s    r   c                       s,   e Zd Zg df fdd	Zdd Z  ZS )ResBlockrd   c                    sD   t    t||d| _t||ddd| _t||ddddd| _d S )Nre   T)rh   r   F)rh   r   rM   )r   r   r   r   r   r   )r   rN   rO   ro   r   r   r   r     s   
zResBlock.__init__c                 C   s4   |  |}| |}| |}|| td }|S )Nr   )r   r   r   rG   rH   )r   r   r;   r   r   r   r   r     s
   


zResBlock.forwardr   r   r   r   r   r     s    r   c                       s.   e Zd Zdg df fdd	Zdd Z  ZS )Discriminatorr   rd   c           
   
      s   t    ddddd| d| d| d| d| d	}td|| d	g}tt|d
}|| }t|d
dD ]}|d
|d	   }	|t||	| |	}q6t	j
| | _d| _d	| _t|d	 |d d| _t	
t|d d d |d ddt|d d	| _d S )Nr   r   r   r   r   r   r   re   r   r   rs   rr   r   )r[   )r   r   r   r   rG   r   r   r   r   r   r   r   stddev_groupstddev_feat
final_convrW   final_linear)
r   r   r   ro   r   r   r   rN   r   rO   r   r   r   r     s8   

zDiscriminator.__init__c           	      C   s   |  |}|j\}}}}t|| j}||d| j|| j ||}t|jdddd }|j	g ddd
d	}||d
||}t||gd
}| |}||d}| |}|S )Nrs   r   F)unbiasedr   rq   T)keepdimsr   r   )r   r0   minr   rw   r   r   rH   varr   ru   r   r   r   r   )	r   r   r;   r~   r   r   r   groupstddevr   r   r   r     s   


zDiscriminator.forwardr   r   r   r   r   r     s    (r   )"	functoolsrG   operatorr   r   r   torch.autogradr   torch.nnr   ra   opr   r   r   r	   r   r
   r)   r+   r?   r@   rC   rW   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s6   
*) & >-