Pix2Pix 使用指南:一副图像到另一副图像的转换

Pix2Pix

    • Pix2Pix 介绍:使用条件 GAN 进行图像到图像的转换
    • Pix2Pix 原理
      • Pix2Pix 模型结构
        • 生成器:Unet结构
        • 判别器:PatchGAN
        • 目标函数
          • 目标函数总结
    • Pix2Pix 项目使用

 


Pix2Pix 介绍:使用条件 GAN 进行图像到图像的转换

Pix2Pix 论文:https://arxiv.org/abs/1611.07004

Pix2Pix 的性质是图像转换。

图像转换,指从一副图像到另一副图像的转换。

可以类比机器翻译,一种语言转换为另一种语言。

这个转换过程是通过建立一个模型,利用生成对抗网络(GANs)的算法,大量的成对图像数据,如简笔画和真实照片,将输入的简笔画转换成逼真的照片。

 


Pix2Pix 原理


输入x:简笔画

生成器G:处理简笔画,生成的模拟图

判别器D:

  • 输入 {简笔画、生成图},判断为 fake
  • 输入 {简笔画、真实图},判断为 real

Pix2Pix 模型结构

生成器:Unet结构


编码器:输入图像,输出特征

解码器:输入特征,输出图像

UNet:对编码-解码器改进的模型,主要是用于医学影像上。

在编码器和解码器之间增加了跳跃连接,使得同一级别的特征图可以在不同阶段进行拼接和融合。

假设我们有一个医学图像分割任务,输入是一张CT扫描图像,输出是图像中病变区域的分割结果。

解码器主要依赖于局部特征,例如像素的颜色、纹理等。

然而,对于复杂的图像分割任务来说,局部特征可能不足以准确地区分不同的区域。

UNet模型引入跳跃连接,关联到上下文信息、全局特征。

而全局特征可能包括图像中病变区域的大小、形状、位置等信息。

通过在解码器中引入跳跃连接,这些全局特征可以指导像素的分类,帮助模型更好地识别病变区域。

判别器:PatchGAN

PatchGAN是为了解决图像处理领域中的一类问题——如何有效地处理模糊和噪声——而提出的。

具体来说,它是为了解决在图像降质过程中产生的模糊和噪声问题,例如在拍照时由于光线不足、镜头移动等因素导致的图像模糊,或者在图像传输过程中引入的噪声等。

通过学习如何处理这些不良因素,PatchGAN能够让模糊的图像变得更加清晰,从而提高图像的质量。

假设你有一张照片,这张照片的某个部分被划出了一个小的正方形区域,而这个区域里面的内容被模糊处理了。

这个模糊处理的部分就叫做"Patch",而"PatchGAN"就是一种专门用来处理这样模糊图像的算法。

在PatchGAN训练判别器时,不是把整个图片直接放进判别器中进行判别,而是像下面这样,先把一幅图切成 N x N 的小块, 再把每个小块送入判别器中进行判别,最后把整体的结果取平均。


图片来源:CSDN@几维wk

这样划分的好处是,评估高频信息(细节)。

在原始的GAN中,判别器只会输出一个评价值,评价生成器生成的整幅图像。

但是PatchGAN的设计不同,它被设计成全卷积的形式。

这意味着,图像经过各种卷积层后,不会进入全连接层或激活函数,而是使用卷积将输入映射为一个 N*N 的矩阵。

这个矩阵就像原始GAN中的评价值,但它评价的是生成器生成的图像中的每一个小区域。

每个点(true或false)代表原始图像中的一小块区域的评价值,这就是“感受野”的应用。

使用 N*N 的矩阵来评价整幅图像,可以关注更多的区域,这就是PatchGAN的优势。

举例,假设我们有一个 64x64 的图像,我们的 PatchGAN 有 16 个 patch,每个 patch 是 8x8 的。这意味着我们的判别器会输出一个 16x16 的矩阵。每个元素值代表对应 patch 在真实图像中的存在概率。

例如,如果判别器判断第 1 行第 1 列的 patch 是真实的,那么矩阵的第 1 行第 1 列的值就会接近 1,而其他值则会接近 0。如果它判断第 2 行第 3 列的 patch 是生成的,那么矩阵的第 2 行第 3 列的值就会接近 0,而其他值则会接近 1。

通过这种方式,PatchGAN 能够关注到图像中的各个区域,而不仅仅是全局的图像。这对于生成图像的细节部分特别有用,因为往往细节部分更能决定一张图像的真实性。

目标函数

