位置: IT常识 - 正文

【论文笔记】CycleGAN(基于PyTorch框架)(毕业论文笔记怎么写)

发布时间:2024-01-17
【论文笔记】CycleGAN(基于PyTorch框架) CycleGAN(基于PyTorch框架)0.论文简介0.1本文主要的工作0.2引言0.3方法1.代码结构1.1根目录中的文件1.1.1 train.py文件1.1.2 test.py文件1.2根目录中的文件夹1.2.1 docs文件夹1.2.2 .git文件夹1.2.3 data文件夹1.2.3.1 template_dataset.py1.2.3.2 __init__.py1.2.3.3 base_dataset.py1.2.3.4 image_folder.py1.2.3.5 aligned_dataset.py1.2.3.6 unaligned_dataset.py1.2.3.7 single_dataset.py1.2.3.8 colorization_dataset.py1.2.4 imgs文件夹1.2.5 models文件夹1.2.5.1 __init__.py1.2.5.2 base_model.py1.2.5.3 template_model.py1.2.5.4 network.py1.2.5.5 cycle_gan_model.py1.2.5.6 pix2pix_model.py1.2.5.7 colorazation_model.py1.2.5.8 test_model.py1.2.6 option文件夹1.2.7 scripts文件夹1.2.8 util文件夹2.复现过程2.1 准备过程2.2 训练过程2.3 测试过程0.论文简介

推荐整理分享【论文笔记】CycleGAN(基于PyTorch框架)(毕业论文笔记怎么写),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:论文知识点笔记,论文文献笔记,论文笔记怎么写,毕业论文笔记怎么写,论文笔记怎么写,毕业论文笔记怎么写,论文知识点笔记,论文笔记怎么做,内容如对您有帮助,希望把文章链接给更多的朋友!

CycleGAN是一款实现风格迁移的模型,其论文可以在各大平台找到。我们在aixiv上可以找到:https://arxiv.org/pdf/1703.10593.pdf。

我们复现的的代码是来自下面这个github仓库:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix。

虽然看起来很简单,不过对于刚入门的新手来说难度还真不低,下面让我们来仔细看看代码的结构。

0.1本文主要的工作在训练集缺失的情况下,将图片从某一种风格转移到另一种风格。希望学习到一种映射规则G,使得G(X)=Y。希望找到G的可逆变换F使得F(G(X))=X。本文进行了很多任务方面的尝试,并和之前的方法作对比。0.2引言整体步骤概述:捕获风格1的图像特征,在没有训练集提示的情况下将其转化为风格2的特征。研究背景:获取不同风格的成对数据存在一定的困难。具体实施:虽无法获取图像级别的监督(缺乏有标注的图像对),但可获取集合级别的监督(X和Y中各有一组图像,我们不知道X中的某张图对应Y中的哪张图,但我们可以知道X和Y这两个集合是彼此对应的)。经过训练,使得y ̂=G(X)与y无法区分,也就是使得y ̂和y的分布尽可能一致。遇到的问题:第一是无法确定哪一个才是有意义的配对(可能会有很多组映射G),第二是独立地去优化对抗损失是一件很困难的事(配对程序会将所有输入的映射图像都转换成同一个输出图像)。解决措施:添加循环一致性损失,把F(G(X))与x、G(F(Y))与y的损失也都加到对抗网络的损失里。 0.3方法整体损失项:损失函数一共是4个部分,其中有两个是对抗损失,两个是循环一致性损失。四项分别是:(1)D_Y:用于衡量y ̂=G(x)与y的损失;(2)D_X:用于衡量x ̂=F(y)与x的损失;(3)F(G(x))与x之间的损失;(4)G(F(y))与y的损失。对抗损失:基本公式如下。 优化思想是: 循环一致性损失。基本公式如下: 总损失函数 优化目标是 1.代码结构1.1根目录中的文件

我们将目光聚集到根目录这个位置。 这里面,我们先来看根目录下的文件:

