Pytorch和DCGAN生成肖像画(上)

简介: Pytorch和DCGAN生成肖像画

我对使用GAN进行艺术创作的想法很感兴趣,因此我开始研究人们设法创造的东西,并且遇到了Mike Tyka的工作,他是Google的研究人员,我发现他对此非常着迷,这促使我开始创建自己的GAN项目来从事艺术创作。

当我开始这个项目时,我并没有意识到训练GAN模型有多困难,并且花费了很多试验和错误才能得出令人满意的结果。因此,在本文中,我将经历构建DCGAN模型的历程,包括我所面临的挑战以及为达到最终模型所做的工作。

虽然并不完美,但结果却是不错的,因为我们仅使用本文提出的具有随机图像增强和特征匹配功能的无监督DCGAN。

640.png

我不会在更高的层次上讨论GANs,因为我认为有很多文章和视频都涉及到这一点,相反,我将只关注技术细节和我的整个过程。项目的完整代码在本文的最后提供。

数据集和预处理

我使用的维基艺术数据集可以在这里下载(https://www.kaggle.com/ipythonx/wikiart-gangogh-creating-art-gan)。这里不需要下载所有的东西,因为需要做的时肖像画,所以我只下载了portrait文件夹,,但你可以随意尝试其他东西。

接下来,我编写了一个python脚本preprocessing.py,以获取数据集以进行训练。我们可以将原始图像的尺寸调整为所需的64x64尺寸,但是如果您查看数据集,您会发现它可能会出错,因为就不希望有人像被压扁,或者他们的手被剪成正方形。理想情况下,我们希望正方形图像的中间带有人脸,所以我使用的“face-recognition”库,可以通过pip进行安装,并使用它遍历每张图像,找到人脸坐标,将其偏移指定的数量 并保存它们。

#cropfaceswithoffsetdefcrop_faces(in_path, out_path, offset):
files=os.listdir(in_path)
forindex, fileinenumerate(files):
try:
img=Image.open(in_path+file)
img_arr=np.array(img)
top, right, bottom, left=face_recognition.face_locations(img_arr)[0]
face_image=img_arr[top-offset:bottom+offset, left-offset:right+offset]
img=Image.fromarray(face_image)
img.save(out_path+str(index)+'.jpg')
except:
pass

然后应用resize()方法,尽管人脸识别工具通常会创建方形或几乎为方形的图像,所以简单地跳过这一部分,只使用pytorch的resize方法不会有太大区别。PIL的调整大小方法与下面定义的方法的区别在于,它会调整图像的大小并对其进行裁剪,以使它们适合指定尺寸的正方形图像,从而避免挤压。但是无论如何,我已经为其他项目构建了此方法,因此不妨使用它。

defresize(in_path, out_path, dim, aspect_ratio=True):
ifaspect_ratio:
files=os.listdir(path)
forindex, fileinenumerate(files):
img=Image.open(path+file)
ifimg.size[0]<img.size[1]:
ratio=dim/float(img.size[0])
new_x=dimnew_y=int(ratio*img.size[1])
img=img.resize((new_x, new_y))
val=int((new_y-dim)/2.0)
ltrb= (0,val,img.size[0],dim+val)
img=img.crop(ltrb)
elifimg.size[0]>img.size[1]:
ratio=dim/float(img.size[1])
new_x=int(ratio*img.size[0])
new_y=dimimg=img.resize((new_x, new_y))
val=int((new_x-dim)/2.0)
ltrb= (val,0,dim+val,img.size[1])
#croppingimg=img.crop(ltrb)
#ifimageissquareelse:
img=img.resize((dim, dim))
img=img.convert('RGB')
img.save(out_path+str(index)+'.jpg')
else:
files=os.listdir(path)
forindex, fileinenumerate(files):
try:
img=Image.open(path+file)
new_img=img.resize((dim,dim))
new_img.save(out_path+'_imgs/'+str(index)+'.jpg')                
except:
pass

下载数据集后,创建另一个文件夹,在其中输出调整大小后的图像。然后只需运行上面的方法,指定原始数据集的路径,刚刚创建的输出文件夹以及所需的维度(64)

最后,我只是运行了rename_images方法以按数字顺序重命名文件,这是不必要的,但只是为了使所有内容变得有条理

#renameimagesnumerically0.jpg, 1.jpg, 2.jpg...
defrename_images(path):
files=os.listdir(path)
forindex, fileinenumerate(files):
os.rename(os.path.join(path, file), os.path.join(path, ''.join([str(index), '.jpg'])))

DCGAN模型

鉴别器

这是我们项目的核心。我创建了一个新文件“ models.py”来保存我们的鉴别器,生成器和一种初始化权重的方法。下图表示具有功能匹配的DCGAN鉴别器架构。

640.png

在最初的DCGAN论文中,定义了一系列具有BatchNorm和LeakyReLU的2D卷积层,以从图像中提取特征,并最终输出单个值来预测输入的图像是假的还是真实的。但是,使用此改进的版本,最终的卷积层之后是完整连接的线性层,因为生成器将使用该层来尝试匹配。

新目标不是直接使鉴别器的输出最大化,而是要求生成器生成与实际数据的统计信息匹配的数据,在这种情况下,我们仅使用鉴别器来指定我们认为值得匹配的统计信息。具体来说,我们训练生成器以使其与鉴别器中间层上的要素的期望值匹配。

classDiscriminator(nn.Module):
def__init__(self, channels_img, features_d):
super(Discriminator, self).__init__()
self.disc=nn.Sequential(
#input: Nxchannels_imgx64x64nn.Conv2d(channels_img, features_d, kernel_size=4, stride=2, padding=1),
nn.LeakyReLU(0.2),
#_block(in_channels, out_channels, kernel_size, stride, padding)
self._block(features_d, features_d*2, 4, 2, 1),
self._block(features_d*2, features_d*4, 4, 2, 1),
self._block(features_d*4, features_d*8, 4, 2, 1),
#Afterall_blockimgoutputis4x4 (Conv2dbelowmakesinto1x1)
        )
self.output=nn.Sequential(
nn.Sigmoid(),
        )
def_block(self, in_channels, out_channels, kernel_size, stride, padding):
returnnn.Sequential(
nn.Conv2d(
in_channels, out_channels, kernel_size, stride, padding, bias=False,
            ),
nn.InstanceNorm2d(out_channels, affine=True),
nn.LeakyReLU(0.2),
        )
defforward(self, x, feature_matching=False):
features=self.disc(x)
output=self.output(features)
iffeature_matching:
returnfeatures.view(-1, 512*4*4), outputelse:
returnoutput

在这种情况下,特征是张量形状时(batch_size,1024),一旦开始训练,feature_matching参数的使用将变得更加清晰。但是为了快速运行此代码,我们定义了一个辅助函数_block(),它添加了DCGAN论文中建议的一层,输入通过顺序模型作为(batch_size,3,64,64)张量并卷积为 一个具有512 * 4 * 4个特征的向量,之后我仅使用了S型激活函数就为假图像返回0,为实数返回1。甚至使用模型,减去图层,观察输出的尺寸等。我始终在我的项目中保留一个park.py文件以进行打印 变量并测试我不确定的任何内容。

目录
相关文章
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch实现DCGAN(生成对抗网络)生成新的假名人照片实战(附源码和数据集)
PyTorch实现DCGAN(生成对抗网络)生成新的假名人照片实战(附源码和数据集)
211 1
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch和DCGAN生成肖像画(下)
Pytorch和DCGAN生成肖像画
191 0
Pytorch和DCGAN生成肖像画(下)
|
机器学习/深度学习 存储 并行计算
一个快速构造GAN的教程:如何用pytorch构造DCGAN(下)
一个快速构造GAN的教程:如何用pytorch构造DCGAN
283 0
一个快速构造GAN的教程:如何用pytorch构造DCGAN(下)
|
机器学习/深度学习 存储 PyTorch
一个快速构造GAN的教程:如何用pytorch构造DCGAN(上)
一个快速构造GAN的教程:如何用pytorch构造DCGAN
287 0
一个快速构造GAN的教程:如何用pytorch构造DCGAN(上)
|
4月前
|
机器学习/深度学习 PyTorch API
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。
571 21
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
|
20天前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
96 9
|
6月前
|
机器学习/深度学习 JavaScript PyTorch
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
生成对抗网络(GAN)的训练效果高度依赖于损失函数的选择。本文介绍了经典GAN损失函数理论,并用PyTorch实现多种变体,包括原始GAN、LS-GAN、WGAN及WGAN-GP等。通过分析其原理与优劣,如LS-GAN提升训练稳定性、WGAN-GP改善图像质量,展示了不同场景下损失函数的设计思路。代码实现覆盖生成器与判别器的核心逻辑,为实际应用提供了重要参考。未来可探索组合优化与自适应设计以提升性能。
403 7
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
|
3月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
102 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
2月前
|
机器学习/深度学习 数据可视化 PyTorch
Flow Matching生成模型:从理论基础到Pytorch代码实现
本文将系统阐述Flow Matching的完整实现过程,包括数学理论推导、模型架构设计、训练流程构建以及速度场学习等关键组件。通过本文的学习,读者将掌握Flow Matching的核心原理,获得一个完整的PyTorch实现,并对生成模型在噪声调度和分数函数之外的发展方向有更深入的理解。
914 0
Flow Matching生成模型:从理论基础到Pytorch代码实现
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
提升模型泛化能力:PyTorch的L1、L2、ElasticNet正则化技术深度解析与代码实现
本文将深入探讨L1、L2和ElasticNet正则化技术,重点关注其在PyTorch框架中的具体实现。关于这些技术的理论基础,建议读者参考相关理论文献以获得更深入的理解。
95 4
提升模型泛化能力:PyTorch的L1、L2、ElasticNet正则化技术深度解析与代码实现

热门文章

最新文章

推荐镜像

更多