python人脸姿态_PFLD:简单高效的实用人脸关键点检测算法

研究背景

人脸关键点检测,在很多人脸相关的任务中,属于基础模块,很关键。比如人脸识别、人脸验证、人脸编辑等等。想做人脸相关的更深层次的应用, 人脸关键点是绕不过去的点 。正是因为它是一个基础模块,所以对速度很敏感,不能太耗时,否则影响了系统整体的效率。所以对人脸关键点检测的要求是,又准又快。

研究问题

人脸关键点目前存在的问题(不能又准又快)的原因如下:

1. 局部变化:表情、局部特殊光照、部分遮挡,导致一部分关键点偏离了正常的位置,或者不可见了;

2. 全局变化:人脸姿态、成像质量;

3. 数据不均衡 : 在人脸数据里面,数据不均衡体现在,大部分是正脸数据,侧脸很少,所以对侧脸、大角度的人脸不太准;

4. 模型效率:在 CNN 的解决方案中,模型效率主要由 backbone 网络决定。

在实际使用中, 人脸关键点的问题主要有两个: 1)对“点是否遮挡”判断是否准确;2)对大角度人脸(+-60 度以内)点位置预测的准确性和稳定性。

解决思路

1. 修改 loss,增加关键点的空间约束项(三个姿态角)和数据均衡项;

2. backbone 采用 MobileNet(常规操作);

3. 用 auxiliary network,让点位置预测更稳定和鲁棒(常规操作)。

复现指南

模型

损失函数

损失函数的意义在于表示差异,而且能表示真正的距离。特别是当对象本身具备 3D 属性,而仅在 2D 上表示的时候,这样的距离表示就是不准确的。本文作者认为,对于人脸这种对象,人脸 pose(更简单的说是 3 个欧拉角)可以弥补一些人脸 3D 到 2D 的信息损失。具体怎么弥补?

希望是网络可以学到 3D 姿态的信息,最容易想到的方法是让网络去预测三个角度,这么做是可以的。进一步还能怎么做?把预测的角度损失和点位置损失组合起来,具体的组合方式,比如相加,或者相乘。相加的方式比较类似多任务损失,相乘的方式可以理解为一种加权,因为角度损失一般会归一化到 0-1 之间。

在实际中又发现,这个角度分布,存在样本不均衡的问题,所以又增加了样本均衡项。

绿色框是预测的角度和 gt 的差值,通过 cos 变成 0-1 之间,通过 (1-x) 操作变成单调增。

红色框是样本均衡项,作者把人脸分成六类(侧脸,正脸,抬头,低头,有表情,有遮挡),统计了训练集中这六类的数量分布,计算对应的数量比例,比如 1/10,用它的倒数,作为均衡项(用倒数是否合理?是否有点糙?可以考虑 focal loss 和 class-balance loss 的处理方法)。

网络

上面是 auxiliary 网络,预测三个角度,infernce 不参与,和下面的网络,共用一些层。角度预测的 gt,是用一个平均正脸上预先定义的 11 点,和 gt 中的 11 点估计出的旋转角度,作为角度的 gt。

下面是 backbone + head:

红框是 head,用了多尺度预测,类似 SSD 的做法。

实验

SOTA 比较:和去年的 LAB 方法(Look at Boundary)相比,NME 提升 0.1 个点。

速度:ARM845 上,一张人脸只要 7ms。backbone 优化,另外一个原因是直接回归位置坐标,而不是常规的 heatmap + offsetr 的方式,无后处理耗时。

Ablation:

对于直接回归位置坐标,本文提出的改进 loss 提升略明显(存疑)。

个人评价

应用决定算法对什么更敏感。人脸关键点终究是一个耗时敏感的问题,为了效率,本文的考虑有如下:

backbone 采用 MobileNet

直接回归点坐标,省去后处理耗时

用 auxiliary 网络,这个网络再怎么搞,都不会影响 inference 耗时

对 loss 的优化,再怎么玩,都不会影响 inference 耗时

什么会影响耗时:

输入大小

inference 涉及的 backbone 和 head

target_to_label 的耗时

所以,像什么对抗损失、模仿学习、加数据训等等方法,都是可以在不改变算力的情况提升模型性能的手段,在工业界常常使用。

三点想法:

如果模型的角度预测分支,放在和位置预测一起出,效果会怎么样?

如果人脸的角度不是预测的,是标注的,效果会怎么样?

考虑效率的话,输入大小和模型算力配比,是最佳的均衡么?

如果有大神复现了本方法,求分享交流,想知道上面三个问题的答案。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python人脸关键点检测是指使用Python编程语言进行人脸关键点的定位和检测。人脸关键点通常包括眼睛、鼻子、嘴巴等重要的面部特征点,通过检测这些关键点可以实现人脸识别、表情识别、姿态估计等应用。 在Python中,有多个库可以用于人脸关键点检测,其中比较常用的是dlib和OpenCV。下面是一个使用dlib库进行人脸关键点检测的示例代码: ```python import dlib import cv2 # 加载dlib的人脸检测器和关键点检测器 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 读取图像 image = cv2.imread("face.jpg") # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用人脸检测器检测人脸 faces = detector(gray) # 遍历每个检测到的人脸 for face in faces: # 使用关键点检测器检测关键点 landmarks = predictor(gray, face) # 遍历每个关键点,并在图像上绘制出来 for n in range(0, 68): x = landmarks.part(n).x y = landmarks.part(n).y cv2.circle(image, (x, y), 2, (0, 255, 0), -1) # 显示结果图像 cv2.imshow("Face Landmarks", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中,首先使用dlib库加载了人脸检测器和关键点检测器。然后读取待检测的图像,并将其转换为灰度图像。接下来使用人脸检测器检测图像中的人脸,并使用关键点检测器检测每个人脸的关键点。最后,遍历每个关键点,并在图像上绘制出来。 需要注意的是,上述代码中使用的shape_predictor_68_face_landmarks.dat文件是一个已经训练好的模型,可以从dlib官方网站下载。此外,还可以根据具体需求对关键点进行进一步处理和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值