首页 > 编程知识 正文

微软faceswap,去演-Ai换脸变脸

时间:2023-05-04 17:04:22 阅读:12788 作者:1079

整个程序的思想分为以下几个部分,

)1)使用Dlib进行人脸检测和68个关键点的定位

这里使用的是ERT方法,来源于论文onemillisecondfacealignmentwithanensembleofregressiontrees,是一种比较古老的方法。 但是有效果。

)2)进行旋转、缩放、平移等变换,即aligement操作,使第2图与原图一致

在此使用了通式变换(Ordinary Procrustes Analysis ),但最终使变换过程最小化,以满足以下公式。 简单来说,第一个图的68个点经过仿射变换(warp_affine ),到第二个图的68个点的距离最小。

其中,r是2*2的旋转变换矩阵,s是线性定标矩阵,t是二维平移向量,p、q分别是在上面计算的两个人的68点。

那么,现在已经只有两幅图的68个点了。 怎么解上面的s、r、t呢? 这里使用奇异值SVD分解(Singular Value Decomposition )求出r。

u,s,vt=numpy.Lina LG.SVD (points1. t * points2) r=) u*vt ).t最终返回到变换矩阵

return numpy.v stack ([ numpy.h stack ) () S2/S1 ) * R,C2.t-(S2/S1 ) *C1.t ) ],numpy.matrix )0.

)3)将第二张图的颜色与第一张图相匹配

如果将第二张图直接重叠在第一张图上,可以看到在边缘处两人的肤色和关怀等有明显的差异。 该过程使用“颜色平衡”(RGB scaling colour-correction )方法。 这里主要对图像1、2进行cjdxn滤波,生成cjdxn滤波后的1、2图像

其中cjdxn核的选择是关键,太小的话第一张图的特征会显示在第二张图上,太大的话脸部以外的区域会被第二张图覆盖。 这里将瞳孔距离增加0.6倍。

im1_blur=cv2.Gaussianblur(im1,(blur_amount,blur_amount ),0 ) im2_blur=cv2.Gaussianblur ) im2, ) ) ) cv2.Gausianblur ) )0) avoid divide-by-zero errors.im2 _ blur=128 * (im2 _ blur=1.0 ) return (im2.aro

这里主要生成蒙版,用该蒙版进行图像融合,在蒙版为1处进行图像2的融合,在蒙版为1处进行图像1的融合,在蒙版为0-1之间进行融合。

蒙版生成的思路是:首先从脸部关键点生成一个凸包,然后抽取凸包中的像素,进行cjdxn滤波生成蒙版,然后对一两幅图的蒙版进行最大操作生成最终的蒙版。

最终用一个alpha变换,用两个图像最终生成想要的结果。

output _ im=im1 * (1.0-combined _ mask ) warped _ corrected _ im2 * combined _ mask当然这没有网上H5的效果,但基本上类型是

实验效果如下,第一张是变换后的图,第二张是原图。

参考:

https://github.com/blddb/faceswap

3358 bl DDB.github.io/2015/07/28 /交换- eds-with-python /

3359 github.com/hrastnik/face swap

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。