AI修图!pix2pix网络介绍

article/2025/8/27 1:54:50

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

多年来,这些任务都需要用不同的模型去生成。在GAN出现之后,这些任务一下子都可以用同一种框架来解决。这个算法的名称叫做Pix2Pix,基于对抗神经网络实现。话不多说,先上一张图。

  • 将街景标注图像变成真实图像
  • 将建筑标注图像转换为真实图像
  • 将卫星图像转换为地图
  • 将白天的图片转换为夜晚的图像
  • 将边缘轮廓线转为真实物体

本文是文献Image-to-image translation with conditional adversarial networks的笔记。

虽然论文是去年11月份的,比较古老,但作为一篇很经典的论文,值得一读。

引入

卷积神经网络, CNN 出现以来,各种图像任务都在飞速的发展。但CNN虽然能够自动学习出一些东西,仍然需要人的指导。设计对的损失函数便是其中的一种方式,对于图像翻译等图像生成任务来说,告诉CNN去学习什么非常的重要。如果告诉CNN去学习一种错误的Loss,那么也不会得到什么好的结果。以欧式距离为例,CNN学习欧氏距离就会得到一张比较模糊的图像。而对于图像翻译任务来说,我们需要让CNN学习能够输出真实的清晰的图像。

pix2pix模型原理

生成网络G

pix2pix网络是GAN网络中的一种,主要是采用cGAN网络的结构,它依然包括了一个生成器和一个判别器。生成器采用的是一个U-net的结构,其结构有点类似Encoder-decoder,总共包含15层,分别有8层卷积层作为encoder,7层反卷积层(关于反卷积层的概念可以参考这篇博客:反卷积原理不可多得的好文)作为decoder,与传统的encoder-decoder不同的是引入了一个叫做“skip-connect”的技巧,即每一层反卷积层的输入都是:前一层的输出+与该层对称的卷积层的输出,从而保证encoder的信息在decoder时可以不断地被重新记忆,使得生成的图像尽可能保留原图像的一些信息。

 

上图中,首先U-Net也是Encoder-Decoder模型,其次,Encoder和Decoder是对称的。 
所谓的U-Net是将第i层拼接到第n-i层,这样做是因为第i层和第n-i层的图像大小是一致的,可以认为他们承载着类似的信息。

判别网络D

对于判别器,pix2pix采用的是一个6层的卷积网络,其思想与传统的判别器类似,只是有以下两点比较特别的地方:

  • 将输入图像与目标图像进行堆叠:pix2pix的判别器的输入不仅仅只是真实图像与生成图像,还将输入图像也一起作为输入的一部分,即将输入图像与真实图像、生成图像分别在第3通道进行拼接,然后一起作为输入传入判别器模型。
  • 引入PatchGAN的思想:传统的判别器是对一张图像输出一个softmax概率值,而pix2pix的判别器则引入了PatchGAN的思想,将一张图像通过多层卷积层后最终输出了一个比较小的矩阵,比如30*30,然后对每个像素点输出一个softmax概率值,这就相当于对一张输入图像切分为很多小块,对每一小块分别计算一个输出。作者表示引入PatchGAN其实可以起到一种类似计算风格或纹理损失的效果。
     

其具体的结构如下图所示:

  • G目标是生成样本欺骗D
  • D的目标是尽可能将真实的样本、G生成的样本分开

 

损失函数

依上所述,Pix2Pix的损失函数为

为了做对比,同时再去训练一个普通的GAN,即只让D判断是否为真实图像。

对于图像翻译任务而言,G的输入和输出之间其实共享了很多信息,比如图像上色任务,输入和输出之间就共享了边信息。因而为了保证输入图像和输出图像之间的相似度。还加入了L1 Loss

那么,汇总的损失函数为

 

 

 

训练细节

  • 梯度下降,G、D交替训练
  • 使用Adam算法训练
  • 在inference的时候,与train的时候一样,这和传统CNN不一样,因为传统上inference时dropout的实现与train时不同。
  • 在inference的时候,使用test_batch的数据。这也和传统CNN不一样,因为传统做法是使用train set的数据。
  • batch_size = 1 or 4,为1时batch normalization 变为instance normalization

实验

评测

使用AMT和FCN-score两种手段来做评测。

  • AMT,一种人工评测平台,在amazon上。
  • FCN-8,使用预训练好的语义分类器来判断图片的可区分度,这是一种不直接的衡量方式。

Loss function实验

使用三种不同的损失函数,cGAN, L1和cGAN+L1,得到结果如下:

可以看到,只用L1得到模糊图像,只用cGAN得到的会多很多东西。而L1+cGAN会得到较好的结果。

当然普通的GAN损失函数也被尝试。只不过这个损失函数只关注生成的图像是否真实,丝毫不管是否对应。所以训练时间长了以后会导致只输出一个图像。

色彩实验

衡量了不同的损失函数下生成的图像色彩与ground truth的区别。

发现,L1有更窄的色彩区间,表明L1鼓励生成的图像均值化、灰度化。而cGAN会鼓励生成的图像有更多的色彩。

Patch对比

D是基于Patch的,Patch的大小也是一个可以调整的参数。

不同的size产生了不同的结果。1x1的patch就是基于Pixel的D,从结果上看,没带来清晰度的提升,但是却带来了更多的颜色。也证明了上一个实验的结论。

16x16的Patch已经可以达到更好的效果,但是多很多东西(一些乱七八糟的点)。70x70可以消除这些。再变大到286x286,就没有多大的效果提升了。

