PyTorch深度学习实战(38)——StyleGAN详解与实现

news2024/11/16 9:26:47

PyTorch深度学习实战(38)——StyleGAN详解与实现

    • 0. 前言
    • 1. StyleGAN
      • 1.1 模型介绍
      • 1.2 模型策略分析
    • 2. 实现 StyleGAN
      • 2.1 生成图像
      • 2.2 风格迁移
    • 小结
    • 系列链接

0. 前言

StyleGAN (Style-Generative Adversarial Networks) 是生成对抗网络 (Generative Adversarial Networks, GAN) 的变体,是一种无监督学习模型,用于生成逼真且高分辨率的图像。与传统 GAN 不同,StyleGAN 引入了两个关键概念:样式迁移和逐渐增强。样式迁移允许生成网络控制图像的风格和外观,从而生成具有不同特征的图像。逐渐增强则是指生成网络逐层地生成图像,先生成粗略的细节,然后逐渐添加更多细节和结构,从而获得更加逼真的图像。本节中,将利用预训练的 StyleGAN2 模型执行风格迁移。

1. StyleGAN

1.1 模型介绍

相比于传统生成对抗网络 (Generative Adversarial Networks, GAN),StyleGAN 的主要优点在于其能够生成高分辨率的逼真图像,同时可以控制所生成图像的风格。StyleGAN 使用自适应实例规范化 (Adaptive Instance Normalization, AdaIN),可以从输入的噪声向量中学习多个层次的风格信息,并且可以通过调整生成网络的输入来控制所生成图像的风格。
StyleGAN 之前,GAN 面临的最大问题是生成的图像分辨率通常较小(通常为 64 x 64),尝试生成更大尺寸图像会导致生成网络或判别网络陷入局部最小值。ProGAN (Progressive GAN) 通过渐进式逐层增强的方式来生成高分辨率、逼真的图像,从而克服了传统 GAN 在高分辨率图像生成时面临的困难,为高质量图像生成奠定了基础。
具体来说,ProGAN 采用了分层的生成网络结构,每一层都包含一个生成网络和一个判别网络,同时每一层的输出分辨率也相应地增加。在训练过程中,逐渐增加图像的分辨率,直到达到所需的分辨率。这种逐渐增加分辨率的方法,可以使得模型在从低分辨率图像逐渐生成高分辨率图像的过程中逐渐学习更多的图像特征,从而生成更加逼真的图像。通过这种方式,ProGAN 已经能够成功地生成高达 1024x1024 像素的图像,其生成质量和逼真度已经接近甚至超越了人眼的识别限制:

ProGAN 架构
尽管 ProGAN 成功地提高了生成图像的质量,但仍然难以控制生成图像的属性,例如性别和年龄等,主要是因为网络只有一个输入,为了解决这一问题,Tero Karras 等人提出了 StyleGAN
StyleGAN 使用与 ProGAN 类似的训练方案,逐步生成图像,但每次网络增加时都会添加一组新的潜在输入,即网络在获得所需尺寸的图像前会接受多个潜在向量。在生成阶段给出的每个潜在向量都决定了在该网络阶段将生成的特征(图像风格):

StyleGAN 架构
在上图中,我们可以看到传统的图像生成方式与基于风格的生成网络之间的差别。在传统的生成网络中,只有一个输入;但基于风格的生成网络中采用以下机制:

  • 创建一个大小为 1 x 512 的随机噪声向量 z z z
  • 将其输入到风格网络(或映射网络)的辅助网络中,该网络创建大小为 18 x 512 的张量 w w w
  • 生成(合成)网络包含 18 个卷积层,每一层都将接受以下内容作为输入:
    • w ( A ) w(A) w(A) 的对应行
    • 随机噪声向量 ( B ) (B) (B)
    • 上一层的输出

其中,噪声 ( B ) (B) (B) 仅用于正则化。

