o
    *j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__ o/var/www/html/Deteccion_Ine/venv/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)Zdtyper   )r   ZtensorZ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   )upZdownr.   r	   r)   r+   r.   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*   r/   r   r   r   r   >   s   
zDownsample.__init__c                 C   s   t || jd| j| jd}|S r3   r5   r6   r   r   r   r   L   r8   zDownsample.forwardr9   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,   r.   )r   r)   r.   upsample_factorr   r   r   r   U   s   

zBlur.__init__c                 C   s   t || j| jd}|S )Nr.   )r	   r)   r.   r6   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_sizerF   rG   rI   r   r   r   r   i   s   

zEqualConv2d.__init__c                 C   s&   t j|| j| j | j| j| jd}|S )N)rI   rF   rG   )r   conv2drB   rE   rI   rF   rG   r6   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   rB   r-   rF   rG   r   r   r   r   __repr__   s   &
zEqualConv2d.__repr__)r   r   Tr   r    r!   r   r   rQ   r"   r   r   r   r   r?   g   s    r?   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   r@   r   rA   Zdiv_rB   rH   Zfill_rI   
activationrC   rD   rE   lr_mul)r   Zin_dimZout_dimrI   	bias_initrV   rU   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rI   )rU   FZlinearrB   rE   r   rI   rV   r6   r   r   r   r      s   zEqualLinear.forwardc                 C   s*   | j j d| jjd  d| jjd  dS )NrN   r   rO   r   rP   )r   r   rB   r-   r   r   r   r   rQ      s   (zEqualLinear.__repr__)Tr   r   NrR   r   r   r   r   rS      s    rS   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      r\   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   )r.   r=   r>   )rW   )r   r   epsrL   rJ   rK   upsample
downsamplelenr<   blurrC   rD   rE   rG   r   r@   r   rA   rB   rS   
modulation
demodulatefused)r   rJ   rK   rL   	style_dimrc   r^   r_   blur_kernelrd   r+   r0   r1   r2   Z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 )NrN   rO   z, upsample=z, downsample=rP   )r   r   rJ   rK   rL   r^   r_   r   r   r   r   rQ      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   r\      r   r   )rG   rF   )rG   )rG   rF   groups)rG   rj   )r-   rd   rE   rB   squeezerb   rc   	unsqueezeviewZsquarer$   r   Zreshaper^   Z	transposer   Zconv_transpose2dra   r_   rM   rG   r   powrK   rL   )r   r   stylebatchrJ   heightwidthrB   wZdcoefsr7   Zdemod_r   r   r   r      s   





	
zModulatedConv2d.forward)r   r    r!   r   rQ   r   r"   r   r   r   r   rZ      s    2rZ   c                       s&   e Zd Z fddZdddZ  ZS )NoiseInjectionc                    s    t    ttd| _d S rT   )r   r   r   r@   r   rH   rB   r   r   r   r   r   A  s   
zNoiseInjection.__init__Nc                 C   s8   |d u r|j \}}}}||d|| }|| j|  S rT   )r-   Z	new_emptyZnormal_rB   )r   imagenoiserp   rt   rq   rr   r   r   r   r   F  s   zNoiseInjection.forwardr   r   r   r   r   r   ru   ?  s    ru   c                       r'   )ConstantInputrh   c                    s&   t    ttd|||| _d S rT   )r   r   r   r@   r   rA   r   )r   channelsizer   r   r   r   P  s   
zConstantInput.__init__c                 C   s    |j d }| j|ddd}|S )Nr   r   )r-   r   repeat)r   r   rp   r7   r   r   r   r   U  s   
zConstantInput.forward)rh   r   r   r   r   r   rx   N  s    rx   c                       s2   e Zd Zdg ddf fdd	Zd	ddZ  ZS )

StyledConvFr[   Tc              	      s8   t    t|||||||d| _t | _t|| _d S )N)r^   rf   rc   )r   r   rZ   convru   rw   r   activate)r   rJ   rK   rL   re   r^   rf   rc   r   r   r   r   ^  s   


zStyledConv.__init__Nc                 C   s(   |  ||}| j||d}| |}|S )Nrw   )r}   rw   r~   )r   r   ro   rw   r7   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 )	ToRGBTr[   c                    sH   t    |rt|| _t|dd|dd| _tt	dddd| _
d S )Nr\   r   F)rc   )r   r   r(   r^   rZ   r}   r   r@   r   rH   rI   )r   rJ   re   r^   rf   r   r   r   r     s   


zToRGB.__init__Nc                 C   s4   |  ||}|| j }|d ur| |}|| }|S r   )r}   rI   r^   )r   r   ro   skipr7   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   r[   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)rV   rU            @          	rh      r   r   r   r   r   r   i   rh   r\   )rf   F)r^   r   r      noise_T)r^   rf   )!r   r   rz   re   r
   rangeappendrS   r   
Sequentialro   channelsrx   r   r|   conv1r   to_rgb1intrC   loglog_size
num_layersZ
ModuleListconvsZ	upsamplesto_rgbsModulenoisesr,   r   rA   n_latent)r   rz   re   Zn_mlpchannel_multiplierrf   Zlr_mlplayersirJ   Z	layer_idxresr-   rK   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   rh   devicer\   r   )r   r   r   rA   r   r   r   )r   r   r   r   rt   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   rA   re   r   r   ro   r   )r   r   Z	latent_inlatentr   r   r   mean_latent  s
   zGenerator.mean_latentc                 C   s
   |  |S r   ro   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   r\   r   )r   r   r   r`   r   r#   rl   r{   randomrandintr   catr   r   r   zipr   r   )r   stylesZreturn_latentsZinject_indexZ
truncationZtruncation_latentZinput_is_latentrw   Zrandomize_noiseZstyle_tro   r   Zlatent2r7   r   r   r   conv2Znoise1Znoise2Zto_rgbrv   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 )	ConvLayerFr[   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   r>   r   )rG   rF   rI   rX   )r`   r   r<   rG   r?   r   r   r   )r   rJ   rK   rL   r_   rf   rI   r~   r   r+   r0   r1   r2   rF   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 )ResBlockr[   c                    sD   t    t||d| _t||ddd| _t||ddddd| _d S )Nr\   T)r_   r   F)r_   r~   rI   )r   r   r   r   r   r   )r   rJ   rK   rf   r   r   r   r     s   
zResBlock.__init__c                 C   s4   |  |}| |}| |}|| td }|S )Nr   )r   r   r   rC   rD   )r   r   r7   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   r[   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   r\   r   r   ri   rh   r   )rU   )r   r   r   r   rC   r   r   r   r   r   r   r   stddev_groupstddev_feat
final_convrS   final_linear)
r   rz   r   rf   r   r   r   rJ   r   rK   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 )Nri   r   F)Zunbiasedr   rg   T)Zkeepdimsr   r   )r   r-   minr   rm   r   r   rD   varr   rk   r{   r   r   r   )	r   r   r7   rp   ry   rq   rr   groupZstddevr   r   r   r     s   


zDiscriminator.forwardr   r   r   r   r   r     s    (r   )"	functoolsrC   operatorr   r   r   Ztorch.autogradr   Ztorch.nnr   rY   opr   r   r   r	   r   r
   r&   r(   r;   r<   r?   rS   rZ   ru   rx   r|   r   r   r   r   r   r   r   r   r   r   <module>   s6   
*) & >-