pix2pixHD代码解析

前言

环境配置:puthon3.6.9 + pytorch1.1.0 + CUDA10.1 + RTX 2080TI(12G)
代码链接: NVIDIA /pix2pixHD
原文地址:High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs
数据集:自己制作,也可调用默认戴姆勒奔驰路测数据集

使用自己数据集训练说明

1、如果您想使用自己的数据集进行训练,请生成标签映射,它是一个通道,其像素值对应于对象标签(即0、1、…,N-1,其中N为标签数量)。这是因为我们需要从标签映射生成一个热点向量。在培训和测试期间,请特别注意–base_options中的参数label_nc。
2、如果您的输入不是标签映射,请指定–label_nc = 0(本人此处指定的就是0,可以理解为和实例、语义都无关,仅仅是图像翻译,达到的效果类似pix2pix),它将直接使用RGB颜色作为输入。文件夹应该命名为train_A, train_B,而不是train_label, train_img,其目标是将图像从A转换为B。
3、如果您没有实例映射或者不想使用它们,请指定–no_instance。
4、预处理的默认设置是scale_width,它将把所有训练图像的宽度调整为opt.loadSize(1024),同时保持长宽比。如果您想要一个不同的设置,请使用–resize_or_crop选项来更改它。例如,scale_width_and_crop首先调整图像的大小,使其具有宽度opt.loadSize,然后执行大小的随机裁剪(opt.fineSize、opt.fineSize)。crop跳过调整大小的步骤,只执行随机裁剪。如果您不想要任何预处理,请指定none,除了确保图像能被32整除外,它什么也不会做。(这段随便翻译的,不是很准确,就是表示对图片变换的一些操作)

正文

首先看一下train和test的主程序

一、pix2pixHD代码解析(train.py + test.py)
博客中详细的在每行代码后备注了注释。train.py运行会进行前向传播和反向求导,而test.py模型仅仅进行前向传播即可。

接下来看一下option参数设置

二、pix2pixHD代码解析(options设置)
英伟达在github的源码封装的非常完美,基本上我们是不需要改动除options以外的其他代码的,只需要在options更改我们的数据集路径,生成的裁剪图片的大小,标签的通道数,是否有实例标签,是否考虑特征匹配,是否考虑感知损失,多尺度判别器的数量等都可以在这里进行设置。具有科学上网工具的可以进入github官网查看源码,上面的readme写的很清楚。

然后看一下dataset处理

三、pix2pixHD代码解析(dataset处理)
详细追究这里的代码可以加深我们对数据集处理的理解。本人的数据集并没有实例分割数据集,因为我的都是单个的对象。我的实际图片是单通道的灰度图,但是在这里为了不改变模型,将单通道改为三通道输入了进去,我的下一步工作是将模型改为针对单通道的。
显存说明:针对1024512的数据集显存12G,单张显卡批次为1,n张显卡批次为n,是可以运行的。但是我本人的图片是三通道10241024在12G显卡上就运行不了了,因此我将数据集改为512512输入。这也是我下一步要将3通道的10241024更改为单通道的1024*1024,然后缩减下模型参数,以往能在12G的显卡上运行起来。

最后看一下核心代码:model

四、pix2pixHD代码解析(models搭建)
里面的pix2pixHD.py是核心代码。这里面的涉及到残差块的代码我还没有搞特别清楚,里面在网络的局部,以512*512为输入,大致算了下模型参数张量维度。

感谢

最后感谢论文的作者和github源码的提供者们,自己只是将别人的代码搬运出来,加上了自己的肤浅理解,我知道有好些地方我理解的并不对,因此只供大家参考,抛砖引玉。pis2pixHD模型虽然不是目前最复杂的模型,但是已经是我目前实操过的代码量最多的模型了,远远大于pix2pix的U-NET生成网络模型。因此我目前还没有吃透这个代码,自己暂时无法实现重组,所以大家有什么问题可以交流,也希望大家能写出更有价值的文章来阐述pix2pixHD。谢谢!

你可能感兴趣的:(PyTorch,GAN)