ARFoundation之路-人脸检测增强之四

2023-10-09 14:30

本文主要是介绍ARFoundation之路-人脸检测增强之四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  苹果公司在iPhone X及后续机型上添加了一个深度摄像机(TrueDepth Camera),利用这个深度摄像机可以更加精准捕捉用户的面部表情,提供更详细的面部特征点信息。

(一) BlendShapes

  利用深度摄像机采集到用户面部表情特征,ARKit提供了一种更加抽象的表示面部表情的方式,这种表示方式就叫Blend Shapes。Blend Shapes在技术上是一组存储了用户面部表情特征运动因子的字典,共包含52组特征运动数据,ARKit会根据深度摄像机采集的用户表情特征值实时的设置相对应的运动因子。利用这些运动因子可以驱动2D或者3D模型,这些模型会实时的展现与用户一致的表情。

  ARKit实时提供全部52组运动因子,这52组运动因子中包括7组左眼运动因子数据、7组右眼运动因子数据、27组嘴与下巴运动因子数据、10组眉毛脸颊鼻子运动因子数据、1组舌头运动因子数据。但在使用时可以选择利用全部或者只利用一部分,如只关注眼睛运动,则只利用眼睛相关运动因子数据即可。
在这里插入图片描述
  每一组运动因子表示一个ARKit识别的人脸表情特征,每一组运动因子都包括一个表示人脸特定表情的定位符与一个表示表情程度的浮点类型值,表情程度值的范围为[0,1],0表示没有表情,1表示完全表情,如在下图中,这个表情定位符为mouthSmileRight,代表右嘴角的表情定位,左图中表情程度值为0,即没有任何右嘴角表情,右图中表情值为1,即为最大的右嘴角表情运动,而0到1中间值则会对网格进行融合,形成一种过渡表情,这也是BlendShapes名字的来历。ARKit会实时捕捉到这些运动因子,利用这些运动因子我们即可以驱动2D、3D模型,这些模型会同步用户的面部表情,当然,我们可以只取其中的一部分所关注的运动因子,但如果想精确的模拟用户的表情,建议使用全部这52组运动因子数据。
在这里插入图片描述

(二)技术原理

  在ARKit中,对表情特征位置定义了52组运动因子数据,使用了BlendShapeLocation来作为表情定位符,表情定位符定义了特定表情属性,如mouthSmileLeft、mouthSmileRight等,与其对应的运动因子则表示表情运动范围。这52组运动因子数据如下表所示。

