上一节我们描述了VAE网络的数学原理,特别强调了它能把输入数据隐射到一个区域内,这种特性带来一个特点是,如果将两个不同数据输入网络得到两个区间,这两个区间要是有重合的话,我们在重合的区域内取一点让解码器进行还原,那么被还原的数据就有可能兼具两个输入数据的特点融合,就好像孩子兼具爸爸与妈妈的特征那样,这点特性在人脸生成上大有用场。

这次我们使用CelebA数据集来训练VAE网络,该数据集包含了将近200000张人脸图像,这次我们使用的网络结构与上一节相差不大,只是在细节上要做一些改变。在上节我们网络识别的数字图片是单值灰度图,这次我们要处理RGB图像,同时由于人脸蕴含的特征远远超过数字图片,因此编码器输出的关键向量维度要从2提升到200以上;第三,为了让网络训练速度加快,我们需要在卷积层输出数据上进行呈批的正规化处理;第四,在损失函数的相关参数上要根据经验进行手动调整。

首先我们先在上一节代码的基础上构造本节需要使用的网络实例:

vae = VariationalEncoder(input_dim = [128, 128, 3], encoder_conv_filters = [32, 64, 64, 64], encoder_conv_kernel_size = [3,3,3,3], encoder_conv_strides = [2, 2, 2, 2], z_dim = 200,decoder_conv_t_filters = [64,64,64,32], decoder_conv_t_kernel_size = [3,3,3,3] ,decoder_conv_t_strides = [2,2,2,2],use_batch_norm = True,use_dropout = True)

接下来我们把人脸数据加压到代码所在网络,并使用如下代码加载到内存,你可以从如下链接获得相应数据集:
https://pan.baidu.com/s/13CDS_74Z7XFOt6AvRSTiZg
我们看看如何使用keras提供的datagenerator分批次将图片数据读入内存

from glob import glob
from keras.preprocessing.image import ImageDataGenerator
section = 'vae'
run_id = '0001'
data_name = 'faces'
RUN_FOLDER = 'C:\\generate_face\\run\\{}\\'.format(section)
RUN_FOLDER += '_'.join([run_id, data_name])
if not os.path.exists(RUN_FOLDER):#构造文件夹存储网络训练过程中产生的数据os.mkdir(RUN_FOLDER)os.mkdir(os.path.join(RUN_FOLDER, 'viz'))os.mkdir(os.path.join(RUN_FOLDER, 'images'))os.mkdir(os.path.join(RUN_FOLDER, 'weights'))
mode = 'build'
DATA_FOLDER = 'C:\\generate_face\\img_align_celeba\\img_align_celeba\\'
BATCH_SIZE = 32 #一次读取32张图片进行分析
INPUT_DIM = (128, 128, 3) #图片的规格
filenames = np.array(glob(os.path.join(DATA_FOLDER, '*.JPG')))
NUM_IMAGES = len(filenames)
print("pic num: ", NUM_IMAGES)
data_gen = ImageDataGenerator(rescale = 1./255)#加载图片时将每个像素点值除以255转换到[0,1]之间
data_flow = data_gen.flow_from_directory(DATA_FOLDER,target_size = INPUT_DIM[:2],batch_size = BATCH_SIZE,shuffle = True,class_mode = 'input',subset = 'training')

上面代码运行后,总共有202599张图片被读取,它们将以分批方式读入内存传给网络进行训练,接下来我们设定网络训练时需要使用的相关参数,并启动训练流程:

LEARNING_RATE = 0.0005
R_LOSS_FACTOR = 10000
EPOCHS = 200
PRINT_EVERY_N_BATCHES = 100
INITIAL_EPOCH = 0
vae.compile(LEARNING_RATE, R_LOSS_FACTOR)
vae.train_with_generator(     data_flow, epochs = EPOCHS, steps_per_epoch = NUM_IMAGES / BATCH_SIZE, run_folder = RUN_FOLDER, print_every_n_batches = PRINT_EVERY_N_BATCHES, initial_epoch = INITIAL_EPOCH
)

上面代码训练后,我们准备用训练好的网络识别人脸图像,首先我们先加载每张人脸图片对应的特征信息,这些信息存储在一个名为list_attr_celeba.csv的文件中:

