基于测地距离场的三维人脸参数化方法

目录

1. 前言

2. 曲面参数化原理

3. 人脸曲面参数化实现

4. 实验结果

Reference


1. 前言

三维人脸数据的识别与处理,一直是视觉与图形学领域的热点问题。相对于人脸图像来说,三维人脸数据拥有完整的几何信息,能够支持更加精确的人脸数据分析算法。在进行相关的计算之前,我们希望三维人脸能够有一个统一的表示形式,以准确的界定人脸的区域以及对应的位置,尽可能的消除姿态以及尺度不一致带来的影响。基于该目的,人脸参数化方法被提出。人脸参数化方法即建立三维人脸到二维参数域的映射,同时尽可能优化映射带来的形状畸变,即映射本身要接近保形的要求。在2002年,Desbrun [1] 提出一种内蕴参数化方法,通过优化余切权重,建立对保形能量的优化模型,进而实现映射。Lv [2] 基于该方法, 利用测地距离提取三维人脸的子曲面,并将曲面映射到参数域中,以建立三维人脸的非刚性对应关系,并降低表情影响。其他参数化方法包括Ricci Flow [3], 调和函数 [4],最优传输 [5] 等,均有不错的应用。本文基于 [1] [2] 两项工作,结合在github上的开源项目,来介绍该技术的具体实现。

Project Link: Intrinisc Parameterization for 3D Facial Surface.


2. 曲面参数化原理

在工作 [1] 中,Desbrun解释了如何建立三维曲面到二维参数域的映射。首先,需要定义映射所产生的能量畸变,如下:

下面考察映射后,点xi和xj位置变换到ui和uj所产生的畸变。一个理想的保形变换应保证所有的角度和面积保持不变。不过,现实中计算理论上的保形变换是比较难的,因为曲面的高斯曲率不是处处为0,自然将其映射到平面上,必然会产生畸变。在实践中,保形变换等价于获得最小化畸变的映射,即拟共形映射。这里,针对点xi和xj,建立他们的畸变能量表示:

这两个能量一个对应角度的优化,一个对应距离的优化。角度优化能量即保形能量的量化表示形式,距离优化能量即保积能量的量化表示形式。对上述能量进行优化求解,即求极值:

至此,我们得到了一个点和他周围点的能量极值计算方法。接下来,我们只需要对所有点计算全局最优解就可以了,基本可以转换为一个线性优化问题,公式如下:

这是一个矩阵化后的能量极值计算表示。M存储的是基于拉普拉斯邻接关系的各个点的余切权重,包含角度优化能量和距离优化能量两项。C是边界条件,即我们希望三维曲面的边界是固定在二维参数域中的,以确定映射结果有明确的边界。最后对上述的线性系统求解,以获得二维坐标U,即曲面在参数域的二维坐标,结果如下:

一个完美的等距映射,应该是实现对上述两个能量的全局优化,但是这比较难。在实践中,还是以优化保形能量为第一优先,以保证角度畸变最小,方便实现纹理映射等应用。另外,可能用户希望固定除了边界以外的一些特征点,如人脸的眼角,嘴角等,工作 [1] 中给了具体的实现,有兴趣的同学可以复现试试看。


3. 人脸曲面参数化实现

在工作 [2] 中,参数化方法被应用在三维人脸数据度量中。具体的做法是,基于鼻尖点,按照特定的测地距离,在人脸曲面上提取一个测地圆盘。该圆盘因为受到测地距离约束,使得能够更准确的界定需要度量的人脸区域,相当于一步face cropping, 如下图所示:

代码实现有两个点需要注意,一个是测地距离计算,还有一个就是针对上述线性系统求解。这里,我列出针对提到两点的关键代码实现,提取自文章一开始介绍的Github项目:

测地距离计算,基于VCG实现:

