随着生成对抗网络GAN的出现,基于该技术的趣味应用如雨后春笋般涌现。其中一个应用方向,便是照片动漫化或者视频动漫化。或许是受到二次元文化的影响,又或者是动漫化应用场景相对广泛、商业价值较高,导致许多开发者参与到上述照片动漫化类型的项目制作中。看到太多大同小异的项目之后,我的脑海中突然浮现出一个问题——为什么没人反其道行之,尝试动漫真人化的项目呢?同时,我本人也非常好奇用GAN生成动漫人物的“真人”形象到底会是什么样子。因此,前段时间,我使用飞桨PaddleGan开发套件,实现了一个动漫人物真人化项目,让“撕漫女友”出现。今天就来和大家分享我的项目设计思路。
项目介绍
技术原理
实现步骤
1.数据准备及预处理
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()
左:中:右=原图:标签:生成图像
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://github.com/PaddlePaddle/PaddleGAN
本文图片源自:
https://aistudio.baidu.com/aistudio/projectdetail/1813349?channelType=0&channel=0公开数据集
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~