a e#@sddlZddlZddlmZddlmmZddlm Z ddl m Z m Z m Z mZGddde Ze GdddeZe Gd d d e ZGd d d e ZdS) N) ARCH_REGISTRY) BaseNetwork LIPEncoderSPADEResnetBlockget_nonspade_norm_layercs<eZdZdZdfd d Zd d Zd dZdddZZS)SPADEGeneratorzGenerator with SPADEResBlock@Fspectralspadesyncbatch3x3Tc st||_||_||_||_d|_|d|j|_|j|_|rft |d|j|j|j|_ nt j |d|jddd|_ t d|jd|j||_t d|jd|j||_t d|jd|j||_t t d|jd|j|t d|jd|j|t d|jd|j|t d|jd|j|g|_t t j d|jddddt j d|jddddt j d|jddddt j d|jddddg|_t jdd |_dS) Nr r)padding) scale_factor)super__init__nfinput_ncis_train train_phase scale_ratioswshnnLinearfcConv2drhead_0 g_middle_0 g_middle_1 ModuleListupsto_rgbsUpsampleup self num_in_chnum_featZuse_vaeZz_dim crop_sizenorm_grZinit_train_phase __class__,D:\face swap\basicsr\archs\hifacegan_arch.pyr s6 "zSPADEGenerator.__init__cCsN|dd\}}|d|j|d|j}}tj|||fd}||S)z Encode input_tensor into feature maps, can be overridden in derived classes Default: nearest downsampling of 2**5 = 32 times Nr)size)r5rF interpolater )r+ input_tensorhwrrxr2r2r3encode=szSPADEGenerator.encodecCs|}||}|||}||}|||}|||}|jrN|jd}n t|j}t |D]}||}|j |||}q`|j|dt |d}t |}|S)Nr皙?)r<r"r)r#r$rrlenr'ranger&r6 leaky_relutorchtanh)r+r;segphaseir2r2r3forwardGs          zSPADEGenerator.forwardNr progressivec Csv|dur||S|jr$|jd}n t|j}|dkrhtt|d|d}|g||gd||}nl|dkrtt|d|dd}|gd|}|||<n4|dkr|d|kr||S|gd|}|||<||d}|||d}| |}| ||d }| ||d}t |D](}| |}|j |||d|}q$|j|dt|d }t|}|S) al A helper class for subspace visualization. Input and seg are different images. For the first n levels (including encoder) we use input, for the rest we use seg. If mode = 'progressive', the output's like: AAABBB If mode = 'one_plug', the output's like: AAABAA If mode = 'one_ablate', the output's like: BBBABB NrrGrrZone_plugZ one_ablater rr=)rFrrr>r'maxminr<r"r)r#r$r?r&r6r@rArB) r+Zinput_xrCnmoderDZ guide_listr;rEr2r2r3mixed_guidance_forward`s8           z%SPADEGenerator.mixed_guidance_forward)r r Fr r r Tr )NrrG) __name__ __module__ __qualname____doc__rr<rFrL __classcell__r2r2r0r3r s0 rcs*eZdZdZd fd d Zd d ZZS) HiFaceGANzk HiFaceGAN: SPADEGenerator with a learnable feature encoder Current encoder design: LIPEncoder r r Fr r r Tc s6t||||||||t|||j|j|j|_dSN)rrrrrr lip_encoderr*r0r2r3rs zHiFaceGAN.__init__cCs ||SrS)rT)r+r8r2r2r3r<szHiFaceGAN.encode)r r Fr r r Tr )rMrNrOrPrr<rQr2r2r0r3rRs rRcs2eZdZdZdfdd Zd d Zd d ZZS)HiFaceGANDiscriminatora* Inspired by pix2pixHD multiscale discriminator. Args: num_in_ch (int): Channel number of inputs. Default: 3. num_out_ch (int): Channel number of outputs. Default: 3. conditional_d (bool): Whether use conditional discriminator. Default: True. num_d (int): Number of Multiscale discriminators. Default: 3. n_layers_d (int): Number of downsample layers in each D. Default: 4. num_feat (int): Channel number of base intermediate features. Default: 64. norm_d (str): String to determine normalization layers in D. Choices: [spectral][instance/batch/syncbatch] Default: 'spectralinstance'. keep_features (bool): Keep intermediate features for matching loss, etc. Default: True. r Trrr spectralinstancec sTt||_|} |r | |7} t|D]&} t| ||||} |d| | q(dS)NZdiscriminator_)rrnum_dr?NLayerDiscriminator add_module) r+r, num_out_chZ conditional_drW n_layers_dr-norm_d keep_featuresrrEZsubnet_dr0r2r3rs  zHiFaceGANDiscriminator.__init__cCstj|ddddgddS)Nr rrF) kernel_sizestridercount_include_pad)r6 avg_pool2d)r+r;r2r2r3 downsamplesz!HiFaceGANDiscriminator.downsamplecCs6g}|D]$\}}||}||||}q |SrS)named_childrenappendrb)r+r;result_Z_net_doutr2r2r3rFs   zHiFaceGANDiscriminator.forward)r r Trrr rVT)rMrNrOrPrrbrFrQr2r2r0r3rUsrUcs(eZdZdZfddZddZZS)rXz@Defines the PatchGAN discriminator with the specified arguments.c std}tt|dd}|}||_t|} tj|||d|dt ddgg} t d|D]T} |} t |dd}| |dkrdnd} | | tj| ||| |dt ddgg7} qb| tj|d|d|dgg7} t t | D]"} | d t| tj| | qdS) Nrg?r)r^r_rr=Frr model)rrintnpceilr]rrr! LeakyReLUr?rIr>rYstr Sequential)r+rr[r-r\r]kwZpadwr norm_layersequencerJZnf_prevr_r0r2r3rs$ " zNLayerDiscriminator.__init__cCsH|g}|D]}||d}||q|jr<|ddS|dSdS)Nr)childrenrdr])r+r;resultsZsubmodelZintermediate_outputr2r2r3rFs    zNLayerDiscriminator.forward)rMrNrOrPrrFrQr2r2r0r3rXs rX)numpyrjrAtorch.nnrZtorch.nn.functional functionalr6basicsr.utils.registryrZhifacegan_utilrrrrrregisterrRrUrXr2r2r2r3s  7