0

TL;DR 有没有办法在不使用机器学习/HMM 的情况下实现相当准确的点头检测机制?(不需要训练和测试数据)

我目前正在开展一个项目,该项目调查人们在对话过程中的面部特征。我负责尝试理解的功能之一是实现某种形式的点头检测。我所有的数据都来自使用OpenFace捕获的面部地标数据。其输出是一个 .csv 文件,其中包含输入视频每一帧的地标细节。

我想要实现的基本过程如下:

  1. 录制参与者交谈的视频,其中发生点头

  2. 使用 OpenFace 从视频中提取特征(姿势、俯仰、偏航、滚动等)

  3. 从世界坐标转换为面坐标(此处显示

  4. 使用转换后的特征来检测何时发生点头

我目前已经完成了第 1-3 步,并且在第 4 步时遇到了一些麻烦。目前我有几种方法可以解决这个问题。

第一个使用来自其中一个标记的翻译信息(类似于此示例)。我只是在参与者头部选择一个点,并在大约 1 秒的窗口长度内确定该点的整体平移运动(垂直)。为了发生点头,这个位移必须超过一个指定的阈值。这种方法适用于大点头的正面视频,但不能很好地拾取较小的点头(更逼真),如果参与者没有面对,就会有麻烦。如果参与者在框架周围移动足够多而没有点头,也会检测到错误的点头,因为它只是在看平移运动。

第二种方法是使用人脸坐标中人头的俯仰数据。这类似于我的第一种方法。音高的总变化是在 1 秒的窗口内计算的。然后我计算了音高数据的平均值和标准偏差,并将我的阈值设置为平均值 + X*标准偏差,其中 X 是我可以指定的某个乘数。所有具有跨过此阈值的音高数据的时间戳都将被归类为点头。同样,这对于较大的点头效果相当好,甚至可以处理非头部视频。将此(和方法 1)应用于实际对话时,它们虽然不太公平。

大多数点头都是非常微妙的,导致音调的变化非常小。我的两种技术的主要问题是它们都依赖于一个阈值,这将根据点头的类型而有很大差异。如果我自己知道发生了点头时手动查看数据,这并不总是很明显,所以不难看出为什么我的方法不适用于真正的点头。

从阅读该主题来看,使用机器学习或 HMM 似乎是一个更好的解决方案。

我目前正在 MATLAB 中对此进行编码,如果有人感兴趣,我可以展示我的代码。谢谢!

4

0 回答 0