[Pytorch系列-69]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - test.py代码详解
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:[Pytorch系列-66]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - pix2pix test代码详解_文火冰糖(王文兵)的博客-CSDN博客
目录
第1章 pix2pix测试代码
1.1 代码路径
1.2 关键命令行参数
第2章 测试代码主要流程
第3章 代码详解
第1章 pix2pix测试代码
1.1 代码路径
.\pytorch-CycleGAN-and-pix2pix\test
1.2 关键命令行参数(以pix2pix为例)
-dataroot ./datasets/facades --direction BtoA --model pix2pix --name facades_pix2pix --verbose
其中 --verbose:表示打印网络架构
第2章 测试代码主要流程
(1)获取命令行参数:opt = TestOptions().parse()
(2)设置test模式下命令命令行参数
(3)创建数据集:dataset = create_dataset(opt)
(4)创建模型pix2pix模型: model = create_model(opt)
(5)加载预预训练模型参数:model.setup(opt)
预训练模型的位置有opt参数指定。
print(model.model_names)
print(model.visual_names)
[Network G] Total number of parameters : 54.414 M
-----------------------------------------------
['G']
['real_A', 'fake_B', 'real_B']
备注:
- pix2pix的test,只有G网络,没有D网络。
- 在pix2pix网络中,有三个关键点的图片:['real_A', 'fake_B', 'real_B'],其中real_A为输入图片,fake_B为创作生成的图片,real_B为与创作对应的真实图片,用它与创作图片进行比较和验证,以确定输出图片是否精准。
(6)构建web输出结构
(7)设置在评估模式:model.eval()
(8)读取数据集:for i, data in enumerate(dataset):
(9)unpack成对数据:model.set_input(data)
(10)根据输入图片,生成创作图片:model.test() , =》 调用foward() 进行前向预测
而前向预测只有G网络,没有D网络:
def forward(self):"""Run forward pass; called by both functions <optimize_parameters> and <test>."""self.fake_B = self.netG(self.real_A) # G(A)
(11)获取输出图片:visuals = model.get_current_visuals(),图片包括:real_A(输入图片), fake_B(创作图片), real_B (用于人工比较)这三部分。
(12)存储图片:save_images =》 pytorch-CycleGAN-and-pix2pix\results\facades_pix2pix\test_latest\images\xxx
(13)存储Website:webpage.save() =》pytorch-CycleGAN-and-pix2pix\results\facades_pix2pix\test_latest\index.htlm
第3章 代码详解
# 获取命令行参数opt = TestOptions().parse() # get test options# hard-code some parameters for testopt.num_threads = 0 # test code only supports num_threads = 1opt.batch_size = 1 # test code only supports batch_size = 1opt.serial_batches = True # disable data shuffling; comment this line if results on randomly chosen images are needed.opt.no_flip = True # no flip; comment this line if results on flipped images are needed.opt.display_id = -1 # no visdom display; the test code saves the results to a HTML file.# 创建数据集dataset = create_dataset(opt) # create a dataset given opt.dataset_mode and other options# 创建模型model = create_model(opt) # create a model given opt.model and other options# 加载预训练模型model.setup(opt) # regular setup: load and print networks; create schedulers# 构建web输出# create a websiteweb_dir = os.path.join(opt.results_dir, opt.name, '{}_{}'.format(opt.phase, opt.epoch)) # define the website directoryif opt.load_iter > 0: # load_iter is 0 by defaultweb_dir = '{:s}_iter{:d}'.format(web_dir, opt.load_iter)print('creating web directory', web_dir)webpage = html.HTML(web_dir, 'Experiment = %s, Phase = %s, Epoch = %s' % (opt.name, opt.phase, opt.epoch))# test with eval mode. This only affects layers like batchnorm and dropout.# For [pix2pix]: we use batchnorm and dropout in the original pix2pix. You can experiment it with and without eval() mode.# For [CycleGAN]: It should not affect CycleGAN as CycleGAN uses instancenorm without dropout.# 设置在评估模式if opt.eval:model.eval()# 读取数据集数据for i, data in enumerate(dataset):if i >= opt.num_test: # only apply our model to opt.num_test images.break# unpack成对数据model.set_input(data) # unpack data from data loader# 生成图片model.test() # run inference# 获取输出图片:real_A(输入图片), fake_B(创作图片), real_B (用于人工比较)visuals = model.get_current_visuals() # get image results# 获取存放图片的路径img_path = model.get_image_paths() # get image paths# 每运行5次,打印一次提示if i % 5 == 0: # save images to an HTML fileprint('processing (%04d)-th image... %s' % (i, img_path))#存储图片save_images(webpage, visuals, img_path, aspect_ratio=opt.aspect_ratio, width=opt.display_winsize)# 图片信息存放到web中,用于可视化显示webpage.save() # save the HTML
----------------- Options ---------------
aspect_ratio: 1.0
batch_size: 1
checkpoints_dir: ./checkpoints
crop_size: 256
dataroot: ./datasets/facades [default: None]
dataset_mode: aligned
direction: BtoA [default: AtoB]
display_winsize: 256
epoch: latest
eval: False
gpu_ids: 0
init_gain: 0.02
init_type: normal
input_nc: 3
isTrain: False [default: None]
load_iter: 0 [default: 0]
load_size: 256
max_dataset_size: inf
model: pix2pix [default: test]
n_layers_D: 3
name: facades_pix2pix [default: experiment_name]
ndf: 64
netD: basic
netG: unet_256
ngf: 64
no_dropout: False
no_flip: False
norm: batch
ntest: inf
num_test: 50
num_threads: 4
output_nc: 3
phase: test
preprocess: resize_and_crop
results_dir: ./results/
serial_batches: False
suffix:
verbose: True [default: False]
----------------- End -------------------
dataset [AlignedDataset] was created
initialize network with normal
model [Pix2PixModel] was created
loading the model from ./checkpoints\facades_pix2pix\latest_net_G.pth
---------- Networks initialized -------------
DataParallel(
(module): UnetGenerator(
(model): UnetSkipConnectionBlock(
(model): Sequential(
(0): Conv2d(3, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(1): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(256, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(512, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(512, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(512, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): UnetSkipConnectionBlock(
(model): Sequential(
(0): LeakyReLU(negative_slope=0.2, inplace=True)
(1): Conv2d(512, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(2): ReLU(inplace=True)
(3): ConvTranspose2d(512, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(1024, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(7): Dropout(p=0.5, inplace=False)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(1024, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(7): Dropout(p=0.5, inplace=False)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(1024, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(7): Dropout(p=0.5, inplace=False)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(1024, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(512, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(4): ReLU(inplace=True)
(5): ConvTranspose2d(256, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(2): ReLU(inplace=True)
(3): ConvTranspose2d(128, 3, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
(4): Tanh()
)
)
)
)
[Network G] Total number of parameters : 54.414 M
-----------------------------------------------
['G']
['real_A', 'fake_B', 'real_B']
creating web directory ./results/facades_pix2pix\test_latest
C:\ProgramData\Anaconda3\envs\pytorch-gpu-os\lib\site-packages\torchvision\transforms\transforms.py:287: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.
warnings.warn(
processing (0000)-th image... ['./datasets/facades\\test\\1.jpg']
processing (0005)-th image... ['./datasets/facades\\test\\103.jpg']
processing (0010)-th image... ['./datasets/facades\\test\\12.jpg']
processing (0015)-th image... ['./datasets/facades\\test\\17.jpg']
processing (0020)-th image... ['./datasets/facades\\test\\21.jpg']
processing (0025)-th image... ['./datasets/facades\\test\\26.jpg']
processing (0030)-th image... ['./datasets/facades\\test\\30.jpg']
processing (0035)-th image... ['./datasets/facades\\test\\35.jpg']
processing (0040)-th image... ['./datasets/facades\\test\\4.jpg']
processing (0045)-th image... ['./datasets/facades\\test\\44.jpg']
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122075510
[Pytorch系列-69]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - test.py代码详解相关推荐
- [Pytorch系列-72]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - 使用预训练模型训练CycleGAN模型
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [Pytorch系列-66]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - 使用预训练模型测试pix2pix模型
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 利用Tensorflow构建生成对抗网络GAN以生成数据
使用生成对抗网络(GAN)生成数据 本文主要内容 介绍了自动编码器的基本原理 比较了生成模型与自动编码器的区别 描述了GAN模型的网络结构 分析了GAN模型的目标核函数以及训练过程 介绍了利用Goog ...
- Keras实现生成对抗网络(GAN)(生成二维平面上服从某一分布的点)
GAN原理 相关数学推导可参考 李宏毅https://www.bilibili.com/video/av36779967/?p=4 通俗的比喻:制造假钞(G)和警察(D)对抗的过程.假钞制造者制造假钞 ...
- [人工智能-深度学习-61]:生成对抗网络GAN - 图像融合的基本原理与案例
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- pytorch生成对抗网络GAN的基础教学简单实例(附代码数据集)
1.简介 这篇文章主要是介绍了使用pytorch框架构建生成对抗网络GAN来生成虚假图像的原理与简单实例代码.数据集使用的是开源人脸图像数据集img_align_celeba,共1.34G.生成器与判 ...
- [论文阅读] (06) 万字详解什么是生成对抗网络GAN?经典论文及案例普及
<娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...
- [Python图像识别] 四十九.图像生成之什么是生成对抗网络GAN?基础原理和代码普及
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- ECCV2022 | 生成对抗网络GAN论文汇总(图像转换-图像编辑-图像修复-少样本生成-3D等)...
图像转换/图像可控编辑 视频生成 少样本生成 图像外修复/结合transformer GAN改进 新数据集 图像增强 3D 图像来源归属分析 一.图像转换/图像可控编辑 1.VecGAN: Image ...
最新文章
- Blender+Substance Painter全流程制作真实的机器人学习教程
- [SF] Symfony 组件 BrowserKit 原理
- 全面学习ORACLE Scheduler特性(5)Schedules调度Programs执行的Jobs
- css样式 数据展示,教程:使用CSS设置数据样式
- python-shutil学习
- 51nod 1343 行列式的根
- linux去掉某一字符开头的行
- 10kv线路负载率计算_电工必懂计算公式,你若不会,如何立足于电力行业?
- MPC实现自动驾驶轨迹跟踪
- pyhton学习,day1作业,用户名密码登录模块
- layui鼠标放上图片局部放大_老照片修复教程之—裁剪图片大小
- Nexus私服学习1
- 职场必备的Excel函数技巧!
- 计算机文档字体替换和加重号,word加重号怎么加
- Java IO流(超详细!)
- 计算机视觉教程(第2版)1-8章期末复习
- 第五章 基于QT和DCMTK的Dicom 图像浏览器---Dicom图像序列类
- oss 视频 转码_oss视频转码----比阿里云文档更详细
- R语言,导入XLSX的Excel数据 多sheet
- win10常用dos命令