我们的想法是从网络摄像头中提取一组帧,然后从中提取面部标志,特殊是双眼的位置,然后将这些坐标通报给神经模型,以得到终极分类,它会见告我们用户是复苏还是睡着了。
方法最近的研究表明,利用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