README.md就是说明书。requirements.txt是说明这样的一个仓库所需要的各种包的版本。.gitignore文件是那些上传的时候要忽略的东西(不是所有的数据都需要被commit到仓库里,有时候可能只需要交源码)。LICENSE文件是许可证文件,会告知我们有什么样的权限(比如这个项目的代码我们可以下载并在本地中修改,但是不能修改远程仓库的内容)。.replit文件提供了所使用的信息,便于在浏览器中运行代码,这样一来就无需在本地配置环境。这是在使用云编辑器repl.it的时候可能会用到的设置。environment.yml这个文件相当于Python+requirement.txt,我们可以直接使用conda env create -f environment.yml来创建一个environment.yml文件里指定的环境(里头什么样的包、环境名是什么、Python版本是多少)。当然,如果你现在就有这样的一个环境,想要导出这个环境所对应的environment.yml,只需要下面的命令就可以conda env export | grep -v "^prefix: " > environment.yml。train.py是用于训练的主脚本,可以指定使用什么样的数据集和模型。我们使用–model选项可以指定使用什么样的模型(例如:pix2pix, cyclegan, colorization),通过–dataset_mode指定数据模式(例如:aligned, unaligned, single, colorization),通过–dataroot指定数据集路径,通过–name指定实验名称。这里可以列举一个命令供参考python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan。test.py是用于测试的主脚本,通过–checkpoints_dir可以设置模型读取的路径,通过–results_dir可以设置结果的保存路径,通过–dataroot可以设置数据集的路径,通过–name可以设置任务名称,通过–model设置所采用的模型。对于CycleGAN双向检验,可以利用命令python test.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan来实现,其中的–model cycle_gan会将数据导入的模式变为双向。对于CycleGAN的单项检验,可以利用命令python test.py --dataroot datasets/horse2zebra/testA --name horse2zebra_pretrained --model test --no_dropout来实现。–no_dropout指的是不需要dropout;–model test指的是单向验证CycleGAN模型,这将使得–dataset_mode自动变成single,也就是导入单一集合的数据。CycleGAN.ipynb和pix2pix.ipynb里头是两个模型的运行教程(在jupyter notebook)。1.1.1 train.py文件

21-25行不说了,都是导入一些基本的类。

第27行的意思是,如果这个脚本作为主脚本使用,那么就运行下方的东西。28行是先把TrainOption实例化成对象,然后用parse进行解析,这样形成一个结果,赋给opt,也就是说,opt解析出来的结果。29行是根据这个结果去创建数据集。30行获取数据集中样本的数量。31行不说了。

33行是创建模型。34行是根据opt创建合适的学习率调整策略、导入网络并打印。第35行是根据opt创建可视化实例。36行是训练迭代次数。

第38行是迭代过程的开始,opt.epoch_count是从哪个epoch开始,opt.n_epochs_decay是持续多少epoch。39-40行不说了,获取这个epoch开始的时间和本轮epoch导入数据的时间。41行是在本轮epoch当中的第几次迭代。42行是可视化机器的重置,保证在每个epoch里它至少有一次保存图片。43行是在每次epoch之前率先更新一下学习率。

第44行就是每个epoch内部的循环了,enumerate函数的作用是同时列出数据和下标,这个无需多说,注意这里的i是batch的编号,而data也不是一张图,而是一个batch的图。45行是本次iteration开始的时间。46-47行是说如果总迭代次数total_iters到了opt.print_freq的整倍数,就计算t_data,也就是本轮iteration开始的时刻到本轮epoch导入数据的时间已经过去了多久。49-50行指的是,一共多少个数据参与了训练以及本轮epoch里有多少数据参与了迭代。51行是把每一个数据解包,52行是参数优化,这些都是在model当中的basemodel.py当中定义的。

54-57行是数据可视化的部分,如果本轮epoch当中已经参与迭代的样本总数是opt.display_freq的整数倍,那么执行55-57行的操作。55行是返回一个叫save_result的布尔值,用于判定是否需要存出结果到html文件里。第56行是只有在着色任务中才有用,是展示图片的命令,其他的模型中compute_visuals函数只有一个命令,那就是pass。第57行则是存储到html文件里的命令,其中save_result就决定本行是否执行,可以参见util文件夹里的visualizer.py。

