万圣节教你用 OpenCV Remix 一张 n 合1脸

大家好,我是为人造的智能操碎了心的智能禅师。

在这个多逝之秋,禅师要哀悼一下金庸先生。昨晚上惊闻噩耗,顿感无比感慨。金庸先生的武侠,影响了好几代人。沧海一声笑,滔滔两岸潮。浮沉随浪只记今朝,先生一路走好!

今天是万圣节?,就是国外的中元节。可能是唯一一个没有被过程情人节、能让人体会真正快乐的,年轻人中流行的节日。禅师在这里,祝愿大家每年万圣节都是 Coser,不被 Cos。?

每年万圣节,大家一般都是化妆成?啊、?啊,?啊……反正是怎么?怎么丑怎么来。

今年禅师就想,老是这些东西也没什么新鲜的。昨晚上打开柜子,看着里面躺着去年买的?面具,前年买的?面具,大前年买的?,?,?……突然有一个大胆的想法:

要是所有凶恶的脸,用 CV 给合成为一张量,是不是就能出现一张独一无二、天下第一凶恶的脸呢?

缘,妙不可言。

咱们的特约作者李烨老师还真就有一篇 OpenCV + dlib + Caffe 合成人脸的文章。

顺便推荐一下 Google 的万圣节 Doodle 对战小游戏,可以和网友 battle。下面是禅师的对战视频:

全文大约2000字。读完可能需要好几首下面这首歌的时间

?

解决方案

通过 Image Morphing 技术,给定两张图片 I 和 J ,就可以叠加(或者叫做混合)I 和 J 来获得一张中间状态的图片 M。

I 和 J 的叠加由一个参数[0,1]区间内的参数 alpha 来控制。当 alpha=0时,M 就等同于 I,而 aphla=1时,M 就为 J。

换言之, M 中的每一个像素 M(x,y),都可以通过这样一个公式来得到它的值:

M(x,y) = (1 – alpha)·I(x,y) + alpha·J(x,y)

当 alpha=0.5的时候,I 和 J 就五五开,平均贡献了 M。如果 I 和 J 是两张人脸照片的话,M 自然也就成了它们的“平均脸”。

看起来好容易哦,那我们赶紧找两张照片来试试吧!就用这两张:

这两张照片alpha=0.5后直接叠加的结果是这样的:

从这张“重影图”上不难看出来,之所以这样,是因为最基本的五官都没有对齐。虽然差强人意,但还算的上比较顺利吧。接下来我们把把两个人的眼睛和嘴对齐,看看是什么效果。

对齐人脸

要想对齐两张人脸,需要建立两张照片中像素的对应关系。

对 I 中的某一个像素点(xi,yi),找到它在 J 中的对应点 (xj,yj),进一步找到 M 中这两个点叠加之后所处位置(xm,ym)。再用下面算式1(记住这个标号,后面有用)计算出 M 中对应点的像素值:

xm = (1-alpha) · xi + alpha · xj

ym = (1-alpha) · yi + alpha · yj

将上面的过程运用到整幅画每一个像素点上算式2(记住这个标号,后面有用):

M(xm,ym) = (1 – alpha)·I(xi,yi) + alpha·J(xj,yj)

接下来,可以把一张人脸分割成若干三角形的区域,叠加两张脸上对应的三角区域。

具体方法如下:

1. 获取人脸特征

我们先在每张面孔上获取68个面部基准点?。

2. Delaunay 三角剖分

在获得了68个面部基准点之后,我们结合人脸所在的矩形的四个顶点和每条边的中心点,将人脸所在的矩形分割成如下图所示的三角形的组合。

3. 基于Delaunay剖分三角形的仿射变换

得到这些Delaunay剖分三角形后,再分别对齐各个区域,对其中像素值进行平均。

使用前述的算式1,根据图像I和图像J中已经获得的76个点,在叠加的结果图像M中找到76个点(xm, ym)

从图像I中选取一个三角形 ti,在 M 中找到对应区域 tm,通过 ti 三个顶点到 tm 三个顶点的映射关系来计算 ti 到 tm 的仿射变换。同理计算出tj到tm的仿射变换。

