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

47edff3100875f80784bd1db916caaa4.gif

f05599faf7fecadc9a5374803b1e4e94.jpeg

项目背景

随着生成对抗网络GAN的出现,基于该技术的趣味应用如雨后春笋般涌现。其中一个应用方向,便是照片动漫化或者视频动漫化。或许是受到二次元文化的影响,又或者是动漫化应用场景相对广泛、商业价值较高,导致许多开发者参与到上述照片动漫化类型的项目制作中。看到太多大同小异的项目之后,我的脑海中突然浮现出一个问题——为什么没人反其道行之,尝试动漫真人化的项目呢?同时,我本人也非常好奇用GAN生成动漫人物的“真人”形象到底会是什么样子。因此,前段时间,我使用飞桨PaddleGan开发套件,实现了一个动漫人物真人化项目,让“撕漫女友”出现。今天就来和大家分享我的项目设计思路。

d168bcde82bee304a64f944f41fd387f.png

项目介绍

技术原理

10021c1d943439218253d87124fc2934.png

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。

de9b02e654651a8b52604d646661aa6a.jpeg

对应的真人图片(标签)/动漫照片(原图)

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-4
BATCH_SIZE = 8
EPOCHS = 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()

我们可以查看一下训练过程中学习的效果,如下图所示。

70865998302df1d844f91415fa085a96.jpeg

左:中:右=原图:标签:生成图像

我们可以清晰地看到,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]                                  # 真人图(即预测结果)

我们把动漫人物图片送入到网络中进行预测,例如以下两张图片:

d2352615eebb68dac168c00cbbf741e5.jpeg

大家可以想象一下,图上两个动漫人物的“真实”面貌会是什么样子呢?

项目效果

测试结果可视化

2a9c1235f26e62ee93e0f22c16bb4bce.jpeg

左:中:右=测试图:生成图像:测试图标签

我们可以看到,测试图生成的效果已经非常接近标签图像,尽管有一些小细节没有完整呈现,但“真人”人像大致的容貌还是能够很好地复现出来。不知道刚刚你想象的“真人”面貌和测试效果有多大的出入呢?

问题与改进方

待优化的问题

  • 数据集风格较为单一(特征简单),使用不同动漫风格的照片进行图像生成,可能会导致生成效果较差。这是因为模型泛化性能仍存在优化空间。另外,目前本项目所采用的数据集只有女性一种性别,无法对男性进行生成图像。

  • 原图阴影部分对应生成部分效果一般会比较差。此外,也存在光照敏感度不强烈的问题。

改进方向

  • 可以尝试优化数据集,即增加数据集风格种类、性别,并且保持一定数量的增加。

  • 可以更换更好的生成器模型,以加强网络学习更多细节的信息。

欢迎交流

  • 点击阅读原文获得项目链接:

    https://aistudio.baidu.com/aistudio/projectdetail/3450122

  • 更多趣味体验欢迎访问:

    https://github.com/PaddlePaddle/PaddleGAN

本文图片源自:
https://aistudio.baidu.com/aistudio/projectdetail/1813349?channelType=0&channel=0公开数据集

7886f73d9703c1b3c1fcb1fc9dbdb1e2.gif

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值