59-64行是打印的部分。如果本轮epoch当中已经参与迭代的样本总数是opt.print_freq的整数倍,那么执行60-64行的操作。第60行是获取当前的损失函数。第61行是计算每个图片所用的时间。第62行是输出当前的损失值,后面的参数含义大家可以点击util文件夹下的visuallizer.py去查看相应的函数。63-64行是损失值可视化的部分,如果window id of the web display这个值大于0,那么就利用plot_current_losses函数输出,参数的含义可以点击util文件夹下的visuallizer.py去查看相应的函数。

66-69行是保存权重文件的部分,如果本轮epoch当中已经参与迭代的样本总数是opt.save_latest_freq的整数倍,那么执行67-69行的操作。67行不说了,68行是设置保存后缀,69行是保存模型。

71行是重新获取时间。72-75行也是在保存模型,不过这次是在每个epoch结束的时候。

77行是输出,无需多言。

1.1.2 test.py文件

它将从’–checkpoints_dir’加载保存的模型,并将结果保存到’–results_dir’。它首先在给定opt选项的情况下创建模型和数据集。它将硬编码一些参数。然后,它对“–num_test”图像运行推断,并将结果保存到HTML文件中。

29-34行不用多说了,导入包。

36-39行是导入wandb包,可以帮我们记录超参数指标。

42-43行不说了,和上面的train.py有异曲同工之妙。45行,测试模式仅能使用单线程,至于哪一个线程,你可以去自己指定;46行,batch_size只能为1;47行是确定数据需不需要打乱;48行则是是否翻转;49行是放弃展示图片;50-52行不说了,上面的train.py里解释过是什么含义。

54-57行,没太看懂。不太熟悉wandb这个包的含义。

59-行,是在创建网站。60行是在确定地址。61-62行是要根据本轮迭代来确定网址的域名(整体)。63行不说了,就是打印一下结果。64行是确定网页的地址和标题(这块可能得在util文件夹里头找html.py)。68-69行是评估模式开启。

70-72行比较简单,不再重复。73-74行也比较容易理解,分别是解包数据、测试。75-78行可以参考注释,获取图像结果、获取图像路径,每隔5个图片打印一次。79行是保存图片到html中,参数的含义可以点击util文件夹下的visuallizer.py去查看相应的函数。最后80行,保存html。

1.2根目录中的文件夹

之后,我们再来看看各个文件夹都是怎么回事。

1.2.1 docs文件夹

docs文件夹不多说了,里头是各种说明文档。

1.2.2 .git文件夹【论文笔记】CycleGAN(基于PyTorch框架)(毕业论文笔记怎么写)

.git文件夹也不多说了,这是用于分布式版本管理的工具,具体什么是git请自行百度。在我【教程搬运】的专栏下也有专门介绍git的博文。

1.2.3 data文件夹

data文件夹,里头是各种和数据加载、处理的模块。里头的__init__.py是一个接口文件,basedataset.py是一个基础文件(包含一些常见的转换功能,有点相当于公用的“基类”,不知道怎么描述了),template_dataset.py这是一个模板,相当于示例文件。其它的都是具体的数据集对应的文件了。

1.2.3.1 template_dataset.py

首先让我们聚焦一个模板文件,也就是template_dataset.py,在这里我们仅仅给出一些说明,读完之后觉得抽象也没关系,我们后面还有例子(1.2.3.2节之后),慢慢体会,慢慢读就可以了。

这个文件主要起到一个模板的作用,是一个参考,具体说明如下:

这个脚本可以被当做一个模板,被用于创建新的数据类型。如果说此时此刻的我们想建立一个新的数据类型dummy,就需要在这个根目录底下创建一个名叫dummy_dataset.py的文件,里面需要定义一个类,名叫DummyDataset,而这个类需要继承父类BaseDataset(当然这个类就在data文件夹中的base_dataset.py之中),在类DummyDataset这里面需要实现四个重要的功能,我们将在后面仔细分析。创建完之后如何使用呢?可以通过–dataset_mode template来指定,但需要注意,你所创建的类名class TemplateDataset、在–data_mode后面所指定的template、文件名template_dataset.py这三者都要保持一致,在实际应用中把template换为你自己的数据集名。具体的命名规范在template_dataset.py这个脚本前面有表述。

