update latest code
FPSE
GauGAN
截止到2022年6月29日(A榜封榜前1天),我们采用的算法在 AAA 榜排名第 141414,得分 0.52180.52180.5218,提交 request_idrequest\_idrequest_id 为 202206291251513760793720220629125151376079372022062912515137607937。
我们在训练集上实现的效果如下(左侧为原图像,右侧为生成图像):
我们在测试集上实现的效果如下(左侧为语义标签图,右侧为生成图像):
我们主要使用 JittorJittorJittor 复现了 GauGANGauGANGauGAN(Semantic Image Synthesis with Spatially-Adaptive Normalization)和 FPSEFPSEFPSE(Learning to Predict Layout-to-image Conditional Convolutions for Semantic Image Synthesis)的模型结构并成功跑通训练和测试流程,基本复现了原论文的结果。
GauGANGauGANGauGAN,即 SPADESPADESPADE 的主要创新点在于使用了新的 Spatially−Adaptive NormalizationSpatially-Adaptive \ NormalizationSpatially−Adaptive Normalization 层来取代传统的 Batch NormalizationBatch \ NormalizationBatch Normalization 层,以此解决了 pix2pixpix2pixpix2pix 等算法中会丢失部分输入语义分割图像信息的问题。主要的修改内容在于 γ\gammaγ 和 β\betaβ 的计算不同。
在 Batch NormalizationBatch \ NormalizationBatch Normalization 中 γ\gammaγ 和 β\betaβ 的计算是通过网络训练得到的,而 Spatially Adaptive NormalizationSpatially \ Adaptive \ NormalizationSpatially Adaptive Normalization 中 γ\gammaγ 和 β\betaβ 是通过语义分割图像计算得到的。
Spatially−Adaptive NormalizationSpatially-Adaptive \ NormalizationSpatially−Adaptive Normalization 的极算过程如公式 (1)(1)(1) 所示。在 Batch NormalizationBatch \ NormalizationBatch Normalization 中, γ\gammaγ 和 β\betaβ 是一维张量,其中每个值对应输入特征图的每个通道,而在 Spatially-Adaptive \ Normalization中,中,中,\gamma和和和\beta是三维矩阵,除了通道维度外还有宽和高维度,因此公式是三维矩阵,除了通道维度外还有宽和高维度,因此公式是三维矩阵,除了通道维度外还有宽和高维度,因此公式(1)中中中\gamma和和和\beta下标包含下标包含下标包含c,y,x三个符号。均值μ和标准差σ的计算如公式三个符号。均值μ和标准差σ的计算如公式三个符号。均值μ和标准差σ的计算如公式(2)(3)所示,这部分和所示,这部分和所示,这部分和Batch \ Normalization$ 中的计算一样。
网络结构方面,生成器采用堆叠多个 SPADE ResBlkSPADE \ ResBlkSPADE ResBlk 实现,其中每个 SPADE ResBlkSPADE \ ResBlkSPADE ResBlk 的结构如左侧所示, Spatially−Adaptive NormalizationSpatially-Adaptive \ NormalizationSpatially−Adaptive Normalization 层中的 γ\gammaγ 和 β\betaβ 参数通过输入的语义分割图像计算得到。
判别器和 pix2pixHDpix2pixHDpix2pixHD 一样采用常见的 Patch−GANPatch-GANPatch−GAN 形式。
从 SPADESPADESPADE 算法的整体示意图来看,生成器的输入可以是一个随机张量,这样生成的图像也是随机的;同样,这个张量也可以通过一个 Image−EncoderImage-EncoderImage−Encoder 和一张风格图像计算得到,编码网络将输入图像编码成张量,这个张量就包含输入图像的风格,这样就能得到多样化的输出了。
CC−FPSECC-FPSECC−FPSE 网络主要是受 SPADESPADESPADE 网络启发而来的。主要使用了一个由权重预测网络预测的条件卷积生成器 G 和一个特征嵌入的鉴别器 D 组成,详细架构如下图所示。
在传统的卷积层中,相同的卷积核应用于所有样本和所有空间位置,而不管它们有不同的语义布局。而在 FPSEFPSEFPSE 网络结构中,认为这种卷及操作对于语义图像的合成不够灵活和有效。所以为了更好地将 semantic image 的布局信息纳入到图像生成的过程中,本篇文章提出了基于语义布局来预测卷积核权值的方法。给定输入特征图 X∈RC×H×WX \in R^{C \times H \times W}X∈RC×H×W,通过一个核大小为 k×kk \times kk×k 的卷积层来输出特征图 Y∈RD×H×WY \in R ^{D \times H \times W}Y∈RD×H×W。其中使用权值预测网络,使用语义标签作为输入,输出每一个条件卷积层的卷积核权值。当然,但实际操作的过程中,如果预测所有的卷积核权值,会导致过高的计算成本和 GPU 内存占用,所以在真实的网络中,只预测轻量级的深度卷积的权值。
上图是采取的训练损失函数。其余的鉴别器网络基本与 SPADESPADESPADE 一致。论文中给出的实验效果要优于 SPADESPADESPADE。
本项目主要运行在单张卡的 3090 上,200个 epoch 的训练周期一般为 4~5 天。
可以进入任意目录执行以下命令安装依赖( jittor 框架请遵循官网给出的安装指导)
pip install -r requirements.txt
数据目录我们没有上传,请遵循赛事公告进行下载。在本次比赛中,我们没有采取更多的数据预处理操作,裁剪、正则化等操作在项目代码中已经有所体现。
预训练模型我们采用的是 Jittor 框架自带的 vgg19 模型,无需额外下载,在代码运行的过程中会载入到内存里。
Jittor
vgg19
在单卡上训练,只需执行以下命令(针对 SPADESPADESPADE 和 FPSEFPSEFPSE 均可):
python train.py \ --name "your project name" \ --datasetmode custom \ --label_dir "your train labels directory" \ --image_dir "your train images directory" \ --label_nc 29 \ --batchSize "your batchsize" \ --no_instance \ --use_vae
因为受平台算力的限制 (单卡3090),FPSEFPSEFPSE 算法需要更高的参数量,也就需要更大的GPU内存。在实际操作中,FPSEFPSEFPSE 只能使用 batchsize = 1 的梯度下降,导致模型训练效果较佳,但是泛化性能很差;相比之下,SPADESPADESPADE 需要的模型参数量更小,可以使用 batchsize = 4 的梯度下降,相应地在测试集上的效果也就更好。我们最终是选择了SPADESPADESPADE 算法的结果上交比赛平台。
batchsize = 1
batchsize = 4
在单卡上进行测试,只需执行以下命令(针对 SPADESPADESPADE 和 FPSEFPSEFPSE 均可):
python test.py \ --name "your project name (the same as the train project)" \ --datasetmode custom \ --label_dir "your test labels directory" \ --label_nc 29 \ --no_instance \ --use_vae
我们将两篇论文的 pytorch 版本的源代码,迁移到了 Jittor 框架当中。其中借鉴了开源社区 Spectral Normalization 的代码,以及重度参考了两篇论文的官方开源代码:SPADE ,FPSE 。
pytorch
Spectral Normalization
基于 Jittor 的草图生成风景大赛代码
Jittor 草图生成风景比赛 SPADE + FPSE
ThisNameIsGeneratedByJittor (此名称由计图生成)队伍成员及分工
FPSE的实现与仓库维护GauGAN的实现与报告撰写实现效果
截止到2022年6月29日(A榜封榜前1天),我们采用的算法在 A 榜排名第 14,得分 0.5218,提交 request_id 为 2022062912515137607937。
我们在训练集上实现的效果如下(左侧为原图像,右侧为生成图像):
我们在测试集上实现的效果如下(左侧为语义标签图,右侧为生成图像):
算法背景
我们主要使用 Jittor 复现了 GauGAN(Semantic Image Synthesis with Spatially-Adaptive Normalization)和 FPSE(Learning to Predict Layout-to-image Conditional Convolutions for Semantic Image Synthesis)的模型结构并成功跑通训练和测试流程,基本复现了原论文的结果。
GauGAN
GauGAN,即 SPADE 的主要创新点在于使用了新的 Spatially−Adaptive Normalization 层来取代传统的 Batch Normalization 层,以此解决了 pix2pix 等算法中会丢失部分输入语义分割图像信息的问题。主要的修改内容在于 γ 和 β 的计算不同。
在 Batch Normalization 中 γ 和 β 的计算是通过网络训练得到的,而 Spatially Adaptive Normalization 中 γ 和 β 是通过语义分割图像计算得到的。
Spatially−Adaptive Normalization 的极算过程如公式 (1) 所示。在 Batch Normalization 中, γ 和 β 是一维张量,其中每个值对应输入特征图的每个通道,而在 Spatially-Adaptive \ Normalization中,\gamma和\beta是三维矩阵,除了通道维度外还有宽和高维度,因此公式(1)中\gamma和\beta下标包含c,y,x三个符号。均值μ和标准差σ的计算如公式(2)(3)所示,这部分和Batch \ Normalization$ 中的计算一样。
网络结构方面,生成器采用堆叠多个 SPADE ResBlk 实现,其中每个 SPADE ResBlk 的结构如左侧所示, Spatially−Adaptive Normalization 层中的 γ 和 β 参数通过输入的语义分割图像计算得到。
判别器和 pix2pixHD 一样采用常见的 Patch−GAN 形式。
从 SPADE 算法的整体示意图来看,生成器的输入可以是一个随机张量,这样生成的图像也是随机的;同样,这个张量也可以通过一个 Image−Encoder 和一张风格图像计算得到,编码网络将输入图像编码成张量,这个张量就包含输入图像的风格,这样就能得到多样化的输出了。
FPSE
CC−FPSE 网络主要是受 SPADE 网络启发而来的。主要使用了一个由权重预测网络预测的条件卷积生成器 G 和一个特征嵌入的鉴别器 D 组成,详细架构如下图所示。
在传统的卷积层中,相同的卷积核应用于所有样本和所有空间位置,而不管它们有不同的语义布局。而在 FPSE 网络结构中,认为这种卷及操作对于语义图像的合成不够灵活和有效。所以为了更好地将 semantic image 的布局信息纳入到图像生成的过程中,本篇文章提出了基于语义布局来预测卷积核权值的方法。给定输入特征图 X∈RC×H×W,通过一个核大小为 k×k 的卷积层来输出特征图 Y∈RD×H×W。其中使用权值预测网络,使用语义标签作为输入,输出每一个条件卷积层的卷积核权值。当然,但实际操作的过程中,如果预测所有的卷积核权值,会导致过高的计算成本和 GPU 内存占用,所以在真实的网络中,只预测轻量级的深度卷积的权值。
上图是采取的训练损失函数。其余的鉴别器网络基本与 SPADE 一致。论文中给出的实验效果要优于 SPADE。
安装
本项目主要运行在单张卡的 3090 上,200个 epoch 的训练周期一般为 4~5 天。
运行环境
安装依赖
可以进入任意目录执行以下命令安装依赖( jittor 框架请遵循官网给出的安装指导)
数据处理
数据目录我们没有上传,请遵循赛事公告进行下载。在本次比赛中,我们没有采取更多的数据预处理操作,裁剪、正则化等操作在项目代码中已经有所体现。
预训练模型我们采用的是
Jittor框架自带的vgg19模型,无需额外下载,在代码运行的过程中会载入到内存里。训练
在单卡上训练,只需执行以下命令(针对 SPADE 和 FPSE 均可):
因为受平台算力的限制 (单卡3090),FPSE 算法需要更高的参数量,也就需要更大的GPU内存。在实际操作中,FPSE 只能使用
batchsize = 1的梯度下降,导致模型训练效果较佳,但是泛化性能很差;相比之下,SPADE 需要的模型参数量更小,可以使用batchsize = 4的梯度下降,相应地在测试集上的效果也就更好。我们最终是选择了SPADE 算法的结果上交比赛平台。推断
在单卡上进行测试,只需执行以下命令(针对 SPADE 和 FPSE 均可):
致谢
我们将两篇论文的
pytorch版本的源代码,迁移到了Jittor框架当中。其中借鉴了开源社区Spectral Normalization的代码,以及重度参考了两篇论文的官方开源代码:SPADE ,FPSE 。