使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上

news2024/11/18 13:56:08

阅读提示:本篇文章的代码为在普通GAN代码上实现人脸图片生成的修改,文章内容仅包含修改内容,全部代码讲解需结合下面的文章阅读。
相关资料链接为:使用PyTorch构建GAN生成对抗
本次训练代码使用了本地GPU计算。

1 CelebADataset类的修改

原则上这一类不需要修改,但为了提升模型运行速度,可以对图片周边适当裁剪,保留五官等重要内容。

# 设置裁剪功能(辅助函数)
def crop_centre(img, new_width, new_height):
    height, width, _ = img.shape
    startx = width//2 - new_width//2
    starty = height//2 - new_height//2
    return img[  starty:starty + new_height, startx:startx + new_width, :]

上面这个函数可以用来从图像的中心裁剪。该函数接收三个参数:

  • img:原始图像,需要是 numpy 数组形式
  • new_width:裁剪后图像的新宽度
  • new_height:裁剪后图像的新高度

该函数通过计算原始图像的中心位置,以及所需裁剪图像的起始位置,从而在 numpy 数组上实现裁剪。最后,函数返回裁剪后的图像。
有了这个函数后,可以在类中预置对图像的裁剪功能,需要对类的__getitem__方法和plot_image方法进行优化。

class CelebADataset(Dataset):

    def __getitem__(self, index):
        if index >= len(self.dataset):
            raise IndexError()
        img = numpy.array(self.dataset[str(index) + '.jpg'])
        img = crop_centre(img, 128, 128)
        return torch.cuda.FloatTensor(img).permute(2,0,1).view(1,3,128,128) / 255.0

    def plot_image(self, index):
        img = numpy.array(self.dataset[str(index)+'.jpg'])
        img = crop_centre(img, 128, 128)
        plt.imshow(img, interpolation='nearest')

2 鉴别器类的修改

鉴别器的网络结构是卷积GAN需要重点修改的地方。此次的卷积GAN设置了3个卷积层和1个全连接层。

class Discriminator(nn.Module):

    def __init__(self):	
    
		self.model = nn.Sequential(
		    
		    nn.Conv2d(3, 256, kernel_size=8, stride=2),
		    nn.BatchNorm2d(256),
		    nn.LeakyReLU(0.2),
		
		    nn.Conv2d(256, 256, kernel_size=8, stride=2),
		    nn.BatchNorm2d(256),
		    nn.LeakyReLU(0.2),
		
		    nn.Conv2d(256, 3, kernel_size=8, stride=2),
		    nn.LeakyReLU(0.2),
		
		    View(3*10*10),
		    nn.Linear(3*10*10, 1),
		    nn.Sigmoid()
	)

经过裁剪的图片的小为128*128;
第一个卷积层使用了256个卷积核,每个卷积核大小为8,步长为2。这一卷积层将会输出256个特征图,特征图的大小为 128 − 8 2 + 1 \frac{128-8}{2}+1 21288+1 ,即61*61;
第二个卷积层使用了256个卷积核,每个卷积核大小为8,步长为2。这一卷积层将会输出256个特征图,特征图的大小为 61 − 8 2 + 1 \frac{61-8}{2}+1 2618+1 ,即27*27;
第二个卷积层使用了3个卷积核,每个卷积核大小为8,步长为2。这一卷积层将会输出3个特征图,特征图的大小为 27 − 8 2 + 1 \frac{27-8}{2}+1 2278+1 ,即10*10;
经过了3层的卷积后,图片的大小已经降到了(3*10*10)。

3 鉴别器测试

修改完鉴别器之后,可以使用真实图像和随即图像,初步判断鉴别器的能力与测试这部分修改后的代码是否存在BUG。

# 鉴别器类建立
D = Discriminator()
D.to(device)

# 测试鉴别器
for image_data_tensor in celeba_dataset:
    # real data
    D.train(image_data_tensor, torch.cuda.FloatTensor([1.0]))
    # fake data
    D.train(generate_random_image((1,3,128,128)), torch.cuda.FloatTensor([0.0]))
    pass

同样,可以查看损失函数的变化情况并使用测试集进行测试。

for image_data_tensor in celeba_dataset:
    # real data
    D.train(image_data_tensor, torch.cuda.FloatTensor([1.0]))
    # fake data
    D.train(generate_random_image((1,3,128,128)), torch.cuda.FloatTensor([0.0]))
    pass

D.plot_progress()

for i in range(4):
  image_data_tensor = celeba_dataset[random.randint(0,20000)]
  print( D.forward( image_data_tensor ).item() )
  pass

for i in range(4):
  print( D.forward( generate_random_image((1,3,128,128))).item() )
  pass

在这里插入图片描述
可以看出,鉴别器对于数据的判断非常有信息。

之后还需对生成器进行同步修改,并使用代码生成图像,这部分内容将放在下篇。

此部分的完整代码可在文末留言申请或在博主的资源区自行下载。

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

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

相关文章

2023.1.23-1.29 AI行业周刊(第134期):春节回家乡的感受

春节的假期,时间过得很快。 年前回家在路上的时候,就考虑到过年时间短暂,但是当大年初六和家乡别离,和大姐二姐们再见的时候,心中还是充满了不舍。 2022年初回家过年的画面还印在脑海中,和家乡相聚的频率…

