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

文章目录

  • 基于openface实现的技术方案
  • 基于py-feat实现的方案
    • [1. 从HuggingFace下载模型并设置`Detector`](#1. 从HuggingFace下载模型并设置Detector)
    • [2. 处理单张图像](#2. 处理单张图像)
    • [3. 处理`Fex`输出结果](#3. 处理Fex输出结果)
    • [4. 保存和加载检测结果](#4. 保存和加载检测结果)
    • [5. 可视化检测结果](#5. 可视化检测结果)
    • [6. 检测单张图像中的多张人脸](#6. 检测单张图像中的多张人脸)
    • [7. 处理多张图像](#7. 处理多张图像)
  • [py-feat 与 OpenFace 对比分析](#py-feat 与 OpenFace 对比分析)
      • [一、双方均支持的 AU(共16项)](#一、双方均支持的 AU(共16项))
      • [二、仅 OpenFace 支持的 AU(共1项)](#二、仅 OpenFace 支持的 AU(共1项))
      • [三、仅 Py-Feat 支持的 AU(共4项)](#三、仅 Py-Feat 支持的 AU(共4项))
      • 四、技术选择建议

基于openface实现的技术方案

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

面部关键点检测

面部标志和头部姿态跟踪

面部动作单元识别

注视跟踪

面部特征提取(对齐的人脸和HOG特征)

windows环境下使用

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

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

1. 安装依赖软件

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库,可以使用以下示例代码来提取面部动作单元:
python 复制代码
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 中没有指定就是提取所有特征

python 复制代码
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 系统为例,可以使用以下命令安装部分依赖:
bash 复制代码
sudo apt-get install build-essential cmake git libopencv-dev
  1. 下载 OpenFace:从 OpenFace 的 GitHub 仓库(https://github.com/TadasBaltrusaitis/OpenFace)下载代码。
bash 复制代码
git clone https://github.com/TadasBaltrusaitis/OpenFace.git
cd OpenFace
  1. 编译:进入 OpenFace 目录后,使用 CMake 生成编译文件,然后进行编译。
bash 复制代码
mkdir build
cd build
cmake..
make -j4  # -j4表示使用4个线程进行编译,可根据CPU核心数调整

使用 OpenFace 提取面部动作单元

  1. 运行命令行工具 :编译完成后,可以使用 FaceLandmarkImg 等可执行文件来处理图像。假设我们有一张图片 test.jpg,要提取其面部动作单元,可以使用以下命令:
bash 复制代码
./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 之间,数值越大表示该动作单元对应的面部肌肉运动越明显。

  1. 处理视频文件 :除了处理单张图像,也可以处理视频。例如,要处理名为 test_video.mp4 的视频,可以使用以下命令:
bash 复制代码
./FaceLandmarkVidMulti -f test_video.mp4 -aus

FaceLandmarkVidMulti 工具会逐帧处理视频,同样输出每帧图像中面部动作单元的强度值。输出结果默认会保存到一个文本文件中,文件名为输入视频文件名加上后缀 .csv,可以用 Excel 等工具打开查看和分析。

  1. 结合编程使用 :OpenFace 也提供了 API,可以在 C++、Python 等编程语言中调用。以 Python 为例,通过 openface 库(需要额外安装,pip install openface)可以实现如下功能:
python 复制代码
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仓库下载所需的预训练模型权重并保存到本地,后续使用将直接调用已保存的模型。

  • 初始化代码

    python 复制代码
    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,可通过以下代码加载并显示:

    python 复制代码
    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的子类):

    python 复制代码
    single_face_prediction = detector.detect(single_face_img_path, data_type="image")

3. 处理Fex输出结果

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

  • 常用属性

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

    python 复制代码
    single_face_prediction.faceboxes  # 查看人脸框信息
    single_face_prediction.emotions  # 查看情绪识别结果

4. 保存和加载检测结果

  • 保存结果 :使用to_csv()方法将Fex实例保存为CSV文件:

    python 复制代码
    single_face_prediction.to_csv("output.csv", index=False)
  • 加载结果 :使用read_feat()函数从CSV文件加载为Fex实例:

    python 复制代码
    from feat.utils.io import read_feat
    input_prediction = read_feat("output.csv")
  • 实时保存 :检测时通过save参数实时保存结果(低内存模式):

    python 复制代码
    fex = detector.detect(inputs=single_face_img_path, data_type="image", save='detections.csv')

5. 可视化检测结果

  • 静态可视化 :使用plot_detections()方法生成matplotlib图像,展示人脸框、动作单元、情绪等:

    python 复制代码
    figs = single_face_prediction.plot_detections(poses=True)  # 包含姿态信息
    # 可选参数:faces='aus'(使用标准化AU模板可视化)、muscles=True(显示肌肉运动)
  • 交互式可视化 :使用iplot_detections()方法生成plotly交互式图像,可切换显示不同检测结果:

    python 复制代码
    single_face_prediction.iplot_detections(bounding_boxes=True, emotions=True)

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

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

  • 示例

    python 复制代码
    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调整尺寸):

    python 复制代码
    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方法筛选特定图像的结果:

    python 复制代码
    # 筛选第一张图像的结果
    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 输出强度值),适合心理学实验分析。
相关推荐
你怎么知道我是队长1 小时前
python-enumrate函数
开发语言·chrome·python
大熋1 小时前
Playwright Python 教程:网页自动化
开发语言·python·自动化
A7bert7772 小时前
【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·python·yolo
菜包eo2 小时前
如何使用数字化动态水印对教育视频进行加密?
音视频·同态加密
cdg==吃蛋糕2 小时前
selenium 使用方法
开发语言·python
ViiTor_AI2 小时前
语音对话秒译 + 视频悬浮字 + 相机即拍即译:ViiTor 如何破局跨语言场景?
音视频·机器翻译·视频翻译工具
Y1nhl3 小时前
力扣_二叉树的BFS_python版本
python·算法·leetcode·职场和发展·宽度优先
Q_Q5110082853 小时前
python的婚纱影楼管理系统
开发语言·spring boot·python·django·flask·node.js·php
若兰幽竹4 小时前
【从零开始编写数据库:基于Python语言实现数据库ToyDB的ACID特性】
数据库·python
xiaocainiao8814 小时前
Python 实战:构建 Git 自动化助手
git·python·自动化