3D【1】人脸重建:Face Alignment Across Large Poses: A 3D Solution中侧脸数据生成实验

论文提出了一个由3d合成侧脸数据的方法,由于最近项目需要,便尝试了该方法。在此记录一些东西。

作者给出的数据合成demo中使用的是basel face model(BFM)的人脸3d重建参数,里面用到了pose参数,shape参数。为了合成出自己的数据,我们需要先获取这两个参数。获取这两个参数的方法挺多的,我这边尝试的几个方法分别为:运行作者给定3d重建demo(3DDFA),或者用High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild中给出的demo(HPEN)生成。接下来说一下这两个方法,这两个方法都要求68个人脸特征点。

1、运行3DDFA。直接按照demo里面的说明,替换自己的数据,然后运行。这里面的问题在于,生成的3d模型分辨率是100*100,但在数据合成demo中我们希望合成原始图片的分辨率。因此在获得roi_img(假设400*400)后可以将其保存下来(还要保存68个特征点,要减去bbox左上点的x),然后将3DDFA生成的pose参数中的x,y,z,f参数都乘上400/100=4(下面的代码)。这个方法的一个问题是,由于3DDFA没有形状约束,其重建出来的3d face可能质量没那么高,这会影响后面的侧脸合成。

Pose_Para(4) = Pose_Para(4)*scale;
Pose_Para(5)=Pose_Para(5)*scale;
Pose_Para(7)=Pose_Para(7)*scale;

2、运行HPEN。该方法用了68个特征点进行形状约束,合成的效果还可以。先用这个demo,生成pose和shape的参数,保存。然后运行侧脸合成demo。该方法只要特征点检测的好,就能够比较好的重建出3d face(特别是鼻子,如果鼻子重建的不好,在合成侧脸时会有比较严重的失真。)

68个特征点的检测可以使用dlib(对正脸比较准),或者How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks)中的demo(对侧脸比较准)。

还有一个可以获取shape参数的方法,利用basel face model作者提供的demo()可以从mesh生成shape参数。但是这个方法要在mesh顶点数跟BFM的顶点数一样。

说一下整个侧脸合成本身比较难以解决的问题,论文中所用的数据大部分是侧脸(角度不是很大),用原本是侧脸的数据合成侧脸(角度大的),效果会比较好。但是如果本来是正脸的数据,要合成侧脸的数据的话问题会比较难。合成出来的侧脸要么特征点映射后轮廓上的点不对(本身正脸轮廓上的特征点在脸部外面),要么合成的数据侧脸轮廓很模糊(本身特征点刚好在正脸轮廓上)。

附上特征点映射代码:

for i = 1:68
   x = pt2d(1,i);
   y = pt2d(2,i);

   nx=0;
   ny=0;
   Mx = ones(size(corres_map(:,:,1)))*double(x);
   My = ones(size(corres_map(:,:,1)))*double(y);
   delta = abs(corres_map(:,:,1)-Mx)+abs(corres_map(:,:,2)-My);
   mm = min(min(delta));
   [nx,ny]=find(delta==mm);
   new_pt(1,i)=nx;
   new_pt(2,i)=ny;
end

你可能感兴趣的:(3d)