【深度学习】pix2pix GAN理论及代码实现与理解

news2024/11/23 22:16:47

灵感:最近也是在看关于GAN方面的代码,也是看到了很多篇博客,都写的挺好的,让我醍醐灌顶,理解了GAN的原理以及代码实现。所以写一下来记载一下,最后有其他好文章的链接。

灵感来源:pix2pixGAN理论以及代码实现

目录

1.什么是pix2pix GAN

2.pix2pixGAN生成器的设计

 3.pix2pixGAN判别器的设计

4.损失函数

5.代码实现 

6.参考文献

1.什么是pix2pix GAN

它实际上就是一个CGAN,条件GAN,不过是改变了一般GAN的辨别器的输出。其他的都是输出一个概率,而pix2pixGAN或者也可以是patchgan,它的最终输出是一个矩阵,每一个块代表一个patch的概率而已。关于patch这一块的知识可以去其他地方补一下,文末也有入口。

 图片x作为此cGAN的条件,需要输入到G和D中。G的输入是x(x是需要转换的图片),输出是生成的图片G(x)。D则需要分辨出(x,G(x))和(x,y)

pix2pixGAN主要用于图像之间的转换,又称图像翻译。

2.pix2pixGAN生成器的设计

对于图像翻译任务来说,输入和输出之间会共享很多信息。比如轮廓信息是共享的。如何解决共享问题?需要我们从损失函数的设计当中去思考。

如果使用普通的卷积神经网络,那么会导致每一层都承载保存着所有的信息。这样神经网络很容易出错(容易丢失一些信息)

所以,我们使用UNet模型作为生成器

 3.pix2pixGAN判别器的设计

D要输入成对的图像。这类似于cGAN,如果G(x)和x是对应的,对于生成器来说希望判别为1;

如果G(x)和x不是对应的,对于生成器来说希望判别器判别为0

pix2pixGAN中的D被论文中被实现为patch_D.所谓patch,是指无论生成的图片有多大,将其切分为多个固定大小的patch输入进D去判断。如上图所示。

这样设计的好处是:D的输入变小,计算量小,训练速度快

4.损失函数

D网络损失函数:输入真实的成对图像希望判定为1;输入生成图像与原图希望判定为0

G网络损失函数:输入生成图像与原图像希望判定为1

 对于图像翻译任务而言,G的输入和输出之间其实共享了很多信息。因而为了保证输入图像和输出图像之间的相似度,还加入了L1loss,公式如下所示:

 

5.代码实现 

代码实现的话有官方以及别人的实现,但是我有点不懂。然后看到这个链接的代码才懂。

全部代码在这:pix2pixGAN理论以及代码实现

我作为笔记记录,写一下我觉得关键的代码理解。

for step,(annos,imgs) in enumerate(dataloader):
        imgs = imgs.to(device)   #imgs 输入的图像
        annos = annos.to(device) #标签,真实的应该生成的图片
        #定义判别器的损失计算以及优化的过程
        d_optimizer.zero_grad() 
        disc_real_output = dis(annos,imgs)      #输入真实成对图片
        d_real_loss = loss_fn(disc_real_output,torch.ones_like(disc_real_output,
                                                             device=device)) 
        #上面是为了将我们输入的真实图像对都标为1,希望他接近1,因为真实嘛
        d_real_loss.backward()   #求梯度
         
        gen_output = gen(annos)  #通过输入图像生成图片
        disc_gen_output = dis(annos,gen_output.detach()) #将我们输入的和生成的图片输入辨别器
        d_fack_loss = loss_fn(disc_gen_output,torch.zeros_like(disc_gen_output,
                                                              device=device))  #辨别器希望生成的和我们输入的图像最终的判断为0,也就是假的嘛
        d_fack_loss.backward()
        
        disc_loss = d_real_loss+d_fack_loss#判别器的损失计算,由两个之和
        d_optimizer.step() #梯度更新
        
        #定义生成器的损失计算以及优化的过程
        g_optimizer.zero_grad()
        disc_gen_out = dis(annos,gen_output) #辨别器辨别输入图像和生成图像的匹配度
        gen_loss_crossentropyloss = loss_fn(disc_gen_out,
                                            torch.ones_like(disc_gen_out,
                                                              device=device)) #生成器和辨别器相反,他希望生成的图像和输入的图像匹配为真实,也就是造假嘛
        gen_l1_loss = torch.mean(torch.abs(gen_output-imgs))  #L1损失
        gen_loss = gen_loss_crossentropyloss +LAMBDA*gen_l1_loss
        gen_loss.backward() #反向传播
        g_optimizer.step() #优化
        
        #累计每一个批次的loss
        with torch.no_grad():
            D_epoch_loss +=disc_loss.item()
            G_epoch_loss +=gen_loss.item()

