腾讯游戏开发精粹Ⅱ——捏脸系统(阅读笔记)

一: 捏脸系统

2D游戏:角色的个性化设定通过修改贴图来实现,不同部位的贴图存在图层前后关系。
3D游戏:通过网格与贴图的方式来实现。
常见的角色个性化设定由两种方式:

  1. 模板选择方式;
    优点:模板都是预先制作的,效果可控,美观。
    缺点:需要花费大量时间生成足够多的模板。
  2. 自由调整方式;
    优点:提供具有物理含义的滑条,关键点的拖拽等以达到改变模型的效果。使得可以生成的个性化角色数量大幅增加,减少人工生成模板的成本。
    缺点:对于没有美术功底的普通玩家,通过滑条或关键点的调整很难达到满意的细微的人脸变化。因此,自动捏脸成为了很多游戏中的关键模块。

目前,行业中的自动捏脸系统主要有以下几方面的问题:

  1. 仅能适用于真实系的游戏,现有的系统采用将真实人脸的特征直接迁移到游戏人脸中的方法,保证两张人脸的类似,无法适用于风格变化较大的卡通系游戏。
  2. 现有的系统需要对游戏引擎进行模拟或对真实人脸进行全脸建模,计算复杂度较高。
  3. 现有的系统模块耦合度较高,对于不同游戏的部署需要进行算法及系统方面的较大调整。

二. 基于照片的角色捏脸流程

  1. 输入照片,检测其中主要的人脸,同时进行发型分类和眼镜检测。
  2. 在检测到的人脸区域,进一步进行关键点检测。对原始照片中的关键点进行预处理,已达到归一,对称,平滑的效果。
  3. 根据游戏风格,对人脸关键点进行调整。
  4. 得到风格化的关键点后,将其转化为游戏中模型的控制参数。
    在这里插入图片描述

1. 基于关键点的人脸表示方法

脸部特征一般分为形状特征和颜色特征。
业内比较成熟的表示方式是使用关键点信息表示脸部特征。关键点越多,表示能力越强。但是自动捏脸需要对定义的关键点的3D信息进行估计,关键点越多,预测难度越大。

2. 人脸关键点检测

  1. 基于深度学习(CNN)的人脸检测。
    可以在更加难以识别的照片中检测到人脸,如人脸朝向较偏,光照阴影干扰较大的情况。
    需要使用GPU进行推理,否则检测速度较慢,尤其对于较大的图片。
  2. 基于图像特征(HoG)的人脸检测。

基于卷积神经网络(CNN)的3D人脸重建和人脸关键点检测方法,大体上可以分为两类:

1. 基于3D Morphable Model (3DMM)的方法。
使用CNN来预测3DMM系数或3D形变,根据单张2D人脸照片来复原人脸3D信息,从而进行密集的关键点检测或人脸3D重建。
这类方法效果受限于人脸模型或模板定义的模型空间,重建的3D人脸往往过于接近模板而较少保留重建对象人脸的特征。
这类方法使用CNN预测3DMM系数后需要调用模型基得到3D人脸三角面片模型,还需要使用透视投影和3D非线性形变等计算。增加了3D人脸重建的计算开销,不符合实时性高的计算要求。
2. 跳过3DMM,用端到端的网络直接根据2D人脸照片重建3D人脸模型。
其中,Adrian Bulat等通过训练一个复杂的神经网络来回归68个人脸2D关键点,用另一个网络去估计关键点的深度。
Aaron Jackson等提出了用体素来表征3D人脸,在一个网络中用2D人脸照片来回归预测体素表达。这种体素把人脸网格3D模型转化为一个3D立方体,有很多冗余,几千个顶点的人脸网格3D模型转化成3D立方体后,数据量要增加一个数量级。为了减少数据量,需要牺牲分辨率来减少3D立方体的大小。并且,用于回归这种体素表达的网络很复杂。

基于人脸模型的方法保留了关键点的语义信息但是受限于模型空间;
无模型/数据驱动的方法(Model-Free)不受模型限制,虽在性能上略有优势,但不能保留图像上的语义信息。

