From b905c5d77d2983ebf115504d97ad1adbdd4a0757 Mon Sep 17 00:00:00 2001 From: lvmengsi Date: Wed, 23 Oct 2019 14:55:27 +0800 Subject: [PATCH] fix spade infer for 1.6(#3575) (#3668) * fix spade infer (#3575) * fix spade * update SPADE * update spade * update infer * update infer * update infer * fix_spade_init --- PaddleCV/PaddleGAN/README.md | 18 +++++++++++++++++- PaddleCV/PaddleGAN/data_reader.py | 10 ++++++++++ PaddleCV/PaddleGAN/images/spade_net.png | Bin 0 -> 64354 bytes PaddleCV/PaddleGAN/infer.py | 14 +++++++++----- PaddleCV/PaddleGAN/network/CGAN_network.py | 2 +- PaddleCV/PaddleGAN/network/SPADE_network.py | 7 +++++++ PaddleCV/PaddleGAN/network/base_network.py | 7 +++++-- PaddleCV/PaddleGAN/scripts/infer_SPADE.sh | 1 + PaddleCV/PaddleGAN/scripts/run_SPADE.sh | 2 +- PaddleCV/PaddleGAN/trainer/SPADE.py | 7 +++++++ 10 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 PaddleCV/PaddleGAN/images/spade_net.png create mode 100644 PaddleCV/PaddleGAN/scripts/infer_SPADE.sh diff --git a/PaddleCV/PaddleGAN/README.md b/PaddleCV/PaddleGAN/README.md index 3b07e819..d2c6f202 100644 --- a/PaddleCV/PaddleGAN/README.md +++ b/PaddleCV/PaddleGAN/README.md @@ -16,7 +16,7 @@ ## 模型简介 -本图像生成模型库包含CGAN\[[3](#参考文献)\], DCGAN\[[4](#参考文献)\], Pix2Pix\[[5](#参考文献)\], CycleGAN\[[6](#参考文献)\], StarGAN\[[7](#参考文献)\], AttGAN\[[8](#参考文献)\], STGAN\[[9](#参考文献)\]。 +本图像生成模型库包含CGAN\[[3](#参考文献)\], DCGAN\[[4](#参考文献)\], Pix2Pix\[[5](#参考文献)\], CycleGAN\[[6](#参考文献)\], StarGAN\[[7](#参考文献)\], AttGAN\[[8](#参考文献)\], STGAN\[[9](#参考文献)\], SPADE\[[13](#参考文献)\]。 注意: 1. StarGAN,AttGAN和STGAN由于梯度惩罚所需的操作目前只支持GPU,需使用GPU训练。 @@ -86,6 +86,7 @@ StarGAN,AttGAN和STGAN采用celeba\[[11](#参考文献)\]数据集进行属性 通过指定dataset参数来下载相应的数据集。 StarGAN, AttGAN和STGAN所需要的[Celeba](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)数据集可以自行下载。 +SPADE使用的[cityscapes](https://www.cityscapes-dataset.com)数据集可以自行下载。下载完成后新建一个目录data/cityscapes/,并在目录下准备3个子目录,分别是真实图片、分割图、实例图。准备一个train_list和test_list,每一行的顺序是分割图\t真实图\t实例图。 **自定义数据集:** 如果您要使用自定义的数据集,只要设置成对应的生成模型所需要的数据格式,并放在data文件夹下,然后把`--dataset`参数设置成您自定义数据集的名称,data_reader.py文件就会自动去data文件夹中寻找数据。 @@ -113,6 +114,7 @@ StarGAN, AttGAN和STGAN所需要的[Celeba](http://mmlab.ie.cuhk.edu.hk/projects - 每个GAN都给出了一份运行示例,放在scripts文件夹内,用户可以直接运行训练脚本快速开始训练。 - 用户可以通过设置`--model_net`参数来选择想要训练的模型,通过设置`--dataset`参数来选择训练所需要的数据集。 +- SPADE模型的训练需要在主目录下新建一个VGG19_pretrained目录,从[该链接](https://paddle-imagenet-models-name.bj.bcebos.com/VGG19_pretrained.tar)下载在ImageNet上预训练好的VGG19模型,解压之后把VGG19模型的参数名改成`vgg19_`开头的参数名。 ### 模型测试 模型测试是利用训练完成的生成模型进行图像生成。infer.py是主要的执行程序,调用示例如下: @@ -183,6 +185,7 @@ STGAN的效果图(图片属性分别为:original image, Bald, Bangs, Black Hai | StarGAN | [StarGAN的预训练模型](https://paddle-gan-models.bj.bcebos.com/stargan_G.tar.gz) | | AttGAN | [AttGAN的预训练模型](https://paddle-gan-models.bj.bcebos.com/attgan_G.tar.gz) | | STGAN | [STGAN的预训练模型](https://paddle-gan-models.bj.bcebos.com/stgan_G.tar.gz) | +| SPADE | [SPADE的预训练模型]() ([SPADE需要的vgg预训练模型]()) ## 进阶使用 @@ -202,6 +205,8 @@ AttGAN利用分类损失和重构损失来保证改变特定的属性,可用 STGAN只输入有变化的标签,引入GRU结构,更好的选择变化的属性,可用于人脸特定属性转换。 +SPADE提出一种考虑空间语义信息的归一化方法,从而更好的保留语义信息,生成更为逼真的图像,可用于图像翻译。 + ### 模型概览 - Pix2Pix由一个生成网络和一个判别网络组成。生成网络中编码部分的网络结构都是采用`convolution-batch norm-ReLU`作为基础结构,解码部分的网络结构由`transpose convolution-batch norm-ReLU`组成,判别网络基本是由`convolution-norm-leaky_ReLU`作为基础结构,详细的网络结构可以查看`network/Pix2pix_network.py`文件。生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。网络利用损失函数学习从输入图像到输出图像的映射,生成网络损失函数由GAN的损失函数和L1损失函数组成,判别网络损失函数由GAN的损失函数组成。生成器的网络结构如下图所示: @@ -245,6 +250,13 @@ AttGAN的网络结构[8] STGAN的网络结构[9]

+- SPADE中整体网络结构如下图所示。SPADE在网络中的卷积层使用了[谱归一化](\[[12](#参考文献)\]),把输入图像的语义mask图像作为生成网络输入,拼接了语义mask和生成器的输出为判别网络的输入。SPADE提出了一种基于空间信息的归一化方法\(SPatially-Adaptive \(DE\)normalization\),在进行归一化的时候可以更好的利用语义信息,从而生成更为逼真的图像。更为具体的网络结构可以参考network/SPADE_network.py文件或者论文中的附录部分。 + +

+
+SPADE整体的网络结构[10] +

+ 注意:网络结构中的norm指的是用户可以选用batch norm或者instance norm来搭建自己的网络。 @@ -291,6 +303,10 @@ STGAN的网络结构[9] [11] [Deep Learning Face Attributes in the Wild](https://arxiv.org/abs/1411.7766) +[12] [Spectral Normalization for Generative Adversarial Networks](https://arxiv.org/abs/1802.05957) + +[13] [Semantic Image Synthesis with Spatially-Adaptive Normalization](https://arxiv.org/abs/1903.07291) + ## 版本更新 diff --git a/PaddleCV/PaddleGAN/data_reader.py b/PaddleCV/PaddleGAN/data_reader.py index 95cdf956..ef18d7e0 100644 --- a/PaddleCV/PaddleGAN/data_reader.py +++ b/PaddleCV/PaddleGAN/data_reader.py @@ -618,6 +618,11 @@ class data_reader(object): train_list = os.path.join(dataset_dir, 'train.txt') if self.cfg.train_list is not None: train_list = self.cfg.train_list + if not os.path.exists(train_list): + print( + "train_list is NOT EXIST!!! Please prepare train list first" + ) + sys.exit(1) train_reader = triplex_reader_creator( image_dir=dataset_dir, list_filename=train_list, @@ -629,6 +634,11 @@ class data_reader(object): test_list = os.path.join(dataset_dir, "test.txt") if self.cfg.test_list is not None: test_list = self.cfg.test_list + if not os.path.exists(test_list): + print( + "test_list is NOT EXIST!!! Please prepare test list first" + ) + sys.exit(1) test_reader = triplex_reader_creator( image_dir=dataset_dir, list_filename=test_list, diff --git a/PaddleCV/PaddleGAN/images/spade_net.png b/PaddleCV/PaddleGAN/images/spade_net.png new file mode 100644 index 0000000000000000000000000000000000000000..569263b121e5dbdd0c18e725186b077b032b98e4 GIT binary patch literal 64354 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 literal 0 HcmV?d00001 diff --git a/PaddleCV/PaddleGAN/infer.py b/PaddleCV/PaddleGAN/infer.py index 764757a6..04c2fc92 100644 --- a/PaddleCV/PaddleGAN/infer.py +++ b/PaddleCV/PaddleGAN/infer.py @@ -170,12 +170,14 @@ def infer(args): model = DCGAN_model(args.n_samples) fake = model.network_G(noise, name="G") elif args.model_net == 'SPADE': + label_shape = [None, args.label_nc, args.crop_height, args.crop_width] + spade_data_shape = [None, 1, args.crop_height, args.crop_width] from network.SPADE_network import SPADE_model model = SPADE_model() - input_label = fluid.layers.data( - name='input_label', shape=data_shape, dtype='float32') - input_ins = fluid.layers.data( - name='input_ins', shape=data_shape, dtype='float32') + input_label = fluid.data( + name='input_label', shape=label_shape, dtype='float32') + input_ins = fluid.data( + name='input_ins', shape=spade_data_shape, dtype='float32') input_ = fluid.layers.concat([input_label, input_ins], 1) fake = model.network_G(input_, "generator", cfg=args, is_test=True) else: @@ -320,10 +322,12 @@ def infer(args): shuffle=False, batch_size=1, mode="TEST") + id2name = test_reader.id2name reader_test = test_reader.make_reader(args, return_name=True) for data in zip(reader_test()): data_A, data_B, data_C, name = data[0] - name = name[0] + name = id2name[np.array(name).astype('int32')[0]] + print("read: ", name) tensor_A = fluid.LoDTensor() tensor_C = fluid.LoDTensor() tensor_A.set(data_A, place) diff --git a/PaddleCV/PaddleGAN/network/CGAN_network.py b/PaddleCV/PaddleGAN/network/CGAN_network.py index 5e971ab9..c15d1045 100644 --- a/PaddleCV/PaddleGAN/network/CGAN_network.py +++ b/PaddleCV/PaddleGAN/network/CGAN_network.py @@ -83,7 +83,7 @@ class CGAN_model(object): name=name + '_dc2', output_size=[self.img_w, self.img_h]) out = fluid.layers.reshape(o_dc2, [-1, self.img_w * self.img_h]) - return o_dc2 + return out def network_D(self, input, label, name="discriminator"): # concat image and label diff --git a/PaddleCV/PaddleGAN/network/SPADE_network.py b/PaddleCV/PaddleGAN/network/SPADE_network.py index 4757920f..20451fbf 100644 --- a/PaddleCV/PaddleGAN/network/SPADE_network.py +++ b/PaddleCV/PaddleGAN/network/SPADE_network.py @@ -40,6 +40,7 @@ class SPADE_model(object): padding=1, name=name + "_fc", use_bias=True, + initial="kaiming", is_test=is_test) x = self.SPADEResnetBlock( x, @@ -88,6 +89,7 @@ class SPADE_model(object): padding=1, name=name + "_conv_img", use_bias=True, + initial="kaiming", is_test=is_test) x = fluid.layers.tanh(x) @@ -148,6 +150,7 @@ class SPADE_model(object): padding=pw, activation_fn='relu', name=name + ".mlp_shared.0", + initial="kaiming", use_bias=True) gamma = conv2d( actv, @@ -155,6 +158,7 @@ class SPADE_model(object): ks, padding=pw, name=name + ".mlp_gamma", + initial="kaiming", use_bias=True) beta = conv2d( actv, @@ -162,6 +166,7 @@ class SPADE_model(object): ks, padding=pw, name=name + ".mlp_beta", + initial="kaiming", use_bias=True) param_attr = fluid.ParamAttr( name=name + ".param_free_norm.weight", @@ -219,6 +224,7 @@ def build_discriminator_Nlayers(input, name=name + ".model0.0", activation_fn='leaky_relu', relufactor=0.2, + initial="kaiming", use_bias=True) d_dims = d_base_dims res_list.append(res1) @@ -248,6 +254,7 @@ def build_discriminator_Nlayers(input, 0.02, 1, name + ".model{}.0".format(d_nlayers), + initial="kaiming", use_bias=True) res_list.append(o_c4) return res_list diff --git a/PaddleCV/PaddleGAN/network/base_network.py b/PaddleCV/PaddleGAN/network/base_network.py index ff7cddb6..50b2d864 100644 --- a/PaddleCV/PaddleGAN/network/base_network.py +++ b/PaddleCV/PaddleGAN/network/base_network.py @@ -414,7 +414,8 @@ def conv2d_spectral_norm(input, dtype = helper.input_dtype() weight_param = fluid.ParamAttr( name=name + ".weight_orig", - initializer=fluid.initializer.Constant(1.0), + initializer=fluid.initializer.Normal( + loc=0.0, scale=1.0), trainable=True) weight = helper.create_parameter( attr=weight_param, @@ -425,7 +426,9 @@ def conv2d_spectral_norm(input, weight = weight_spectral_norm if use_bias: bias_attr = fluid.ParamAttr( - name=name + "_b", initializer=fluid.initializer.Constant(0.0)) + name=name + "_b", + initializer=fluid.initializer.Normal( + loc=0.0, scale=1.0)) else: bias_attr = False conv = conv2d_with_filter( diff --git a/PaddleCV/PaddleGAN/scripts/infer_SPADE.sh b/PaddleCV/PaddleGAN/scripts/infer_SPADE.sh new file mode 100644 index 00000000..fd726dc0 --- /dev/null +++ b/PaddleCV/PaddleGAN/scripts/infer_SPADE.sh @@ -0,0 +1 @@ +python infer.py --model_net SPADE --test_list ./data/cityscapes/test_list --load_height 512 --load_width 1024 --crop_height 512 --crop_width 1024 --dataset_dir ./data/cityscapes/ --init_model ./spade_py37/checkpoints/99/ diff --git a/PaddleCV/PaddleGAN/scripts/run_SPADE.sh b/PaddleCV/PaddleGAN/scripts/run_SPADE.sh index 3833dc7d..225c69d5 100644 --- a/PaddleCV/PaddleGAN/scripts/run_SPADE.sh +++ b/PaddleCV/PaddleGAN/scripts/run_SPADE.sh @@ -1,4 +1,4 @@ export FLAGS_eager_delete_tensor_gb=0.0 export FLAGS_fast_eager_deletion_mode=1 export FLAGS_fraction_of_gpu_memory_to_use=0.01 -CUDA_VISIBLE_DEVICES=0 python train.py --model_net SPADE --dataset cityscapes --train_list train_list --test_list val_list --crop_type Random --batch_size 1 --epoch 200 --load_height 612 --load_width 1124 --crop_height 512 --crop_width 1024 --label_nc 36 +CUDA_VISIBLE_DEVICES=0 python train.py --model_net SPADE --dataset cityscapes --train_list ./data/cityscapes/train_list --test_list ./data/cityscapes/val_list --crop_type Random --batch_size 1 --epoch 200 --load_height 612 --load_width 1124 --crop_height 512 --crop_width 1024 --label_nc 36 diff --git a/PaddleCV/PaddleGAN/trainer/SPADE.py b/PaddleCV/PaddleGAN/trainer/SPADE.py index 40f22fe3..b11c9b6c 100644 --- a/PaddleCV/PaddleGAN/trainer/SPADE.py +++ b/PaddleCV/PaddleGAN/trainer/SPADE.py @@ -19,6 +19,7 @@ from network.SPADE_network import SPADE_model from util import utility import paddle.fluid as fluid import sys +import os import time import network.vgg as vgg import pickle as pkl @@ -316,6 +317,12 @@ class SPADE(object): place = fluid.CUDAPlace(0) if self.cfg.use_gpu else fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) + + if not os.path.exists(self.cfg.vgg19_pretrain): + print( + "directory VGG19_pretrain NOT EXIST!!! Please download VGG19 first." + ) + sys.exit(1) gen_trainer.vgg.load_vars(exe, gen_trainer.program, self.cfg.vgg19_pretrain) -- GitLab