基于C#实现的TPS和B样条人脸变形系统

Expiredlove

发布日期: 2019-04-17 14:49:59 浏览量: 368
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 需求分析

人脸变形即,在引导图的面部 68 个关键点的引导下,将源图的面容进行扭曲变形,使得得到的图片的人脸的关键点特征与导引图的关键点特征相似。

由于该变形过程无法用显式的数学公式进行表达,在变形上存在一定的难度。而我们的需求是将源图的关键点坐标的位置映射到导引图的关键点坐标的位置,同时也要将关键点坐标附近的像素坐标也映射过去。由于映射之后得到的坐标点不是整数,所以需要进行插值。为此,可以采用两个常见的变形函数,即 B 样条变形和 TPS 变形。

在本报告中,规定源图为待变形图,导引图为将源图的关键点特征变换成的目标的图片,生成图即变形后的图片。如将特朗普的脸的特征换成梁静茹的儿子 Anderson 的脸,源图为特朗普,导引图为 Anderson。

2 TPS 变形

2.1 方案设计

首先将导引图的关键点经平移、放大、旋转等操作进行仿射变换以变换到源图的关键点的位置,进行粗对齐。之后以导引图的关键点为控制点,源图的关键点为目标点,进行 TPS 求解即得到变形之后的图像。

2.2 方案基本原理

2.2.1 仿射变换参数拟合

仿射变换是最常用的空间坐标变换之一,其形式如下。

通过仿射变换拟合参数之后,坐标点进行了尺度、旋转、平移或偏移。对参数进行最小二乘法拟合,在进行仿射变换之后,将源图和导引图的人脸进行粗对齐,便于后续 TPS 操作。

2.2.2 TPS 变形

TPS(Thin plate spline) 是一种常见的插值模型,目标是寻找一个通过所有控制点的光滑曲面f(x, y),使得能量函数 If 最小,且该问题有解析解。

TPS 求解,给定 n 个控制点 P1 = (x1, y1), …, Pn = (xn, yn),记矩阵 K,P,L 分别为

假定目标点为 P′1 = (x′1, y′1), …, P′n = (x′n, y′n),记矩阵 V,Y 为

其中 U(r) 为径向基函数,即 U(r) = r2log(r2) r ̸= 0,r 为坐标点之间的距离。任意一点的坐标为

其中,a1, ax, ay, ω 为线性方程组 L[ω1, …, ωn, a1, ax, ay]T = Y 的解。

2.2.3 具体实现

控制点为导引图的 68 个关键点,目标点为源图的 68 个关键点,即 Pi 为导引图的关键点,P′i为源图的关键点,注意导引图的关键点要带入仿射变换之后的坐标。带入方程计算求解再进行插值即得到变形后的图片。

3 B 样条变形

3.1 方案设计

首先将导引图的关键点经平移、放大、旋转等操作进行仿射变换以变换到源图的关键点位置以进行粗对齐。之后通过使用三次 B 样条扭曲进行人脸变形,即得到变换之后的结果。其中,网格点的移动受控制点影响,姑且将权重全部设为 1,之后再使用梯度下降方法以求得每一个网格点的位移权重,得到使得 Loss 较小的权重,用该组参数进行变形即得到目标图片。

3.2 方案基本原理

3.2.1 B 样条变形

给定 m+n+1 个平面或空间 Pi(i = 0, 1, …, m + n),称 n 次参数曲线段:

为第 k 段 n 次 B 样条曲线段 k = 0, 1, 2, …, m,这些曲线段的全体称为 n 次 B 样条曲线,其顶点Pi(i = 0, 1, …, n + m) 所组成的多边形称为 B 样条曲线的特征多边形。其中 Gi,n(t) 称为基函数。项目主要使用的是三次 B 样条曲线的基函数。

三次 B 样条曲线基函数:

其中,t ∈ [0, 1]。

三次 B 样条扭曲 B 样条扭曲由网格点的位移影响其附近图像的变形。三次 B 样条扭曲中,任一点的位移由距其最近的 16 个网格点的位移决定。设图中某一点的的坐标为 (x, y),设网格大小为N,则有