近年来,出现了第三类方法:使用无模型的方法重建3D人脸且保留关键点信息。此方法提出了同时预测密集关键点和3D人脸重建的CNN框架,多个公共数据集显示该方法优于同类算法。

学术界人脸关键点检测的标准是68个关键点。但是对于VR/AR或人脸卡通化的应用,68个关键点往往不能准确的捕捉人脸的细节和特征(眉毛的厚度,眼角的形状等)。
下图为96个关键点的示例参照图:
在这里插入图片描述

3. 人脸关键点风格化调整

检测得到人脸关键点后,由于真实人脸的视角可能未必正对摄像头,并且存在左右不对称,关键点检测误差等问题,需要程序对检测结果进行一定的预处理。

预处理过程分为:

  1. 关键点归一化
  2. 关键点对称化
  3. 关键点平滑
    在这里插入图片描述
1. 关键点归一化

为了确保真实人脸和游戏中标准人脸模型的关键点在尺度,位置,方向等方面统一。
具体包含以下部分:

  1. 尺度归一化
  2. 位置归一化
  3. 角度归一化

归一化的原点定为1号和17号关键点的中点。定义1号和17号关键点距原点的距离均为1。由此得到尺度归一化和位置归一化的关键点。之后需要将偏移的人脸转正,依次将预测的人脸关键点沿x,y,z坐标轴进行旋转。
沿x轴旋转时,将18号与24号关键点的z坐标对齐,让鼻梁上端与鼻子下端处于同一深度,得到旋转矩阵 R x Rx Rx
沿y轴旋转时,将1号与17号关键点的z坐标对齐,得到旋转矩阵 R y Ry Ry;
沿z轴旋转时,将1号与17号关键点的y坐标对齐,得到旋转矩阵 R z Rz Rz;
这样就可以将关键点的方向对齐,并得到归一化的关键点。

2. 关键点对称化

真实人脸由于表情或本身的特征并不会完美对称,而游戏中人脸模型不对称会导致不美观,因此需要关键点对称化。

一个简单的对称化方法就是将所有左右对称的关键点的y,z坐标取平均,代替原有的y,z坐标。
这种方法在多数情况下效果良好,但当人脸在y轴方向上旋转的角度较大时,会对效果造成一定的影响。

当人脸偏转角度较大时,可能部分眉毛不可见,同时透视会造成眼睛一大一小。虽然预测的关键点可以弥补透视造成的影响,但是仍需要保持3D关键点的2D投影与照片上的关键点对应,会出现明显的双眼,双眉不同的情况。
对于这种情况,自动捏脸系统使用靠近镜头一侧的眼睛与眉毛作为主眼,主眉,并将其镜像复制到另一侧以减小角度偏转造成的误差。

3. 关键点平滑化

预测误差不可避免,很可能会出现脸部凹陷,眉毛锯齿状等。人与人之间的脸型及五官的形状差别较大,使用预定义的参数化曲线很难达到相对准确的描述。因此,在平滑化时,程序仅对部分区域进行平滑:人脸轮廓,眼睛,眉毛,下嘴唇,这些区域基本都保持了曲线的单调平滑特征,即不存在锯齿状的情况。

归一化模块要对检测的边界逐个检查关键点是否满足凸曲线/凹曲线的定义。
通过判断关键点是在相邻两点连线的上方还是下方。
在这里插入图片描述

4. 关键点风格化

不同游戏有不同的人脸风格,自动捏脸系统需要将真实人脸的关键点风格转化为游戏所需的风格才能生成游戏中的人脸。
真实系的游戏人脸大同小异,但卡通系的人脸千差万别。关键点风格化很难有统一的标准。

4. 基于关键点的网格变形

1. 基础模型处理和标记3D关键点

基础头模一般是有脸,眼睛,睫毛,牙齿,头发等多个部分组合而成的。
在没有骨骼的情况下,脸部变形依赖的是基础网格的连接结构,需要对复合的基础头模进行拆分,变形的主体是脸部依托的连通模型,其他的附件则依赖脸部模型的变形结果进行调整。

