a ^d@ @sdZddlZddlZddlZddlZddlZddlZddlZddl m Z d!ddZ Gdddej Z Gd d d ejZd d Zd dZddZddZeejdddddejdddddejddeddddddZed kredS)"z5Converting legacy network pickle into the new format.N)miscFcCst|}t|trdt|dkrdtdd|Drd|\}}}t|}t|}t|}t|||d}d|vrtd|d<d|vrd|d<t|dt j j sJt|dt j j sJt|d t j j sJt|dtt dfsJt|dt j j t dfsJ|r|dD]r} || } t | j} | d | } d | _d | _| | jkrt | fi| d } tj| | dd| || <q|S)Ncss|]}t|tVqdSN) isinstance_TFNetworkStub).0netr %/mnt/Git_Code_Linux/DragGAN/legacy.py z#load_network_pkl..)GDG_emaZtraining_set_kwargsZ augment_piper rrZsynthesis_kwargsFT) require_all)_LegacyUnpicklerloadrtuplelenallconvert_tf_generatorconvert_tf_discriminatordicttorchnnModuletypecopydeepcopy init_kwargsget num_fp16_res conv_clampevalrequires_grad_rcopy_params_and_buffers)f force_fp16datatf_Gtf_DZtf_Gsr rrkeyoldkwargsZ fp16_kwargsnewr r r load_network_pkls8 (     r1c@s eZdZdS)rN)__name__ __module__ __qualname__r r r r r>srcseZdZfddZZS)rcs"|dkr|dkrtSt||S)Nzdnnlib.tflib.networkZNetwork)rsuper find_class)selfmodulename __class__r r r6Bsz_LegacyUnpickler.find_class)r2r3r4r6 __classcell__r r r:r rAsrcs"tfddd|S)NcsF|jD]\}}|||<q|jD]\}}||d|q&dS)N/) variables componentsitems)prefixtf_netr9valuecomprecurse tf_paramsr r rFLsz#_collect_tf_params..recurse)r)rBr rEr _collect_tf_paramsIs rIc Gst|D]\}}d}d}t|ddd|dddD]4\}}t||}|r8d}|durh||}qnq8z*|sxJ|dur|tt |Wq t |t |j Yq 0q dS)NFrT)rnamed_params_and_bufferszipre fullmatchgroupscopy_r from_numpynparrayprintlistshape) r8patternsr9tensorfoundrCpatternZvalue_fnmatchr r r _populate_module_paramsVs"&  r]c @sP|jdkrtd|jtdsfdd }ddlm}|j}tj|dd|d d|d d|d d |d d|ddd|dd|dd|dd|dd|dgd|dd|ddtj|dd|dd|d d|d!d|d"d#|d$d%d&d'd(d)}|d*|d+|d,|d-|d.|d/t t }t |dkrVtd0|dt |t  D]\\}}td1|}|rj|jdt|d&} || d2| d3|d<d4|jj_qj|fi|d5} t| d6fd7d8d9fd:d8d;fdd8d?fd@d8dAfdBd8dCfdDd8dEfdFd8dGfdHd8dIfdJd8dKfdLd8dMfdNd8dOfdPd8dQfdRd8dSfdTd8dUfdVd8dWfdXd8dYfdZd8d[fd\d8d]fd^d8d_fd`d8dafdbd8dcfddd8defdfd8dgfdhd8difdjd8dkfdld8dmfdnd8dofdpd8dqddrd?| S)tNr!TensorFlow pickle version too lowcs&|||}|dur"|S|Sraddr")tf_namedefaultnoneval known_kwargs tf_kwargsr r kwargrs  z#convert_tf_generator..kwargrnetworks_stylegan2Z latent_size label_sizeZ dlatent_size resolution num_channelsr fmap_base@rJfmap_maxr#r$ architectureskipresample_kernelrKrrrK use_noiseT nonlinearitylrelumapping_layersZ label_fmaps mapping_fmapsZmapping_nonlinearity mapping_lrmulg{Gz? w_avg_betagףp= ?rK)rc) num_layersembed_featureslayer_features activation lr_multiplierr~)Zz_dimc_dimZw_dimimg_resolution img_channels channel_base channel_maxr#r$rsresample_filterrwrmapping_kwargstruncation_psitruncation_cutoffZstyle_mixing_prob structure conditioningZ fused_modconvUnknown TensorFlow kwargzToRGB_lod(\d+)/(.*)xz/ToRGB/origFzmapping\.w_avgcsdS)NZ dlatent_avgr r rGr r r z&convert_tf_generator..mapping\.embed\.weightcs dS)Nzmapping/LabelEmbed/weight transposer rr r rr mapping\.embed\.biascsdS)Nzmapping/LabelEmbed/biasr r rr r rr mapping\.fc(\d+)\.weightcsd|dS)N mapping/Dense/weightrirr r rr mapping\.fc(\d+)\.biascsd|dS)Nr/biasr rrr r rr zsynthesis\.b4\.constcs ddS)Nzsynthesis/4x4/Const/constrr r rr r rr zsynthesis\.b4\.conv1\.weightcsdddddS)Nzsynthesis/4x4/Conv/weightrrJrrKrr rr r rr zsynthesis\.b4\.conv1\.biascsdS)Nzsynthesis/4x4/Conv/biasr r rr r rr z!synthesis\.b4\.conv1\.noise_constcs ddS)Nzsynthesis/noise0rrr r rr r rr z$synthesis\.b4\.conv1\.noise_strengthcsdS)Nz!synthesis/4x4/Conv/noise_strengthr r rr r rr z$synthesis\.b4\.conv1\.affine\.weightcs dS)Nzsynthesis/4x4/Conv/mod_weightrr rr r rr z"synthesis\.b4\.conv1\.affine\.biascs ddS)Nzsynthesis/4x4/Conv/mod_biasrKr r rr r rr z synthesis\.b(\d+)\.conv0\.weightcs6d|d|dddddddfddddS) N synthesis/rz/Conv0_up/weightrrJrrKrrrr r rr zsynthesis\.b(\d+)\.conv0\.biascsd|d|dS)Nrrz/Conv0_up/biasr rrr r rr z%synthesis\.b(\d+)\.conv0\.noise_constcs(dttt|dddS)Nsynthesis/noiserJrintrSlog2rrr r rr z(synthesis\.b(\d+)\.conv0\.noise_strengthcsd|d|dS)Nrrz/Conv0_up/noise_strengthr rrr r rr z(synthesis\.b(\d+)\.conv0\.affine\.weightcsd|d|dS)Nrrz/Conv0_up/mod_weightrrrr r rr z&synthesis\.b(\d+)\.conv0\.affine\.biascsd|d|ddS)Nrrz/Conv0_up/mod_biasrKr rrr r rr z synthesis\.b(\d+)\.conv1\.weightcs"d|d|dddddS)Nrrz /Conv1/weightrrJrrKrrrr r rr zsynthesis\.b(\d+)\.conv1\.biascsd|d|dS)Nrrz /Conv1/biasr rrr r rr z%synthesis\.b(\d+)\.conv1\.noise_constcs(dttt|dddS)NrrJrrrrrr r rr z(synthesis\.b(\d+)\.conv1\.noise_strengthcsd|d|dS)Nrrz/Conv1/noise_strengthr rrr r rr z(synthesis\.b(\d+)\.conv1\.affine\.weightcsd|d|dS)Nrrz/Conv1/mod_weightrrrr r rr z&synthesis\.b(\d+)\.conv1\.affine\.biascsd|d|ddS)Nrrz/Conv1/mod_biasrKr rrr r rr z synthesis\.b(\d+)\.torgb\.weightcs"d|d|dddddS)Nrrz /ToRGB/weightrrJrrKrrrr r rr zsynthesis\.b(\d+)\.torgb\.biascsd|d|dS)Nrrz /ToRGB/biasr rrr r rr z(synthesis\.b(\d+)\.torgb\.affine\.weightcsd|d|dS)Nrrz/ToRGB/mod_weightrrrr r rr z&synthesis\.b(\d+)\.torgb\.affine\.biascsd|d|ddS)Nrrz/ToRGB/mod_biasrKr rrr r rr zsynthesis\.b(\d+)\.skip\.weightcs6d|d|dddddddfddddS) Nrr /Skip/weightrrrJrrKrrrr r rr .*\.resample_filterz.*\.act_filter)NN)version ValueError static_kwargssettrainingrj GeneratordnnlibEasyDictrVkeysrrIr@rNrOrrgroup synthesisr/rsr%r&r]) r+rhrjZ network_classr/unknown_kwargsr9rCr\rr r rfrgrGr rks                                   !rc "s|jdkrtd|jtdMfdd }tj|dd|dd|d d |d d |d dd|dd|dd|dd|ddtj|dd|dgd|dddtj|dd|dd|dd|dd|dddtj|dd|d d!|ddd"d# }|d$|d%tt}t|dkr8td&|dt |t D]X\}}t d'|}|rL|j dt|d!}||d(|d)|d<d*|_qLdd+lm}|jfi|d,} t| d-fd.d/d0fd1d/d2fd3d/d4fd5d/d6fd7d/d8fd9d/d:fd;d/d<fd=d/d>fd?d/d@fdAd/dBfdCd/dDfdEd/dFfdGd/dHfdId/dJfdKd/dLd!| S)NNrr^cs|||Srr_)rarbrer r rhs z'convert_tf_discriminator..kwargrlrrmrnrorrsZresnetrprqrJrrrkr#r$r|rxryrurv freeze_layers)rrrrzr}g?)rrrrrmbstd_group_sizeZmbstd_num_featuresrK)rZmbstd_num_channelsr) rrrrsrrr#r$Zcmap_dimZ block_kwargsrZepilogue_kwargsrrrzFromRGB_lod(\d+)/(.*)rz /FromRGB/rriFzb(\d+)\.fromrgb\.weightcs |d|dddddS)Nrz/FromRGB/weightrrJrrKrrrr r rr z*convert_tf_discriminator..zb(\d+)\.fromrgb\.biascs|d|dS)Nrz /FromRGB/biasr rrr r rr zb(\d+)\.conv(\d+)\.weightc s6|d|d|ddgt|ddddd S) Nr/ConvrH_downrrrJrrK)rrrrrr r rr zb(\d+)\.conv(\d+)\.biasc s*|d|d|ddgt|dS)NrrrHrr)rrrr r rr zb(\d+)\.skip\.weightcs |d|dddddS)NrrrrJrrKrrrr r rr rcs dS)NzLabelEmbed/weightrr rr r rr rcsdS)NzLabelEmbed/biasr r rr r rr rcsd|dS)NMappingrrrrr r rr rcsd|dS)Nrrr rrr r rr zb4\.conv\.weightcsdddddS)Nz4x4/Conv/weightrrJrrKrr rr r rr zb4\.conv\.biascsdS)Nz 4x4/Conv/biasr r rr r rr zb4\.fc\.weightcs dS)Nz4x4/Dense0/weightrr rr r rr z b4\.fc\.biascsdS)Nz4x4/Dense0/biasr r rr r rr zb4\.out\.weightcs dS)Nz Output/weightrr rr r rr z b4\.out\.biascsdS)Nz Output/biasr r rr r rr r)N)rrrrrrrVrrrIr@rNrOrrrrsrrjZ Discriminatorr%r&r]) r,rhr/rr9rCr\rrjrr rr rs                     rz--sourcez Input pickleTPATH)helprequiredmetavarz--destz Output picklez --force-fp16zForce the networks to use FP16BOOL)rrrbr show_defaultcCstd|dtj|}t||d}Wdn1s>0Ytd|dt|d}t||Wdn1s0YtddS)aConvert legacy network pickle into the native PyTorch format. The tool is able to load the main network configurations exported using the TensorFlow version of StyleGAN2 or StyleGAN2-ADA. It does not support e.g. StyleGAN2-ADA comparison methods, StyleGAN2 configs A-D, or StyleGAN1 networks. Example:  python legacy.py \ --source=https://nvlabs-fi-cdn.nvidia.com/stylegan2/networks/stylegan2-cat-config-f.pkl \ --dest=stylegan2-cat-config-f.pkl z Loading "z"...)r)NzSaving "wbzDone.)rUrutilopen_urlr1openpickledump)sourcedestr)r(r*r r r convert_network_pickle%s* *r__main__)F)__doc__clickrrNrnumpyrSrrZ torch_utilsrr1rr UnpicklerrrIr]rrcommandoptionboolrr2r r r r  s,  ( eU