【自然语言处理】文本分析:非结构化信息分析科学与应用导论(主题建模)

文本分析:非结构化信息分析科学与应用导论(主题建模)1.介绍 文本聚类可以将数据(这里即指文本)按照一定规则划分为不同的群组,理想情况下可以从聚类结果中发现一些有趣的模式。不同聚类方法的一致性意义和…

QT 使用线程完成串口数据的读写,并把数据传递给主线程

1、之前做串口通信的时候直接在主线程 用了api实现,这种只做个串口助手是OK的,但是在大型项目中这样做会占用主线程的时间,数据量大的时候不确定有多卡顿。 2、看了网上很多资料,没一个写的是对的,主要错在 QSerialPo…

Linux-用户及文件权限管理

目录1、Linux 用户管理1.1 查看用户1.2 创建用户1.3 用户组1.4 删除用户和用户组2、Linux文件权限2.1 查看文件权限2.2 变更文件所有者2.3 修改文件权限3、补充1、Linux 用户管理 Linux可以实现多用户登录,A和B用户可以同时登录同一台主机,虽然他们的文…

IT帮助台如何帮助企业进行人力资源管理

在大多数组织中,HR 服务管理流程从内部聊天或电话开始,以 Word 文档和 Excel 工作表结束。以这种老式的方式管理所有这些信息变得非常乏味,因为 组织成长。大多数组织,即使有人力资源管理系统,也使用过时的系统&#x…

2-3-内存泄漏和内存溢出

1、内存泄漏和内存溢出区别 内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 内存泄漏是指你向系统申请分配内存进行使用(new),可是…

vue指令

文章目录1.vue基础1.el挂载点2.data数据对象2.vue指令1.v-text2.v-html3.v-on4.v-show5.v-if6.v-bind7.v-for8.v-model1.vue基础 1.el挂载点 在el命中的内部可以无限嵌套el绑定的元素,可以支持id选择器,class选择器,标签选择器。并且双标签…

element - - - - - Form表单的resetFields()方法没有生效?

万事如伊 大吉大利 Form表单的resetFields方法没有生效?1. 场景描述2. 问题分析3. 解决办法关于element组件,相信各位同学都不陌生。其各个组件不可谓不好用,能够快速的帮助开发人员进行排版布局&实现效果。 但是总会遇到一些不可避免的坑。 1. 场…

win10中pycharm使用django问题总结

1.问题一出现问题:ERROR: Could not find a version that satisfies the requirement XXX解决方法直接选用pip源并且信任它的来源就可以解决这种问题。pip install django版本号 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 这里将pip源换成…

公司招了个在腾讯拿35K的人,让我见识到什么才叫测试天花板···

一进公司,看见门外有几个带着行李在外面等待的人,应该就是来入职的,果不其然,在进公司后,召开了新人见面会,让他们做了自我介绍和职业规划以及部门,令我印象最深刻的就是一个刚刚从腾讯离职出来…

【C++修炼之路】类和对象(上)—— 入门篇

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录一、前言二、初识面向过程和面向对象三、类的引入和定义四、类的访问限定符及封装1、访问限定符2、封装五、类的作用域六、类的实…

Day03-无处不在的数据

文章目录Day03-无处不在的数据无处不在的数据分析案例1:论文选题案例2:产品面试案例3:工作汇报用户的依赖性案例4:选票逻辑几乎所有岗位都需要数据分析Day03-无处不在的数据 昨天,我们为你打开了数据分析的大门&#…

vue生命周期钩子函数

1 vue的生命周期的钩子函数有哪些 beforeCreate :在调用beforeCreate时,已完成的内容是创建了一个空的Vue实例对象,这个对象上有默认的生命周期函数和默认的事件created :此阶段时,数据配置结束。包括数据侦听、计算属…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第2天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有74天

🏆🏆🏆🏆🏆🏆🏆 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录&a…

【JavaScript速成之路】JavaScript变量

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言1,JavaScript变量1.1,变量的含义1.2,变量…

C语言指针变量的定义和使用

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符…

微盟全链路压测:如何帮助电商业务实现 10 倍性能提升?

一分钟精华速览 全链路压测之所以被誉为电商大促备战的 “核武器” ,是因为它基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,能真实反映系统的状况,对系统风险和瓶颈真正做到心中有数。 …

Flutter 学习 - Dart 语言基础

文章目录前言一、Dart 概述Dart 重要的概念二、变量与基本数据类型三、函数四、运算符五、流程控制语句六、异常处理七、面向对象构造函数继承类抽象类枚举类型八、泛型九、库的使用引用库指定库前缀引用库的一部分总结技巧1. 安全调用2. 设置默认值3. 简化判断前言 Dart 作为…

【RabbitMQ】快速入门学习MQ

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比: 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 1.初识MQ 1.1.同步和异步通讯…

最全面的SpringBoot教程(二)——SpringBoot配置文件

前言 本文为SpringBoot配置文件相关内容介绍,下边将对配置文件分类,yaml基本语法,yaml数据格式,获取数据,profile-运维,项目内部配置文件加载顺序,项目外部配置文件加载顺序等进行详尽介绍~ &a…