好了,刚刚我们已经说明了这个模板函数的作用,下面让我们详细地说一下要实现的是个具体功能:

__len__函数,用于统计数据集里有多少数据,这无需多言,里面需要传入一个self参数,这显然是实例化之后的对象。返回值一般是len(self.A_path),括号内的内容是访问self的路径属性。modify_commandline_options函数,用于添加针对这个数据集特定的选项,这个脚本里头只是一个样例。__getitem__函数,这个函数将用来获取数据点,最后要返回的是数据和数据的路径,{‘data_A’: data_A, ‘data_B’: data_B, ‘path’: path},一切信息就都包含在这样一个字典里头。__init__函数,注意到它需要传入两个参数,一个是self,另一个是opt,前者就是将类进行实例化出来的对象,不用管;后者是我们添加的选项,在options里头文件夹里头有一些BaseOption,我们的opt必须是其中的子集。然后先得继承一下BaseDataset.__init__这个方法,之后在此处要获取数据集的路径,并且还要对输入数据进行一定的预处理。

为了便于大家理解__init__函数,我列举了single_dataset.py这个脚本里的内容进行举例。

def __init__(self, opt): """Initialize this dataset class. Parameters: opt (Option class) -- stores all the experiment flags; needs to be a subclass of BaseOptions """ # 调用BaseDataset.__init__方法,将创建好的对象self和你在训练命令里的opt传入。 BaseDataset.__init__(self, opt) # 用opt.dataroot解析出数据路径,opt.max_dataset_size解析出最大允许数据集大小。 # make_dataset函数是用来制作数据集,返回值是一个图片组成的列表。 # 最后使用sorted函数对图片进行一下排序。 self.A_paths = sorted(make_dataset(opt.dataroot, opt.max_dataset_size)) # 这是对输入进行处理的部分。 input_nc = self.opt.output_nc if self.opt.direction == 'BtoA' else self.opt.input_nc self.transform = get_transform(opt, grayscale=(input_nc == 1))

读完上面我写的,你可能一头雾水,没事,我们马上就利用示例来分析。

1.2.3.2 init.py

这个脚本主要是提供接口。里头分成两部分,第一部分有三个函数,第二部分是一个类,里头也有几个函数。

让我们先进入第一部分。

先来看第一个函数find_dataset_using_name,这个函数在这个脚本之外就再也没使用过,推测这个函数是用来按照数据集名称来寻找所对应的dataset类的。我们可以简单地把这个函数的功能理解为,给定一个数据集名,例如Single,我们将singledataset.py脚本中的SingleDataset这个类进行实例化,并返回。整个函数乍一看很难理解,其实不然。第一行dataset_filename = "data." + dataset_name + "_dataset"就是一个简单的拆解,便于第二行datasetlib = importlib.import_module(dataset_filename)进行导入,有人会好奇这第二行是在干什么,这一行是在动态导入对象,dataset_filename只不过就是一个索引而已,导入之后的结果是一个类实例化后的对象datasetlib。这时候小朋友们可能又要问我了,为什么是一个类实例化后的对象?因为你注意看左侧的data文件夹下,任何一个数据集(比如single)是不是都对应着一个脚本(例如:single_dataset.py),而这个脚本里是不是有一个类名字叫做SingleDataset。以后,凡导入这种类实例化后的对象,都是需要动态导入对象的。有些小朋友又会问了,为什么我们要导入这个类的对象,你不是要导入数据集么?很好,我们来看这个类是不是有__getitem__函数,你的数据都是这么被读入的,你可以理解为,数据集被存到这个类实例化后的对象里了。第三行定义一个变量并初始化dataset = None。第四行target_dataset_name = dataset_name.replace('_', '') + 'dataset',简单的文字编辑。第五行到第八行就要正式进入循环了,我们来看datasetlib.__dict__.items(),感兴趣的同学可以去查查__dict__是干什么的python中__dict__的作用是什么? 请参见__dict__的用法 ,__dict_也是一个魔法函数,可以把一个类当中定义的属性和方法都作为一个字典返回,而datasetlib.__dict__.items()其实就是方便这个循环遍历这个字典,有小朋友可能会问,为什么我们要遍历?我来告诉你,因为这个类里有很多的属性或方法形成的键值对,而我们需要的只有那些图片名称和图片组成的键值对,所以我们才要在这个循环中的if函数判断其键名name是不是我们所需要的类名,然后如果它同时也是BaseDataset的子集,就说明遍历过程中当前这个cls就是我们所需要的数据集所对应的类。把它读出来给dataset。第九行到第十行是报错信息,如果第九行的条件语句被触发了,那么第十行的raise就会自动执行错误信息,raise是Python一个常见的语法。最后,这个方法显然返回的是第十一行的dataset,return dataset。注意,这个地方的dataset其实还是一个类形成的实例化对象,千万不要认为里头只有图片。来看第二个函数get_option_setter。这个函数返回的是一个静态方法,这个方法就负责对命令里的option进行编辑(而这些命令就是我们平时启动训练/测试脚本的时候所使用的那些命令),而这个方法就存在于dataset_class这个类里头,这个类又是怎么获取的呢?答案就在上面一个函数里。再来看第三个函数create_dataset,这次要根据所给的option真正地制作一个数据集了(不再像第一个函数那样返回一个类),代码结构也很简单,一行实例化,一行调用load_data()方法,最后返回所需数据集。但是我们还没有看到CustomDatasetDataLoader这个类呀。别急,我们先继续往下。

