[关闭]
@sambodhi 2018-10-30T20:11:19.000000Z 字数 2901 阅读 2135

使用 3D 卷积神经网络的交叉视听识别进行唇语识别

作者|Amirsina Torfi、Seyed Mehdi Iranmanesh、Nasser M. Nasrabadi
译者|清爹
编辑|Jane

导读:唇语识别是一项集机器视觉与自然语言处理于一体的技术,可以直接从有人讲话的图像中识别出讲话内容。唇语识别系统使用机器视觉技术,从图像中连续识别出人脸,判断其中正在说话的人,提取此人连续的口型变化特征,随即将连续变化的特征输入到唇语识别模型中,识别出讲话人口型对应的发音,随后根据识别出的发音,计算出可能性最大的自然语言语句。

唇语识别并非最近才出现的技术,早在 2003 年,Intel 就开发了唇语识别软件 Audio Visual Speech Recognition(AVSR),开发者得以能够研发可以进行唇语识别的计算机;2016 年 Google DeepMind 的唇语识别技术就已经可以支持 17500 个词,新闻测试集识别准确率达到了 50% 以上。

大家一定很好奇唇语识别系统要怎么实现。很幸运的是,Amirsina Torfi 等人实现了使用 3D 卷积神经网络的交叉视听识别技术进行唇语识别,并将代码托管到 GitHub 上开源: https://github.com/astorfi/lip-reading-deeplearning

本文简单地介绍了如何使用 3D 卷积神经网络的交叉视听识别技术进行唇语识别,完整的论文可参阅:
https://ieeexplore.ieee.org/document/8063416

下面是进行唇语识别的简单实现方法。

输入管道须由用户准备。该项目实现了为视听匹配(audio-visual matching)提供耦合 3D 卷积神经网络唇语识别就是这个项目的具体应用之一。

概况

视听语音识别(Audio-visual recognition,AVR)被认为是音频损坏时语音识别任务的一种解决方案,也是多人场景中用于讲话人验证的一种视觉识别方法。AVR 系统的方法是利用从一种模态中提取的信息,通过补充缺失的信息来提高另一种模态的识别能力。

问题与方法

关键问题是找出音频和视频流之间的对应关系,就是这项工作的目标。我们提出了一种耦合 3D 卷积神经网络架构,该架构可以将两种模式映射到一个表示空间中,以使用学习的多模态特征来评估视听流的对应关系。

如何利用 3D 卷积神经网络

我们提出的该架构将结合时态信息和空间信息,来有效地发现不同模态的时态信息之间的相关性。通过使用相对较小的网络架构和更小的数据集,我们提出的方法优于现有类似的视听匹配方法的性能,现有方法是使用 CNN 进行特征表示。我们还证明了有效的对选择(pair selection)方法可以显著提高性能。

代码实现

输入管道须由用户提供。实现的其余部分考虑包含基于话语的提取特征的数据集。

唇语识别

就唇语识别来讲,必须将所需视频作为输入。首先,使用 cd 命令进入相应的目录:

  1. cd code/lip_tracking

运行专用的python file如下:

  1. python VisualizeLip.py --input input_video_file_name.ext --output output_video_file_name.ext

运行上述脚本,通过保存每个帧的嘴部区域来提取唇部动作,并创建输出视频,在嘴部区域周围有一个矩形,以便更好地进行可视化。

所需的arguments由以下 Python 脚本定义,VisualizeLip.py文件中已定义该脚本:

  1. ap = argparse.ArgumentParser()
  2. ap.add_argument("-i", "--input", required=True,
  3. help="path to input video file")
  4. ap.add_argument("-o", "--output", required=True,
  5. help="path to output video file")
  6. ap.add_argument("-f", "--fps", type=int, default=30,
  7. help="FPS of output video")
  8. ap.add_argument("-c", "--codec", type=str, default="MJPG",
  9. help="codec of output video")
  10. args = vars(ap.parse_args())

一些已定义的参数有其默认值,它们并不需要进一步的操作。

处理

在视觉部分中,对视频进行后期处理,使其帧率相等,为 30f/s。然后,使用 dlib 库对视频执行人脸跟踪和嘴部区域提取的操作。最后,所有嘴部区域都调整为相同的大小,并连接起来形成输入特征数据集。数据集并不包含任何音频文件。使用 FFmpeg 框架从视频中提取音频文件。处理管道如下图所示:

这项工作的输入管道

我们所提出的该架构使用两个不相同的卷积网络(ConvNet),它使用一对语音和视频流。网络输入是一对特征,表示从 0.3 秒的视频剪辑中提取的唇部动作和语音特征。主要任务是确定音频流是否与唇部运动视频剪辑在所需的流持续时间内相对应。在接下来的两个小节中,我们将讲解语音和视觉流的输入。

语音网络(Speech Net)

在时间轴上,时间特征是非重叠的 20ms 窗口,用来生成具有局部特征的频谱特征。输入语音特征映射以图像数据立方体的形式表示,对应于频谱图,以及 MFEC 特征的一阶导数和二阶导数。这三个通道对应于图像深度。从一个 0.3 秒的视频剪辑中,可以导出 15 个时态特征集(每个都形成 40 个 MFEC 特征),这些特征集形成了语音特征立方体。每个输入特征为一个音频流的维数为 15x40x3。如下图所示:

readme_images/Speech_GIF.gif

语音特征使用 SpeechPy 包进行提取。

要了解输入管道是如何工作的,请参阅code/speech_input/input_feature.py

视觉网络(Visual Net)

在这项工作中使用的每个视频剪辑的帧率是 30 f/s。因此,9 个连续的图像帧形成 0.3 秒的视频流。网络的视频流的输入是大小为 9x60x100 的立方体,其中 9 是表示时态信息的帧数。每个通道是嘴部区域的 60x100 灰度图像。

架构

该架构是一个耦合 3D 卷积神经网络,其中必须训练具有不同权重集的两个不同网络。在视觉网络中,唇部运动的空间信息和时态信息相结合,进行融合来利用时间相关性。在音频网络中,提取的能量特征作为空间维度,堆叠的音频帧构成了时间维度。在我们提出的 3D 卷积神经网络架构中,卷积运算是在连续的时间帧上对两个视听流执行的。

训练 / 评估

首先,克隆存储库。然后,用 cd 命令进入专用目录:

  1. cd code/training_evaluation

最后,必须执行train.py文件:

  1. python train.py

对于评估阶段,必须执行类似脚本:

  1. python test.py

运行结果

下面的结果表明了该方法对收敛准确度和收敛速度的影响。

最好的结果,也就是最右边的结果,属于我们提出的方法。

所提出的在线对选择方法的效果如上图所示。

参考来源:

https://github.com/astorfi/lip-reading-deeplearning

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注