人脸关键点的应用场景及重难点解析丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网视频组 AI 算法工程师 周世付。
人脸检测、人脸关键点检测,是计算机视觉的基础算法。许多酷炫应用背后,例如美颜、贴纸、人脸驱动 avatar,是依赖着人脸检测、人脸关键点检测的算法。
人脸检测的常规做法,是从图像中找到人脸的位置并采用矩形框的方式将人脸标示出来。由于人脸检测提供的信息比较粗糙,要想获取更精细、详细的人脸信息,比如,人脸的脸型、嘴巴、眼睛、鼻子的位置和几何形状,就需要进行人脸关键点检测。
01 人脸关键点检测的技术原理
人脸关键点检测,也称为人脸关键点定位或者人脸对齐,是在人脸检测获取到人脸在图像中具体位置的基础上,进一步定位人脸器官的位置。
这些人脸器官位置信息,是一些具有明确语议定义的离散点,因此称为人脸关键点。通常,人脸关键点定义在人脸的脸颊、嘴巴、眼睛、鼻子和眉毛区域,将人脸关键点连接起来,能够描绘人脸的几何特征。
人脸关键点的类型,可划分为 2D 关键点和 3D 关键点。2D 关键点,输出的是人脸关键点的 x、y 的坐标信息。常用的 2D 关键点数量 5 点、68 点、106 点,随着技术的发展及应用对人脸关键点提出更高要求,也出现了 280 点甚至是 1000 点的人脸关键点方案。
3D 关键点,则输出关键点的 x、y、z 的坐标信息。3D 关键点的检测,是采用 3DMM 模型,重建人脸的 3D mesh,再将 3D mesh 投射到 2D 的图像空间。由于 3D 关键点比 2D 关键点多了深度信息,在人脸姿态估计、3D 物体穿戴方面,优势较为明显。
利用人脸关键点,可以定位嘴巴、眼睛、鼻子、眉毛的位置,以及推断脸型、嘴巴、眼睛的几何形态和头部的姿态。在不同的表情、姿态、光照和遮挡条件下,准确、快速、稳定地定位人脸关键点,是一项极具挑战的任务。
02 人脸关键点检测的算法演进
人脸关键点检测的方法分为传统机器学习方法和深度学习方法。传统机器学习的方法,典开的代表包括 ASM(Active Shape Model)、AAM(Active Appearance Models)。
ASM 是由 Cootes 于 1995 年提出的经典人脸关键点检测算法,ASM 是一种基于点分布模型的算法,外形相似的物体的身体形状,可通过若干关键点的坐标依次串联形成的一个形状向量表示。ASM 算法需要人工标定的方法预先标定训练集,经过训练获得形状模型,再通过关键点的匹配实现特定物体的匹配。ASM 算法的优点是模型简单,架构清晰,对轮廓形状有较强的约束,但近似于穷举搜索的关键点定位方式,限制了其运算的效率。
AAM 是 ASM 的进阶版,在形状约束的基础上,加入整个脸部的纹理特征。传统机器学习的方法,检测的速度相对较快,但关键点检测的精度有限,难以满足应用的要求。
深度学习方法,在关键点检测的精度上,碾压传统机器学习方法。基于深度学习的人脸关键点检测方法,大致可分为两个流派:热力图方法和和直接回归方法。热力图方法,是每个关键点生成一个热力图,关键点处的值最大,离关键点越远,值越小。热力图方法,关键点检测的精度高,并可判断关键点是否被遮挡,对遮挡的鲁棒性较好。由于热力图大小通常是输入图像的 1/4,对内存的占用大。检测关键点的数量越多,内存占用越大,限制了热力图方法在端侧设备上的应用。直接回归方法,通过卷积神经模型预测关键点的坐标,内存占用小,关键点检测的精度较热力图方法差一些。由于直接回归方法内存占用小,检测速度快,在端侧设备上的应用前景广阔。
03 人脸关键点的应用
人脸关键点的应用领域十分广泛,主要应用方向可划分为 4 类:人脸姿态对齐、人脸美颜、人脸贴纸和 avatar 模型驱动。
人脸姿态对齐,在人脸识别领域,同一个 ID 的人脸在不同姿态下,人脸的相似度变化较大,人脸识别的精度不同。为了提高人脸识别的精度,需要将不同姿态的人脸,对齐到一个中立的姿态。这个对齐的操作,依赖人脸关键点提供的位置信息。人脸姿态对齐,对关键点的精度和数量,要求不高,通常只需要 5 个关键点,定位眼睛、鼻子和嘴巴。
美颜,作为当今社交 app 中不可或缺的基本功能,发个朋友圈、开个直播前,不需要花时间化个妆,只需打开美颜,即可瞬间提升个人的颜值,将自己最美的一面显现给朋友或观众。美颜的种类繁多,五花八门,大致可以分为大类:1) 美型,调整脸颊、眼睛的形状,即将圆脸调整为修长的瓜子脸,把眼睛调大,达到大眼、瘦脸的效果;2) 磨皮,目的是将脸部的皱纹、痘印、斑点去除,提升皮肤的平滑度和光泽度。脸部不同区域,对磨皮程度的需求不一样,例如眼睛区域需保持清晰通透,磨皮程度要低一些或不磨皮。3) 美妆,是将化妆品的效果,融合到用户的脸上,以视频或图像的方式,呈现给用户,从而可让用户无需到线下门店体验试妆效果,线上就能体验到化妆品在自己脸上的效果。美颜,对人脸关键点检测的精度和数量,要求很高。在关键点精度方面,对眼睛、嘴唇的定位精度尤为高;关键点数量方面,则是越多越好。
贴纸,是将电子的道具,如眼镜、帽子、假发、皇冠、项链、耳环等,“穿戴”到用户的脸上或头部,为用户定制个性化的形象。手机相机、社交 app 提供了各种各样的道具,供用户选择。
贴纸,对人脸关键点的要求,没有美颜高,但高精度的人脸关键点,对贴纸的效果,是有帮助的。
人脸驱动 avatar,近年来元宇宙、虚拟人、卡通人物的概念层出不穷,其背后的技术本质是如何将自然图像中真实人脸的表情、姿态等信息,迁移到 avatar 模型,驱动 avatar 维妙维肖地“模仿”真人。人脸关键点,作为有效的人脸信息载体,可进一步提炼出符合 avatar 模型的语议信息,从而驱动 avatar。人脸驱动,对人脸关键的要求是最高的。人脸关键点的分布,除了定位脸颊、眉毛、眼睛、鼻子、嘴巴外,还要求定位面颊部位。另外,人脸关键点定位越精准,捕捉人脸的微表情越精细,avatar 才越生动。
04 人脸关键点算法面临的挑战
人脸关键点检测算法,在实际应用过程中,面临着诸多的挑战,需要解决的问题,具体表现为:
1、在不同人脸姿态、光照条件、脸部被遮挡时,关键点定位要准确;
2、连续视频帧检测,帧间关键点的抖动,要在可控范围或被消除;
3、检测速度够快,可在端侧设备实时运行。
为了达到更准确的关键点定位,学术界通常采用基于热力图的方法,采用更大更深的模型,但其代价是模型对算力要求高,无法在端侧设备实时运行。其次,为了满足不同条件下,关键点定位准确,业界通常会自建大规模的训练集。
为了满足美颜、贴纸、avatar 驱动应用对人脸关键点的精度的要求,声网自建了大规模的人脸关键点数据集。人脸关键点的数据集建立过程中,充分考虑了以下几个因素:
1、在数据采集设备方面,覆盖了各种类型手机的前置/后置摄像头、不同类型的笔记本摄像头和 USB 摄像头。
2、不同光线条件下采集人脸图像,包括强光、暗光、背光等条件。
3、多个角度、姿态、变换远近拍摄人脸图像。
4、穿戴不同的遮挡物进行人脸图像拍摄,包括眼镜、口罩、帽子,以及手部遮挡嘴巴、脸颊、眼睛。
5、人工标注人脸关键点,并对标注精度进行二次人工审核,确保人工标注的关键点是准确的。
05 声网人脸关键点算法
声网自研的人脸关键点算法,利用深度学习技术,设计了轻量级模型,满足移动端设备实时运行的要求,其具备如下几个特点:
1、支持 106 个关键点的检测,关键点覆盖了脸颊、嘴巴、鼻子、眼睛、眉毛区域,能够满足大多数应用对关键点的点数要求。
2、推理速度快,在移动端设备可实时。结合人脸检测和人脸关键点检测的推理,耗时控制在 10ms 以内,为其它实时应用提供富余的时间余量。
3、支持人脸姿态的欧拉角预测。
4、支持眼球跟踪。
5、支持关键点防抖功能,保证在视频中保持关键点既精准又稳定。
声网人脸关键点算法,为美颜、贴纸、avatar 等应用提供基础的技术能力,结合声网的 RTC 技术,可为开发者提供更加完备的解决方案。点击阅读即可进一步了解详情。
人脸关键点的应用场景及重难点解析丨Dev for Dev 专栏的更多相关文章
- LUA重难点解析
1.元表 元表也是一个 table,它附加在另一个 table 上,可以扩展该 table 的某些行为. 拿 __index 来举例,它是用来扩展查找索引行为的.在查找一个 key 对应的值时,会依次 ...
- Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析
重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
- dlib人脸关键点检测的模型分析与压缩
本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景1 2. 标准化的api1 3. 框架选型 JNI2OpenCV.dll and JavaCV ...
- 这是一份非常适合收藏的Android进阶/面试重难点整理
写在前面 记得我大二时“不务正业”地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并且不够深入,遇到瓶颈 ...
- .NET_RSA加密全接触(重、难点解析)
.NET_RSA加密全接触(重.难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSAC ...
- 李洪强漫谈iOS开发[C语言-008]- C语言重难点
C语言学习的重难点 写程序的三个境界: 照抄的境界,翻译的境界,创新的境界 1 伪代码: 描述C语言的编程范式 范式: 规范的一种表示 对于C的范式学会的话,C, C++ Java 都会了 2 ...
- 用keras实现人脸关键点检测(2)
上一个代码只能实现小数据的读取与训练,在大数据训练的情况下.会造内存紧张,于是我根据keras的官方文档,对上一个代码进行了改进. 用keras实现人脸关键点检测 数据集:https://pan.ba ...
- keras实现简单CNN人脸关键点检测
用keras实现人脸关键点检测 改良版:http://www.cnblogs.com/ansang/p/8583122.html 第一步:准备好需要的库 tensorflow 1.4.0 h5py ...
随机推荐
- Redis基础命令和持久化
Redis命令工具 Redis-server :用于启动Redis的工具 Redis-benchmark:用于检查Redis在本机的运行效率 Redis-check-aof:修复aof持久化文件 Re ...
- 服务器 安装docker (启动坑了很久才成功)docker-compose
安装docker: 1.Docker要求CentOS系统的内核版本高于 3.10 , 通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2.更新yum包: sudo yu ...
- 使用python+poco+夜神模拟器进行自动化测试。
https://blog.csdn.net/saint_228/article/details/84889017 网易最近出的一款自动化UI测试工具:Airtest 挺火的,还受到谷歌的推荐.我试着用 ...
- 使用C++进行冒泡排序
#include "pch.h" #include <iostream> using namespace std;手动输入10个数,进行冒泡排序 int main() ...
- Mysql学习:1、mysql安装及配置及连接Navicat
1.下载地址: https://dev.mysql.com/downloads/windows/installer/8.0.html 2.安装流程: a.选自定义安装:custom. b. 在下一步的 ...
- mysql 删除数据所有表
SELECT CONCAT('drop table ',table_name,';') FROM information_schema.`TABLES` WHERE table_schema='car ...
- 升级adb
adb 是没有自动升级的命令的,如果想要更新adb的版本,需要在网上找到自己想要的版本进行更新. 为什么要更新呢? 肯定是在使用中遇到了什么问题必须升级版本才能解决,如果不影响使用,那都无所谓.这里提 ...
- 用python判断三角形的形状
# coding:utf-8 class point: def __init__(self,x,y,name): self.x = x self.y = y self.name = name '''两 ...
- c++ dll 传递string参数
用c++编写了一个dll,需要传递一个路径的变量参数,刚开始想着使用string变量,但是在实践过程中string变量会成为乱码,尽量避免使用string变量传递参数,可以使用const char* ...
- 时间格式转换成指定格式(Vue)
1 /** 2 * Parse the time to string 3 * @param {(Object|string|number)} time 4 * @param {string} cFor ...