图像翻译网络模型Pix2Pix

article/2025/8/27 1:34:20

Pix2pix算法(Image-to-Image Translation,图像翻译),它的核心技术有三点:基于条件GAN的损失函数,基于U-Net的生成器和基于PatchGAN的判别器。Pix2Pix能够在诸多图像翻译任务上取得令人惊艳的效果,但因为它的输入是图像对,因此它得到的模型还是有偏的。这里的有偏指的是模型能够在与数据集近似的 的情况下得到令人满意的生成内容,但是如果输入 与训练集的偏差过大,Pix2Pix得到的结果便不那么理想了。

条件GAN

如图,鉴别器D学习对假图片(由生成器合成)和真实图片组进行分类。生成器G,学会欺骗鉴别器。与普通GAN不同,生成器和鉴别器都观察输入的轮廓图与生成图片或真实图片,普通GAN直接输入生成图片或真实图片。

输入图像用y表示,输入图像的边缘图像用x表示,pix2pix在训练时需要成对的图像(x和y)。x作为生成器G的输入(随机噪声z,去掉z不会对生成效果有太大影响,但假如将x和z合并在一起作为G的输入,可以得到更多样的输出)得到生成图像G(x),然后将G(x)和x基于通道维度合并在一起,最后作为判别器D的输入得到预测概率值,该预测概率值表示输入是否是一对真实图像,概率值越接近1表示判别器D越肯定输入是一对真实图像。另外真实图像y和x也基于通道维度合并在一起,作为判别器D的输入得到概率预测值。因此判别器D的训练目标就是在输入不是一对真实图像(x和G(x))时输出小的概率值(比如最小是0),在输入是一对真实图像(x和y)时输出大的概率值(比如最大是1)。生成器G的训练目标就是使得生成的G(x)和x作为判别器D的输入时,判别器D输出的概率值尽可能大,这样就相当于成功欺骗了判别器D。

U-Net

U-Net是一个用于医学图像分割的全卷积模型。它分为两个部分,其中左侧是由卷积和降采样操作组成的压缩路径,右侧是由卷积和上采样组成的扩张路径,扩张的每个网络块的输入由上一层上采样的特征和压缩路径部分的特征拼接而成。网络模型整体是一个U形的结构,因此被叫做U-Net。

U-Net是德国Freiburg大学模式识别和图像处理组提出的一种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码(Encoder-Decoder)结构的网络相比,U-Net的区别是加入skip-connection,对应的feature maps和decode之后的同样大小的feature maps按通道拼(concatenate)一起,用来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果非常明显。

判别器

使用L1正则有助于使生成的图像更清楚

最终目标是在正则约束情况下的生成器和判别器的最大最小博弈

 

利用马尔科夫性的判别器(PatchGAN),pix2pix采用的策略是,用重建来解决低频成分,用GAN来解决高频成分。一方面,使用传统的L1 loss来让生成的图片跟训练的图片尽量相似,用GAN来构建高频部分的细节。

另一方面,使用PatchGAN来判别是否是生成的图片。PatchGAN的思想是,既然GAN只用于构建高频信息,那么就不需要将整张图片输入到判别器中,让判别器对图像的每个大小为N x N的patch做真假判别就可以了。因为不同的patch之间可以认为是相互独立的。pix2pix对一张图片切割成不同的N x N大小的patch,判别器对每一个patch做真假判别,将一张图片所有patch的结果取平均作为最终的判别器输出。具体实现的时候,使用的是一个NxN输入的全卷积小网络,最后一层每个像素过sigmoid输出为真的概率,然后用BCEloss计算得到最终loss。这样做的好处是因为输入的维度大大降低,所以参数量少,运算速度也比直接输入一张快,并且可以计算任意大小的图。

pix2pix_model.py