U-Net

U-Net中使用了skip-connection,而使用与不使用也做了对比实验

可以看到,使用普通的Encoder-Decoder导致了很大的模糊。

效果图

总结

本文将Pix2Pix论文中的所有要点都表述了出来,主要包括:

cGAN,输入为图像而不是随机向量
U-Net,使用skip-connection来共享更多的信息
Pair输入到D来保证映射
Patch-D来降低计算量提升效果
L1损失函数的加入来保证输入和输出之间的一致性。
Reference

[1]. Image-to-image translation with conditional adversarial networks
[2]. 对抗神经网络
[3]. 卷积神经网络


http://chatgpt.dhexx.cn/article/4lDL7wGK.shtml

相关文章

pix2pix论文详解

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

对于pix2pix的介绍以及实现

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

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

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

pix2pix算法原理与实现

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

Java字符串按照字节数进行截取

本文为joshua317原创文章,转载请注明:转载自joshua317博客 Java字符串按照字节数进行截取 - joshua317的博客 一、问题 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个&#xff0…

JAVA中截取字符串中指定字符串

JAVA中截取指定字符串 举个例子,需要截取“abcdef”中的“cde”。 场景1:获取该字符串的下标。输出“cde”。 public static void main(String[] args) {// TODO Auto-generated method stubString data "abcdef";String out data.substri…

Java字符串截取 方法

在 String 中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。 方法的重载: public String substring(int beginIndex) {}public String substring(int beginIndex, int endIndex) {}例子演示&am…

java截取某个字符之前的字符串

1.截取"-"之前字符串 代码如下(示例): //java截取某个字符之前的字符串 public static void substringTest01(){String str "1627579713907351556-202302200018";//截取-之前字符串String str1 str.substring(0, str.…

java中字符串截取,调用substring()方法

substring() 方法返回字符串的子字符串。在java中 substring()方法有两种用法, 第一种 public String substring(int beginIndex) 第二种 public String substring(int beginIndex, int endIndex) 参数的意思 beginIndex -- 起始索引(包括&#xff09…

java截取指定字符串中的某段字符

利用字符串的substring函数来进行截取。 其中,substring函数有两个参数: 1、第一个参数是开始截取的字符位置。(从0开始) 2、第二个参数是结束字符的位置1。(从0开始) indexof函数的作用是查找该字符串中…

Java截取某个特殊字符前后的字符串

思路:想要根据某个特殊字符进行截取字符串,最终是要用到substring()函数,那么关键,是要找到特殊字符所在的位置,也就是要用到函数indexOf()和laseIndexOf()两个函数。 举例: String str "abc_def_gh…

java字符串截取后几位

字符串中截取后几位,或从后面数第几位到第几位! public class demo4 {public static void main(String[] args) {String str "(P)UA000110222(S)4123222200005";//截取后四位String substring str.substring(str.length() - 4);System.out.…

Java字符串截取,截取某个字符之前或者之后的字符串

提示:java截取某个字符之前或者之后的字符串 文章目录 一、java截取某个字符之前或者之后的字符串:1. 截取"_"之前字符串2. 截取"_"之后字符串 二、截取正数第二个"_"后面的内容 一、java截取某个字符之前或者之后的字符串: 1. 截取…

java实现爬虫_手把手教你从零开始用Java写爬虫

本文将手把手地教大家从零开始用Java写一个简单地爬虫! 目标 爬取全景网图片,并下载到本地 收获 通过本文,你将复习到: IDEA创建工程IDEA导入jar包爬虫的基本原理Jsoup的基本使用File的基本使用FileOutputStream的基本使用ArrayLi…

java爬虫 webcollector_Java爬虫-WebCollector | 学步园

爬虫简介: WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。 爬虫内核: WebCollector致力于维护一个稳定、可扩的爬虫内核,便于开发者进行…

Java爬虫高级教程-动力节点

作为网络爬虫的入门采用Java开发语言,内容涵盖了网络爬虫的原理以及开发逻辑,Java网络爬虫基础知识,网络抓包介绍,jsoup的介绍与使用,HttpClient的介绍与使用等内容。本课程在介绍网络爬虫基本原理的同时,注…

java 爬虫处理数据_Java语言实现爬虫实战

引言 网络上有许多信息,我们如何自动的获取这些信息呢?没错,网页爬虫~! 在这篇博文中,我将会使用java语言一步一步的编写一个原型的网页爬虫,其实网页爬虫并没有它听起来那么难。 紧跟我的教程,我相信你会在…

2021年Java爬虫技术教程(一小时实现)

Java爬虫开发 操作要点 正则表达式 Java网络通信:URL IO流 Map—HashMap 字符串操作 异常处理 项目已上传本人码云(gitee)传送门 如果这篇博客对你有一点点小帮助,希望您能给我来波一键三连; 前言 python优点&am…

java 爬虫大型教程(一)

java 爬虫大型教程(一) 写在开始前,既然是大型教程,那就从最初始的环境变量开始搭建说起。 电脑环境:我的电脑是macbook pro,因此系统环境变量配置是和Windows不一样的,如果你的电脑是Windows系统&#x…

java 爬虫 sessionid_java爬虫实战之模拟登陆

使用jsoup工具可以解析某个URL地址、HTML文本内容,是java爬虫很好的优势,也是我们在网络爬虫不可缺少的工具。本文小编带领大家使用jsoup 实现java爬虫模拟登陆,通过省力的API,很好的实现java爬虫模拟登陆。 一、使用工具&#xf…