当前位置:首页 » 《随便一记》 » 正文

动漫人物也能变“真人”?PaddleGAN帮你找到“撕漫”的TA

2 人参与  2022年07月20日 09:45  分类 : 《随便一记》  评论

点击全文阅读


本文已在飞桨公众号发布

图片

项目背景

随着生成对抗网络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】公众号
获取更多技术内容~


点击全文阅读


本文链接:http://zhangshiyu.com/post/43545.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1