来让我们进入第二部分,CustomDatasetDataLoader这个类。

先看看__init__函数吧,需要传入的参数一个是self,就是实例化之后的对象,另一个是opt,也就是各种选项。第一行是self的性质,也就是self.opt,这个就等于你传入的参数opt,第二行,代码是dataset_class = find_dataset_using_name(opt.dataset_mode),这是在做什么?右侧的函数返回值是一个实例化对象,也就是说dataset_class只是一个由相应的Dataset这个类实例化之后的对象(这一点从上面 find_dataset_using_name函数的解释就可窥知一二),然后转化成self.dataset,而self.dataset也是个实例化的对象,这个是要传入到torch.utils.data.DataLoader中的,而且你阅读一下torch.utils.data.DataLoader的使用方法就会发现,第一个参数一定是一个实例化之后的对象。torch.utils.data.DataLoader这个是一个非常常用的Pytorch导入数据之用的东西,具体的用法请参见torch.utils.data.DataLoader的用法,而在这个函数里头,第75-79行这几行代码不难理解,因此我不再赘述。然后来看看load_data函数,这个没的说,就是读取数据,然后返回self其实也就是返回实例化之后的对象,也就是把数据集导出。__len__函数就不说了,具体作用大家都懂。__iter__函数的作用是生成一批数据(batch)并迭代。enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。yield的使用可以从这个链接yield的使用当中得到答案,它的作用是生成一个迭代(常见的迭代比如说斐波那契数列)。

总而言之,这个脚本就是围绕着create_dataset这样一个函数展开的,目的就是根据opt制作数据集,只是一个接口而已。

1.2.3.3 base_dataset.py

这个文件实现了一些基础的数据读取、转换功能。在BaseDataset类中,所有的函数基本都留空,这个是要根据具体的数据集来确定的,所以base_dataset.py里的这块是空的,可以在template_dataset.py查到每个函数对应的用法示例,而实际的应用就是single_dataset.py、colorizationo_dataset.py等文件里的用法。

我们来看看在BaseDataset类之后有什么函数。

