如何写一个简短的Python代码做一个换脸程序的详细概述.doc
《如何写一个简短的Python代码做一个换脸程序的详细概述.doc》由会员分享,可在线阅读,更多相关《如何写一个简短的Python代码做一个换脸程序的详细概述.doc(5页珍藏版)》请在三一文库上搜索。
1、如何写一个简短的Python代码做一个换脸程序的详细概述在这篇文章中将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸。这个过程分四步:检测脸部标记。旋转、缩放、平移和第二张图片,以配合第一步。调整第二张图片的色彩平衡,以适配第一张图片。把第二张图像的特性混合在第一张图像中。1.使用dlib提取面部标记该脚本使用dlib的 Python 绑定来提取面部标记(landmark landmark主要是把人脸的那些关键点定位好,就可以大概确定人脸的角度偏移等信息,以便接下来的人脸对准之类的操作。):关于dlib配置步骤,建议大家百度一下,这里不在赘述。
2、Dlib 实现了 Vahid Kazemi 和 Josephine Sullivan 的使用回归树一毫秒脸部对准论文中的算法。算法本身非常复杂,但dlib接口使用起来非常简单:PREDICTOR_PATH = /home/matt/dlib-18.16/shape_predictor_68_face_landmarks.datdetector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(PREDICTOR_PATH)def get_landmarks(im): rects = detector(im, 1
3、) if len(rects) 1: raise TooManyFaces if len(rects) = 0: raise NoFaces return numpy.matrix(p.x, p.y for p in predictor(im, rects0).parts()get_landmarks()函数将一个图像转化成numpy数组,并返回一个682元素矩阵,输入图像的每个特征点对应每行的一个x,y坐标。特征提取器(predictor)需要一个粗糙的边界框作为算法输入,由一个传统的能返回一个矩形列表的人脸检测器(detector)提供,其每个矩形列表在图像中对应一个脸。2.用 Procr
4、ustes 分析调整脸部现在我们已经有了两个标记矩阵,每行有一组坐标对应一个特定的面部特征(如第30行的坐标对应于鼻头)。我们现在要解决如何旋转、翻译和缩放第一个向量,使它们尽可能适配第二个向量的点。一个想法是可以用相同的变换在第一个图像上覆盖第二个图像。将这个问题数学化,寻找T,s和R,使得下面这个表达式:结果最小,其中R是个22正交矩阵,s是标量,T是二维向量,pi和qi是上面标记矩阵的行。事实证明,这类问题可以用“常规 Procrustes 分析法”解决:def transformation_from_points(points1, points2): points1 = points1
5、.astype(numpy.float64) points2 = points2.astype(numpy.float64) c1 = numpy.mean(points1, axis=0) c2 = numpy.mean(points2, axis=0) points1 -= c1 points2 -= c2 s1 = numpy.std(points1) s2 = numpy.std(points2) points1 /= s1 points2 /= s2 U, S, Vt = numpy.linalg.svd(points1.T * points2) R = (U * Vt).T ret
6、urn numpy.vstack(numpy.hstack(s2 / s1) * R, c2.T - (s2 / s1) * R * c1.T), numpy.matrix(0., 0., 1.)代码实现了这几步:1.将输入矩阵转换为浮点数。这是后续操作的基础。2.每一个点集减去它的矩心。一旦为点集找到了一个最佳的缩放和旋转方法,这两个矩心c1和c2就可以用来找到完整的解决方案。3.同样,每一个点集除以它的标准偏差。这会消除组件缩放偏差的问题。4.使用奇异值分解计算旋转部分。可以在维基百科上看到关于解决正交 Procrustes 问题的细节。5.利用仿射变换矩阵返回完整的转化。其结果可以插入
7、OpenCV 的cv2.warpAffine函数,将图像二映射到图像一:def warp_im(im, M, dshape): output_im = numpy.zeros(dshape, dtype=im.dtype) cv2.warpAffine(im, M:2, (dshape1, dshape0), dst=output_im, borderMode=cv2.BORDER_TRANSPARENT, flags=cv2.WARP_INVERSE_MAP) return output_im对齐结果如下:3.校正第二张图像的颜色如果我们试图直接覆盖面部特征,很快会看到这个问题:这个问题是两
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 一个 简短 Python 代码 程序 详细 概述
链接地址:https://www.31doc.com/p-3421723.html