图像生成GAN和风格迁移
图像生成GAN和风格迁移
本周的学习重点是生成对抗网络(GAN)和风格迁移技术在图像生成领域的应用。通过深入探讨GAN的对抗训练机制和风格迁移的损失函数设计,我们不仅能够理解这些技术的基本原理,还能通过代码示例和实验结果,直观地看到它们在实际应用中的表现。
摘要
本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器通过对抗训练,使随机噪声逐步转换为逼真图像,展示了其在动漫人物生成中的潜力。其次阐述了风格迁移方法,通过预训练卷积网络提取图像内容和风格特征,并构建内容、风格及总变差损失,实现艺术风格转换。
1.生成对抗网络 GAN
上述的图简而言之就是,一个简单的分布经过Generator 后变成一个复杂的分布(给定一个低维的向量,对应生成一个动漫人物)
Discriminator的作用是将一张图片输出一个Scalar,其数值越大表示这张图片越像真实的二次元人物的额图像。
Generator 和Discriminator都是神经网络,其架构可以自己设计。
思考:为什么需要Discriminator?
联想演化理论
上述枯叶蝶为更好的生存不断地进化(相当于generator),而天敌波波鸟为了捕获食物也需要进化(相当于discriminator)
generator生成一张图,discriminator通过对比真实图片来判断生成的图片是否真实,generator为“欺骗”discriminator不断地调整参数使得更加其生成地图片接近真实图片类型,上述过程也就是两者对抗过程。
1.1 算法步骤
第一步:先固定generator,训练discriminator ,其学习sample中人物特征,对于初始随机化参数地generator进行判别其是否符合真实地漫画人物形象。
将第一步训练好的discriminator和generator看成一个大网络,输入一个向量,输出一个分数,discirminator里面的参数是固定的,不断调整generator的参数使其输出的scaler值越大越好。
重复上述1,2两个步骤,直到generator产生的图片和真实图片很接近停止迭代。
对于discirminator的目标函数为:G ∗ = a r g min G D i v ( P G , P d a t a ) G^*=arg\min_GDiv(P_G,P_{data})G∗=argGmin Div(PG ,Pdata )
上述training的目标函数和js divergence 是有关系的,具体的推导过程参考GAN
经过文章中所提及的推导过程最后的公式可以变换成如下:
G ∗ = a r g min G D i v ( P G , P d a t a ) G^=arg\min_GDiv(P_G,P_{data})G∗=argminG Div(PG ,Pdata )、D ∗ = a r g max D V ( D , G ) D^=arg\max_DV(D,G)D∗=argmaxD V(D,G)
其中max objective value 和div是相关的,公式改写成如下:
G ∗ = a r g min G ( m a x D V ( D , G ) ) G^*=arg\min_G(max_DV(D,G))G∗=argGmin (maxD V(D,G))
下面是一个简单的GAN生成一张图片的代码示例:
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 定义生成器模型
class Generator(nn.Module):
def __init__(self, latent_dim=100, img_shape=(1, 28, 28)):
super(Generator, self).__init__()
self.img_shape = img_shape
self.model = nn.Sequential(
nn.Linear(latent_dim, 128),
nn.ReLU(inplace=True),
nn.Linear(128, 256),
nn.BatchNorm1d(256, momentum=0.8),
nn.ReLU(inplace=True),
nn.Linear(256, 512),
nn.BatchNorm1d(512, momentum=0.8),
nn.ReLU(inplace=True),
nn.Linear(512, int(torch.prod(torch.tensor(img_shape)))),
nn.Tanh() # 输出范围在 [-1, 1]
)
def forward(self, z):
img = self.model(z)
img = img.view(img.size(0), *self.img_shape)
return img
# 利用生成器生成一张图片
latent_dim = 100
generator = Generator(latent_dim=latent_dim)
generator.eval() # 设置为评估模式
# 随机生成一个噪声向量
z = torch.randn(1, latent_dim)
# 利用生成器生成图片
gen_img = generator(z).detach().numpy().squeeze()
# 由于 Tanh 激活函数输出在 [-1, 1],需将其转换到 [0, 1] 以便显示
gen_img = (gen_img + 1) / 2.0
# 显示生成的图片
plt.imshow(gen_img, cmap='gray')
plt.title("Generated Image")
plt.axis("off")
plt.show()
2.风格迁移
风格迁移时一种计算机视觉技术,其核心思想将一幅图片的内容(物体的结构、布局、形状等信息)与另一幅图像的风格(如颜色、纹理、笔触等艺术特征)分离,并将两者重新组合,生成一幅既保留内容图像主体又具有风格图像艺术效果的新图像。
2.1 损失函数
import torch
# 内容一阶方差
def content_loss(Y_hat,Y):
return torch.square(Y_hat-Y.detach()).mean()
# 二阶协方差
def gram(X):
num_channels,n = X.shape[1],X.numel() // X.shape[1]
X = X.reshape(num_channels,n)
return torch.matmul(X,X.T) / (num_channels * n)
# 风格一阶方差
def style_loss(Y_hat,gram_Y):
return torch.square((gram(Y_hat)-gram_Y.detach())).mean()
## 图像上下左右减少噪声的损失函数 总变差损失函数
def tv_loss(Y_hat):
diff_v = torch.abs(Y_hat[:, :, 1:, :] - Y_hat[:, :, :-1, :]) #计算竖直方向上的差分
diff_h = torch.abs(Y_hat[:, :, :, 1:] - Y_hat[:, :, :, :-1]) #计算水平方向的差分
loss = (diff_v.sum()+diff_h.sum())/(Y_hat.size(0) * Y_hat.size(1)) # 假设按批次和通道求平均
return loss
# 风格迁移的损失函数 内容损失+风格损失
content_weight,style_weight,tv_weight = 1,1e3,10
def computer_loss(X,content_Y_hat,styles_Y_hat,contents_Y,styles_Y_gram):
contents_l = [content_loss(Y_hat,Y) * content_weight
for Y_hat,Y in zip(content_Y_hat,contents_Y)]
styles_l = [style_loss(Y_hat,Y)*style_weight
for Y_hat,Y in zip(styles_Y_hat,styles_Y_gram)]
tv_l = tv_loss(X) * tv_weight
return contents_l,styles_l,tv_l
2.2 论文阅读
2.2.1 简介
本周阅读论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》文章地址原始的风格迁移的速度非常慢,在GPU上,生成一张图片需要10分钟,并且这个时间会随着图片尺度的增大而迅速增大。这其中的原因在于把生成图片的过程当中一个训练的过程。正是基于上面的原因,提出一种方法:不把图片当做一个训练过程,而当成一个执行的过程。
2.2.2 方法
本周所阅读的这篇文章把快速风格迁移网络结构包含两个部分。一个是生成网络(Transform Network),一个是损失网络(Loss network)。生成网络接收一个图片当作输入,然后输出也是一种图片(风格迁移后的结果)。如下图,左侧是生成网络,右侧是损失网络:
训练阶段:首先选定一张风格图片。训练的目标是让生成网络可以有效生成图片。目标是由损失网络定义。
执行阶段:给定一张图片,将其输入生成网络,输出这张图片风格迁移后的结果。
上述过程模型在执行阶段可以完成风格图片的生成。因此生成一张图片的速度非常快,在GPU上一般小于1秒。
2.2.3 实验
进行风格迁移的结果相比于Gatys等人的实验结果相似,但是生成的速度要快的多。
2.2.4 结论
通过训练具有感知损失函数的前馈变换网络,结合了前馈图像变换任务和基于优化的图像生成方法的优点。将这种方法应用于风格转移,与Gatys等人提出的方法相比,获得了相当的性能和大幅提高的速度。
3.总结
本周系统学习了生成对抗网络与风格迁移技术在图像生成中的表现。GAN通过生成器和判别器的对抗训练,使随机噪声转化为真实感图像,展现出在动漫人物生成方面的优势,其缺点就是不好训练;风格迁移则利用卷积网络提取内容与风格特征,通过损失函数实现艺术风格转换。