当前位置: 首页 > news >正文

视频人脸处理——人脸面部动作提取

文章目录

  • 基于openface实现的技术方案
    • windows环境下使用
      • 1. 安装依赖软件
      • 2. 下载OpenFace代码
      • 3. 编译OpenFace
      • 4. 提取面部动作单元
      • 5.==选择提取目标方案==
    • liunx环境下使用
      • 安装与配置
      • 使用 OpenFace 提取面部动作单元
      • 应用场景
  • 基于py-feat实现的方案
    • 1. 从HuggingFace下载模型并设置`Detector`
    • 2. 处理单张图像
    • 3. 处理`Fex`输出结果
    • 4. 保存和加载检测结果
    • 5. 可视化检测结果
    • 6. 检测单张图像中的多张人脸
    • 7. 处理多张图像
  • py-feat 与 OpenFace 对比分析
      • 一、双方均支持的 AU(共16项)
      • 二、仅 OpenFace 支持的 AU(共1项)
      • 三、仅 Py-Feat 支持的 AU(共4项)
      • 四、技术选择建议

基于openface实现的技术方案

【免费下载】 OpenFace 开源项目使用教程
openface的导出数据说明

面部关键点检测
在这里插入图片描述
面部标志和头部姿态跟踪
在这里插入图片描述
面部动作单元识别
在这里插入图片描述

注视跟踪
在这里插入图片描述
面部特征提取(对齐的人脸和HOG特征)
在这里插入图片描述

windows环境下使用

【环境配置】Windows10上的OpenFace安装与使用
Windows系统下的Openface安装及使用–亲测有效
openface在windows环境下使用的步骤

在Windows上使用OpenFace提取面部动作单元,主要步骤包括安装相关依赖、下载OpenFace代码、编译项目以及运行和调用等:

1. 安装依赖软件

  • Visual Studio :OpenFace基于C++开发,编译需要Visual Studio提供编译环境。建议安装Visual Studio 2015及以上版本,安装时确保勾选了“使用C++的桌面开发”相关组件。
  • CMake:用于生成Visual Studio的项目文件。从CMake官网(https://cmake.org/download/)下载Windows安装包,安装过程中勾选“Add CMake to the system PATH for all users”选项,以便在命令行中直接使用CMake。
  • Python:如果后续希望通过Python调用OpenFace的功能,需要安装Python。从Python官网(https://www.python.org/downloads/windows/)下载合适版本的Python安装包,安装时勾选“Add Python to PATH”。之后可通过pip安装相关依赖库,比如openface库 (pip install openface)。

2. 下载OpenFace代码

访问OpenFace的GitHub仓库(https://github.com/TadasBaltrusaitis/OpenFace),点击绿色的“Code”按钮,选择“Download ZIP”将代码下载到本地,然后解压到合适的目录,比如C:\OpenFace

3. 编译OpenFace

  • 打开命令提示符:按下Win + R组合键,输入cmd并回车,打开命令提示符窗口。
  • 进入OpenFace目录:使用cd命令进入OpenFace解压后的目录,例如cd C:\OpenFace
  • 创建构建目录:在OpenFace目录下创建一个用于存放编译文件的目录,比如build ,执行命令mkdir build ,然后进入该目录cd build
  • 生成Visual Studio项目文件:执行cmake -G "Visual Studio 15 2017 Win64"..(这里假设使用的是Visual Studio 2017 64位版本,若版本不同,需要相应修改Visual Studio后的数字,例如Visual Studio 2019对应Visual Studio 16 2019 Win64 )。CMake会根据系统环境和OpenFace代码生成对应的Visual Studio项目文件。
  • 编译项目:生成项目文件后,会在build目录下找到OpenFace.sln解决方案文件。双击打开该文件,在Visual Studio中,选择“Release”配置和合适的目标平台(通常为x64),然后点击“生成”菜单中的“生成解决方案”,等待编译完成。编译成功后,会在build\Release目录下生成可执行文件。

4. 提取面部动作单元

  • 处理单张图片:进入编译生成的可执行文件所在目录(build\Release),在命令提示符中执行类似如下命令:
FaceLandmarkImg.exe -f "C:\test.jpg" -aus

其中-f 后面指定要处理的图片路径,-aus表示提取面部动作单元。执行后,命令行中会输出每个面部动作单元的强度值。

  • 处理视频文件:如果要处理视频,使用如下命令:
FaceLandmarkVidMulti.exe -f "C:\test_video.mp4" -aus

工具会逐帧处理视频,并将面部动作单元强度值的结果保存到一个与视频同名、后缀为.csv的文件中,保存在与视频相同的目录下 。

  • 通过Python调用:如果已经安装了openface库,可以使用以下示例代码来提取面部动作单元:
import openface# 加载模型(确保模型文件路径正确,可根据实际安装情况调整)
align = openface.AlignDlib("models/dlib/shape_predictor_68_face_landmarks.dat")
net = openface.TorchNeuralNet("models/openface/nn4small2v1.t7", 96)# 读取图像
img = openface.load_image("C:\test.jpg")
bb = align.getLargestFaceBoundingBox(img)
alignedFace = align.align(96, img, bb, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)# 提取面部动作单元
aus = net.forward_aus(alignedFace)
print(aus)

5.选择提取目标方案

command 中没有指定就是提取所有特征

import subprocess
import os
# https://blog.csdn.net/bj233/article/details/113737268
# OpenFace 二进制文件路径
openface_executable = "../../FeatureExtraction.exe"# 输入图像或视频路径
input_path = "video.mp4"  # 可以是图片文件或视频文件
output_csv = "video_raw_2Dfp.csv"# 构建命令行调用
# command = [
#     openface_executable,
#     "-f", input_path,      # 输入文件
#     "-of", output_csv      # 输出 CSV 文件路径
# ]
# 构建命令行调用
command = [openface_executable,"-f", input_path,      # 输入文件# "-aus",                # 提取 AU# "-gaze",                # 提取 AU# "-pose",                # 提取 AU"-of", output_csv,      # 输出 CSV 文件路径-2Dfp 以像素为单位输出2D界标;# "-2Dfp",# 以像素为单位输出2D界标;# '-3Dfp', # 以毫米为单位输出3D特征;# '-pdmparams', # 输出刚性和非刚性形状参数;# '-pose', # 输出头姿势(位置和旋转);# '-aus', # 输出面部动作单元;# '-gaze', # 输出注视和相关特征(眼睛界标的2D和3D位置);# '-hogalign', # 输出提取的HOG特征文件;# '-simalign', # 输出被跟踪人脸的相似度对齐图像;# '-nobadaligned', # 如果输出相似对齐的图像,请勿从检测失败或不可靠的帧中输出(从而节省一些磁盘空间);# '-tracked', # 输出具有检测到的特征的视频;
]# 执行命令
try:subprocess.run(command, check=True)print(f"AU 数据提取完成,输出文件位于:{output_csv}")
except subprocess.CalledProcessError as e:print(f"OpenFace 调用失败:{e}")

liunx环境下使用

OpenFace 是一款用于面部行为分析的开源工具包,它能够通过提取面部动作单元(Facial Action Units,AUs)来量化面部表情的变化。面部动作单元是由心理学家制定的一套用于描述面部肌肉运动的标准,不同的动作单元组合可以表示各种复杂的面部表情,比如微笑、皱眉等。以下是使用 OpenFace 提取面部动作单元的相关内容:

安装与配置

  1. 安装依赖:OpenFace 基于 C++ 编写,同时依赖一些其他库。在 Linux 系统下,一般需要安装 CMake、OpenCV、Boost 等库。以 Ubuntu 系统为例,可以使用以下命令安装部分依赖:
sudo apt-get install build-essential cmake git libopencv-dev
  1. 下载 OpenFace:从 OpenFace 的 GitHub 仓库(https://github.com/TadasBaltrusaitis/OpenFace)下载代码。
git clone https://github.com/TadasBaltrusaitis/OpenFace.git
cd OpenFace
  1. 编译:进入 OpenFace 目录后,使用 CMake 生成编译文件,然后进行编译。
mkdir build
cd build
cmake..
make -j4  # -j4表示使用4个线程进行编译,可根据CPU核心数调整

使用 OpenFace 提取面部动作单元

  1. 运行命令行工具:编译完成后,可以使用 FaceLandmarkImg 等可执行文件来处理图像。假设我们有一张图片 test.jpg,要提取其面部动作单元,可以使用以下命令:
./FaceLandmarkImg -f test.jpg -aus

-f 参数指定输入图像的路径,-aus 参数表示要提取面部动作单元。运行后,OpenFace 会检测图像中的人脸,定位面部关键点,并输出每个面部动作单元的强度值。输出结果通常会显示在命令行中,格式类似于:

AU01_r: 0.02
AU02_r: 0.01
AU04_r: 0.00
...

其中,AUXX_r 表示右侧面部的第 XX 个动作单元,后面的数值表示该动作单元的强度,范围一般在 0 到 1 之间,数值越大表示该动作单元对应的面部肌肉运动越明显。
2. 处理视频文件:除了处理单张图像,也可以处理视频。例如,要处理名为 test_video.mp4 的视频,可以使用以下命令:

./FaceLandmarkVidMulti -f test_video.mp4 -aus

FaceLandmarkVidMulti 工具会逐帧处理视频,同样输出每帧图像中面部动作单元的强度值。输出结果默认会保存到一个文本文件中,文件名为输入视频文件名加上后缀 .csv,可以用 Excel 等工具打开查看和分析。
3. 结合编程使用:OpenFace 也提供了 API,可以在 C++、Python 等编程语言中调用。以 Python 为例,通过 openface 库(需要额外安装,pip install openface)可以实现如下功能:

import openface# 加载模型
align = openface.AlignDlib("models/dlib/shape_predictor_68_face_landmarks.dat")
net = openface.TorchNeuralNet("models/openface/nn4small2v1.t7", 96)# 读取图像
img = openface.load_image("test.jpg")
bb = align.getLargestFaceBoundingBox(img)
alignedFace = align.align(96, img, bb, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)# 提取面部动作单元
aus = net.forward_aus(alignedFace)
print(aus)

上述代码首先加载了面部关键点检测模型和用于提取面部动作单元的神经网络模型,然后读取图像,检测并对齐人脸,最后提取面部动作单元的值并打印出来。

应用场景

  • 情绪分析:通过面部动作单元的组合和强度,可以推断出人的情绪状态,比如开心、生气、惊讶等,可应用于市场调研、用户体验分析等领域,了解用户对产品或内容的情感反应。
  • 人机交互:在智能客服、智能驾驶等场景中,根据用户的面部表情实时调整交互方式,提供更加个性化和人性化的服务。
  • 心理学研究:帮助心理学家量化和分析人类的面部表情行为,研究情绪表达的机制和规律。

基于py-feat实现的方案

py-feat官网教程
https://github.com/cosanlab/py-feat
可视化检测结果
在这里插入图片描述
在这里插入图片描述

py-feat是一个用于面部动作单元(Facial Action Units,AUs)检测的Python库,它基于深度学习模型,可以方便地从图像或视频中提取面部动作单元信息。

1. 从HuggingFace下载模型并设置Detector

  • Detector类作用:整合了预训练的人脸检测、情绪识别、姿态估计等模型,提供便捷的高层API(如detector.detect())。
  • 模型下载:首次初始化Detector时,Py-Feat会自动从HuggingFace仓库下载所需的预训练模型权重并保存到本地,后续使用将直接调用已保存的模型。
  • 初始化代码
    from feat import Detector
    detector = Detector()  # 使用默认模型
    # 可指定模型,如:detector = Detector(emotion_model='svm')
    
  • 默认模型:包括face_model=img2pose、landmark_model=mobilefacenet、au_model=xgb、emotion_model=resmasknet等。

2. 处理单张图像

  • 准备图像:Py-Feat提供了测试图像single_face.jpg,可通过以下代码加载并显示:
    from feat.utils.io import get_test_data_path
    from feat.plotting import imshow
    import os
    test_data_dir = get_test_data_path()
    single_face_img_path = os.path.join(test_data_dir, "single_face.jpg")
    imshow(single_face_img_path)
    
  • 检测图像:使用detect()方法处理图像,返回Fex类实例(一种基于pandas DataFrame的子类):
    single_face_prediction = detector.detect(single_face_img_path, data_type="image")
    

3. 处理Fex输出结果

Fex实例包含丰富的检测数据,可通过便捷属性或pandas方法访问:

  • 常用属性
    • faceboxes:人脸框信息(位置、宽度、高度、得分)
    • aus:动作单元(AU)强度值
    • emotions:情绪概率(愤怒、厌恶、恐惧、快乐、悲伤、惊讶、中性)
    • poses:头部姿态(俯仰角、翻滚角、偏航角等)
    • identities:人脸标识
  • 示例
    single_face_prediction.faceboxes  # 查看人脸框信息
    single_face_prediction.emotions  # 查看情绪识别结果
    

4. 保存和加载检测结果

  • 保存结果:使用to_csv()方法将Fex实例保存为CSV文件:
    single_face_prediction.to_csv("output.csv", index=False)
    
  • 加载结果:使用read_feat()函数从CSV文件加载为Fex实例:
    from feat.utils.io import read_feat
    input_prediction = read_feat("output.csv")
    
  • 实时保存:检测时通过save参数实时保存结果(低内存模式):
    fex = detector.detect(inputs=single_face_img_path, data_type="image", save='detections.csv')
    

5. 可视化检测结果

  • 静态可视化:使用plot_detections()方法生成matplotlib图像,展示人脸框、动作单元、情绪等:
    figs = single_face_prediction.plot_detections(poses=True)  # 包含姿态信息
    # 可选参数:faces='aus'(使用标准化AU模板可视化)、muscles=True(显示肌肉运动)
    
  • 交互式可视化:使用iplot_detections()方法生成plotly交互式图像,可切换显示不同检测结果:
    single_face_prediction.iplot_detections(bounding_boxes=True, emotions=True)
    

6. 检测单张图像中的多张人脸

Detector会自动识别单张图像中的多张人脸,Fex实例中每行对应一张人脸:

  • 示例
    multi_face_image_path = os.path.join(test_data_dir, "multi_face.jpg")
    multi_face_prediction = detector.detect(multi_face_image_path, data_type="image")
    figs = multi_face_prediction.plot_detections(add_titles=False)  # 可视化所有人脸
    

7. 处理多张图像

  • 批量处理:向detect()方法传入图像路径列表,可批量处理多张图像。通过batch_size设置批量大小(需注意图像尺寸一致性,可配合output_size调整尺寸):
    img_list = [single_face_img_path, multi_face_image_path]
    mixed_prediction = detector.detect(img_list, batch_size=1, data_type="image")  # 串行处理
    # 批量处理示例:detector.detect(img_list, batch_size=5, output_size=512)
    
  • 结果筛选:使用pandas方法筛选特定图像的结果:
    # 筛选第一张图像的结果
    figs = mixed_prediction.loc[0].plot_detections()
    # 按图像路径筛选
    img_name = mixed_prediction["input"].unique()[1]
    axes = mixed_prediction.query("input == @img_name").plot_detections()
    

py-feat 与 OpenFace 对比分析

OpenFace 和 Py-Feat 各自支持的 AU 列表如下

一、双方均支持的 AU(共16项)

AU 编号面部动作单元名称技术实现差异典型应用场景
AU01内眉上扬(内侧眉弓提升)OpenFace:通过眉弓几何变形检测;Py-Feat:CNN 直接识别眉部肌肉激活惊讶、悲伤表情分析
AU02外眉上扬(外侧眉弓提升)OpenFace:依赖 HOG 特征+SVM 分类;Py-Feat:多模态特征融合(图像+几何)惊讶、疑惑表情分析
AU04皱眉(降眉肌收缩)OpenFace:计算眉间距变化率;Py-Feat:面部关键点运动轨迹分析愤怒、专注表情分析
AU05上睑提升(上眼睑抬起)OpenFace:检测眼睑高度与眼球暴露比例;Py-Feat:CNN 直接回归眼睑激活概率惊讶、恐惧表情分析
AU06脸颊提升(颧大肌收缩)OpenFace:检测颧骨区域形变;Py-Feat:结合面部纹理与关键点位移微笑、愉悦表情分析
AU07眼睑收紧(眼轮匝肌收缩)OpenFace:分析眼周皱纹特征;Py-Feat:注意力机制聚焦眼周区域厌恶、用力表情分析
AU09鼻子皱起(提上唇鼻翼肌)OpenFace:检测鼻翼扩张程度;Py-Feat:多尺度特征融合识别鼻翼运动厌恶、轻蔑表情分析
AU10上唇提升(上唇提肌)OpenFace:计算上唇与鼻翼距离变化;Py-Feat:语义分割定位上唇区域厌恶、不屑表情分析
AU12嘴角上扬(颧大肌/笑肌)OpenFace:分析嘴角角度与水平位移;Py-Feat:结合面部纹理与关键点坐标变化微笑、大笑表情分析
AU14唇角紧缩(三角肌收缩)OpenFace:检测嘴角内侧运动;Py-Feat:CNN 分类器判断嘴角形态勉强微笑、苦涩表情分析
AU15嘴角下拉(降口角肌)OpenFace:计算嘴角垂直位移;Py-Feat:时序分析嘴角运动轨迹悲伤、不满表情分析
AU17下唇抬起(降下唇肌)OpenFace:检测下唇高度变化;Py-Feat:语义分割识别下唇区域思考、严肃表情分析
AU20嘴角水平拉伸(颊肌收缩)OpenFace:分析嘴角水平位移;Py-Feat:结合面部纹理与关键点距离变化紧张、惊恐表情分析
AU23嘴唇收紧(口轮匝肌)OpenFace:计算唇部厚度与宽度比例;Py-Feat:CNN 直接检测唇部形态愤怒、决心表情分析
AU25嘴唇微张(下颌下降)OpenFace:分析上下唇距离;Py-Feat:语义分割定位唇部区域惊讶、说话状态分析
AU26嘴唇大张(下颌下降+张开)OpenFace:检测下颌角度变化;Py-Feat:3D 面部重建计算下颌运动惊讶、恐惧、大喊表情分析

二、仅 OpenFace 支持的 AU(共1项)

AU 编号面部动作单元名称OpenFace 检测逻辑为何 Py-Feat 未集成典型应用场景
AU45_r眨眼/眼睑快速闭合基于 HOG 特征检测眼周区域快速形变,结合时序分析判断眨眼频率与幅度深度学习模型对“快速动作”捕捉精度稍低;Py-Feat 侧重静态/慢动态 AU疲劳检测、注意力分析、谎言识别

三、仅 Py-Feat 支持的 AU(共4项)

AU 编号面部动作单元名称Py-Feat 检测逻辑为何 OpenFace 未集成典型应用场景
AU11提上唇鼻翼肌(鼻唇沟加深)CNN 模型直接识别鼻唇沟区域纹理变化,结合关键点位移计算肌肉收缩程度传统几何特征难以量化鼻唇沟细微变化冷笑、轻蔑等复杂表情分析
AU24嘴唇压紧(口轮匝肌收缩)基于语义分割的唇部形态分析,结合时序关键点运动轨迹判断肌肉收缩状态与 AU23(嘴唇收紧)区分度较低,传统模型易混淆愤怒、焦虑表情分析
AU28唇部伸展(唇拉伸肌)深度学习模型分析唇部水平拉伸比例,结合面部纹理判断是否为非自愿性唇部运动属于较罕见 AU,传统数据集覆盖不足痛苦、不适表情分析
AU43闭眼(眼睑完全闭合)注意力机制聚焦眼周区域,通过 CNN 分类器判断眼睑闭合状态与 AU45(眨眼)逻辑重叠,OpenFace 合并处理睡眠状态检测、疲劳分析

四、技术选择建议

  1. 优先选 OpenFace 的场景

    • 需要检测 眨眼频率(AU45),如驾驶疲劳监测、视频会议注意力分析;
    • 部署环境算力有限,需纯 CPU 实时运行(OpenFace 单帧处理速度比 Py-Feat 快 30%+)。
  2. 优先选 Py-Feat 的场景

    • 需要分析 复杂社交表情(如冷笑 AU11、焦虑 AU24),或研究微表情(如 AU28 唇部非自愿伸展);
    • 需要 可视化与量化结合(如热力图标记 AU 激活区域、DataFrame 输出强度值),适合心理学实验分析。
http://www.lryc.cn/news/584892.html

相关文章:

  • 静电式 vs UV 光解:哪种油烟净化技术更适合你的餐厅?
  • python的病例管理系统
  • 【JMeter】执行系统命令
  • VS 按F12 提示cannot navigate to the symbol under the caret
  • 机器学习详解
  • linux中INIT_MM_CONTEXT宏对pgd的重复赋值
  • Windows 10 2021 LTSC【版本号:19044.6036】
  • 设计模式笔记_结构型_代理模式
  • 小白学Python,标准库篇——随机库、正则表达式库
  • 【跟着PMP学习项目管理】每日一练 - 5
  • C++,从汇编角度看《虚拟继承的邪恶》
  • 【Linux】GDB/CGDB 调试器学习笔记
  • 【经典面经】C++新特性 TCP完整收发数据 TLS1.2 TLS1.3
  • AWS控制台升级EKS版本
  • AI进化论07:第二次AI寒冬——AI“改头换面”,从“AI”变成“机器学习”
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • 基于vscode开发工具显示git提交信息的插件
  • Web3.0 支付网络对企业的优势
  • Linux磁盘限速(Ubuntu24实测)
  • spark3 streaming 读kafka写es
  • 可以悬浮在Windows电脑桌面的好用便签软件评测
  • 前端开发—全栈开发
  • php use 命名空间与 spl_autoload_register的关系
  • DVWA靶场通关笔记-反射型XSS(Reflected Low级别)
  • uni-app获取手机当前连接的WIFI名称
  • 小皮面板搭建pikachu
  • 如何将文件从OPPO手机传输到电脑
  • GNhao,获取跨境手机SIM卡跨境通信新选择!
  • 手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
  • 【Python3教程】Python3高级篇之CGI编程