import pandas as pd
INPUT_DIM = (128,128,3)
att = pd.read_csv(os.path.join(DATA_FOLDER, 'list_attr_celeba.csv'))
att.head()

上面代码运行后输出结果如下:

我们看到每张图片对应的特性都会以1或-1的方式标记出来,1表示图片含有给定特性,-1表示没有,接下来我们把图片重新读入内容同时让每张图片对应相应特性:

class ImageLabelLoader():def __init__(self, image_folder, target_size):self.image_folder = image_folderself.target_size = target_sizedef build(self, att, batch_size, label = None):data_gen = ImageDataGenerator(rescale=1./255)if label:data_flow = data_gen.flow_from_dataframe(att, self.image_folder, x_col='image_id', y_col=label, target_size=self.target_size , class_mode='other', batch_size=batch_size, shuffle=True)else:data_flow = data_gen.flow_from_dataframe(att, self.image_folder, x_col='image_id', target_size=self.target_size , class_mode='input', batch_size=batch_size, shuffle=True)return data_flow
DATA_FOLDER = '/content/drive/My Drive/all_images/images/'
imageLoader = ImageLabelLoader(DATA_FOLDER, INPUT_DIM[:2])
data_flow_generic = imageLoader.build(att, n_to_show)
print(len(data_flow_generic))

上面代码先从读取10张原图片,将其输入网络后通过编码器获得人脸对应的关键向量,然后再使用解码器根据关键向量重构图片,运行后输出结果如下:

上面是原图,下面是网络重构后输出的图片。输出虽然不是很清晰,但是网络的确能够将一个区间内任意一点解码成符合人脸特征的图像.值得我们注意的是,重构的图片与原图片有一些差异,这些差异的产生主要在于输入解码器的向量与编码器输出的并不完全一样,输入解码器的向量是从一个区间内随机采样的一点,因此得到的向量与解码器对输入图片的编码不同,但由于采样的向量与编码器对输入图片的编码结果在距离上比较接近,因此输出图片的特征与输入图片依然有很大的相似之处。

我们接下来看看如何用编解码器生成新人脸:

n_to_show = 30
'''
随机采样一点作为关键向量,因为解码器已经知道如何将位于单位正太分布区间内的一点转换为人脸,
因此我们随机在区间内获取一点后,解码器就能生成相应人脸
'''
znew = np.random.normal(size = (n_to_show, vae.z_dim))
new_face = vae.decoder.predict(np.array(znew))
fig = plt.figure(figsize = (18, 5))
fig.subplots_adjust(hspace = 0.4, wspace = 0.4)
for i in range(n_to_show):ax = fig.add_subplot(3, 10, i+1)ax.imshow(new_face[i, :, :, :])ax.axis('off')
plt.show()

上面代码运行后输出结果如下:

上面的人脸图片在我们的图片库中不存在,是网络动态生成的结果。这些人脸实际上与图片库中的不同人脸又有相似之处,他们的生成实际上是网络将图片库中人脸的不同特征进行组合的结果。上面生成人脸中,某个人脸的头发颜色可能来自图片库某张图片,发型可能又来自另一张图片,眼睛可能又来自第三张图片,由于编码器能将人类分解成200个特征点,也就是关键向量中的每个分量,当我们从这些分量中随机采样时,就相当于对人脸不同特征进行抽取,最后再把这些抽取出来的特征组合成一张人脸,下一节我们会看到如何实现更神奇的人脸变换。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:

