换脸,即为使用算法将图片中的人脸替换成另一张脸。
这里我们来使用python dlib模块来实现换脸。
获取人脸特征点
首先我们需要安装dlib,安装过程请参考之前的文章,
然后,我们下载人脸的68个特征点的检测器(shape_predictor_68_face_landmarks.dat)
链接: https://share.weiyun.com/EPZZJfNs (密码:BLFc)
我们新建一个名为”model”的文件夹,将解压后的dat文件放进去。
再新建一个名为”faces”的文件夹,准备好两张都只带有一个人脸的图片,将其放进去。
编写代码,获取人脸68特征点:
1 | import cv2 |
调用get_landmark
函数即可获取人脸的特征点数据。
脸部调整
图片中的人脸可能会有不同的倾斜度和不同的位置。所以,我们需要把人脸进行调整。
1 | def transformation_from_points(points1, points2):#计算图片转化过程 |
参考 (维基百科):
正交普氏问题(Singular Value Decomposition):
https://en.wikipedia.org/wiki/Orthogonal_Procrustes_problem
仿射变换矩阵(Affine transformations):
https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
获取人脸掩模
我们可以使用一个掩模(mask)来表示人脸的位置,属于人脸的区域像素值为1,不属于人脸的区域像素值为0。
将原图片乘以掩模,就可以得到人脸,而其余区域像素值为0;
将原图片乘以1−mask
,即人脸区域会是0,其余区域会保留下来。
上面这两个结果相加,既可以实现初步的换脸。
1 | #人脸特征点器官的对应点 |
颜色校正
受到光照、肤色等因素的影响,换脸后看起来显得十分不自然。
因此我们使用高斯模糊来校正颜色:
1 | COLOUR_CORRECT_BLUR_FRAC = 0.6 |
使用im2除以im2的高斯模糊,再乘以im1来校正颜色。这种方法也只能从一定程度上校正颜色,有时反而会出现副作用。
如果太小,第一个图像的面部特征将显示在第二个图像中;反之过大,内核之外区域像素被覆盖,并发生变色。这里的内核用了一个0.6x的瞳孔距离,COLOUR_CORRECT_BLUR_FRAC
可自行调整。
进行换脸
将以上函数进行组合调用,主函数代码如下:
1 | import os,glob |
然后,我们调用此函数即可实现换脸操作。
例如faces文件夹下有两个图片1.jpg和2.jpg,调用main("1.jpg","2.jpg")
即可把1.jpg的人脸换成2.jpg中的人脸。
详细请参考Github上的https://github.com/matthewearl/faceswap 项目
如要进行视频换脸,则是进行逐帧替换,多张人脸的替换请自行完善。