表情定位符描述
eyeBlinkLeft左眼眨眼
eyeLookDownLeft左眼目视下方
eyeLookInLeft左眼注视鼻尖
eyeLookOutLeft左眼向左看
eyeLookUpLeft左眼目视上方
eyeSquintLeft左眼眯眼
eyeWideLeft左眼睁大
eyeBlinkRight右眼眨眼
eyeLookDownRight右眼目视下方
eyeLookInRight右眼注视鼻尖
eyeLookOutRight右眼向左看
eyeLookUpRight右眼目视上方
eyeSquintRight右眼眯眼
eyeWideRight右眼睁大
jawForward努嘴时下巴向前
jawLeft撇嘴时下巴向左
jawRight撇嘴时下巴向右
jawOpen张嘴时下巴向下
mouthClose闭嘴
mouthFunnel稍张嘴并双唇张开
mouthPucker抿嘴
mouthLeft向左撇嘴
mouthRight向右撇嘴
mouthSmileLeft左撇嘴笑
mouthSmileRight右撇嘴笑
mouthFrownLeft左嘴唇下压
mouthFrownRight右嘴唇下压
mouthDimpleLeft左嘴唇向后
mouthDimpleRight右嘴唇向后
mouthStretchLeft左嘴角向左
mouthStretchRight右嘴角向右
mouthRollLower下嘴唇卷向里
mouthRollUpper下嘴唇卷向上
mouthShrugLower下嘴唇向下
mouthShrugUpper上嘴唇向上
mouthPressLeft下嘴唇压向左
mouthPressRight下嘴唇压向右
mouthLowerDownLeft下嘴唇压向左下
mouthLowerDownRight下嘴唇压向右下
mouthUpperUpLeft上嘴唇压向左上
mouthUpperUpRight上嘴唇压向右上
browDownLeft左眉向外
browDownRight右眉向外
browInnerUp蹙眉
browOuterUpLeft左眉向左上
browOuterUpRight右眉向右上
cheekPuff脸颊向外
cheekSquintLeft左脸颊向上并回旋
cheekSquintRight右脸颊向上并回旋
noseSneerLeft左蹙鼻子
noseSneerRight右蹙鼻子
tongueOut吐舌头

  需要注意的是,在上表中表情定位符的命名是基于人脸的,如eyeBlinkRight定义的是人脸右眼,在呈现3D模型时我们镜像了模型,看到的人脸模型右脸其实在左边。

  有了表情特征运动因子后,就需要使用到Unity的SkinnedMeshRenderer.SetBlendShapeWeight()方法,该方法原型为:

  public void SetBlendShapeWeight(int index, float value);

  该方法有两上参数,index参数为需要融合的网格索引,其值必须小于Mesh.blendShapeCount值;value为需要设置的BlendShape权重值,这个值与模型设定值相关,可以是[0,1],也可以是[0-100]等等。

  该方法主要就是用于设置指定网格索引的BlendShape权重值,这个值表示从源网格到目标网格的过滤(源网格与目标网格拥有同样的拓扑结构,但顶点位置两者有差异),最终值符合以下公式:

V f i n = ( 1 − v a l u e ) ∗ V s r c + v a l u e ∗ V d e s Vfin = (1-value)*Vsrc + value*Vdes Vfin=(1value)Vsrc+valueVdes

  因此,通过设置网格的BlendShape权重值可以将网格从源网格过渡到目标网格。如下图所示。
在这里插入图片描述

(三)使用BlendShapes

  从上文可以看出,想要使用ARKit的BlendShapes功能需要满足两个条件:第一是有带有深度摄像机的移动设备,第二是有一个BlendShape已定义好的模型,这个模型BlendShape定义最好与上表中对应一致。

  为模型添加BlendShape可以在3dMax软件中定义变形器,并做好对应的网格变形,如下图所示。
在这里插入图片描述
  在满足以上两个条件后,使用BlendShapes就变得相对简单了,实现的思路是:
  (1)获取到ARKit表情特征运动因子,这可以使用ARKitFaceSubsystem.GetBlendShapeCoefiicients()方法获取到,这会返回一个Unity NativeArray数组,里面即包括所有52组表情特征运动因子数据。
  (2)模型挂载Skinned Mesh Renderer组件,其BlendShape与模型中定义折BlendShape标记符一致,如下图所示,绑定ARKit的表情特征定位符与Skinned Mesh Renderer中的BlendShape,使其保持一致。
在这里插入图片描述
  (3)在Face数据发生改变时更新所有的表情特征运动因子,示例代码如下所示:

    void UpdateFaceFeatures(){if (skinnedMeshRenderer == null || !skinnedMeshRenderer.enabled || skinnedMeshRenderer.sharedMesh == null){return;}using (var blendShapes = m_ARKitFaceSubsystem.GetBlendShapeCoefficients(m_Face.trackableId, Allocator.Temp)){foreach (var featureCoefficient in blendShapes){int mappedBlendShapeIndex;if (m_FaceArkitBlendShapeIndexMap.TryGetValue(featureCoefficient.blendShapeLocation, out mappedBlendShapeIndex)){if (mappedBlendShapeIndex >= 0){skinnedMeshRenderer.SetBlendShapeWeight(mappedBlendShapeIndex, featureCoefficient.coefficient * coefficientScale);}}}}}

  BlendShapes实现效果如下图所示。
在这里插入图片描述

参考文献

1、blendshapelocation blendshapelocation

这篇关于ARFoundation之路-人脸检测增强之四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173482

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机