其中,坐标 (xi, yi) 为网格点 Pxi,xj 的坐标。根据这一原则将图片建立起网格点坐标系,则可以得到点 (x, y) 的位移为

3.2.2 梯度下降法

梯度下降的主要思想为:开始时随机选取一个参数的组合,即 (θ1, θ2, …, θn),计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合,不断迭代后得到一个局部最小值。

这里为了得到较好的网格点位移权重,故采用梯度下降法。定义 Loss 函数为

其中,m 为脸部关键点个数 (一般取 68),n 为网格点个数。s(·) 表示的是点的位移,θ 表示的是网格点位移权重。设学习率为 α,每次迭代进行参数的同步更新,即

当迭代到一定次数或 Loss 函数的值小于某个阈值的时候梯度下降停止。

要注意学习率 α 的选取:如果 α 太大,则梯度下降法可能会越过最低点,甚至可能无法收敛,即移动步数很大导致每次更新都越过最低点,离最低点越来越远;如果 α 太小,梯度下降可能会很慢。这里默认学习率为 0.001,且为了避免无法收敛的情况,在具有发散的趋势时,将当前学习率减半,以保证最终代价函数能够收敛。

3.2.3 具体实现

先定义三类点,即控制点、网格点、任一点。控制点即为脸部的 68 个关键点,网格点定义见上文,任一点即变换后的图像上的每一个点。现在所需要做的,首先建立好网格坐标,之后根据控制点的位移计算每个控制点周围的 16 个点的位移偏差。即遍历 68 个关键点,周围的每个网格点以 1 的权重进行分别求和。由于权重为 1,故每个网格点的位移的权重需要进行调整,故对所有网格点设一个位移权重,采用梯度下降法进行求解。设 X,Y 方向的学习率均为 0.001,初始化权重均为 0.05。

4 68个关键点检测

使用 C# 的 Dlib 库运用机器学习进行关键点检测1。在加载已经训练好的模型后,检测即可得到 68 个关键点。通过与附件中给定的 9 张图的关键点坐标相对比,相差较小。

5 插值原理

5.1 最近邻插值

将变换后的图像中的元像素点最近邻像素的灰度值赋给原像素点的方法,是最简单的灰度值插值,即将非整点的坐标四舍五入,不够精确。

5.2 双线性插值

图像中任意一点的像素值由它周围四个点的像素值确定,具体关系为

双线性插值相对简便,速度相对较快。但是双线性灰度插值的平滑作用可能使得图像的细节产生退化,这种现象在进行图像放大时尤其明显。

5.3 双三次插值

图像中任意一点的像素由它周围 16 个点的像素确定,具体关系为

其中,矩阵 A、B、C 分别为

S(·) 为

双三次插值通常能够产生较好的效果,最精确的插补图形,能够创造出比双线性插值更平滑的图像边缘。但是它的速度几乎是最慢的。

6 实现效果

6.1 运行界面

用户可以根据需要对变形方式进行选择 (TPS/BSpline),对三种插值方式进行选择。同时对于关键点信息的载入,用户可以选择读入外部数据或者选择自动识别。同时,为了防止用户操作上的失误,设置只有在用户载入图片之后才能上载关键点信息,二者均完成后才能开始进行变形。

6.2 不同变形模式下的运行效果

6.2.1 TPS 变形

上图即为 TPS 变形的效果。由于 TPS 的原理,故在变形之后会出现没有信息的部分,对于该部分的处理为忽略。之前考虑用最边缘的像素值进行 padding,但是由于本身就缺乏该部分信息,进行 padding 之后图像会变得很奇怪。

6.2.2 B 样条变形

在进行 20 次梯度下降之后,得到变形后的图片。由于 B 样条只对局部进行处理,所以背景上没有缺失信息的部分。如这张图,奥巴马的眼睛变大。

6.3 不同插值方式下的变形效果

