openface 人脸对齐 基本原理

代码

具体代码请参考:https://github.com/TadasBaltrusaitis/OpenFace

    vector<string> arguments = get_arguments(argc, argv);
    FaceAnalysis::FaceAnalyserParameters face_analysis_params(arguments);
    face_analysis_params.OptimizeForImages();
    FaceAnalysis::FaceAnalyser face_analyser(face_analysis_params);

    face_analyser.PredictStaticAUsAndComputeFeatures(captured_image, face_model.detected_landmarks);

人脸对齐主要为上面的PredictStaticAUsAndComputeFeatures函数,输入参数为人脸图像及提取的68个人脸关键点。
函数内部和人脸对齐有关的有两个函数,分别为:
1.

    cv::Vec6f params_global;
    cv::Mat_ params_local;
    pdm.CalcParams(params_global, params_local, detected_landmarks);

函数的作用是根据在当前人脸图像上的提取的关键点来估计旋转、平移、缩放系数。
具体过程为:根据当前人脸关键点的位置可以得到人脸图像的宽高,将openface定义的68个标准3维人脸关键点投影到2维以获取基准模型的二维宽高,计算两者之间的大小系数得到图像的缩放系数;
设置平移量为当前人脸roi图像的中心坐标;
根据当前初始的旋转及平移量将基准3D人脸关键点坐标映射到2维,计算映射后的2维基准点与当前人脸关键点之间的误差欧氏距离,然后设置最大迭代次数,以减小前述欧氏距离为参考,迭代优化R和t,当误差欧氏距离值基本不变或者达到最大迭代次数时停止迭代,得到当前人脸图像与基准人脸图像之间的最优旋转矩阵R和平移量t。
2.

AlignFaceMask(aligned_face_for_au, frame, detected_landmarks, params_global, pdm, triangulation, true, align_scale_au, align_width_au, align_height_au);

执行该函数得到对齐后添加掩模之后的人脸图像。
各参数含义:aligned_face_for_au为对齐后人脸图像;frame为输入图像;detected_landmarks为检测到人脸关键点;params_global为pdm.CalcParams函数得到的最优旋转和平移、缩放系数;pdm, triangulation, true, align_scale_au, align_width_au, align_height_au为openface预设量,从模型中读取得到。
函数的计算过程为对于3维基准点乘以缩放系数,忽略掉z轴,计算68个关键点中左右面部边缘、鼻子、左右眼睛相关的基准点与当前人脸上提取的对应关键点之间的旋转矩阵,使用了https://en.wikipedia.org/wiki/Kabsch_algorithm方法。计算出平移量,然后将区域向上移动至包含眉毛区域,然后基于triangulation来判断对应掩模中每一个点是否应该保留。然后将掩模与变换后的图像进行与,得到对齐后的人脸掩模图像。

备注

本部分内容看的比较粗糙,欢迎批评指正。

你可能感兴趣的:(人脸识别)