上面用到的loss_fn是BCE损失。因为我们的辨别器输出值为概率嘛,0到1,所以算得上是二分类,可以使用BCE。

6.参考文献

     GAN系列之 pix2pixGAN 网络原理介绍以及论文解读icon-default.png?t=M85Bhttps://blog.csdn.net/m0_62128864/article/details/124026977

一文看懂PatchGAN_明月几时有.的博客-CSDN博客_patchgan最近看到PatchGAN很是好奇原理是什么,发现网上很多介绍的并不清楚.故墙外墙内来回几次,大概是清楚了.PatchGAN其实指的是GAN的判别器,将判别器换成了全卷积网络.这么说并不严谨,PatchGAN和普通GAN判别器是有区别的,普通的GAN判别器是将输入映射成一个实数,即输入样本为真样本的概率.PatchGAN将输入映射为NxN的patch(矩阵)X,XijX_{ij}Xij​的值代表...https://blog.csdn.net/weixin_35576881/article/details/88058040

pix2pix算法笔记_AI之路的博客-CSDN博客_pix2pix算法论文:Image-to-Image Translation with Conditional Adversarial Networks论文链接:https://arxiv.org/abs/1611.07004代码链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix这篇论文发表在CVPR2017,简称pix2pix,是将GAN应用...https://blog.csdn.net/u014380165/article/details/98453672

Pix2Pix-基于GAN的图像翻译_张雨石的博客-CSDN博客_pix2pix算法语言翻译是大家都知道的应用。但图像作为一种交流媒介,也有很多种表达方式,比如灰度图、彩色图、梯度图甚至人的各种标记等。在这些图像之间的转换称之为图像翻译,是一个图像生成任务。多年来,这些任务都需要用不同的模型去生成。在GAN出现之后,这些任务一下子都可以用同一种框架来解决。这个算法的名称叫做Pix2Pix,基于对抗神经网络实现。https://blog.csdn.net/stdcoutzyx/article/details/78820728

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

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

相关文章

干货 | 提前在开发阶段暴露代码问题,携程Alchemy代码质量平台

作者简介Lyan,携程资深后端开发工程师,负责自动化测试框架及平台类工具开发,关注Devops、研发效能领域。一、背景随着敏捷开发,DevOps开发模式的流行,代码质量分析作为研发质量保证体系的重要组成部分,不仅…

LVS负载均衡群集--NAT

目录 前言 一、对于lvs负载均衡的了解 1、群集(集群)的概述 1.1 出现的问题 1.2 解决高并发的方法 2、群集的类型 2.1 负载均衡群集 2.2 高可用群集(冗余 单点故障) 2.3 高性能运算群集(分布式) …

【C++面向对象程序设计】CH6 多态性与虚函数

目录 一、多态性的概念 二、一个典型的例子——【例6.1】 1.声明基类point类 2.声明派生类circle ​编辑 3.声明circle的派生类cylinder 三、虚函数 1.虚函数的作用 (1)派生类的对象可以给基类的对象赋值 (2)派生类的对象…

mmdetection3d SUN RGB-D数据集预处理

SUN RGB-D是普林斯顿大学发布的一种关于室内场景理解的数据集,共包含了10335个样本,其中训练样本和验证测试样本数量分别为5285和5050。每个样本包含了彩色图像(RGB)和深度(D)信息,并且分别进行…

智能微型断路器在道路照明、园区照明、隧道照明中的应用-安科瑞 时丽花

智能微型断路器应用场景 九小场所 商场、超市等购物场所 养老院、福利院、孤儿院等社会福利机构 图书馆、博物馆、科技馆、文化馆等文化活动中心 车站、轨道交通等交通枢纽 易燃易爆仓库、木材加工、纺织、喷涂、制药等企业 酒吧,网吧等娱乐场所 幼儿园、小…

