在今年六月份举行的WWDC18大会上,苹果介绍了全新的升级版“Animoji”——Memoji,用户可以选择不同的发型、五官和肤色来定制自己专属的表情符号,例如选择不同的肤色、发型甚至雀斑,并且有多种颜色。
但是,选择毕竟是有限的,在多种样式中对比查找也有一定难度,那么是否有一种算法可以根据照片生成Memoji呢?
在这篇博文中,我们将介绍一种用神经网络从真实照片中生成苹果Memoji表情的方法。具体来说,我测试了用于人脸识别的网络VGG16 Face,将真实照片与Memoji进行对比。之后我用它选择各种特征,为新目标创造Memoji表情。本文原作者为Pat Niemeyer,以下是论智的编译。
上图是神经网络生成的两个结果。在实际操作过程中,我们的工作会受到以下几点因素的影响:
人像卡通化
第一个问题就是:某人的“卡通版本”是什么样的。卡通漫画通常会放大某人最明显的特征,但是类似发型之类的其他特征区别不是很明显,并且发型的类型非常多。经过训练辨认人脸的神经网络会以抽象方式捕捉到某人的发型信息,从而进行转化。反过来说,这也意味着从抽象信息中生成发型并不是一个理想的好方法。
肤色和发色
在不同光线条件下推测照片中人物的肤色非常困难,在我的测试中,网络通常会选择肤色更浅的区域,并且不能区分现实和非现实情况。同样,虽然测试设备在分辨暗色和亮色头发的任务中表现不错,但是当照片中的头发颜色更鲜艳,这一方法或多或少地可能失败。
这里推荐一篇文章,其中用到的对人脸特征和肤色进行规范化的工具非常酷:Synthesizing Normalized Faces from Facial Identity Features。
No API
想用Memoji做实验遇到的最大挑战就是,目前没有可用的API能够程序化创造它们(没有直接的方法可以让我们在iOS中自动进行创造)。所以,当我们想搜索可能的Memoji作为生成过程的一部分时,这一过程变得极为低效。理想状态下,我们想用一个通用算法彻底调整各特征的组合,而不是独立处理,但这在简单的实验上是无法做到的。
照片选择
选择哪张照片作为参考材料对结果有很大的影响,在有些情况下,一些照片会比其他的生成更好的结果。理想的照片应该是裁剪合理、脸朝向前方、最具代表性的照片。对于每一特征,我都会根据至少四张人脸图像进行打分。
网络设置
VGG
VGG是图像识别中常用的卷积神经网络架构,VGG Face是该架构经过人脸识别训练后的工具。它的创作者已将完全训练后的网络开源,大大方便了我们的实验,因为从零训练一个这样的网络通常需要大量数据和计算时间。
VGG Face
Torch
另外在测试时,我用到了Torch科学计算框架。Torch提供了运行VGG模型所需要的环境,并且基于Lua提供了脚本环境,同时还有用于数学计算的库和基础搭建模块,可用于神经网络的图层。
Torch可以自动下载VGG Face模型,并且只需几行代码就能运行一张图片。基础流程如下:
net = torch.load('./torch_model/VGG_FACE.t7')
net:evaluate()
-- Apply an image
img = load_image(my_file)
output = net:forward(img)
其中下载图像和对图像规范化的步骤代码可以在源代码中找到。
图层
如上图所示,VGG有很多不同类型的图层,首先是一个能保存RGB图像数据的Tensor,它应用了多种卷积、池化、权重和其他类型的变换,随着每个图层学习更多抽象特征,数据的“形状”和维度都在变化。最终网络会在最后一层生成一个一维的、有2622个元素的预测向量。该向量表示真人与网络训练结果匹配成功的概率。
在我们的案例中,我们不关心这些预测结果,而是想利用网络比较自己数据集中的抽象人脸。为了做到这一点,我们可以利用预测图层下的图层的输出,该图层包括了4096个元素向量,对人脸特征进行组合定制。
output = net.modules[selectedLayer].output:clone()
虽然VGG16的标准是16层的框架,但实际上在Torch中实施后生成的是具有40个模块的设置。
相似度
接下来,我们会向网络中输入成对的图片,然后用一种简单的相似度尺度比较它们的输出。其中比较两个大型数字向量的方法是利用点积:
torch.dot(output1, output2)
这就生成了一个表示向量在高维空间中“对齐”程度的标量值。
对于这一测试,我们想将生成的Memoji和多张参考图像对比,生成最终结果。所以我只需将每一对图像的值进行正则化,取平均分数。
sum = 0
for i = 1, #refs do
localref = refs[i]
local dotself = torch.dot(ref , ref)
sum = sum + torch.dot(ref, target) / dotself
end
...
return sum / #refs
正则化表示将一张图像和它本身相比的分数为1,那么之后的分数越接近于1,说明相似度越大。
除此之外,我们还能用到很多其他类型的衡量尺度。常用的两种可能是欧几里得距离或计算两输入之间的平均方差。
首次测试——The Lineup
首先我想知道,这一人脸网络能否在所有照片上生成对应的Memoji。首先,我随机收集了63张Memoji图像,大部分是苹果的设计原型。
之后我选择了一个Memoji,然后让网络选出前三名相似度最高的表情。
结果非常不错!不仅仅它能找到完全一样的Memoji(得分为1),第二第三名看起来也很相像。
真实照片
现在我们要进行“真实性”检测:我们让网络根据真实相片找到相似的Memoji,结果如下:
由于只能在有限的数据集中选择,所以结果并不如我们期待的那样好,可以看到分数都很低。
生成过程
接下来,我尝试让网络挑选特征创造全新的Memoji。正如上文提到的,在iOS中并没有能自动创建Memoji的途径,所以我决定编写脚本促进Memoji的生成。
我将手机和电脑连接,用QuickTime Player的录制功能将这一过程保留下来。
但这一方法并不理想。首先,操作起来很复杂,光发型就有93种,运行一遍需要大量时间。更重要的是,我们每次只能评估一个特征的不同。理论上,我们可以不断地重复选择树,进行迭代,知道网络认为没有什么变化时才能停止。但是这种方法也不完美,很有可能只是一个“部分最小值”。
另外,照片中人物头像细微的移动就会影响分数。最后,我发现了一个简单的解决方法。
结果
在文章未完成前,我其实没有采用网络得出的川普中的发型,而是手动选择了一个分数最高的,觉得那个更适合他。但是最后我还是坚持展示出所有网络得出的结果。
所以,有的时候排名前三的将结果并不总是相似的。例如,以下就是川普发型的排名:
但是,奥巴马耳朵的排名却很靠谱,又大到小分数逐渐降低:
不过眼睛的选择却有些不同:
但是川普的眼睛就比较一致了:
发色
前面说到,头发的颜色因为光线问题会难以确定。川普和奥巴马的头发还比较好确定,但是有些情况下,网络总会把很亮的颜色看作灰色:
-
神经网络
+关注
关注
42文章
4759浏览量
100445 -
人脸识别
+关注
关注
76文章
4004浏览量
81698
原文标题:用神经网络根据照片创建专属Memoji表情
文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论