【PyTorch][chapter 24][李宏毅深度学习][ CycleGAN]【理论】

news2024/12/27 13:08:41

摘要(Abstract):

              本篇主要参考论文分享一下CycleGAN.

              CycleGAN是实现不同图像之间风格的转换,并且样本数据无需配对即可实现转换

       图像到图像的转换是一类视觉和图形问题,其目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射(Pix2Pix)。然而,对于许多任务,无法得到配对训练数据训练数据集。CycleGAN提出了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。

       CycleGAN的目标是学习映射 G:X→Y,使得 生成图像G(X) 中的图像分布与使用对抗性损失的分布 Y 无法区分。由于这种映射高度受限,我们将其与逆映射 F:Y→X 结合起来,并引入循环一致性损失来推动F(G(X))≈X(反之亦然)。在不存在配对训练数据的几个任务上给出了定性结果:

      包括集合风格迁移、对象变形、季节迁移、照片增强等。与几种现有方法的定量比较证明了我们方法的优越性。风格迁移GAN 也能做,但是GAN问题是输入的图像x 和输出的图样 是一种无意义的配对,无法达到以下效果.


目录:

  1.     简介
  2.     相关工作 
  3.     原理阐述
  4.     实现
  5.     实验结果
  6.     限制与讨论

一 简介(Introduction)

        CycleGAN的创新点在于能够在源域和目标域之间,无须建立训练数据间一对一的映射,就可以实现这种迁移,更重要的是生成新的图片和原始图片是一种有意义的配对.

       这里重点介绍一下该图像转换领域的背景技术:

     1.1 Pix2Pix 问题

        

也是风格转换的模型,但是是基于paired 训练数据集的

如上图:
图(左)配对训练 :由训练示例组成,存在一一映射关系。
图(右)无配对训练,由源集和目标集组成,无明确的映射关系。

问题: 
           获得配对训练数据可能很困难而且很贵

  1.2 GAN 问题

  也是风格转换的模型,基于Unpaired 训练数据集的

训练集为一组图像域  X 和 Y 中的不同集合。
我们通过GAN网络训练映射使得输出,与Y域的图像 y 无法区分.

问题: 
       这样的风格转换并不能保证输入x和输出以有意义的配对方法 如上图,一匹马生成了两匹斑马,鉴别器识别依然会是True. 但是跟输入就没有映射关系.

 

  1.3 CycleGAN 方案

解决方案:  循环一致性约束cycle consistent,使得输入和输出有映射关系

我们已经有了一个生成器 G: X\rightarrow Y

增加一个循环 生成器:      F:Y\rightarrow X

通过增加 a cycle consistency loss 来保证 x 和输出\hat{y} 成为有意义的映射