void TriGeodesic_Mymesh_Geodesic(Point3f c) {

        //Point3f c = m.bbox.Center();
        MyVertex* closest = &*m.vert.begin();
        float minDist = Distance(closest->P(), c);
        for (MyMesh::VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
        {
            if (Distance(vi->P(), c) < minDist)
            {
                minDist = Distance(vi->P(), c);
                closest = &*vi;
            }
        }
        vector<MyVertex*> seedVec;
        seedVec.push_back(closest);
        tri::EuclideanDistance<MyMesh> ed;
        tri::Clean<MyMesh>::RemoveUnreferencedVertex(m);
        tri::Allocator<MyMesh>::CompactEveryVector(m);
        tri::UpdateTopology<MyMesh>::VertexFace(m);
        tri::Geodesic<MyMesh>::Compute(m, seedVec, ed);
        pair<float, float> minmax = tri::Stat<MyMesh>::ComputePerVertexQualityMinMax(m);
        tri::UpdateColor<MyMesh>::PerVertexQualityRamp(m);
        printf("min %f max %f\n", minmax.first, minmax.second);
        tri::io::ExporterPLY<MyMesh>::Save(m, "Data/base.ply", tri::io::Mask::IOM_VERTCOLOR | tri::io::Mask::IOM_VERTQUALITY);
        vertexGeoDis.resize(m.vert.size(), 0);
        float minDis = 9999;
        float maxDis = -9999;
        for (size_t i = 0; i < m.vert.size(); ++i)
        {
            MyVertex* nextV = &*(m.vert.begin() + i);
            vertexGeoDis[i] = nextV->Q();
            if (vertexGeoDis[i] > maxDis) {
                maxDis = vertexGeoDis[i];
            }
            if (vertexGeoDis[i] < minDis) {
                minDis = vertexGeoDis[i];
            } 
        }

        max_g = maxDis;
        min_g = minDis;

        cout << "geodesic computation finished" << endl;     
}

线性系统求解,基于Eigen实现:

//LaplaceNeighbor为网格的邻接矩阵,尺度等于网格顶点数
Eigen::SparseMatrix<float> A1_sparse(LaplaceNeighbor.size(), LaplaceNeighbor.size());

//网格邻接矩阵是一个稀疏矩阵,使用稀疏矩阵模型来进行数据存储于计算,效率较高
Eigen::MatrixXf b1_sparse(LaplaceNeighbor.size(), 2);
Eigen::MatrixXf x1_sparse;

//使用三元素实现对稀疏矩阵的赋值
std::vector<Eigen::Triplet<float>> tripletlist;	

//赋值tripletlist...

//压缩稀疏矩阵
A1_sparse.setFromTriplets(tripletlist.begin(), tripletlist.end());
A1_sparse.makeCompressed();

//使用BiCGSTAB解Ax=b
Eigen::BiCGSTAB<Eigen::SparseMatrix<float> > Solver_sparse;
Solver_sparse.setTolerance(0.00001);
Solver_sparse.compute(A1_sparse);
x1_sparse = Solver_sparse.solve(b1_sparse);

注:在Eigen里提供了很多方法解决Ax=b,参考图如下:

稠密矩阵 

 稀疏矩阵

 

可以根据需要求解的具体问题,选择合适的求解器。


4. 实验结果

1)基于测度距离的人脸子曲面提取:

2)基于人脸子曲面的参数化:


Reference

[1] Desbrun M, Meyer M, Alliez P. Intrinsic parameterizations of surface meshes[C]. Computer graphics forum. Oxford, UK: Blackwell Publishing, Inc, 2002, 21(3): 209-218.

[2] Lv C, Wu Z, Wang X, et al. Constructing 3D facial hierarchical structure based on surface measurements[J]. Multimedia Tools and Applications, 2019, 78(11): 14753-14776.

[3] Zeng W, Samaras D, Gu D. Ricci flow for 3D shape analysis[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2010, 32(4): 662-677.

[4] Hou J, Chau L P, Zhang M, et al. A highly efficient compression framework for time-varying 3-D facial expressions[J]. IEEE Transactions on Circuits and Systems for Video Technology, 2014, 24(9): 1541-1553.

[5] Jin M, Wang Y, Yau S T, et al. Optimal global conformal surface parameterization[C]//IEEE Visualization 2004. IEEE, 2004: 267-274.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值