a e&@sddlZddlZddlmZddlmmZddlmZddlm Z Gdddej Z Gdddej Z Gdd d ej Z dd dZGdddej ZGdddej ZGddde ZdddZdS)N)init) spectral_normcs$eZdZfddZddZZS)SPADEc st|dsJtd|}t|d}t|d}|dkrVt ||_ nF|dkrtt dt ||_ n(|dkrtj |d d |_ nt |d |d krd n|}|d}ttj||||d t|_tj||||d d|_tj||||d d|_dS)NZspadezspade(\D+)(\d)x\dinstanceZ syncbatch\SyncBatchNorm is currently not supported under single-GPU mode, switch to "instance" insteadbatchFaffinez2 is not a recognized param-free norm type in SPADE kernel_sizepadding)rrbias)super__init__ startswithresearchstrgroupintnnInstanceNorm2dparam_free_normprint BatchNorm2d ValueError SequentialConv2dReLU mlp_shared mlp_gammamlp_beta) selfZ config_textZnorm_ncZlabel_ncparsedZparam_free_norm_typeksZnhiddenpw __class__,D:\face swap\basicsr\archs\hifacegan_util.pyrs$   zSPADE.__init__cCsT||}tj||dddd}||}||}||}|||}|S)Nrnearest)sizemode)rF interpolater.r"r#r$)r%xsegmap normalizedZactvgammabetaoutr+r+r,forward(s     z SPADE.forward)__name__ __module__ __qualname__rr8 __classcell__r+r+r)r,r s rcs:eZdZdZd fdd ZddZdd Zd d ZZS) SPADEResnetBlocka ResNet block that uses SPADE. It differs from the ResNet block of pix2pixHD in that it takes in the segmentation map as input, learns the skip connection if necessary, and applies normalization first and then convolution. This architecture seemed like a standard architecture for unconditional or class-conditional GAN architecture using residual block. The code was inspired from https://github.com/LMescheder/GAN_stability. spectralspadesyncbatch3x3cst||k|_t||}tj||ddd|_tj||ddd|_|jr`tj||ddd|_d|vrt |j|_t |j|_|jrt |j|_| dd}t ||||_ t ||||_ |jrt ||||_dS)Nr?rr F)rrspectral)rrlearned_shortcutminrr conv_0conv_1conv_srreplacernorm_0norm_1norm_s)r%finfoutnorm_gZ semantic_ncZfmiddleZspade_config_strr)r+r,rCs"       zSPADEResnetBlock.__init__cCsH|||}|||||}|||||}||}|SN)shortcutrDactrHrErI)r%r2segx_sdxr7r+r+r,r8_s  zSPADEResnetBlock.forwardcCs"|jr||||}n|}|SrN)rBrFrJ)r%r2rQrRr+r+r,rOfszSPADEResnetBlock.shortcutcCs t|dS)Ng?)r0 leaky_relur%r2r+r+r,rPmszSPADEResnetBlock.act)r>r?) r9r:r;__doc__rr8rOrPr<r+r+r)r,r=9s  r=c@s"eZdZdZd ddZddZdS) BaseNetworkz8 A basis for hifacegan archs with custom initialization normal{Gz?cs@fdd}|||D]}t|dr |q dS)Ncsp|jj}|ddkrdt|dr<|jdur.init_func init_weights)applychildrenrfru)r%rsr_rtrpr+rrr,ruts    zBaseNetwork.init_weightscCsdSrNr+rUr+r+r,r8szBaseNetwork.forwardN)rXrY)r9r:r;rVrur8r+r+r+r,rWqs "rWr?rrcCs,|}t|||||t||||SrN)expr0 avg_pool2d)r2logitkernelstriderr[r+r+r,lip2dsr}c@seZdZdZddZdS)SoftGateg(@cCst||jSrN)torchsigmoidmulCOEFFrUr+r+r,r8szSoftGate.forwardN)r9r:r;rr8r+r+r+r,r~sr~cs,eZdZfddZddZddZZS) SimplifiedLIPc s>tt|ttj||ddddtj|ddt|_dS)Nr?rF)rrTr ) rrrrrr rr~rz)r%channelsr)r+r,rs zSimplifiedLIP.__init__cCs|jdjjddS)Nrr\)rzr[rhfill_)r%r+r+r, init_layerszSimplifiedLIP.init_layercCst|||}|SrN)r}rz)r%r2fracr+r+r,r8szSimplifiedLIP.forward)r9r:r;rrr8r<r+r+r)r,rs rcs.eZdZdZejffdd ZddZZS) LIPEncoderz.get_out_channelcsdr"t|}tdd}|dks6t|dkr:|St|dddur`t|d|dd|dkr|tj|dd}nP|dkrtd tj |d d}n,|d krtj |d d}nt d |d t ||S)Nr@rdrrr Tr Z sync_batchrFrznormalization layer z is not recognized) rrlenrdelattrregister_parameterrrrrrr)rZ subnorm_typerr norm_typer+r,add_norm_layers"   z/get_nonspade_norm_layer..add_norm_layerzKThis is a legacy from nvlabs/SPADE, and will be removed in future versions.)r)rrr+rr,get_nonspade_norm_layersr)r?rr)r)rrtorch.nnrtorch.nn.functional functionalr0rZtorch.nn.utilsrModulerr=rWr}r~rrrr+r+r+r,s   -8) #