发布时间:2022-09-20 10:23:15
此次的事例是把pipeline形成的照片应用于3DMM,再次拟生成新的图片。
load model
3DMM的关系式:
S∈ 3 是均值人脸形状, 脸扫描仪练习获得身份基, 是人脸身份参数。是表情基, 是人脸的表情参数。这一公式计算因为我们明确199维的形状参数和29维的表情参数就可以获得一张三维模型。
bfm=MorphabelModel( 'Data/BFM/Out/BFM.mat')
这里边是采用牙买加人脸,200个人脸,
男生与女生个100个练习出的。
这一mode里有:
'shapeMU':[ 3*nver, 1]. * 当然状态下一个人脸
'shapePC':[ 3*nver, n_shape_para]. * s1,s2 有 199矩阵的特征值
'shapeEV':[n_shape_para, 1]. ~ 形状的特征根
'expMU':[ 3*nver, 1]. ~ 有均匀的表情形状,有一个人脸
'expPC':[ 3*nver, n_exp_para]. ~ 有 29个表情矩阵的特征值
'expEV':[n_exp_para, 1]. ~ 有 29个特征根
'texMU':[ 3*nver, 1]. ~ 有均值形状的纹路
'texPC':[ 3*nver, n_tex_para]. ~ 有纹路 199矩阵的特征值
'texEV':[n_tex_para, 1]. ~ 有 199纹路特征根
'tri':[ntri, 3](start from1, should sub 1inpython andc ). * 105840行三角形
'tri_mouth':[ 114, 3](start from1, asa supplement to mouth triangles). ~ 嘴 114
'kpt_ind':[ 68,](start from1). ~ 在 53215中在其中 68个是关键环节
能够看见我们将要表情的与形状数组长度;
加在一起获得一个新的。
model[ 'shapeMU']=(model[ 'shapeMU']model[ 'expMU']).astype(np. float32)
model[ 'tri']=model[ 'tri'].T. copy(order='C').astype(np. int32) - 1
#减一是以 1逐渐,从零开始
model[ 'tri_mouth']=model[ 'tri_mouth'].T. copy(order='C').astype(np. int32) - 1
# 114, 3包括嘴的三角形
# kpt ind
model[ 'kpt_ind']=(np.squeeze(model[ 'kpt_ind']) - 1).astype(np. int32)
#最原始的引索也是从 1开始, 68个引索。
generate face mesh
依据3DMM我们都知道就可以形成一张图片,我们将要所需要的参数开展随机数字乘于一个很大的数。
sp=bfm.get_shape_para( 'random') #形状
ep=bfm.get_exp_para( 'random') #表情
(-1.5,1.5)中间,
有可能会提高表情,优肯消弱表情。
在依据sp, ep的参数,
依虫草鹿鞭王批发价格据3DMM公式计算去形成人脸。
公式计算相对应的的编码
vertices=self.model[ 'shapeMU']self.model[ 'shapePC'].dot(shape_para) self.model[ 'expPC'].dot(exp_para)
vertices=np.reshape(vertices,[int( 3), int(len(vertices)/ 3)], 'F').T
colors=self.model[ 'texMU']self.model[ 'texPC'].dot(tex_para* self.model[ 'texEV'])
colors=np.reshape(colors,[int( 3), int(len(colors)/ 3)], 'F').T/ 255.
随机生成的三维人脸如下所示:
transform vertices to proper position
我们将要随机生成的三维人脸通过
s=8e-04
angles=[10, 30, 20]
t=[0, 0, 0]
这一次我邀请到了一线大厂数据工程师 Johnson,2钟头直播带大伙儿选读毕业论文,并来给大家详细分析3DMM优化算法,如今二维码支付0.1元还可以领编码数据。
二维码支付0.1元预定直播间
下播后给予教学课件&编码数据
pipepline中讲过,根据s,a,t能直接形成下面的照片左如图所示。相对应的三维模型右如图所示。这也是根据代码生成的照片。
这节详细介绍怎样通过3DMM来线性拟合形成跟输入以上照片类似一样。
编码中取下68个点进行对比。
x=projected_vertices[bfm.kpt_ind, 虫草鹿鞭王胶囊的害处 : 2]
下面必须68个点x,68个点相对应的引索。
fitted_sp, fitted_ep, fitted_s, fitted_angles, fitted_t=bfm.fit(x, X_ind, max_iter=3)
x: (n, 2) 是二维图片的座标, X_ind: 代表了 68 个点相对应的引索的三维点。 max_i
ter: 是迭代更新次数。
3.1 fit_points
进行调整
fitted_sp, fitted_ep, s, R, t=fit.fit_points(x, X_ind, self.model, n_sp=self.n_shape_para, n_ep=self.n_exp_para,max_iter=max_iter)
下面看代码:
sp=np.zeros((n_sp, 1), dtype=np.float32)
ep=np.zeros((n_ep, 1), dtype=np.float32)
shapeMU=model[ 'shapeMU'][ valid_ind, :]
shapePC=model[ 'shapePC'][ valid_ind, :n_sp]
expPC=model[ 'expPC'][ valid_ind, :n_ep]
上边的shapeMU是依据均值人脸,shapePC挑选出均值的199个包括68个关键环节的人脸,expPC挑选出29个表情包括68个关键环节的人脸。
上边的便是之前53215个点,如今变为68个点进行收集,204是68*3,3表述的是x,y,z
下面开展迭代更新:虫草鹿鞭王怎么购买
fori inrange(max_iter):
根据3DMM公式计算:
相对应的编码为:
X=shapeMU shapePC.dot(sp) expPC.dot(ep) #X.shape=(204, 1)
将(204,1)变为(3,68)
X=np.reshape(X,[int(len(X)/ 3), 3]).T
3.2 estimate_affine_matrix_3d22d
这一函数是大家要找一个转换将三维空间一个点转换到一个二维空间一个点。
X表明三维一个点,x表示二维一个点。
X=X.T; x=x. T
assert(x.shape[ 1]==X.shape[ 1])
n =x.shape[ 1]
assert(n >=4)
这里边我们应该解方程组,八个未知量,
因此n的高于或等于4才可以解出来方程。
求x的平均值,求模长均值
x=x - np.tile(mean[:, np.newaxis],[1, n])
average_norm=np.mean(np.sqrt(np.sum(x**2, 0)))
scale=np.sqrt(2) / average_norm #0.03789943607443278
为何是np.sqrt(2),
由于周长为1的等腰直角三角形的斜边
就是np.sqrt(2)
三维一个点同理可得:
我们应该求八个数,来获得二维坐标
A=np.zeros((n*2, 8), dtype=np.float32);
X_homo=np.vstack((X, np.ones((1, n)))).T
A[:n, :4]=X_homo
A[n:, 4:]=X_homo
b=np.reshape(x,[-1, 1])
X1=P1X1 P2X2 P3X3 P4
Y1=P1Y1 P2Y2 P3Y3 P4
X1=P1XZ1 P2YZ2 P3Z3 P4Z
可以使用下边的编码可获得
大家可能P引流矩阵,第一行是P8前四个数,
第二行是P8的后四个是,
第三行是0 0 0 1,
根据齐次坐标能够是x=PX
完成二维点与三维点变换。
这其中的UV是下边的这图:
这一次我邀请到了一线大厂数据工程师 Johnson,2钟头直播带大伙儿选读毕业论文,并来给大家详细分析3DMM优化算法,如今二维码支付0.1元还可以领编码数据。
二维码支付0.1元预定直播间
下播后给予教学课件&编码数据
3.3 P2sRt(P)
编码相匹配的意思是将x,y,z转动以后到x,y的纵坐标上。
关键修复S,R,T
3.4 matrix2angle(R)
一般是用R引流矩阵修复交角。
x: pitch
y: yaw
z: roll
能把旋转三个视角计算出来,
把计算出来的三个视角,
与一逐渐生成图片的视角的照片,
10,30,20,配对看看是否相同,
那样依据流程(2 再固定不动α i, βi优化s,R,t )
己经把s,r,t可能出来,
那么就会可能 αi, βi 形状参数和表情参数。
3.5 estimate shape
下面是可能
3 固定不动s,R,t,先提升βi。
编码里边是estimate_expression.
4 固定不动s,R,t,在提升α i。
编码里边是estimate_shape.
verify fitted parameters
# verify fitted parameters
fitted_vertices=bfm.generate_vertices(fitted_sp, fitted_ep)
transformed_vertices=bfm.transform(fitted_vertices, fitted_s, fitted_angles, fitted_t)
image_vertices=mesh.transform.to_image(transformed_vertices, h, w)
fitted_image=mesh.render.render_colors(image_vertices, bfm.triangles, colors, h, w)