get_params:前面的if语句是根据opt.preprocess去计算新的宽、高大小,而73、74行则是计算x,y,这是两个参数,用于表示图像截取的位置,random.randint(0, np.maximum(0, new_w - opt.crop_size))具体代表什么含义呢?我们不妨这么想,20×20的图片,我们要把它裁剪成10×10,那么裁剪的位置(左上角坐标)只能在左上方10×10的区域之内,要不然的话,被裁剪出的图片就无法成为10×10的图片了,这两行随机数生成就是干这个的;flip参数则是通过生成随机数的方式来计算翻转概率。这里我要多说一句,Transform是torchvision里用于图片预处理的中药模块,里头规定了很多歌变换,使用者经常通过Transform.Compose将其组合起来,如果我们需要的功能源代码里头不能实现,就需要自己定义函数,有关这部分内容可以参见Torchvision中Transform的使用。get_transform:这个函数的作用即使把所有预处理的方案组合一下,形成一个list,这个list就记录着我们所有的预处理操作。我们来看看81行的几个参数:opt, params=None, grayscale=False, method=Image.BICUBIC, convert=True,opt不说了,就是指定的各个选项;params是上一个函数获取的,默认情况下是None;grayscale应该是是否进行灰度处理;method指的是放大图片的方法,Image.BICUBIC是双三次插值的意思。注意第83-84行,如果grayscale参数是Ture,就执行transforms.Grayscale(1),这个1指的是一个通道;85-87行是说,如果resize为True,则通过双三次插值把图片resize到指定大小;88-89行是等比调整大小,注意前面是elif而不是if,说明和前面的85-87行是有关联的;91-95行是关于裁剪的设定,先要判定params是不是None,如果不是,那就不能采用随机裁剪,而是指定裁剪左上角的点,并指定裁剪大小;97-98行的意思是,如果什么预处理操作都没有,那么就要通过人工调整把图片的宽、高数值调整成4的倍数;100-104行是翻转的相关操作;106-111行属于细微的调整,执行了两个操作,分别是张量化、标准化。最后将所有的变换操作compose到一起。__make_power_2:这个函数就是要根据给定的方法(例如:双三次插值),将图片变成指定的大小。其中的round函数是一种四舍五入的方法。__scale_width:这是用于调整大小的一个函数,不难读懂。__crop:这是用于图片裁剪的一个函数,不难读懂。__flip:图片左右反转,这个函数不用我说了吧。__print_size_warning:这个函数只是用来打印一个警告,告诉人们所输入的图片不合乎要求,需要将宽高调整到4的倍数。1.2.3.4 image_folder.py

这是一个和图片读取有关的脚本。1-16行不说了,很容易读懂,我们从后面说起。

is_image_file:这个脚本不说了,判定是否为图片。make_dataset:这就是制作数据集的函数。assert函数就是先判断dir是否是一个路径,如果不是,输出后面的报错信息。os.walk是根据给定的路径dir进行遍历,该函数返回一个 [ 文件夹路径,文件夹名字,文件名 ] 的三元组序列。28-32行很简单,我就不解释了。default_loader:这是一个默认的“读取器”。指定默认的读取路径,然后转换成RGB图像。这个函数是为后面做准备的。ImageFolder:这是一个类。43行,根据root来制作数据集,imgs实际上是一个列表;44-46行是在必要的时候返回错误信息;48-52行我就不说了,很容易;54-55行,根据索引来寻找指定序号的图片,56行,根据你给定的loader(52行定义的)去加载图片,存入变量img里,57-58行是预处理,处理的方式在50行已经给定,59-62行就是返回而已,比较容易读懂;64-65行不说了,统计imgs列表的长度,就是想看看数据集的大小。1.2.3.5 aligned_dataset.py

先插一句,为什么要准备对齐的数据,这是因为pix2pix模型要用这个。

aligned_dataset.py包含一个可以加载图像对的数据集类。它设置好了一个图像目录/path/to/data/train,其中包含 {A,B} 形式的图像对。在测试期间,您需要准备一个目录/path/to/data/test作为测试数据。那么如何准备对齐的数据集呢,方法在这里。您也可以参阅/pytorch-CycleGAN-and-pix2pix/datasets/combine_A_and_B.py这个脚本,它就是我们在准备对齐数据的时候需要执行的脚本。我们在这里权且先不提,后面还会再说。

让我们来逐个分析在Aligned_dataset类里面的3个函数。