\left\{\begin{matrix} F(G(x))=x\\ G(F(y))=y \end{matrix}\right.


二  相关工作(relate work)

      2.1 Generative Adversarial Networks (GANs)

            生成对抗网络 (GAN)在图像生成方面取得了令人印象深刻的成果,
例如:text2image 、image inpainting ,future prediction,在其它领域
例如视频,3D数据也获得了成功.

          GAN 的成功源于对抗性损失的理念(adversarial loss),这种损失迫使
生成的图像原则上是无法区分的来自真实照片.在图像生成任务中,adversarial loss 作用特别强大 .cycleGAN 也采用了的对抗性损失,使得翻译后的图像无法与目标中的图像区分开
领域。


 

   图(a): 模型包含两个映射函数(生成器)

                   G: X\rightarrow Y  

                   F: Y\rightarrow X

                  以及对应的鉴别器

                    D_Y,D_X

                  D_Y : 鉴别图像是否来自生成的图片,还是Y域的图像

                  D_X :  鉴别图像是否来自生成的图片,还是X域的图像

        为了进一步规范映射,我们引入了两个循环一致性损失,它们捕捉了这样的直觉:如果
我们从一个域转换到另一个域,然后再返回,我们应该到达我们开始的地方.

     图(b) 正向循环一致性损失(forward cycle-consistency loss)

                 x\rightarrow G(x)\rightarrow F(G(x))\approx x

                生成器G将X域的图像转换为Y域的图像\hat{y}=G(x), 再通过生成器F将Y域的图像\hat{y}

                 转换为X域的图像\hat{x}:   x,\hat{x} 要尽可能的相似

图(c) 反向循环一致性损失(backward cycle-consistency loss)

                   y\rightarrow F(y)\rightarrow G(F(y))\approx y 

论文中也提到了跟该领域的一些其它模型的区别

   2.2 Image-to-Image Translation

          图像到图像的转换想法至少可以追溯到 Hertzmann 等人的
图像类比: 基于在单个输入输出 pair的训练图像 ,用于学习图像之间的纹理 。

         更近一点的方法 在CNN上使用 input-output 训练集 去学习.
   我们的方案使用pix2pix 框架,去学习一个输入到输入图像的pair映射.

2.3 Unpaired Image-to-Image Translation

     其他几种方法也解决了不配对的情况,其目标是
关联两个数据域: X 和 Y 。
     Rosales等人提出一个贝叶斯框架,其中包括基于先验的
在基于patch-based 的马尔可夫随机场上计算源图像和风格图像之间的极大似然估计。
   CoGAN 和 cross-model 场景网络[1]使用权重共享策略来学习
跨域的通用表示。

 Liu等人将上述框架扩展为变分自动编码器  和生成式的组合对抗性网络。

   另一条并发线工作  鼓励输入和输出共享特定的“内容”特征,尽管它们可能有所不同
“风格”。这些方法还使用对抗性网络,强制输出接近输入的附加项在预定义的度量空间中,例如类标签空间,图像像素空间和图像特征空间。


    与上述方法不同 ,cycleGAN 的公式并不依赖于任何特定于任务的、预定义的相似性函数
输入和输出,我们也不假设输入和输出必须位于相同的低维嵌入中
空间。这使得我们的方法成为通用解决方案适用于许多视觉和图形任务。

2.3 Cycle Consistency

      这个思想是这篇论文的核心创新点
        使用传递性作为规范结构化数据的方法有着悠久的历史。
在视觉跟踪领域,强制执行简单的前后一致性几十年来一直是标准技巧 。
在语言领域,验证和改进翻译通过“反向翻译和协调”是一种由人工翻译人员使用技术。
最近,高阶循环一致性已被用于
structure from motion、3D shape matching 、cosegmentation,dense semantic alignment
depth estimation。其中,Zhou Godard等人 与我们的工作最相似,因为他们使用
循环一致性损失作为使用传递性进行监督的一种方式CNN 训练。
   在这项工作中,我们将介绍一个类似的损失推动 G 和 F 彼此保持一致

2.4 Neural Style Transfer
     神经风格转移

是另一种方式执行图像到图像的转换,
通过将一幅图像的内容与基于的另一幅图像(通常是一幅画)的风格合成.
原理:通过神经网络得到特征后,通过Gram matrix 作为损失函数
另一方面,我们的首要重点是学习两个图像集合之间的映射,而不是之间的映射
两个特定的图像,通过尝试捕捉对应关系高层外观结构之间。所以,
我们的方法可以应用于其他任务,例如绘画!照片、物体变形等,其中单个样品转移方法效果不佳。

   


 三  原理阐述(Formulation)

        我们的目标是学习 X域和Y 域之间的映射函数.

        给定训练样本集:  \begin{Bmatrix} x \end{Bmatrix}\in X,     \begin{Bmatrix} y \end{Bmatrix} \in Y

        数据的概率分布为:x \sim p_{data}(x),  y \sim p_{data}(y)

        如图(a) 我们的模型包含两个映射 G: X\rightarrow Y and Y\rightarrow X

        此外还包含两个鉴别器 D_X,D_Y.

 D_X目标:  鉴别图片是来自域\begin{Bmatrix} x \end{Bmatrix} 还是域\begin{Bmatrix} F(y) \end{Bmatrix}

 D_Y目标:  鉴别图片是来自域\begin{Bmatrix} y \end{Bmatrix} 还是域 \begin{Bmatrix} G(x) \end{Bmatrix}

我们的目标包含两种类型损失:

对抗性损失[adversarial losses]:

           用于学习目标图像的分布

循环一致性损失[cycle consistency losses]

          以防止学到的映射 G 和 F 彼此矛盾,保证 x 和输出\hat{y} 成为有意义的映射

   3.1  Adversarial Loss

        这个跟GAN的原理是一样的,优化的目标是 

     

     

       公式(1) G尝试生成类似Y域的样本G(x), D_Y旨在区分 真实的样本y和生成样本G(x)。

生成器G的目标是最小化该损失函数,  鉴别器D_Y的目标是最大化该损失函数.

        公式(2) 同理

   3.2  Cycle Consistency Loss

    GAN 能保证单个输入x_i映射到一类风格的图片,无法保证转换后的图像包含原图像的信息.

   为了保证x_i能映射到期望的y_i,我们引入了循环一致性(cycle-consistent)约束

cycle consistency loss:

在初步实验中,我们还尝试替换L_1F(G(x))之间具有对抗性损失的这个损失中的范数

和x之间,以及G(F(y))和y之间,但没有观察到提高了性能。

   3.3  Full Objective

      


\lambda 控制两个目标的相对重要性。 我们的目标是解决:

3.4 Identity Loss

        这是原论文中没有提到的,但是在代码中有提到.

   如上图:

               输入一张马通过生成器G(X) 期望得到斑马Y

               输入一张斑马Y 通过生成器G(Y),依然期望得到斑马Y


四  实现(Implementation)

   4.1 网络架构Network Architecture

            由两个GAN模型组成,GAN 里面的生成器鉴别器使用的是ResNet 结构.

在鉴别器中使用了PatchGAN(70X70的特征矩阵,代表Fake or True)

     4.2  PatchGAN

         gan鉴别器最终输出的是一个(0,1)的标量,代表概率。

      CycleGan 鉴别器输出的是一个(N*N)矩阵,矩阵中每个元素相同于提取的原图像的一类特征.

   

4.2  训练细节(Training details)

   (1) 损失函数的差异

          使用了least-squares loss ,而不是 negative log likelihood

  

(2) 生成图片的采样

       其次,为了减少模型振荡,我们遵循
Shrivastava 等人的策略  并更新判别器
使用生成图像的历史记录而不是
由最新生成器生成的。我们保留一个图像缓冲区,
保留之前生成的50张图像。
.

(3) 超参数设置


五  结果 Result 

   重点讲了跟其它模型在一些通用数据集上面的性能对比结果


六  限制和讨论(Limitations and Discussion) 

尽管我们的方法可以取得引人注目的结果
在许多情况下,结果并不好。Figure-17显示几种典型的失败.

如图中斑马转换生成器,把骑马的人一起转换了.


这种失败可能是由我们量身定制的生成器架构引起的。
该生成器主要针对外观变化有良好的表现.
处理更加多样化和极端的变换,尤其是几何变换
变化,是今后工作的重要课题。

一些故障案例是由训练数据集分布特性引起的。
例如,在horse->zebra 转换示例中(Figure17)(图 17,
右),因为我们的模型是在 horse & zebra ImageNet上训练的,
没有包含一个骑着斑马或者马的人的数据集。


我们还观察到paired training data 和 unparired training 结果之间存在挥之不去的差距
在有些场景下这种差距很难或者不可能接近。 比如  unparired training 例如,我们的
方法有时会排列树木和建筑物的标签在 photos->labels 任务的输出中.
解决这个歧义问题可能需要某种形式的弱语义监督训练。
整合弱或半监督数据可能会导致给更强大的translators,但仍然只占一小部分
完全监督系统的注释成本。


 尽管如此,在许多情况下,完全不配对的数据是资源丰富,应该充分利用。
环境

当然论文中也列举了一些成功的案例

https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py

ResNet18详细原理(含tensorflow版源码)_resnet18网络结构-CSDN博客

风格迁移——Cycle对抗生成网络(CycleGAN)原理介绍及实践 - 知乎

论文地址:https://arxiv.org/abs/1703.10593

 官方代码: GitCode - 开发者的代码家园

论文解读视频1:

精读CycleGAN论文-拍案叫绝的非配对图像风格迁移_哔哩哔哩_bilibili

3小时带你吃透!基于CycleGan开源项目实战图像合成,这是我见过最简单的【生成对抗网络】教程!!神经网络与深度学习|人工智能_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务高级篇(四):多级缓存:Nginx本地缓存 --- Redis缓存 --- 进程缓存

文章目录 一、多级缓存概念二、准备工作【导入案例,并搭建Nginx反向代理】2.1 导入商品案例2.1.1 安装MySQL2.1.2 导入SQL2.1.3 导入Demo工程2.1.4 启动2.1.5 导入商品查询页面 三、JVM进程缓存【第三级缓存】3.1 本地进程缓存与分布式缓存的区别3.2 本地进程缓存&a…

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇

接着上一篇《厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇》继续总结一下厨余垃圾处理设备智能软硬件统的原理。所有的软硬件系统全是自己一人独自开发,看法和角度难免有局限性。希望抛砖引玉,将该智能软硬件系统分享给更多有类…

字节算法岗二面,凉凉。。。

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后,总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的,反正能用就行。 安装官方驱动的办法其实很简单,现在独立显卡一共就那么几家,最常见的显卡就是Nvidi…

【Maven】高效入门

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图(了解) 二、Maven安装和配置1. Maven…

iOS-UIFont 实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS-UIFont 实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

移动硬盘盒结合PD技术为电脑供电:一种便携高效的供电新方案

在数字化时代,电脑已经成为我们生活和工作中不可或缺的工具。而在电脑的使用过程中,供电问题一直是我们需要关注的重要方面。近年来,随着技术的不断进步,移动硬盘盒子与PD(Power Delivery)技术的结合&#…

技术周刊 117 期:Visual Copilot、INP、Kimi 支持 200 万字上下文、Grok 开源、Figure 01、Open Sora 开源

美味值:🌟🌟🌟🌟🌟 口味:金骏眉 大家好,我是童欧巴。老规矩,咱们先来看技术资讯。 技术资讯 前端 VitePress (早就应该) 1.0 发布MistCSS,只使用 CSS 来…

QT环境搭建

学习QT 一、QT环境搭建二、QT的SDK下载三、认识QT SDK 中自带的一些程序 一、QT环境搭建 QT开发环境,需要安装三个部分。 c编译器(gcc、cl.exe……不是visual studio)QT SDK(QT SDK里面已经内置了C编译器;SDK就是软件…

【网络爬虫】(1) 网络请求,urllib库介绍

各位同学好,今天开始和各位分享一下python网络爬虫技巧,从基本的函数开始,到项目实战。那我们开始吧。 1. 基本概念 这里简单介绍一下后续学习中需要掌握的概念。 (1)http 和 https 协议。http是超文本传输&#xf…

【考研数学二】线性代数重点笔记

目录 第一章 行列式 1.1 行列式的几何意义 1.2 什么是线性相关,线性无关 1.3 行列式几何意义 1.4 行列式求和 1.5 行列式其他性质 1.6 余子式 1.7 对角线行列式 1.8 分块行列式 1.9 范德蒙德行列式 1.10 爪形行列式的计算 第二章 矩阵 2.1 初识矩阵 2…

基于nodejs+vue企业人才引进服务平台python-flask-django-php

本文通过采用MySQL数据库以及nodejs语言、express框架,结合国内线上管理现状,开发了一个基于node的企业人才引进服务平台。系统分为多个功能模块:用户信息、企业信息、招聘信息、应聘信息等。通过系统测试,本系统实现了系统设计目…

ffmpeg拉流并解码

流程 注意事项 版本不同导致的api差异资源安全释放

C# 将 Word 转文本存储到数据库并进行管理

目录 前言 1. 创建数据库表格 2. 安装必需的 NuGet 包 3. 转换 Word 文档为文本 4. 将文本存储到数据库 5. 完整示例 前言 C# 是一种通用的编程语言,可以用于开发各种类型的应用程序,包括处理文本和数据库管理。在这篇文章中,我将向您…

10.2024

使用选择排序将{2,9,5,0,1,3,6,8}排序 代码&#xff1a; public class 第十题 {public static void main(String[] args) {int a[]{2,9,5,0,1,3,6,8};int begin0;int enda.length-1;while (begin<end){int mina[begin];int tbegin;for (int ibegin;i<end;i){if(min>…

瑞吉外卖实战学习--完善登录功能

完善登录功能 1、创建自定义过滤器LoginCheckFiler1.1通过WebFilter创建过滤器1.2 验证是否可以拦截请求1.3 代码 2、在启动类加入注解ServletComponentScan 用来扫描过滤器触发所有的过滤器ServletComponentScan 3、完善过滤器的处理逻辑3.1判断是否需要是要放行的请求3.2判断…

基于nodejs+vue考研互助交流系统python-flask-django-php

同时还能为用户提供一个方便实用的考研互助交流系统&#xff0c;使得用户能够及时地找到合适自己的考研信息。管理员在使用本系统时&#xff0c;可以通过后台管理员界面管理用户的信息&#xff0c;也可以发布系统公告&#xff0c;让用户及时了解考研信息。这样&#xff0c;用户…

javaSwing超级玛丽游戏

一、摘要 摘要 近年来&#xff0c;Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序…

EPSON推出RX8804CE为工业机器提供稳定且精准的时钟信号

工业机器是智能工厂的关键主体组成部分&#xff0c;工业机器的时钟稳定性和精确性直接关系到整个系统的生产高效性和稳定性。EPSON推出了面向工业机器、手持设备、室外机等领域的实时时钟模块RX8804CE&#xff0c;可选择32.768 KHz、1024 Hz、1 Hz三种频率输出&#xff0c;温度…

Android视角看鸿蒙第九课-鸿蒙的布局

鸿蒙的四大布局 导读 前面八篇文章描述了鸿蒙app的配置文件&#xff0c;关于版本号&#xff0c;开发版本&#xff0c;桌面图标等等配置方式。从这一篇文章开始学习鸿蒙的UI使用方式。 前面我们学习到鸿蒙有ability和page的区分&#xff0c;ability类似Activity但又不完全一样…