以奥巴马的脸特征换成 Anderson 为例,使用 TPS 变形方式。大图见 figure 文件夹。由于看小图无法感受到插值效果的不同,故将图片放大 5 倍对比奥巴马的右眼。

6.3.1 最近邻插值

6.3.2 双线性插值

6.3.3 双三次插值

6.3.4 三种插值方式效果对比

由对比图可以看到,最近邻插值的效果最差,双线性和双三次插值的效果要好于最近邻插值。除此之外,双三次插值的图像边缘要比双线性平滑,即双线性插值可能会对图像产生稍微模糊的效果。

6.4 自行检测关键点并进行变形

在实现自行检测 68 个关键点之后,可以对想要被变形的图片进行变形。下图尝试“王校长”的变形,68 个关键点等在检测结束后自行显示在图片上。在识别关键点之后,可以得到变形后的图片。

可以看到,变形后的“王校长”更符合图片的配字。

识别算法可以识别这种通过人脸制作的表情包。

7 误差分析

7.1 观测误差与舍入误差

对于观测误差,由于图片的 RGB 值是 uint8 类型,所以观测误差最大为 0.5。

工程中多出使用 C# 的 double 类型,精度为 15 位有效数字,故中间过程的舍入误差相对较小,可以忽略。而在对 Bitmap 的 RGB 赋值时,将 double 类型转换为 0 255 的 uint8,舍入误差最大为 0.5。而对于这三种插值,其实质为周围 4 个或 16 个点的线性组合,且线性组合的系数为 1。

综上,观测误差的最大值为 0.5,舍入误差的最大值为 0.5。

7.2 方法误差 (插值)

7.2.1 最近邻插值

由坐标的舍入误差可以得到,|∆x| ≤ 0.5, |∆y| ≤ 0.5,所以最近邻的方法误差为

由于数字图像为离散信号,故将微分换位差分。假定,f(x, y) 在 x 方向和 y 方向上的一阶导数存在且有界为 Mx1, My1。则显然,在物体边缘等变化较大的区域,Mx1, My1 比较大,其他区域非常小。所以,x 方向和 y 方向的方法误差最大为 0.5Mx1, 0.5My1,总方法误差为 0.5(Mx1 + My1)。

7.2.2 双线性插值

假定,f(x, y) 在 x 方向和 y 方向上的二阶导数存在且有界 Mx2, My2。先考虑 x 分量的插值,即考虑 y = j 与 y = j + 1 方向的插值。每个直线方向上的插值为一维插值,故可以得到每条直线的插值误差为

再将得到的插值后的两点进行 y 分量的插值,即考虑 x = x0 方向的插值,且同为一维插值,故可以得到插值误差为

综上,总的方法误差为

7.2.3 双三次插值

假定,f(x, y) 在 x 方向和 y 方向上的四阶导数存在且有界 Mx4, My4。若直接按照分析双线性插值对双三次插值误差进行分析,则很容易得到总的方法误差为

考虑双三次插值的另一种形式。具体如下

其中,参数矩阵可以表示为

其中,矩阵 P 和矩阵 F 分别为

记 Px, Py 矩阵如下

则有

根据这个形式可以得知,双三次插值即可以等价位,先做 y 方向的三次埃尔米特插值,再做 x 方向的三次埃尔米特插值,即与双线性插值分解方法类似。则误差为

而在求取导数的过程中同样存在着误差。由于离散情况下,需要使用差分来代替导数,考虑使用中心差分来近似一阶导数。具体形式如下,这里 h 取 1。

在这里,有

不妨先考虑 x 方向,则易知存在 x∗ ∈ [x − 1, x + 1] 使得 fx(x) = f′(x∗)。假定 f(x, y) 的二阶导数存在且有界 Mx2, My2。所以有

y 方向同理。所以由于使用差分来代替导数造成的误差为 Mx2 + My2。双三次插值总的方法误差为二者相同时考虑。

7.3 方法误差 (变形)

7.3.1 最小二乘拟合

