本文已在飞桨公众号发布
项目背景
随着生成对抗网络GAN的出现,基于该技术的趣味应用如雨后春笋般涌现。其中一个应用方向,便是照片动漫化或者视频动漫化。或许是受到二次元文化的影响,又或者是动漫化应用场景相对广泛、商业价值较高,导致许多开发者参与到上述照片动漫化类型的项目制作中。看到太多大同小异的项目之后,我的脑海中突然浮现出一个问题——为什么没人反其道行之,尝试动漫真人化的项目呢?同时,我本人也非常好奇用GAN生成动漫人物的“真人”形象到底会是什么样子。因此,前段时间,我使用飞桨PaddleGan开发套件,实现了一个动漫人物真人化项目,让“撕漫女友”出现。今天就来和大家分享我的项目设计思路。
项目介绍
技术原理
X:原图 G(X):生成图 G:生成器 D:判别器 Y:标签
简单来说,本项目的基础原理,是将原图X以及标签Y送进GAN网络进行学习,原图通过生成器G生成一张真人图像 G(X),再把生成图像G(X)以及原图X送进判别器D进行判断,再通过与标签图像Y计算L1 loss和CGAN loss修改反向传播网络权值,使得最后的生成图像G(X)能够“骗”过判别器D(误以为是标签图像Y)。
实现步骤
1.数据准备及预处理
数据类别:动漫照片(原图)/对应的真人图片(标签)。
数据数量:共计约1400张图像。
数据划分:训练集、测试集中的比例13:1。
对应的真人图片(标签)/动漫照片(原图)
2.自定义生成器和判别器
生成器采用Unet结构,输入目标轮廓,经过编码解码生成着色的目标图像,判别器采用PatchGAN对生成假图像和真实图像进行判别,把图像分成切片patch,分别判断每个patch的真假,再平均最后的结果。
generator = UnetGenerator()discriminator = NLayerDiscriminator()out = generator(paddle.ones([1, 3, 256, 256]))print('生成器输出尺寸:', out.shape)out = discriminator(paddle.ones([1, 6, 256, 256]))print('判别器输出尺寸:', out.shape)输出结果如下:生成器输出尺寸: [1, 3, 256, 256]判别器输出尺寸: [1, 1, 30, 30]
实例化生成器、判别器
3.定义超参数进行训练
# 超参数LR = 1e-4BATCH_SIZE = 8EPOCHS = 100# 优化器optimizerG = paddle.optimizer.Adam( learning_rate=LR, parameters=generator.parameters(), beta1=0.5, beta2=0.999)optimizerD = paddle.optimizer.Adam( learning_rate=LR, parameters=discriminator.parameters(), beta1=0.5, beta2=0.999)# 损失函数bce_loss = nn.BCELoss()l1_loss = nn.L1Loss()
我们可以查看一下训练过程中学习的效果,如下图所示。
左:中:右=原图:标签:生成图像
我们可以清晰地看到,pix2pix网络学习到的效果还是很不错的,尤其是右图第一行生成的图像已经和标签图像非常像。接下来我们使用测试集测试一下模型效果。
4.测试
# 为生成器加载权重weights_save_path = 'work/weights'last_weights_path = os.path.join(weights_save_path, sorted(os.listdir(weights_save_path))[-1])print('加载权重:', last_weights_path)model_state_dict = paddle.load(last_weights_path)generator.load_dict(model_state_dict)generator.eval()# 读取数据# test_names = os.listdir('data/cartoon_A2B/test')# # img_name = np.random.choice(test_names)img_name = '01481.png'img_A2B = cv2.imread('data/cartoon_A2B/test/'+img_name)img_A = img_A2B[:, 256:] # 卡通图(即输入)img_B = img_A2B[:, :256] # 真人图(即预测结果)
我们把动漫人物图片送入到网络中进行预测,例如以下两张图片:
大家可以想象一下,图上两个动漫人物的“真实”面貌会是什么样子呢?
项目效果
测试结果可视化
左:中:右=测试图:生成图像:测试图标签
我们可以看到,测试图生成的效果已经非常接近标签图像,尽管有一些小细节没有完整呈现,但“真人”人像大致的容貌还是能够很好地复现出来。不知道刚刚你想象的“真人”面貌和测试效果有多大的出入呢?
问题与改进方向
待优化的问题
数据集风格较为单一(特征简单),使用不同动漫风格的照片进行图像生成,可能会导致生成效果较差。这是因为模型泛化性能仍存在优化空间。另外,目前本项目所采用的数据集只有女性一种性别,无法对男性进行生成图像。
原图阴影部分对应生成部分效果一般会比较差。此外,也存在光照敏感度不强烈的问题。
改进方向
可以尝试优化数据集,即增加数据集风格种类、性别,并且保持一定数量的增加。
可以更换更好的生成器模型,以加强网络学习更多细节的信息。
欢迎交流
点击获得项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/3450122
更多趣味体验欢迎访问:
https://github.com/PaddlePaddle/PaddleGAN
本文图片源自:
https://aistudio.baidu.com/aistudio/projectdetail/1813349?channelType=0&channel=0公开数据集
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~