\u200E
动漫人物也能变“真人”?PaddleGAN帮你找到“撕漫”的TA
发布日期:2022-07-13T02:56:12.000+0000 浏览量:4995次





随着生成对抗网络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-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()

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


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


我们可以清晰地看到,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】公众号

获取更多技术内容~