如何使用面部标志作为神经网络的输入来检测出昏昏欲睡的人?
介绍
本文的目的是解释如何使用面部标志作为神经网络的输入来检测出昏昏欲睡的人,在这种情况下,3D卷积神经网络会发出警报以唤醒用户并防止某种形式的事故。
我们的想法是从网络摄像头中提取一组帧,然后从中提取面部标志,特别是双眼的位置,然后将这些坐标传递给神经模型,以获得最终分类,它会告诉我们用户是清醒还是睡着了。
方法
最近的研究表明,使用3D卷积神经网络或Conv3D可以实现活动识别,因为不是分析单个帧而是分析它们的一组,这组帧是包含活动的短视频。
昏昏欲睡可以是一种包含在视频中的活动,但使用Conv3D来尝试预测困倦是有道理的。
第一步是从相机中提取帧,在我们的例子中会是网络摄像头。一旦我们有了框架,我们就会使用一个名为dlib的python库,其中包含一个面部标志检测器;结果是x、y坐标的集合,它们代表着面部标志的位置。
面部标志图1:面部标志
即使得到一系列的点,我们也只对眼睛的位置感兴趣,所以我们只保留属于眼睛的十二个点。
图片标题图2:面部标志的感兴趣区域
到目前为止,我们拥有单帧的面部标志。然而,我们希望给系统提供序列感,并且为此,我们不考虑单帧来进行最终预测,我们最好采用它们中的一组。
我们认为,一次分析一秒钟的视频就足以做出良好的睡意预测。因此,我们保持十个面部地标检测,相当于一秒视频;然后,我们将它们连接成一个单一的模式,即一个具有形状(10,12,12)的数组; 10个帧,x坐标为12个点,y坐标为12个点。此数组是我们的Conv3D模型的输入,用于最终分类。
图像标题图3:神经模型
我们模型的第一个隐藏层是一个3D卷积层,后面是最大池化层和一个flatten层,它产生一个800个神经元的向量。下一层是密集层,具有relu激活功能。模型y的最后一层由两个神经元组成,其中激活函数是softmax函数,由两个神经元组成,每个类一个。
体系架构
网络摄像头总是流式传输视频,但我们每0.1秒分析一个帧,直到我们达到10个样本,相当于1秒,以提取面部标志并仅保留与双眼相对应的点。我们将这些点分组为7个单元的重叠,这意味着我们将点从第一帧分组到十个,下一组从第四帧到第十三帧形成。
一旦我们有一组眼睛的点(x,y坐标),我们将它们传递给我们的神经模型以获得分类,其结果可以是[1,0]代表“清醒”,或者[0,1]代表“昏昏欲睡”。换句话说,我们正在分析小块网络摄像头的流媒体,以便每秒都能预测困倦。
图片标题图4:解决方案架构
实现
在这里,您可以找到如何获得本文中使用的每个元素。
- 该系统是在python 3.5上实现的
- 使用OpenCV for python实现从网络摄像头中提取帧
- 使用库dlib提取面部标志
- 该模型使用keras构建
- 在flask的帮助下部署了前端
结果
我们仅为200个epochs训练了我们的最终模型,用于训练该模型的优化器是ADAM。当然,我们尝试过许多其他模型,但得到最好的结果的就是这里显示的模型。
这项工作的最终结果是显示用户网络摄像头的前端。每隔一秒分析一次流,并在视频下显示预测是“昏昏欲睡”还是“清醒”。作为我们最后一个示例中的附加功能,如果用户被检测为“昏昏欲睡”,则系统就会发出声音警报。
图片标题图5:前端结果
对于进一步的实验,这里提出的解决方案可以很容易地扩展到智能手机甚至是运行Ubuntu发行版的嵌入式系统上,例如著名的raspberry pi。
作者: Cristyan Rufino Gil Morales
文章来源:https://dzone.com/articles/drowsy-detection-using-facial-landmarks-extraction