使用面部标记提取和深度神经网络进行“昏昏欲睡”的检测

640?wx_fmt=jpeg

导言


本文的目的是解释如何使用面部标志作为神经网络的输入来检测昏昏欲睡的人,在这种情况下,3D卷积神经网络发出警报以唤醒用户并防止某种形式的事故。


我们的想法是从网络摄像头中提取一组帧,然后从中提取面部标志,特别是双眼的位置,然后将这些坐标传递给神经模型,以获得最终分类,告诉我们用户是否清醒或者睡着了。

方法


最近的工作表明,使用3D卷积神经网络或Conv3D可以实现活动识别,因为不是分析单个帧而是分析它们的一组,这组帧是包含活动的短视频。


话虽如此,并将昏昏欲睡视为可以包含在视频中的活动,但使用Conv3D来尝试预测困倦是有意义的。


第一步是从相机中提取帧,在我们的例子中是网络摄像头。一旦我们有了框架,我们就会使用一个名为dlib的python库,其中包含一个面部标志检测器; 结果是x,y坐标的集合,指示面部标志的位置。

640?wx_fmt=png


即使我们得到一个点的集合,我们只对眼睛的位置感兴趣,所以我们将只保留属于眼睛的十二个点。

640?wx_fmt=png


到目前为止,我们拥有单帧的面部标志。然而,我们希望给我们的系统提供序列感,并且为此,我们不考虑单帧来进行最终预测,我们最好采用它们中的一组。


我们认为,一次分析一秒钟的视频就足以做出好的睡意预测。因此,我们保持十个面部地标检测,相当于一秒视频; 然后,我们将它们连接成一个单一的模式,即一个具有形状(10,12,12)的数组; 10个帧,x坐标为12个点,y坐标为12个点。此数组是我们的Conv3D模型的输入,以获得最终分类。

640?wx_fmt=png


我们模型的第一个隐藏层是3D卷积层,接着是最大池化层和展平层,这导致了800个神经元的向量。下一层是青少年单元的密集层,具有relu激活功能。模型y的最后一层由两个神经元组成,其中激活函数是softmax函数,由两个神经元组成,每个类一个。

构建


网络摄像头总是流式传输视频,但我们每0.1秒分析一个帧,直到我们达到10个样本,相当于1秒,以提取面部标志并仅保留对应于双眼的点。我们将这些点分组为7个单元的重叠,这意味着我们将点从第一帧分组到十个,下一组从第四帧到第十三帧形成。

一旦我们有一组眼睛的点(x,y坐标),我们将它们传递给我们的神经模型以获得分类,其结果可以是[1,0]代表“清醒”,或者[0,1]代表“昏昏欲睡”。换句话说,我们正在分析小块网络摄像头的流媒体,以便每秒预测困倦。

640?wx_fmt=png

执行


在这里,您可以找到如何获得本文中使用的每个元素。

  • 该系统是在python 3.5上实现的

  • 使用OpenCV for python实现从网络摄像头中提取帧

  • 使用库dlib提取面部标志

  • 该模型使用keras构建

  • 在烧瓶的帮助下部署了前端。

 
 
from keras.utils import plot_modelfrom keras.models import Modelfrom keras.layers import Inputfrom keras.layers import Densefrom keras.layers import Flattenfrom keras.layers.convolutional import Conv3Dfrom keras.layers.pooling import MaxPooling3Dfrom keras.models import Sequentialvisible = Input(shape=(10,12,12,1))conv1 = Conv3D(8, kernel_size=2, activation='relu')(visible)pool1 = MaxPooling3D(pool_size=(2, 2, 2))(conv1)flat1 = Flatten()(pool1)hidden1 = Dense(10, activation='relu')(flat1)output = Dense(2, activation='softmax')(hidden1)model = Model(inputs=visible, outputs=output)import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv3D
from keras.layers.pooling import MaxPooling3D
from keras.models import Sequential
visible = Input(shape=(10,12,12,1))
conv1 = Conv3D(8, kernel_size=2, activation='relu')(visible)
pool1 = MaxPooling3D(pool_size=(222))(conv1)
flat1 = Flatten()(pool1)
hidden1 = Dense(10, activation='relu')(flat1)
output = Dense(2, activation='softmax')(hidden1)
model = Model(inputs=visible, outputs=output)


结果


我们仅为200个时期训练了我们的最终模型,用于训练该模型的优化器是ADAM。当然,我们尝试过许多其他模型,但最好的结果是这里显示的模型。

这项工作的最终结果是显示用户网络摄像头的前端。每隔一秒分析一次流,并在视频下显示预测“昏昏欲睡”或“清醒”。作为我们最后一个示例中的附加功能,如果用户被检测为“昏昏欲睡”,则系统会发出声音警报。

640?wx_fmt=png



对于进一步的实验,这里提出的解决方案可以很容易地扩展到在智能手机上工作,甚至可以在运行Ubuntu发行版的嵌入式系统中工作,例如众所周知的树莓派。


长按订阅更多精彩▼

640?wx_fmt=jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值