平均脸
均和脸
均衡脸
就是很多人的脸合成一个综合的脸。
在本教程中,我们将学习如何使用 OpenCV (C++/Python) 创建平均脸。
大多数人都会认为图 1 中的女人很漂亮。你能猜出她的种族吗?为什么她的皮肤完美无瑕?好吧,她不是真实的。她也不是完全虚拟的。她的脸是 2011 年左右在我的公司 Sight Commerce Inc. 工作的所有女性员工的平均脸。很难确定她的种族,因为由于我们出色的多元化记录,她一半是白人,一半是西班牙裔,一半是白人。亚洲血统和印度血统!
人脸平均的历史非常有趣。
这一切都始于弗朗西斯·高尔顿(查尔斯·达尔文的表弟),早在 1878 年,他就发明了一种通过对齐眼睛来合成脸部的新摄影技术。他认为,通过对罪犯的面部进行平均,他可以创建典型的犯罪面部,这反过来又有助于根据某人的面部特征预测其是否是罪犯。结果证明他的假设是错误的。你无法通过看一个人的照片来判断他是否是罪犯。
然而,他指出,平均面孔总是比平均面孔更有吸引力。
20 世纪 90 年代的几位研究人员表明,人们发现平均面部比个人面部更有吸引力。在一项有趣的实验中,研究人员对 22 名 2002 年德国小姐决赛入围者的面孔进行了平均。人们认为平均面孔比 22 名参赛者中的每一位都更具吸引力,其中包括赢得比赛的柏林小姐。哎哟! 原来杰西卡阿尔芭的脸之所以吸引人,正是因为她的脸接近平均水平!
根据定义,平均值不应该是平庸的吗?为什么我们觉得普通的脸很有吸引力?根据一种名为“恋偶癖”的进化假说,有性繁殖的动物会寻找具有平均特征的伴侣,因为与平均特征的偏差可能表明不利的突变。平均脸也是对称的,因为脸的左侧和右侧的变化被平均化了。
如何使用 OpenCV 创建平均脸?
这篇文章是一系列内容的一部分,其中包括面部标志检测、Delaunay 三角测量、面部变形和面部交换。我们以之前的文章中介绍的一些概念为基础。事实上,面部平均在理论上与面部变形没有什么不同。
下面描述给定一组面部图像生成平均面部的步骤。我们不对图像的大小或图像中面部的大小做出任何假设。
步骤1:面部特征检测
对于每张面部图像,我们使用 dlib 计算 68 个面部标志。有关安装和使用 dlib 的详细信息可以在我关于面部特征检测的帖子中找到。左图显示了68个地标点。
第二步:坐标变换
输入的面部图像的尺寸可能非常不同。因此,我们需要一种方法来规范化面部并将它们带到相同的参考系。为了实现这一点,我们将面部扭曲为 600×600 图像,使得左眼的左眼角位于像素位置 ( 180, 200 ),右眼的右眼角位于像素位置 ( 420, 200 )。我们将该坐标系称为输出坐标系 ,将原始图像的坐标称为输入坐标系。
以上几点是如何选择的?我想确保这些点位于水平线上,并且脸部的中心位置距图像顶部大约三分之一的高度。所以我选择眼角位于 ( 0.3 x width, height / 3 ) 和 ( 0.7 x width, height / 3 )。
我们还知道原始图像中眼角的位置;它们分别是地标 36 和 45。因此,我们可以计算相似变换(旋转、平移和缩放),将点从输入坐标系变换到输出坐标系。
什么是相似变换?相似变换是一个 2×3 矩阵,可用于变换点的位置
或整个图像。该矩阵的前两列编码旋转和缩放,最后一列编码平移(即移位)。假设您想要变换(移动)正方形的四个角,以便正方形在 x 和 y 方向上缩放
和
分别。同时旋转一个角度
,并翻译(移动)为
和
在 x 和 y 方向上。其相似变换可以写为
给定一点
,上述相似变换,将其移动到点
使用下面给出的等式
为了找到将点从输入图像坐标变换到输出图像坐标的相似变换,我们可以使用estimateRigidTransform
C++
1234 | // inPts and outPts are Vectors of points. // The last parameter indicates we do not want a similarity // transform and not a full affine transform. cv::estimateRigidTransform(inPts, outPts, false ); |
Python
1234 | # inPts and outPts are numpy arrays of tuples # The last parameter indicates we do not want a similarity # transform and not a full affine transform. cv2.estimateRigidTransform(inPts, outPts, False ); |
不过有一个小问题。OpenCV 要求您提供至少 3 个点对。这是愚蠢的,因为您可以仅使用两个点来计算相似变换。好消息是,我们可以简单地想象第三个点,使其与两个已知点形成一个等边三角形,然后使用estimateRigidTransform,就好像我们有三个点对一样。
一旦计算出相似变换,它就可以用于将输入图像和地标变换到输出坐标。图像使用warpAffine进行变换,点使用Transform进行变换。
第 3 步:面部对齐
在上一步中,我们能够将所有图像和地标转换为输出图像坐标。现在所有图像的大小相同,并且两个眼角对齐。通过对这些对齐图像的像素值进行平均来获得平均图像可能很诱人。但是,如果您这样做,您最终会得到左侧显示的图像。当然,眼睛是对齐的,但其他面部特征是错位的。
如果您是本博客的常客,您可能知道我们接下来要使用的使面部特征对齐的技巧。
如果我们知道一个输入图像中的哪个点对应于另一个输入图像中的哪个点,我们就可以轻松地完美对齐两个图像。但是,我们没有这些信息。我们只知道输入图像中 68 个对应点的位置。我们将使用这 68 个点将图像划分为三角形区域。并在平均像素值之前对齐这些区域。
您将从阅读我关于面部变形的文章中受益,了解有关此对齐过程的更多详细信息。下面是不太详细的描述。
计算平均面点
为了计算特征对齐的平均面部,我们首先需要计算输出图像坐标中所有变换后的地标的平均值。这是通过简单地平均输出图像坐标中的地标的 x 和 y 值来完成的。
计算 Delaunay 三角剖分
在上一步中,我们获得了输出图像坐标中平均人脸的标志位置。我们可以使用这 68 个点(图 6 中的蓝色部分)和输出图像边界上的 8 个点(绿色部分)来计算 Delaunay 三角剖分(红色部分)。有关 Delaunay 三角测量的更多详细信息,请参见此处。
Delaunay 三角剖分允许我们将图像分解为三角形。Delaunay 三角剖分的结果是由 76 个点(68 个面点 + 8 个边界点)数组中的点索引表示的三角形列表。在下面黄色框中显示的三角测量示例中,我们看到地标 62、68 和 60 形成一个三角形,32、50 和 49 形成另一个三角形,依此类推。三角测量示例[62 68 6032 50 4915 16 729 8 5853 35 36… ]
扭曲三角形
在上一步中,我们计算了面部标志的平均位置,并使用这些位置来计算 Delaunay 三角剖分,以将图像划分为三角形。在图 7 中,左图显示了变换后的输入图像上的 Delaunay 三角形,中间的图像显示了平均地标上的三角测量。请注意,左图中的三角形 1 对应于中图中的三角形 1。左图中三角形1的三个顶点和中图中对应的顶点可用于计算仿射变换。该仿射变换可用于将左图像中三角形 1 内的所有像素变换为中图像中的三角形 1。当对左图像中的每个三角形重复此过程时,会产生右图像。右图只是左图变形为普通脸的结果。
第 4 步:脸部平均
上一步应用于所有输入图像时,会为我们提供正确扭曲到平均图像地标坐标的图像。要计算平均图像,我们可以简单地将所有扭曲图像的像素强度相加,然后除以图像数量。图 2 显示了该平均的结果。它看起来比我们在图 5 中获得的平均值要好得多。
您认为一般总统的长相如何?很想听听您的回应。在我看来,他看起来慈父般、慈祥。
脸部平均结果
一个成功的男性科技企业家的平均面貌是怎样的?下图 8 显示了马克·扎克伯格、拉里·佩奇、埃隆·马斯克和杰夫·贝佐斯的平均面孔。对于这位普通的企业家,我找不到任何值得注意的地方,除了尽管杰夫·贝佐斯试图压低平均水平,但他仍然剩下一些头发。
奥斯卡最佳女主角得主的平均长相如何?下图 9 显示了布丽·拉尔森、朱丽安·摩尔、凯特·布兰切特和詹妮弗·劳伦斯的平均面孔。一般的好女演员看起来都很有魅力!她的牙齿也比一般企业家好。这里没有惊喜!
您还可以通过对脸部及其镜面反射进行平均来制作对称脸部。一个例子如下所示。
说明
图片来源
现任和前任总统的所有图像均属于公共领域,并可从维基百科下载。
我从 Sight Commerce Inc. 获得了使用图 1 中的图像的许可。