视频人脸处理——人脸面部动作提取
文章目录
- 基于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 提取面部动作单元的相关内容:
安装与配置
- 安装依赖:OpenFace 基于 C++ 编写,同时依赖一些其他库。在 Linux 系统下,一般需要安装 CMake、OpenCV、Boost 等库。以 Ubuntu 系统为例,可以使用以下命令安装部分依赖:
sudo apt-get install build-essential cmake git libopencv-dev
- 下载 OpenFace:从 OpenFace 的 GitHub 仓库(https://github.com/TadasBaltrusaitis/OpenFace)下载代码。
git clone https://github.com/TadasBaltrusaitis/OpenFace.git
cd OpenFace
- 编译:进入 OpenFace 目录后,使用 CMake 生成编译文件,然后进行编译。
mkdir build
cd build
cmake..
make -j4 # -j4表示使用4个线程进行编译,可根据CPU核心数调整
使用 OpenFace 提取面部动作单元
- 运行命令行工具:编译完成后,可以使用
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 合并处理 | 睡眠状态检测、疲劳分析 |
四、技术选择建议
-
优先选 OpenFace 的场景:
- 需要检测 眨眼频率(AU45),如驾驶疲劳监测、视频会议注意力分析;
- 部署环境算力有限,需纯 CPU 实时运行(OpenFace 单帧处理速度比 Py-Feat 快 30%+)。
-
优先选 Py-Feat 的场景:
- 需要分析 复杂社交表情(如冷笑 AU11、焦虑 AU24),或研究微表情(如 AU28 唇部非自愿伸展);
- 需要 可视化与量化结合(如热力图标记 AU 激活区域、DataFrame 输出强度值),适合心理学实验分析。