__init__函数:典型的接口函数。14-20行没啥可说的,很简单。第21行是在获取数据的路径(只有路径,没有图片),第22行在1.2.3.4节中已经说的非常明确了,注意这一行的返回值应当是一个列表,列表由图像组成。第23行是为了确保裁剪大小小于图片本身的大小。第24-25行,如果转换方向是B→A,那模型的input应该是opt里的output,反之则结论相反,而模型的output也有类似的结论。__getitem__函数:40-41行是单独读取一张图片,并将其转化为RGB,43行是获取图片的宽、高,44-45行是从AB这一张图中获取A和B,什么意思呢?就是对齐的两张图。48-54行是对于图片的预处理,56行是返回一个字典,无需多言。__len__函数:不用我多说了吧。1.2.3.6 unaligned_dataset.py

unaligned_dataset.py包含一个可以加载未对齐/未配对数据集的数据集类。我们可以使用数据集标志训练模型--dataroot /path/to/data。

依然是同样的三个函数,让我们来一一解读。

__init__函数:里面实现的各项功能和1.2.3.5节中的__init__函数是非常类似的。26-27行获取目录,29-30行生成图片列表,31-32行获取列表大小,33-35行判断转换方向,36-37行生成变换。__getitem__函数:51-56行是获取图片索引的方式。57-61行是读取图片,并进行简单的预处理。63行就是返回了。__len__函数:这个函数不用我说了吧。1.2.3.7 single_dataset.py

single_dataset.py包含一个数据集类,可以加载由path指定的一组单个图像–dataroot /path/to/data。它只能用于使用模型选项为一侧生成CycleGAN结果-model test。

里面的三个函数完全就是前面1.2.3.6的翻版,我就不再一一赘述了。

1.2.3.8 colorization_dataset.py

colorization_dataset.py实现了一个数据集类,可以加载一组 RGB 的自然图像,并将 RGB 格式转换为Lab颜色空间中的 (L, ab) 对。基于 pix2pix 的着色模型 ( --model colorization) 需要它。

modify_commandline_options:这个函数的出现,意味着opt里头一些默认的选项要被修改了,因为对应着着色任务,所以输入维度是1(亮度),输出维度是2(也就是Lab颜色空间中的ab)。__init__函数:接口函数。第41行的assert函数要注意一下,只有在括号内的内容为True方可执行,否则报错,而其它行基本都在之前遇到过,不再赘述。__getitem__函数:56行是获取路径,57-59行是读图、转换、数组化,60-61行是从RGB颜色空间转换到Lab颜色空间并转化为张量;62-63行没太看懂,我推测是标准化,64行是返回值。这个函数的返回值A就是亮度,返回值B就是Lab颜色空间里的ab值。__len__函数:不想说了。。。1.2.4 imgs文件夹

这里是两个示例图片,也可以被用来存放效果图。

1.2.5 models文件夹

模型目录包含与目标函数、优化和网络架构相关的模块。如果要添加一个名为的自定义模型类dummy,那么必须要添加一个名为的文件dummy_model.py并定义一个DummyModel类,这个类继承父类BaseModel。您需要实现四个功能:__init__初始化类(您需要先调用BaseModel.init(self, opt))、set_input(从数据集中解包数据并应用预处理)、forward(生成中间结果)、optimize_parameters(计算损失、梯度和更新网络权重),以及可选的modify_commandline_options(添加特定于模型的选项并设置默认选项)。现在您可以通过指定 flag 来使用模型类–model dummy。有关示例,请参见我们的模板模型类。下面我们详细解释每个文件。

1.2.5.1 init.py

_init_.py 实现了这个包与训练和测试脚本之间的接口。 train.py并在给定选项的情况下test.py调用from models import create_modelandmodel = create_model(opt)创建模型opt。您还需要调用model.setup(opt)以正确初始化模型。