重复这个过程,处理图像 I 中的每一个三角形,得到一个扭曲的(warped)图像 I'。用同样的方法处理图像 J,获得扭曲的图像 J'。

得到了扭曲的图像 I'和图像 J'。这两个图像就可以直接使用算式2进行叠加了。最后得到叠加结果:

叠加人脸

算式2用于叠加2张人脸,在alpha=0.5时求取的是两张脸的平均。

那么我们把算式推广一下,从图像I和图像J推广为图像I_1, I_2, I_3, ..., I_n;令 alpha=1/n;则算式2变形为如下:

M(xm,ym) = 1/n · [I_1(xi_1, yi_1) + I_2(xi_2, yi_2) + ... ... + I_n(xi_n, yi_n)]

由此,我们也就得到了n张脸的平均。

用这个方法,我们可以得到6位美国总统的平均脸:

他们平均之后的样子是这样的:

代码实现

代码下载: https://github.com/juliali/AverageFace

之前是从描述角度来讲解平均脸原理。现在,我们来看看code。

[Code -1 ] 使用dlib来进行人脸识别和人脸特征点的提取

[Code-2] 根据特征点获得Delaunay剖分三角

[Code-3] 计算仿射变换

[Code-4] 通过仿射变换扭曲Delaunay剖分三角形

区分性别

经过尝试,合成后的脸怎么看都感觉是男的。至于如何训练模型来区分性别,扫描下方二维码来获取答案吧 ?

参考资料

【1】 AverageFace 代码、模型及样例图片

【2】 FaceGenderClassification 配置文件及命令

【3】 原始的性别分类模型

【4】Delaunay三角剖分原理

原文发布于微信公众号 - 人工智能头条(AI_Thinker)

原文发表时间:2018-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

机器学习算法一览(附python和R代码)

260140
来自专栏用户2442861的专栏

深度卷积网络CNN与图像语义分割

转载请注明出处: http://xiahouzuoxin.github.io/notes/

19010
来自专栏机器学习原理

我的机器学习概率论篇排列 组合古典概率联合概率条件概率全概率公式贝叶斯公式独立事件随机变量离散型随机变量连续型随机变量期望和方差三个基本定理参数估计

前言: 概率论的理解有些抽象,掌握概率论的方法,用实际样本去无限接近真实,熟练掌握并且使用一些最基本的概念是前提,比如,均值,方差 排列 组合 计算各种...

72060
来自专栏机器之心

深度 | 从数据结构到Python实现:如何使用深度学习分析医学影像

选自Medium 作者:Taposh Dutta-Roy 机器之心编译 运用深度学习技术进行图像和视频分析,并将它们用于自动驾驶汽车、无人机等多种应用场景中已成...

83090
来自专栏量子位

Kaggle冠军告诉你,如何从卫星图像分割及识别比赛中胜出?

王小新 编译自 Kaggle 量子位 出品 | 公众号 QbitAI 在2016年12月至2017年3月期间,Kaggle网站举办了一场对英国国防科学与技术实...

79890
来自专栏机器学习ML

UdaCity-机器学习工程师-项目1:预测波士顿房价

欢迎来到机器学习工程师纳米学位的第一个项目!在此文件中,有些示例代码已经提供给你,但你还需要实现更多的功能来让项目成功运行。除非有明确要求,你无须修改任何已给出...

30250
来自专栏量子位

用Keras+TensorFlow,实现ImageNet数据集日常对象的识别

王新民 编译自 Deep Learning Sandbox博客 量子位 出品 | 公众号 QbitAI ? 在计算机视觉领域里,有3个最受欢迎且影响非常大的学术...

70080
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

      最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html         可处理...

922100
来自专栏崔庆才的专栏

自然语言处理全家福:纵览当前NLP中的任务、数据、模型与论文

组合范畴语法(CCG; Steedman, 2000)是一种高度词汇化的形式主义。Clark 和 Curran 2007 年提出的标准解析模型使用了超过 400...

85000
来自专栏新智元

谷歌等祭出图像语义理解分割神器,PS再也不用专业设计师!

不不不,这不是“找不同”,是为了让你感受一下“像素级语义分割和理解”带来的修图效果:

13620

扫码关注云+社区

领取腾讯云代金券