B站视频弹幕不挡住人脸效果

前言 有天在B站看二舅的视频时,密密麻麻的弹幕居然没有二舅的人脸,很好奇是怎么做到的,于是决定一探究竟。 高端的效果,往往只需要采用最朴素的实现方式,琢磨了好一会儿,打开了F12,豁然开朗。…

Quartz深度实战

概述 Java语言中最正统的任务调度框架,几乎是首选。后来和Spring Schedule平分秋色;再后来会被一些轻量级的分布式任务调度平台,如XXL-Job取代。另外近几年Quartz的维护和发布几乎停滞,但这并不意味着Quartz被淘汰,还…

【干货】微信私域运营打法和案例拆解(附78页pdf下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点知识图谱在美团推荐场景中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf(附下载链接)机器学习在B站推荐系统中的应用实践…

【吴恩达机器学习笔记】七、神经网络

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…

数据库设计三范式

数据库设计三范式 范式是数据库设计时遵循的一种规范,不同的规范需要遵循不同的范式,只有充分遵循了数据库设计的范式,才能设计开发出冗余较小、高效、结构合理的数据库。 通常,我们在设计数据库的时候会要求遵循三范式。 第一…

《强化学习周刊》第69期:ICLR2023强化学习论文推荐、MIT实现自动调整内在奖励的强化学习...

No.69智源社区强化学习组强化学习研究观点资源活动周刊订阅告诉大家一个好消息,《强化学习周刊》已经开启“订阅功能”,以后我们会向您自动推送最新版的《强化学习周刊》。订阅方法:方式1:扫描下面二维码,进入《强化学…

使用Python PySNMP模块获取设备指标

一、PySNMP模块介绍: PySNMP 是一个跨平台的纯Python SNMP 引擎实现。它具有功能齐全的 SNMP 引擎,能够充当代理/管理器/代理角色,通过 IPv4/IPv6 和其他网络传输传输 SNMP v1/v2c/v3 协议版本。目前,使用较多的是SNMP v3和v2c版…

Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记

1 摘要 传统的基于文本行的文档去扭曲方法在处理复杂布局和/或非常少的文本行时会出现问题。当图像中没有对齐的文本行时,这通常意味着照片、图形和/或表格占据了输入的大部分。因此,对于健壮的文档去扭曲变形,我们建议除了对齐的文本行之外…

Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)

本来想着没有all pass就不写题解了,但在赛后对最后一题纠结了好久,然后发现是个类似脑筋急转弯的题,自己与正确答案只差一层纸,实在有点不吐不快。另外本期考了经典的背包问题的模板题,也值得记录下来,加深…

全志科技A40i国产开发板——性能参数综合测试

本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI、4G(选配)模块,同时引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音视频多媒…

宿主机与开发板网络共享

宿主机网络共享 一、关键步骤 11. 网络共享简介 目标:宿主机可以用ssh连接开发板,开发板可以上网。 步骤:宿主机与目标机用网线直连,宿主机采用IP共享的方式连接开发板; 配置项IP开发板IP192.168.0.232宿主机以太网I…

Java 序列化原理

我的网站 | 我的博客 | 序列化解析工具 概念 Java为我们提供了一种默认的对象序列化机制,通过这种机制可以将一个实例对象写入到IO流中,当然这种IO流可以是文件流、网络流或者其他什么流。 代码的写法 ObjectOutputStream 对象输出流,用…

2022新一代设备维修管理系统助力企业降本增效

设备的维修是指企业或者设备密集型单位为了保持、恢复并提升设备使用寿命而定期对设备进行状态的维护,备件的更换,发生故障后的维修和恢复,从而让设备保证良好的运营状态,提升设备的可利用性并保证产能和设备安全。 大型企业在设…

C++11标准模板(STL)- 算法(std::merge)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 归并两个已排序的范围 st…

关于Mysql使用left join写查询语句执行很慢的问题解决

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 表结构/索引展示 &#xff08;1&#xff09;表结构 &#xff08;2&#xff09;各表索引情况 2. 存在性能问题的SQL语句 3. 解决思路 &#xff08;1&#xff09;执行计划思路调优 &#xff08;…