目前业界并不存在自动标注任意3D头模关键点的方法,需要人工进行标注关键点。为了消除误差,可以把基础模型渲染成图片进行检测,统计出误差。

2. 网格自动变形

网格自动变形的主要思路是把关键点驱动的形变问题转化为二次项函数优化问题,即求解一个线性偏微分方程组。

1. 双调和变形
2. 仿射变形
3. 网格变形结果

仿射变形可以通过调整四种约束条件的权重达到不同的变形效果,包括逼近拟合双调和变形的效果。
仿射变形相比于双调和变形拥有更大的自由度。但是双调和变形相比于仿射变形有更快的计算速度。

5. 骨骼参数估计

通过一个神经网络来实现从关键点到参数的转换,该神经网络称为K2P网络。一般情况下,参数于关键点的数目都不多(一般小于100),所以网络采用K层全连接网络。

6.图像特征提取

为了在保持美观的同时使得游戏中形象的贴图更加符合用户特征,很多游戏会根据用户照片中的图像特征对标准贴图进行调整。

图像特征提取的两种思路:

  1. 基于图像处理的方式。
    不需要训练数据,直接分析图像中的信息(如边界,颜色,纹理等)来获取希望提取的特征。算法较为轻量。
  2. 基于监督学习的范式。
    需要大量的人工标注,在运行时需要载入预训练的模型,算法相对复杂,好处是获取到的图像特征更为准确,对于较复杂的问题处理的更好。
1. 平均肤色提取

检测区域为眼部的最下方关键点为上边界,鼻子的最下方关键点为下边界,左右边界为上下边界y坐标所对应的脸部关键点的边界。
该区域可能还包含部分睫毛,鼻孔,头发等,因此,取所有像素RGB值的中位数作为最终预测的平均肤色。
在这里插入图片描述

2. 平均眉色提取

取77,78,81,82号关键点组成的绿色区域,选取的每个像素要先与平均肤色进行比较,只有区别大于一定值的像素才会被收集。最后,取收集像素RGB值的中位数作为最终的平均眉色。
在这里插入图片描述

3. 平均瞳色提取

尽可能去除睫毛,眼白,反光,以保证最终得到的多数像素来自瞳孔。
为了去除睫毛像素,需要将眼睛的关键点沿Y轴方向向内收缩一段距离,形成下图绿色折线区域。并排除眼白和反光的像素,采用中位数作为平均瞳色。
在这里插入图片描述

4. 平均唇色提取

仅检测下嘴唇区域的像素,采用中位数作为平均唇色。
在这里插入图片描述

5. 平均发色提取

可以使用神经网络进行图像的头发像素分割,但是图像分割的标注代价很大,并且对于游戏应用来说不需要非常高准确度的颜色提取。

提取区域为:下边界为两侧眉脚,矩形高度为眉毛上沿到眼睛下沿的距离,左右边界为1号,17号关键点分别向左,右扩充固定距离。

肤色阈值法: 根据平均肤色选取一个阈值进行皮肤像素检测,但是由于皮肤颜色并不止,边缘皮肤往往颜色较暗,很难选取合适的阈值。
肤色,发色两类K-Means: 将检测区域的像素进行二分类,但是对于浅色头发很容易与皮肤混淆。
连通区域法: 因为肤色的变化往往是连续的,可以选取中间像素作为起点,向左右两侧检测皮肤像素,将肤色的渐变考虑进来,可以得到相对准确的结果。
在这里插入图片描述

6. 平均眼影颜色提取

将亮度低于一定阈值的像素排除(睫毛影响),检测每个像素的色相与平均肤色的差别(肤色区分)。
使用色相而不是RGB做检测,是因为色相对于亮度的变化不敏感,眼睛上方的皮肤颜色可能在亮度上有较大变化。
在这里插入图片描述

7. 将常用的RGB颜色模型转为HSV颜色模型

7. 发型分类

使用深度学习方法训练分类模型来进行预测。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值