人脸生成黑科技:使用VAE网络实现人脸生成相关推荐

  1. Python人脸识别黑科技(二):教你使用python+Opencv完成人脸解锁

    继上一篇"Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识",那么今天我们来讲关于使用python+opencv+ ...

  2. 人脸识别撞脸名画_人脸识别“黑科技”蚂蚁金服“遇见名画中的自己”火爆东博会...

    ​也许你撞过衣服.撞过名字,但是你是否想过你会与世界名画中的"古人"撞脸?当下,蚂蚁金服首次把黑科技"遇见名画中的自己"带进了第13届中国-东盟博览会. 东博会 ...

  3. 戴上口罩AI变“脸盲”?口罩人脸识别黑科技来袭

    疫情期间,口罩在全国抗疫中起到了关键作用.但在口罩成为每一位公民"标配"的同时,对诸如"刷脸"支付.高铁闸机身份认证等需要人脸识别的场景提出了挑战. 口罩.帽子 ...

  4. 人脸识别黑科技正式入侵,消亡还是苏醒?人工智能测试势不可挡!

    摘要:当前,人脸识别技术已经在诸多领域取得广泛应用,但其风险也一直为外界关注,尤其是对风险容忍度较低的金融行业来说,用户验证环节如果出现漏洞,就可能造成巨大损失.本文将以一个项目实例出发,分享在测试人 ...

  5. 闲鱼代码Java_面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    作者:闲鱼技术-青页 一直以来, 如何从'视觉稿'精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的 ...

  6. 追平iPhone!搭载IFAA人脸识别黑科技,这款国产安卓手机厉害了

    2017年9月,iPhone X上市带动了无数个Face ID相关的话题.苹果Face ID技术采用的是3D结构光技术,由于苹果收购了提供该技术的以色列公司,使得iPhone X 的Face ID拥有 ...

  7. 高考监考引入人脸识别黑科技?更多高新监控技术为高考保驾护航!

    高考是我国选拔考试中最公平相对最综合的选拔方式,同时,也是一场决定资源分配的考试.虽然说高考对人生的影响并不是决定性的,但是对于大多数考生来说,高考是一项重要.严肃的人生选择,因此对于高考作弊的防范也 ...

  8. 智能家居黑科技!首款3D人脸识别智能锁发布 搭载百度智能云函谷物联安全系统...

    随着AI在家庭场景中应用的普及与发展,智能锁逐渐成为智能家居的不可或缺的"门面担当",在满足消费者快捷和多样化需求的同时,如何保障家庭安全也成为被重点关注的问题.4月24日,德施曼 ...

  9. 快手用最简单的方式感动每一个独特的你 原来背后的黑科技才是真的666

    "双击""666""老铁""没毛病",或许只有快手有这样的魅力,让用户成为他们最忠诚最形象的广告代言人,当我们听到这些来 ...

最新文章

  1. 分享Kali Linux 2017年第24周镜像文件
  2. docker 开启remote api
  3. ios学习——键盘的收起
  4. 现有CSDN博客的排名机制
  5. Kotlin 知识梳理(13) 运行时的泛型
  6. AlexNet网络构建与训练
  7. 网站部署nginx--uwsgi
  8. 学习笔记——指针那些事儿
  9. 如何检查字符串“ StartsWith”是否为另一个字符串?
  10. Linux系统下文件与目录操作
  11. Java好学吗?Java能做什么?如何快速入门Java?
  12. Git(9)-- 远程仓库的使用
  13. WPF界面设计中常用的一些代码片段及属性
  14. php curl exec 返回值,php curl_exec函数返回false的解决方法
  15. spring中如何实现参数隐式传递_Java进阶架构之开源框架面试题系列:Spring+SpringMVC+MyBatis(含答案分享)...
  16. C语言程序设计第五版第五章课后习题
  17. 阿里云平台购买域名 免费申请SSL证书
  18. vue框架优点和缺点
  19. 《Python机器学习基础教程》官方中文PDF+英文PDF+源代码 (张亮译)
  20. 三大框架整合开发的时候,出现红色双箭头,advised by org.springframework.transaction.interceptor.TransactionInterceptor.in

热门文章

  1. requests基础爬虫案例
  2. 压缩包密码忘了怎么办
  3. PBOC代码回顾(1)
  4. 对前端程序员非常友好的人脸检测接口——face-api.js的介绍和demo
  5. 手写Spring-第四章-为依赖的对象注入灵魂!
  6. RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
  7. 马云十年前说的新商业文明是不是在吹牛?
  8. kinit: Keytab contains no suitable keys for xxxx@HADOOP.COM while getting initial credentials
  9. 学计算机的女生后来都怎么样了?
  10. 中国联通盈利剧增,但多项数据垫底