生成器优化目标: L c G A N ( G , D ) = E x , y [ log ⁡ D ( x , y ) ] + E x , z [ log ⁡ ( 1 − D ( x , G ( x , z ) ) ] \begin{aligned}\mathcal{L}_{cGAN}(G,D)=&\mathbb{E}_{x,y}[\log D(x,y)]+\\&\mathbb{E}_{x,z}[\log(1-D(x,G(x,z))]\end{aligned} LcGAN(G,D)=Ex,y[logD(x,y)]+Ex,z[log(1D(x,G(x,z))]

  • L c G A N ( G , D ) L cGAN (G,D) LcGAN(G,D):这是 cGAN 的损失函数,它关于生成器G和判别器D优化。损失函数的目标是最小化生成器生成的假样本被判别器识别的概率,同时最大化判别器正确识别真实样本的概率。

  • E x , y [ l o g D ( x , y ) ] Ex,y[logD(x,y)] Ex,y[logD(x,y)]:这部分是期望真实样本被判别器识别的概率。x是真实样本,y是对应的条件标签,D(x,y) 是判别器对于输入 (x,y) 判断为真实样本的概率。

  • E x , z [ l o g ( 1 − D ( x , G ( x , z ) ) ) ] Ex,z[log(1−D(x,G(x,z)))] Ex,z[log(1D(x,G(x,z)))]:这部分是期望生成器生成的假样本被判别器识别的概率。x是真实样本,z是随机噪声,G(x,z)是生成器根据真实样本x和随机噪声z生成的假样本。

    D ( x , G ( x , z ) ) D(x,G(x,z)) D(x,G(x,z)) 是判别器对于输入 ( x , G ( x , z ) ) (x,G(x,z)) (x,G(x,z)) 判断为真实样本的概率,因此我们需要最大化它的相反数,即 ( 1 − D ( x , G ( x , z ) ) ) (1−D(x,G(x,z))) (1D(x,G(x,z)))

    通过最小化这个损失函数,cGAN可以训练出能够生成满足给定条件约束的样本的生成器。

举例:

传统的损失函数,如L2或L1损失,旨在最小化生成样本与真实样本之间的差异。这种差异度量方法在生成对抗网络(GAN)中同样重要,因为生成器不仅要能够欺骗判别器,还需要生成与真实数据相似度尽可能高的假样本。

当我们在GAN的目标函数中加入传统的损失时,生成器就需要在满足判别器的条件下,尽可能地接近真实样本。这使得生成器不仅要关注欺骗判别器,还要关注生成样本的质量。因此,这种结合可以产生更清晰、更逼真的假样本。

L2损失会最小化每个特征的平方差,因此生成的假样本可能会更加平滑,而无法捕捉到真实样本中的一些细节和变化。

相反,如果使用L1损失来优化生成器,我们可能会发现生成的假样本更加锐利和清晰。

这是因为L1损失会最小化每个特征的绝对差值,因此生成的假样本可能会更加突出真实样本中的一些边缘和细节。

所以,在GAN的目标函数中混入L1损失相比L2损失能够带来更好的效果。因为L1损失能够更好地捕捉到真实样本中的边缘和细节,从而产生更清晰、更逼真的假样本。

这个公式的目的是最小化生成模型G生成的假样本与真实样本之间的差异。具体来说,它计算了真实样本y与生成模型G生成的假样本G(x, z)之间的L1距离(即绝对值差异的总和)。

最终目标函数:

目标函数总结

判别器的优化目标,就是一个GAN

生成器的优化目标,有俩个:

  • 总体相似程度:L1距离,真实标签-生成图(x,z),引入噪声z是为了提高生成图的丰富程度

  • 细节相似程度:对抗损失 + 评估高频信息(细节)

Pix2Pix 项目使用

Pix2Pix 本地部署:https://www.iotword.com/15549.html

Pix2Pix 项目代码:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

Pix2Pix 代码(国内下载链接,很快):https://gitcode.net/zhenzhidemaoyi/pytorch-CycleGAN-and-pix2pix

手把手教学使用链接:https://blog.csdn.net/qq_42691298/article/details/127460187

这篇写的太详细,手把手教学,我真没必要再写了。
 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/205378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十八章,Swing窗体

概述 String包的层次结构和继承关系如下 常用的Swing组件如下表 Swing常用窗体 JFrame 窗体 JFrame 类的常用构造方法包括以下两种形式: public JFrame():创建一个初始不可见、没有标题的窗体。 public JFrame(String title)&a…

网络基础『发展 ‖ 协议 ‖ 传输 ‖ 地址』

🔭个人主页: 北 海 🛜所属专栏: 神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.网络发展1.1.背景1.2.类型 2.网络协议2.1.什么是协议2.2.协议…

Bilateral Guided Upsampling

Abstract 我们提出了一种加速一大类图像处理算子的算法。给定低分辨率参考输入和输出对,我们通过拟合将输入映射到输出的局部曲线来对算子进行建模。然后,我们可以通过在全分辨率输入上评估这些低分辨率曲线来生成全分辨率输出。我们证明,这…

经典策略梯度算法

经典策略梯度算法 DDPG算法 DDPG 算法被提出的初衷其实是 DQN 算法的一个连续动作空间版本扩展。深度确定性策略梯度算法( deep deterministic policy gradient,DDPG),是一种确定性的策略梯度算法。 由于DQN算法中动作是通过贪…

DCDC前馈电容与RC串并联电路

一、RC串并联电路特性分析 1、RC串联电路 RC 串联的转折频率: f01/(2πR1C1),当输入信号频率大于 f0 时,整个 RC 串联电路总的阻抗基本不变了,其大小等于 R1。 2、RC并联电路 RC 并联电路的转折频率&…

学习笔记三十六:通过Ingress-nginx实现灰度发布

通过Ingress-nginx实现灰度发布 灰度发布原理将新版本灰度给部分用户切一定比例的流量给新版本 部署两个版本的服务以 nginx 为例,先部署一个 v1 版本:部署一个 v2 版本再创建一个 Ingress,对外暴露服务,指向 v1 版本的服务:访问验证 基于 He…

csdn最新最全面的Jmeter接口测试:jmeter_逻辑控制器_循环控制器

循环控制器 循环次数:设置该控制器下的请求的循环执行次数 永远:勾选上的话,会一直循环,即所谓死循环 注意:如果线程组本身已经设置了循环次数的话,那循环控制元件控制的子节点 的循环次数为线程组设置的…

高级IO select 多路转接实现思路

文章目录 select 函数fd_set 类型timeval 结构体select 函数的基本使用流程文件描述符就绪条件以select函数为中心实现多路转接的思路select 缺陷 select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); selec…

科普:什么是合同生命周期管理?

在当前,企业面临自身转型升级与行业数字建设的挑战,急需一种系统化的解决方案,帮助企业在自身运作方面实现降本增效,为拓展业务获得发展提供助力,而合同生命周期管理在其中就扮演着十分重要的角色。 一、合同生命周期…

解读《陆奇最新演讲实录—我的大模型世界观》

腾讯科技频道记者张小珺一篇《陆奇最新演讲实录—我的大模型世界观》刷爆朋友圈。文章知识点丰富、字里行间处处流淌着创业方法论和AI应用商机,含金量极高! PS:一家之言、不求苟同。如有不爽之处,欢迎来 找我。 腾讯新闻原文&am…

宝塔mongodb启动失败

宝塔mongodb启动失败 尝试以下步骤: 命令行启动看报错信息 /etc/init.d/mongodb start出现 error:14,查看 mongodb.log 提示 MongoDB –无法解除套接字文件 /tmp/mongodb-27017 的链接 查看 /tmp/mongodb-27017.sock,发现拥有…

STM32CubeIDE(CUBE-MX)----快速移植FreeRTOS实战

文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言 FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能&#xf…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进,分布式架构也得到蓬勃的发展,那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized就无法使用了,当然很多同学脱口而出的基于Redis的se…

[iOS学习笔记]浅谈RunLoop底层

RunLoop是什么? RunLoop是iOS开发中比较重要的知识点,它贯穿程序运行的整个过程。它是线程基础架构的一部分,是一种保障线程循环处理事件而不会退出的机制。同时也负责管理线程需要处理的事件,让线程有事儿时忙碌,没事…

网络基础_1

目录 网络基础 协议 协议分层 OSI七层模型 网络传输的基本流程 数据包的封装和分用 IP地址和MAC地址 网络基础 网络就是不同的计算机之间可以进行通信,前面我们学了同一台计算机之间通信,其中有进程间通信,前面学过的有管道&#xff…

Mendix UI页面布局以案说法

一、前言 试着回想最近一次与公司网站交互的情况,访问了多个页面,并且可能使用了某些功能。有可能基于这种互动,可以向某人介绍公司的一些主要功能。其中一些可能是更肤浅的东西,比如他们的标志是什么样子或他们的主要配色方案是…

第20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Threa…

[跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

Installation(下载代码-装环境) conda create -n bk-sdm python3.8 conda activate bk-sdm git clone https://github.com/Nota-NetsPresso/BK-SDM.git cd BK-SDM pip install -r requirements.txt Note on the torch versions weve used torch 1.13.1 for MS-COCO evaluation…

简单好用!日常写给 ChatGPT 的几个提示词技巧

ChatGPT 很强,但是有时候又显得很蠢,下面是使用 GPT4 的一个实例: 技巧一:三重冒号 """ 引用内容使用三重冒号 """,让 ChatGPT 清晰引用的内容: 技巧二:角色设定…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…
最新文章