大角度人脸转正--Towards Large-Pose Face Frontalization in the Wild

Towards Large-Pose Face Frontalization in the Wild
ICCV2017
https://www.arxiv.org/abs/1704.06244
http://cvlab.cse.msu.edu/project-face-frontalization.html

本文结合 3D Morphable Model (3DMM) 和 GAN 来进行人脸转正。

大的框架如下图所示:
这里写图片描述

3DMM Coefficients 得到输入人脸的姿态信息,通过3D模型可以得到大概信息,没有细节信息
因为原始输入图像含有细节信息,所以这里将 3DMM Coefficients 和 原始图像 输入到 GAN 的 Generator 生成模型中去,通过 GAN 生成还有细节的正脸图像,将这个生成的图像送到 GAN 的 Discriminator 判别模型中 和人脸识别模块中。GAN 的 Discriminator 主要判断图像是人工合成的还是 真实的图像。通过训练可以是 GAN 的 Generator 的生成图像 达到以假乱真的效果,即 GAN 的 Discriminator 将生成图像 判断为真实图像。这里加入人脸识别模块,主要是希望输入图像和生成的图像 保持是同一个人。

这里写图片描述
这里的 X 是原始输入图像, X_f 是 生成图像, X_g 是真值图像
R 是 3DMM 参数估计模型,G 生成正脸图像,
这里写图片描述

三大数据库实验对比:
这里写图片描述
这里写图片描述

这里写图片描述

### 人脸姿态估计算法与图像处理方法 #### 基于数据增强的人脸姿态平衡 为了应对训练集中正脸和侧脸样本分布不均的问题,可以通过调整数据集中的样本比例实现更均衡的姿态表示。具体而言,利用已知的关键点坐标计算人脸的朝向参数(pitch、yaw 和 roll)。随后,依据这些角度对数据进行分组,并通过人工复制或生成较少姿态类别的样本来达到类别间的数量平衡[^1]。 #### 高保真姿势不变模型 (HF-PIM) 针对高分辨率下保持纹理细节的需求,提出了 HF-PIM 方法用于合成高质量的正面视图。此方法能够有效解决因遮挡和扭曲带来的挑战,在保证身份一致性的同时生成逼真的正面人脸图像[^2]。尽管其主要目标是正面化而非单纯关键点映射,但它提供了一个框架,可用于研究如何从侧脸提取特征并将其转化为对应正脸上的位置关系。 #### 基于三维变形模型 (3DMM) 的 HPEN 方法 Zhu 等人开发了基于 3DMM 的高效解决方案——HPEN 方法,旨在快速完成位姿和表情归一化操作。该技术不仅限于面部内部区域,还包括对外围环境及背景深度信息的估算,以确保最终输出具备自然过渡效果。借助此类工具,可以从不同视角捕捉到的信息重建出接近真实的正面像,并推导相应的关键点布局[^3]。 #### 角度人脸转正策略 当面对极端倾斜情况下的输入时,“角度人脸转正”方案提供了另一种思路。这类算法通常依赖复杂的几何变换或者学习型机制来克服传统方法难以胜任的范围旋转校准难题。例如,《Towards Large-Pose Face Frontalization in the Wild》论文探讨的就是这样一个方向,它可能涉及到了某些特定的技术手段使得即使是在非常规条件下也能获得较为满意的前视效果图[^4]。 #### 自监督学习无标注对象建模 最后值得一提的是《Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild》,这篇文献介绍了一种全新的自监督方式来进行可变形物体的学习过程。虽然它的应用场景更为广泛而不仅仅局限于人类脸部结构分析领域内,但是其中蕴含的理念同样适用于探索未知条件下面部形态变化规律的研究课题之中[^5]。 综上所述,多种技术和理论都可以作为解决“由侧脸至正脸”的转化问题的基础资源加以考虑应用。 ```python import numpy as np def calculate_orientation(keypoints): """ 计算人脸朝向角(pitch, yaw, roll),以便后续分类和数据增强。 参数: keypoints (list): 给定的人脸关键点列表 返回: tuple: pitch, yaw, roll 角度值 """ # 这里仅作示意用途;实际实现需结合具体数据库定义 pitch = np.mean([keypoint['z'] for keypoint in keypoints]) yaw = np.arctan((keypoints[-1]['x'] - keypoints[0]['x']) / \ (keypoints[-1]['y'] - keypoints[0]['y'])) roll = ... # 更复杂逻辑省略 return pitch, yaw, roll def balance_dataset(data, angles): """按角度区间划分数据集,并补充不足部分""" grouped_data = {} for d, angle in zip(data, angles): interval = classify_angle(angle) if interval not in grouped_data: grouped_data[interval] = [] grouped_data[interval].append(d) max_count = max(len(v) for v in grouped_data.values()) balanced_data = [] for k, v in grouped_data.items(): while len(v) < max_count: v.extend(np.random.choice(v)) balanced_data += v[:max_count] return balanced_data ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值