import torch
from .base_model import BaseModel
from . import networksclass Pix2PixModel(BaseModel):""" This class implements the pix2pix model, for learning a mapping from input images to output images given paired data.The model training requires '--dataset_mode aligned' dataset.By default, it uses a '--netG unet256' U-Net generator,a '--netD basic' discriminator (PatchGAN),and a '--gan_mode' vanilla GAN loss (the cross-entropy objective used in the orignal GAN paper).pix2pix paper: https://arxiv.org/pdf/1611.07004.pdf"""@staticmethoddef modify_commandline_options(parser, is_train=True):"""Add new dataset-specific options, and rewrite default values for existing options.Parameters:parser          -- original option parseris_train (bool) -- whether training phase or test phase. You can use this flag to add training-specific or test-specific options.Returns:the modified parser.For pix2pix, we do not use image bufferThe training objective is: GAN Loss + lambda_L1 * ||G(A)-B||_1By default, we use vanilla GAN loss, UNet with batchnorm, and aligned datasets."""# changing the default values to match the pix2pix paper (https://phillipi.github.io/pix2pix/)parser.set_defaults(norm='batch', netG='unet_256', dataset_mode='aligned')if is_train:parser.set_defaults(pool_size=0, gan_mode='vanilla')parser.add_argument('--lambda_L1', type=float, default=100.0, help='weight for L1 loss')return parserdef __init__(self, opt):"""Initialize the pix2pix class.Parameters:opt (Option class)-- stores all the experiment flags; needs to be a subclass of BaseOptions"""BaseModel.__init__(self, opt)# specify the training losses you want to print out. The training/test scripts will call <BaseModel.get_current_losses>self.loss_names = ['G_GAN', 'G_L1', 'D_real', 'D_fake']# specify the images you want to save/display. The training/test scripts will call <BaseModel.get_current_visuals>self.visual_names = ['real_A', 'fake_B', 'real_B']# specify the models you want to save to the disk. The training/test scripts will call <BaseModel.save_networks> and <BaseModel.load_networks>if self.isTrain:self.model_names = ['G', 'D']else:  # during test time, only load Gself.model_names = ['G']# define networks (both generator and discriminator)self.netG = networks.define_G(opt.input_nc, opt.output_nc, opt.ngf, opt.netG, opt.norm,not opt.no_dropout, opt.init_type, opt.init_gain, self.gpu_ids, opt.block_nums)if self.isTrain:  # define a discriminator; conditional GANs need to take both input and output images; Therefore, #channels for D is input_nc + output_ncself.netD = networks.define_D(opt.input_nc + opt.output_nc, opt.ndf, opt.netD,opt.n_layers_D, opt.norm, opt.init_type, opt.init_gain, self.gpu_ids)if self.isTrain:# define loss functionsself.criterionGAN = networks.GANLoss(opt.gan_mode).to(self.device)self.criterionL1 = torch.nn.L1Loss()# initialize optimizers; schedulers will be automatically created by function <BaseModel.setup>.self.optimizer_G = torch.optim.Adam(self.netG.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))self.optimizer_D = torch.optim.Adam(self.netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))self.optimizers.append(self.optimizer_G)self.optimizers.append(self.optimizer_D)def set_input(self, input):"""Unpack input data from the dataloader and perform necessary pre-processing steps.Parameters:input (dict): include the data itself and its metadata information.The option 'direction' can be used to swap images in domain A and domain B."""AtoB = self.opt.direction == 'AtoB'self.real_A = input['A' if AtoB else 'B'].to(self.device)self.real_B = input['B' if AtoB else 'A'].to(self.device)self.image_paths = input['A_paths' if AtoB else 'B_paths']def forward(self):"""Run forward pass; called by both functions <optimize_parameters> and <test>."""self.fake_B = self.netG(self.real_A)  # G(A)def backward_D(self):"""Calculate GAN loss for the discriminator"""# Fake; stop backprop to the generator by detaching fake_Bfake_AB = torch.cat((self.real_A, self.fake_B),1)  # we use conditional GANs; we need to feed both input and output to the discriminatorpred_fake = self.netD(fake_AB.detach())self.loss_D_fake = self.criterionGAN(pred_fake, False)# Realreal_AB = torch.cat((self.real_A, self.real_B), 1)pred_real = self.netD(real_AB)self.loss_D_real = self.criterionGAN(pred_real, True)# combine loss and calculate gradientsself.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5self.loss_D.backward()def backward_G(self):"""Calculate GAN and L1 loss for the generator"""# First, G(A) should fake the discriminatorfake_AB = torch.cat((self.real_A, self.fake_B), 1)pred_fake = self.netD(fake_AB)self.loss_G_GAN = self.criterionGAN(pred_fake, True)# Second, G(A) = Bself.loss_G_L1 = self.criterionL1(self.fake_B, self.real_B) * self.opt.lambda_L1# combine loss and calculate gradientsself.loss_G = self.loss_G_GAN + self.loss_G_L1self.loss_G.backward()def optimize_parameters(self):self.forward()  # compute fake images: G(A)# update Dself.set_requires_grad(self.netD, True)  # enable backprop for Dself.optimizer_D.zero_grad()  # set D's gradients to zeroself.backward_D()  # calculate gradients for Dself.optimizer_D.step()  # update D's weights# update Gself.set_requires_grad(self.netD, False)  # D requires no gradients when optimizing Gself.optimizer_G.zero_grad()  # set G's gradients to zeroself.backward_G()  # calculate graidents for Gself.optimizer_G.step()  # udpate G's weights