以上三个组合将创建一个管道,该管道接收一个 1 x 512 向量并创建一个 1024 x 1024 图像。映射网络能够生成 18 x 512 向量,其中每个 1 x 512 向量(共 18 个)都能够图像的生成作出贡献。输入合成网络前几层的 1 x 512 向量(负责生成 4 x 48 x 8 的图像)有助于得到图像的整体姿态和大尺度特征(如姿势、面部形状等),并且会在后面几层得到增强;添加到中间层的向量(负责生成 16 x 1632 x 3264 x 64 图像)对应于小尺度特征,例如发型、睁眼或闭眼等;添加到最后几层的向量对应于图像的颜色方案和其他微观结构,在最后几层时,图像结构被保留,面部特征也被保留,只有图像级别的细节,例如光照条件等会发生变化。

1.2 模型策略分析

在本节中,我们将利用预训练的 StyleGAN2 模型执行风格迁移,以生成具有不同风格的图像,模型策略原理如下所示:

  • 假设 w 1 w_1 w1 风格向量用于生成 face-1,而 w 2 w_2 w2 风格向量用于生成 face-2,样式向量的形状都为 18 x 512
  • w 2 w_2 w2 中的前几个向量(负责生成从 4 x 48 x 8 分辨率的图像)被替换为来自 w 1 w_1 w1 的相应向量,这样我们就可以将低级特征(如面部姿态)从 face-1 迁移到 face-2
  • 如果 w 2 w_2 w2 的中间的风格向量(比如第 315——负责生成 64 x 64256 x 256 分辨率的图像)被替换为 w 1 w_1 w1 中的风格向量,则可以迁移例如眼睛、鼻子等其他中级特征
  • 如果最后几个风格向量(负责生成 512 x 5121024 x 1024 分辨率的图像)被替换,则肤色和背景等精细特征将会(不会显着影响面部整体特征)被迁移

了解了风格迁移的策略后,现在让我们了解如何使用 StyleGAN2 在自定义图像上执行风格迁移:

  • 获取图像
  • 对齐图像,以便存储图像中的面部区域
  • 获取对齐图像的潜在向量
  • 通过将随机潜在向量 (1 x 512) 传递到映射网络生成图像

通过以上过程,得到两个图像:对齐图像和 StyleGAN2 网络生成的图像,然后将对齐图像的一些特征迁移到 StyleGAN2 网络生成的图像中。

2. 实现 StyleGAN

接下来,我们使用 PyTorch 实现以上策略,为了节省训练时间,从 gitcode 中获取预训练网络,下载后解压缩。

2.1 生成图像

(1) 获取预训练网络权重:

from pytorch_stylegan_encoder.InterFaceGAN.models.stylegan_generator import StyleGANGenerator
from pytorch_stylegan_encoder.models.latent_optimizer import PostSynthesisProcessing
import torch
import numpy as np
from matplotlib import pyplot as plt
from glob import glob
import cv2

synthesizer = StyleGANGenerator("stylegan_ffhq").model.synthesis
mapper = StyleGANGenerator("stylegan_ffhq").model.mapping
trunc = StyleGANGenerator("stylegan_ffhq").model.truncation

(2) 加载预训练的生成网络、合成网络和映射网络的权重:

post_processing = PostSynthesisProcessing()
post_process = lambda image: post_processing(image).detach().cpu().numpy().astype(np.uint8)[0]

(3) 定义函数根据随机向量生成图像:

def latent2image(latent):
    img = post_process(synthesizer(latent))
    img = img.transpose(1,2,0)
    return img

(4) 生成随机向量:

rand_latents = torch.randn(1,512).cuda()

在以上代码中,通过映射网络传递随机的 1 x 512 维向量以生成 1 x 18 x 512 维向量,生成的 18 x 512 维向量决定了生成图像的风格。

(5) 根据随机向量生成图像:

plt.imshow(latent2image(trunc(mapper(rand_latents))))
plt.show()

生成图像

2.2 风格迁移

接下来,我们将学习如何在以上生成图像和其他选择图像之间执行风格迁移,首先从 gitcode 中获取用于人脸对齐的程序并解压缩。

(1) 获取测试图像 (MyImage.jpg) 并将其对齐,对齐对于生成合适的潜在向量非常重要,因为 StyleGAN 生成的所有图像都以人脸为中心且特征明显,在 shell 中执行以下命令对齐测试图像:

$ mkdir -p stylegan-encoder/raw_images
$ mkdir -p stylegan-encoder/aligned_images
$ mv MyImage.jpg stylegan-encoder/raw_images
$ python stylegan-encoder/align_images.py stylegan-encoder/raw_images/ stylegan-encoder/aligned_images/
$ mv stylegan-encoder/aligned_images/* ./MyImage.jpg

(2) 查看对齐后的测试图像

from PIL import Image
img = Image.open('MyImage.jpg')

plt.imshow(np.array(img))
plt.title('original')
plt.show()

查看测试图像

(3) 使用对齐图像生成潜在向量,这是一个识别潜在向量组合的过程,该组合使对齐图像与根据潜在向量生成的图像之间的差异最小化。

首先,在 shell 中执行以下命令:

$ python encode_image.py MyImage.jpg pred_dlatents_image.npy --use_latent_finder true --image_to_latent_path ../trained_models/image_to_latent.pt

encode_image.py 程序执行以下操作:

  • 在潜在空间中创建一个随机向量 w w w
  • 使用随机向量 w w w 生成图像
  • 使用 VGG 感知损失(与神经风格迁移中的损失相同)将生成图像与原始输入图像进行比较
  • 对随机向量 w w w 执行反向传播,减少损失
  • 优化后的 w w w 向量将生成一张 VGG 特征与输入图像几乎相同的图像,因此合成图像看起来与输入图像相似。

然后,继续编写代码:

pred_dlatents = np.load('pred_dlatents_image.npy')
pred_dlatent = torch.from_numpy(pred_dlatents).float().cuda()
pred_image = latent2image(pred_dlatent)
plt.imshow(pred_image)
plt.title('synthesized')
plt.show()

风格迁移结果

得到了与感兴趣图像相对应的潜在向量后,执行图像风格迁移。

(4) 执行风格迁移。

风格迁移的核心逻辑实际上是风格张量的部分迁移,即 18 x 512 风格张量中的 18 个子集。接下来,我们分别传输前两行、 3-15 行、15-18 行;由于每组向量负责生成图像的不同方面,因此每组交换的向量会交换图像中的不同特征:

idxs_to_swap = slice(0,3)
my_latents = torch.Tensor(np.load('pred_dlatents_image.npy', allow_pickle=True))

A, B = latent2image(my_latents.cuda()), latent2image(trunc(mapper(rand_latents)))
generated_image_latents = trunc(mapper(rand_latents))

x = my_latents.clone()
x[:,idxs_to_swap] = generated_image_latents[:,idxs_to_swap]
a = latent2image(x.float().cuda())

x = generated_image_latents.clone()
x[:,idxs_to_swap] = my_latents[:,idxs_to_swap]
b = latent2image(x.float().cuda())
plt.subplot(221)
plt.imshow(A)
plt.subplot(222)
plt.imshow(a)
plt.subplot(223)
plt.imshow(B)
plt.subplot(224)
plt.imshow(b)
plt.suptitle('Transfer high level features')
plt.show()

请添加图片描述

idxs_to_swap 分别作为 slice(4,15)slice (15,18) 的输出如下:

slice(4,15)

slice (15,18)

(5) 接下来,我们需要推导一组风格向量,新向量仅改变测试图像的笑脸。为此,需要计算沿潜在向量z移动的正确方向。我们可以通过首先创建大量伪造图像来实现这一点,然后训练 SVM 分类器判断图像中的人物是否微笑,该 SVM 将创建一个超平面,划分笑脸与非笑脸,潜在向量 z z z 所需的移动方向将垂直于这个超平面,在 shell 中执行以下命令:

python InterFaceGAN/edit.py -m stylegan_ffhq -o results_new_smile -b InterFaceGAN/boundaries/stylegan_ffhq_smile_w_boundary.npy -i pred_dlatents_image.npy -s WP --steps 20

可视化生成图像:

generated_faces = glob('results_new_smile/*.jpg')

cols = len(generated_faces)
ix = 1
for im in sorted(generated_faces):
    plt.subplot(1, cols, ix)
    plt.imshow(cv2.cvtColor(cv2.imread(im,1), cv2.COLOR_BGR2RGB))
    ix += 1
plt.show()

小结

StyleGAN 能够生成非常高分辨率人脸图像的关键在于,在增加分辨率的步骤中逐步增加生成网络和判别网络的复杂性,以便在每一步中,两个模型都可以很好地完成任务。我们学习了如何通过确保每个分辨率的特征由一个独立的输入(称为风格向量)来控制,从而操纵生成图像的风格,以及如何通过将图像之间的风格进行交换来操作不同图像的风格。

系列链接

PyTorch深度学习实战(1)——神经网络与模型训练过程详解
PyTorch深度学习实战(2)——PyTorch基础
PyTorch深度学习实战(3)——使用PyTorch构建神经网络
PyTorch深度学习实战(4)——常用激活函数和损失函数详解
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(6)——神经网络性能优化技术
PyTorch深度学习实战(7)——批大小对神经网络训练的影响
PyTorch深度学习实战(8)——批归一化
PyTorch深度学习实战(9)——学习率优化
PyTorch深度学习实战(10)——过拟合及其解决方法
PyTorch深度学习实战(11)——卷积神经网络
PyTorch深度学习实战(12)——数据增强
PyTorch深度学习实战(13)——可视化神经网络中间层输出
PyTorch深度学习实战(14)——类激活图
PyTorch深度学习实战(15)——迁移学习
PyTorch深度学习实战(16)——面部关键点检测
PyTorch深度学习实战(17)——多任务学习
PyTorch深度学习实战(18)——目标检测基础
PyTorch深度学习实战(19)——从零开始实现R-CNN目标检测
PyTorch深度学习实战(20)——从零开始实现Fast R-CNN目标检测
PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测
PyTorch深度学习实战(22)——从零开始实现YOLO目标检测
PyTorch深度学习实战(23)——从零开始实现SSD目标检测
PyTorch深度学习实战(24)——使用U-Net架构进行图像分割
PyTorch深度学习实战(25)——从零开始实现Mask R-CNN实例分割
PyTorch深度学习实战(26)——多对象实例分割
PyTorch深度学习实战(27)——自编码器(Autoencoder)
PyTorch深度学习实战(28)——卷积自编码器(Convolutional Autoencoder)
PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)
PyTorch深度学习实战(30)——对抗攻击(Adversarial Attack)
PyTorch深度学习实战(31)——神经风格迁移
PyTorch深度学习实战(32)——Deepfakes
PyTorch深度学习实战(33)——生成对抗网络(Generative Adversarial Network, GAN)
PyTorch深度学习实战(34)——DCGAN详解与实现
PyTorch深度学习实战(35)——条件生成对抗网络(Conditional Generative Adversarial Network, CGAN)
PyTorch深度学习实战(36)——Pix2Pix详解与实现
PyTorch深度学习实战(37)——CycleGAN详解与实现

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

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

相关文章

使用AI创建令人惊叹的3D模型

老子云平台《《《《《 使内容创作者能够在一分钟内毫不费力地将文本和图像转换为引人入胜的 3D 资产。 文本转 3D 我们的文本转 3D 工具使创作者(包括那些没有 3D 经验的创作者)能够使用文本输入在短短一分钟内生成 3D 模型。 一句话生成3D模型 老子…

Day31|贪心算法1

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 无固定套路,举不出反例,就可以试试贪心。 一般解题步骤: 1.将问题分解成若干子问题 2.找出适合的贪心策略 3.求解每一个子问题的最优解 4.将局部最优解堆叠成全局最…

Unity2023.1.19_ECS_DOTS

Unity2023.1.19_ECS_DOTS 盲学-盲目的学习: 懒着自己整理就看看别人整理的吧,整合一下逻辑通了不少: DOTS/data oriented technology stack-面向数据的技术栈 ECS/Entities-Component-System Unity-Entities包 Entities提供ECS架构面向数…

C语言操作符详解(一)

一、操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符:<< >> • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、…

蓝桥杯练习系统(算法训练)ALGO-987 强力党逗志芃

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 逗志芃励志要成为强力党&#xff0c;所以他将身上所以的技能点都洗掉了重新学技能。现在我们可以了解到&#xff0c;每个技…

express+mysql+vue,从零搭建一个商城管理系统9--添加商户

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建models/shop.js二、新建routes/shop.js三、修改routes下的index.js四、添加商户总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 一、新建models/shop.js models/shop.…

Python数据分析案例38——我国个人工作总收入影响因素分析

案例背景 偶然之间找到了CSFP(中国家庭追踪调查)的数据集&#xff0c;一个很全的家庭调查数据集。所以就想对大家现在最关心的工资和其影响因素做一点分析。 得到的结论还挺有价值的&#xff0c;有符合逻辑的&#xff0c;也有反直觉的。 数据来源 CFPS由北京大学中国社会科学…

element loading遮罩层添加按钮

<el-table v-loading"loadingText" element-loading-text"拼命加载中" :data"tableData" :tableColumn"tableColumn" :span-method"objectSpanMethod" border :cell-style"cellStyle" :header-cell-style"…

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在&#xff0c;这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…

第二证券|飞行汽车最大订单诞生,万亿级产业待起飞!概念股早盘大涨

开年以来&#xff0c;飞翔轿车赛道利好不断。 飞翔轿车草创公司斩获大订单 据媒体报道&#xff0c;美国飞翔轿车草创公司Alef Aeronautics表明&#xff0c;其电动笔直起降&#xff08;eVTOL&#xff09;飞翔器的预定最近创下了新纪录&#xff0c;订单量已到达2850份。埃隆马斯…

Cesium绘制带有方向的线

export const MAP_3D_BEGIN_CALC (lineStringData, geoData) > {// 画方向线map.entities.add({name: uav-tmp-line,polyline: {positions: Cesium.Cartesian3.fromDegreesArray(lineStringData),material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.RED),//…

windows下tensorflow-gpu2.5+cudn11.2+cudnn8.1环境配置

1.下载visualStidio2019&#xff08;cudn要用到&#xff09; 要下载2019版本&#xff0c;2022好像不很适配&#xff0c;cudn11.2以上的版本或许可以尝试 visualstidio官网是2022版本&#xff0c;找2019的下载Visual Studio 2019 版本 16.11 发行说明 | Microsoft Learn 勾选…

【C语言】Leetcode 206.反转链表

博主主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《Leetcode》 题目 解决思路 思路一&#xff1a;翻转链表 struct ListNode* reverseList(struct ListNode* head) {if(head NULL){return NULL;}struct ListNode* n1 NULL,*n2 head,*n3 n2 -> next;while(…

ChatGPT Plus 如何开启插件

ChatGPT Plus 如何开启插件 购买完 ChatGPT Plus 会员之后&#xff0c;需要手动开启才能使用 GPT 的插件和 Code interpreter服务。 ​ 具体步骤如下&#xff1a; 1. 进入设置 点击左下角个人邮箱的位置&#xff0c;在弹窗中选择 Settings &Beta 2. 开启选项 在设置选…

紫光展锐T618_4G安卓核心板方案定制

紫光展锐T618核心板是一款采用纯国产化方案的高性能产品&#xff0c;搭载了开放的智能Android操作系统&#xff0c;并集成了4G网络&#xff0c;支持2.5G5G双频WIFI、蓝牙近距离无线传输技术以及GNSS无线定位技术。 展锐T618核心板应用旗舰级 DynamlQ架构 12nm 制程工艺&#x…

以线缆行业为例,工业智能网关的实际应用及其带来的变革-天拓四方

工业智能网关是一种集数据采集、传输、处理和分析于一体的智能化设备。它能够实现对工业现场各种传感器、执行器等设备的数据进行实时采集&#xff0c;并通过网络传输到云端或本地数据中心进行分析处理。同时&#xff0c;工业智能网关还具备边缘计算能力&#xff0c;能够在本地…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者简介 李江梦&#xff0c;中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文&#xff1a;BayesPrompt: Prompting Large…

国创证券|AI手机PC概念拉升,福蓉科技4连板,思泉新材大涨

AI手机PC概念大幅走高&#xff0c;到发稿&#xff0c;思泉新材涨近15%&#xff0c;盘中一度涨停&#xff1b;道明光学、福蓉科技均涨停&#xff0c;诚迈科技涨近8%&#xff0c;亿道信息涨逾6%。 值得注意的是&#xff0c;福蓉科技已接连4个交易日涨停。公司4日晚间发布危险提示…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

nginx 配置404 及 nginx demo

郭永坤123/nginx-demo nginx demo&#xff1a; 包含 &#xff1a; 负载均衡 自定义conf 反向代理