find_model_using_name:这个函数是根据参数model_name去找对应的模型。第32行的model_filename是这个model所对应的文件名,比如说里头有cycle_gan_model,就对应着models.cycle_gan_model,这是便于import所采用的方法。第33行就不说了,动态导入该文件中的类和对应的名字,形成一个字典,字典的结构是{name,cls}。第34行是先把model置为None。第35行也只是调整格式。第36-39行是重点,逐个判断所导入的字典里头的键值对,其中的name是否和target_model_name一致,如果一致且是BaseModel的一个子集,那么model等于cls并被返回,否则报错。get_option_setter:这个函数是根据模型名来找到对应的类,赋值给变量model_class,并把其中修改opt的选项返回。create_model:这个模型主要是将model实例化,并返回对应的对象instance。1.2.5.2 base_model.py

base_model.py为模型实现了一个抽象基类 ( ABC )。它还包括常用的辅助函数(例如 , setup, test, update_learning_rate, ) save_networks,load_networks以后可以在子类中使用。

我们来看看BaseModel这个类里包含了什么东西。

__init__函数:首先
本文链接地址:https://www.jiuchutong.com/zhishi/300657.html 转载请保留说明!

上一篇:10 OpenCV图像识别之人脸追踪(opencv图像识别特定形状)

下一篇:HTML 事件参考手册

  • 固定资产本期发生额怎么算
  • 销售额营业收入怎么填
  • 小规模纳税人核算方式选什么
  • 购房所需的税费种类和费用
  • 因员工过失造成第三方损失
  • 支付刻制公司印章费
  • 出口免税什么意思
  • 公司出售自用汽车如何开票
  • 备品的定义
  • 科目余额表期初借贷一定要相等吗
  • 母子公司间的借款现金流计入哪里
  • 税控盘怎么作废发票重新开
  • 外购烟丝消费税是多少
  • 房地产开发企业资质等级有几个
  • 积分抵扣所开的发票,也能在税前扣除吗?
  • 年末会计账上应该注意哪些
  • 进项发票已经抵扣怎么做退回处理
  • 递延所得税资产是什么
  • 母公司如何将子公司转让
  • 营改增房租增值税税率
  • 租赁合同未付款生效吗
  • 企业所得税申报表A类
  • 增值税减免算什么费用
  • 公司处理固定资产车辆怎么开发票
  • php代码生成器
  • 怎么做合同
  • 递延所得税资产是什么意思
  • 取得的进项税发票抵扣
  • 风险敞口是指什么
  • 微信小程序在哪里找?
  • 记一次调试YOLOv5+DeepSort车辆跟踪项目的经过
  • 超参数有哪些调优方法
  • 微信小程序下拉菜单怎么做
  • carplcy车载有什么用
  • opencv几何变换
  • thinkphp6多语言
  • java 泛型方法
  • 权益法转换为成本法
  • 开了银行对公账户要多久
  • 筹办期间发生的广告费和业务宣传费可以扣除吗
  • 应付职工薪酬相关认定有哪些
  • 公司没有车加油费怎么报
  • 研发费用成本化和费用化
  • 利润表的组成是指
  • 固定资产清理包括什么会计科目
  • jdbc连接mysql数据库代码
  • 小规模纳税人工资要每月申报
  • 个人独资企业需要会计做账吗
  • 工程施工的间接费用年底可以不结转吗
  • 电子商业汇票背书人记载不得转让
  • 材料暂估入库的账务处理
  • 如何计提材料跌价准备
  • 收到总公司拨款怎么入账
  • 疫情期间购买消毒弥雾机的请示
  • 场地租赁费属于劳务还是服务
  • 企业支付宝要交税吗?
  • 记账发生错账怎么办
  • 自动备份mssql server数据库并压缩的批处理脚本
  • win键有啥用
  • win7用u盘怎么重装系统
  • windows2003硬盘分区
  • windowsxp优化教程
  • win10原装版
  • windows8更新不了怎么办
  • win10注册不了账号
  • xp磁盘空间不足怎么办
  • shell脚本转换为exe
  • css设置表格隔行换色
  • jquery动态设置css
  • jquery与ajax获取特殊字符实例详解
  • [android] intent实例
  • nodejs开发web
  • 安卓Android下载
  • 简述python语言
  • 税务鉴定收费标准
  • 党费减免规定
  • 国税局内设机构
  • 2.4车船使用税
  • 零申报的企业残保金怎么申报
  • 企业需要缴纳哪些费用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号