http://chatgpt.dhexx.cn/article/sG1y3npE.shtml

相关文章

GAN系列之pix2pix、pix2pixHD

1. 摘要 图像处理的很多问题都是将一张输入的图片转变为一张对应的输出图片&#xff0c;比如灰度图、梯度图、彩色图之间的转换等。通常每一种问题都使用特定的算法&#xff08;如&#xff1a;使用CNN来解决图像转换问题时&#xff0c;要根据每个问题设定一个特定的loss funct…

Pix2Pix原理解析

1.网络搭建 class UnetGenerator(nn.Module):"""Create a Unet-based generator"""def __init__(self, input_nc, output_nc, num_downs, ngf64, norm_layernn.BatchNorm2d, use_dropoutFalse):"""Construct a Unet generatorPa…

如何利用Pix2Pix将黑白图片自动变成彩色图片

实现黑白图片自动变成彩色图片 如果你有一幅黑白图片,你该如何上色让他变成彩色的呢?通常做法可能是使用PS工具来进行上色。那么,有没有什么办法进行自动上色呢?自动将黑白图片变成彩色图片?答案是有的,使用深度学习中的Pix2Pix网络就可以实现这一功能。 如图所示,我们…

Pix2Pix进一步了解

参考&#xff1a;Pix2Pix视频解读 一、Pix2Pix是输入图片矩阵而不是标签向量 1、生成器方面 Pix2Pix与CGAN之间的联系&#xff1a;CGAN生成器输入的是一个label&#xff0c;而我们现在要做的是把这个lable换成一个图片&#xff0c;如下所示。这个图片是一个建筑物的模…

CycleGAN与pix2pix训练自己的数据集-Pytorch

github&#xff1a;https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 参考&#xff1a;https://blog.csdn.net/Gavinmiaoc/article/details/80585531 文章目录 CycleganDownload&Prerequisitesbefore your work数据集训练测试 pix2pix数据集训练测试 Cyclegan Do…

pix2pix学习系列(1):预训练模型测试pix2pix

pix2pix学习系列&#xff08;1&#xff09;&#xff1a;预训练模型测试pix2pix 参考文献&#xff1a; [Pytorch系列-66]&#xff1a;生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - 使用预训练模型测试pix2pix模型 运行环境 win 10 1、代码下载 Gith…

pix2pix简要笔记

参考(40条消息) 全文翻译&杂记《Image-to-Image Translation with Conditional Adversarial NetWorks》_Maples丶丶的博客-CSDN博客_image-to-image translation 图像到图像通常有特定方法&#xff08;没有通用&#xff09;&#xff0c;但本质是像素到像素的映射问题。本文…

简单理解Pix2Pix

论文名&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 论文地址&#xff1a;https://arxiv.org/abs/1611.07004 代码链接&#xff1a;https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix Pix2Pix是做什么的 图像风格迁移&#xff0c;一…

Pix2pix网络的基本实现

Pix2pix Gan 主要用于图像之间的转换&#xff0c;又称图像翻译《Image-to-Image Translation with Conditional Adversarial Networks》 普通的GAN接受的G部分的输入是随机向量&#xff0c;输出的是图像。D部分接受的输入是图像&#xff08;生成的或是真实的&#xff09;&…

Pix2Pix(2017)+CycleGAN+Pix2PixHD

GAN 常规的深度学习任务如图像分类、目标检测以及语义分割或者实例分割&#xff0c;这些任务的结果都可以归结为预测。图像分类是预测单一的类别&#xff0c;目标检测是预测Bbox和类别&#xff0c;语义分割或者实例分割是预测每个像素的类别。而GAN是生成一个新的东西如一张图…

经典论文pix2pix详解

Image-to-Image Translation with Conditional Adversarial Networks https://phillipi.github.io/pix2pix/ https://arxiv.org/pdf/1611.07004.pdf https://github.com/phillipi/pix2pix https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 摘要&#xff1a;我们研…

pix2pix 学习笔记

论文&#xff1a; Image-to-Image Translation with Conditional Adversarial Networks https://arxiv.org/pdf/1611.07004v1.pdf 代码&#xff1a; 官方project&#xff1a;https://phillipi.github.io/pix2pix/ 官方torch代码&#xff1a;https://github.com/phillipi/pi…

生成对抗:Pix2Pix

cGAN : Pix2Pix 生成对抗网络还有一个有趣的应用就是&#xff0c;图像到图像的翻译。例如:草图到照片&#xff0c;黑白图像到RGB&#xff0c;谷歌地图到卫星视图&#xff0c;等等。Pix2Pix就是实现图像转换的生成对抗模型&#xff0c;但是Pix2Pix中的对抗网络又不同于普通的GAN…

Pix2Pix

1. 概述 很多的图像处理问题可以转换成图像到图像&#xff08;Image-to-Image&#xff09;的转换&#xff0c;即将一个输入图像翻译成另外一个对应的图像。通常直接学习这种转换&#xff0c;需要事先定义好损失函数&#xff0c;然而对于不同的转换任务&#xff0c;需要设计的损…

pix2pix的简介

概念&#xff1a; 给定一个输入数据和噪声数据生成目标图像&#xff0c;在pix2pix中判别器的输入是生成图像和源图像&#xff0c;而生成器的输入是源图像和随机噪声&#xff08;使生成模型具有一定的随机性&#xff09;&#xff0c;pix2pix是通过在生成器的模型层加入Dropout来…

AI修图!pix2pix网络介绍

语言翻译是大家都知道的应用。但图像作为一种交流媒介&#xff0c;也有很多种表达方式&#xff0c;比如灰度图、彩色图、梯度图甚至人的各种标记等。在这些图像之间的转换称之为图像翻译&#xff0c;是一个图像生成任务。 多年来&#xff0c;这些任务都需要用不同的模型去生成…

pix2pix论文详解

pix2pix论文详解 – 潘登同学的对抗神经网络笔记 文章目录 pix2pix论文详解 -- 潘登同学的对抗神经网络笔记 pix2pix简介模型输入与GAN的区别Loss函数的选取conditional GAN的loss 生成器网络结构判别器网络结构训练过程生成器G的训练技巧将dropout用在预测 评估指标 艺术欣赏 …

对于pix2pix的介绍以及实现

最近读了pix2pix的相关文章&#xff0c;也是关于对抗生成的。它与之前接触的GAN有挺大的不同。比如从训练集来说&#xff0c;它是进行成对的训练&#xff08;接下来会介绍&#xff09;&#xff0c;损失函数的不同比如加入了L1损失&#xff0c;以及生成器的输入&#xff0c;以及…

GAN系列之 pix2pixGAN 网络原理介绍以及论文解读

一、什么是pix2pix GAN 论文&#xff1a;《Image-to-Image Translation with Conditional Adversarial Networks》 pix2pix GAN主要用于图像之间的转换&#xff0c;又称图像翻译。图像处理的很多问题都是将一张输入的图片转变为一张对应的输出图片&#xff0c;端到端的训练。 …

pix2pix算法原理与实现

一、算法名称 Pix2pix算法(Image-to-Image Translation,图像翻译) 来源于论文&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 二、算法简要介绍、研究背景与意义 2.1介绍 图像处理、图形学和视觉中的许多问题都涉及到将输入图像转换为相应…