最小二乘参数拟合使用了高斯消元法进行求解,具体分析见下。

7.3.2 TPS 变形

高斯消元法 线性方程组 L[ω1, …, ωn, a1, ax, ay]T = Y 求解时应用了高斯消元法。由定理,若 A 是非奇异阵,Ax = b ̸= 0,且 A(x + δx) = b + δb,则有

高斯消元误差的上界即为 ∥A−1∥ ∥A∥, 经过 Matlab 辅助计算,所给定的 9 份数据点 (最小二乘法拟合后) 的所构成的矩阵 L 不是病态矩阵。但是由于水平有限,无法进行更详细的分析。

除此之外,舍入误差与观测误差没有被放大,几乎无影响。

7.3.3 B 样条变形

梯度下降法 迭代次数限制在 20 次时,根据当前实现的算法,代价函数 (均方误差) 的区间为(0,40)。

而当参数最佳时,均方误差为 E(E ≥ 0),故梯度下降法的均方误差为 (0, 40)。

8 其他相关说明

8.1 TPS 与 B 样条的对比

通过视觉效果来看,TPS 是针对全局进行变形,而 B 样条是对局部进行变形,所以论全局观赏效果的话,B 样条占优势。但是显而易见 TPS 的变形效果要比 B 样条更明显。除此之外,B 样条的计算时间要比 TPS 少一些。

8.2 问题与解决

8.2.1 关于线性方程组求解的误差分析

由于自身能力有限,关于高斯消元法部分的误差分析在稍微自学课本后面的内容之后,仍是无法进行更具体的分析。我感觉可能无法去分析得更具体,即若分析误差上界,可能实际值要远小于该误差上界,故或许需要一个条件更强的分析高斯消元误差的方法。

8.2.2 关于 LOSS 函数的选取

LOSS 函数的选取本着网格点与移动点的位移关系设计,但事实证明若 LOSS 函数趋于 0 所得到的变形并不是最优的,猜测设计的 LOSS 函数的条件不够强。为了解决这种情况,将迭代次数固定。

8.2.3 关于图片中有多个人

68 个关键点检测算法是先对人脸进行识别,再载入模型进行检测关键点。如果图片中有多个人,则默认人脸为所检测的最后一个人脸。

8.2.4 关于侧脸和歪脸的处理

变换最好的效果就是正脸源图和正脸导引图。如果有歪脸,即头正,则通过仿射变换最小二乘,已经进行旋转,故效果较好。但是对于侧脸,比如梁静茹和特朗普的另一张照片,变换之后的图像为了模仿导引图的特征,脸会歪,但是这是正确的输出结果。同时由于没有露出的脸部的信息未知,所以无法对未知的信息进行填补。

8.3 程序运行所需环境

程序使用 VS2017 进行开发,使用的语言为 C#,电脑分辨率为 1366×768。

8.4 总结与反思

本次大作业,让我慢慢地了解并应用了 C# 语言,并让我体会到了它的优点所在。除此之外,对插值的理解更加深刻。而对于图像的变形上,我感受到了 TPS 变形与 B 样条变形之间的差异。TPS相对来讲实现简单,但是对全局进行操作导致背景出现黑色部分;而 B 样条可以对局部进行调整,但是调整效果并没有 TPS 那么明显,各有利弊。以及由于还有其他几个大作业,关于 B 样条还有一些升级的思路,但是由于时间关系没有付诸实践。除此之外,由于时间关系,没有对界面进行美化,保持着原始的朴素。

此外,在逐渐完成大作业的过程中,我发现我之前将换脸和脸部变形的概念混淆。本次大作业完成的只是根据导引图关键点特征对源图进行变形,生成图片的像素值采自源图,所以无法实现换脸的效果。

上传的附件 cloud_download 基于C#实现的TPS和B样条人脸变形系统.7z ( 8.03mb, 5次下载 )
error_outline 下载需要15点积分

发送私信

你最美丽的时光陪我度过那些年

5
文章数
5
评论数
最近文章
eject