本文转载自公众号《核心阅读》(ID:AI_Discovery)道路万千,安全第一!疲劳驾驶可能是交通事故的元凶之一,美国的一项研究表明,如果司机睡眠不足4小时,引发交通事故的概率与酒后驾车相当。为了减少疲劳驾驶现象,驾驶员疲劳检测应运而生。这是一项安全技术,可以防止驾驶员在驾驶过程中因疲劳而引发安全事故。这个Python中级项目的目的是建立一个驾驶员疲劳检测系统,用于检测人眼闭合的持续时间。当检测到驾驶员疲劳时,系统会发出警告。驾驶员疲劳检测系统这个Python项目将使用OpenCV从网络摄像头收集图像,并将它们输入“深度学习”模型,该模型将人眼分类为“睁开”或“闭合”。这个Python项目将采用的方法如下:第1步-从相机获取图像作为输入。第2步-检测图像中的人脸并创建感兴趣区域(ROI)。第3步-从ROI中检测人眼并将其输入分类器。第4步-分类器会将人眼分类为睁眼或闭眼。第五步-计算驾驶员是否疲劳的分数。在学习先决条件、数据集和模型结构之前,如果您是新手,建议您参考PythonMasterSheet了解Python编程语言所需的所有概念。先决条件此Python项目需要一个用于捕获图像的网络摄像头。您需要在您的系统上安装Python(推荐3.6版本),然后使用pip安装所需的包。OpenCV-使用pip安装opencv-python(面部和眼睛检测)。TensorFlow-使用pip安装tensorflow(keras使用TensorFlow作为后端)。Keras-使用pip安装keras(构建分类模型)。Pygame-使用pip安装pygame(播放警告音)。需要数据集来创建用于此模型的数据集。为了创建数据集,我们编写了一个脚本来捕获相机中人眼的图像并存储在本地磁盘上,将人眼图像分类为“打开”或“关闭”状态,并通过删除所需图像来构建模型手动清理数据。该数据包括大约7000张人眼在不同光照条件下的图像。在数据集上训练模型后,我们附上最终的权重和模型结构文件“models/cnnCat2.h5”。您现在可以使用此模型根据眼睛是睁开还是闭上来对图像进行分类。模型结构我们使用的模型是由Keras通过卷积神经网络(CNN)构建的。卷积神经网络是一种特殊类型的深度神经网络,在图像分类方面表现非常出色。CNN基本上由一个输入层、一个输出层和一个可以包含多个层的隐藏层组成。卷积运算由过滤器在这些层上执行,过滤器在层和过滤器上执行2D矩阵乘法。CNN模型结构包括以下几层:卷积层;32个节点,内核大小为3的卷积层;32个节点,内核大小为3的卷积层;64个节点,内核大小为3的全连接层;128个节点最后一层也是全连接层,有2个节点。在所有层中,除了使用Softmax的输出层外,都使用了Relu激活函数。使用Python项目进行驾驶员疲劳检测的步骤从zip下载python项目源代码并解压缩系统中的文件:Python项目Zip文件。zip的目录是:1.“haarcascadefiles/cascadefiles”文件夹包含从图像中检测对象所需的xml文件。在这种情况下,需要检测人脸和眼睛。2.模型文件夹包含我们的模型文件“cnnCat2.h5”,它是在卷积神经网络上训练的。3.我们有一个音频“alarm.wav”,当司机昏昏欲睡时播放。4.“Model.py”文件包含一个程序,通过该程序训练数据集以构建分类模型。您可以从此文件中看到正在运行的卷积神经网络。5.“Drowsinessdetection.py”是本项目的主文件。我们必须在开始测试时运行此文件。下一个。让我们逐步了解该算法是如何工作的。第1步-从摄像头获取图像作为输入使用网络摄像头获取图像作为输入。为了访问网络摄像头,我们进行了无限循环以捕获每一帧。我们使用OpenCV提供的方法cv2.VideoCapture(0)来访问相机并设置捕获对象(cap)。cap.read()将读取每一帧并将图像存储在帧变量中。Step2-Detectthefaceintheimageandcreatearegionofinterest(ROI)为了检测图像中的人脸,首先需要将图像模式转换为灰度,因为用于物体检测的OpenCV算法需要灰度图像作为输入。因此可以在没有颜色信息的情况下检测物体。我们将使用haar级联分类器来检测人脸。使用face=cv2.CascadeClassifier('pathtothehaarcascadexmlfile')设置分类器,然后使用faces=face.detectMultiScale(gray)执行检测。这反过来会产生一个包含x、y坐标和高度(对象边界框的宽度)的检测数组。现在我们可以遍历人脸并为每张脸绘制边界框。for(x,y,w,h)infaces:cv2.rectangle(frame,(x,y),(x+w,y+h),(100,100,100),1)step3-从ROI检测人眼同将其输入分类器以检测人脸的过程也适用于检测眼睛。首先,我们分别为leye和reye中的眼睛设置级联分类器,然后使用left_eye=leye.detectMultiScale(gray)来检测人眼。现在,我们只需要从完整图像中提取眼睛数据。这可以通过提取眼睛的边界框来实现,然后可以使用此代码从框架中提取眼睛图像。l_eye=frame[y:y+h,x:x+w]l_eye只包含左眼的图像数据。这将被送入CNN分类器,该分类器将预测眼睛是睁着还是闭着。同样,我们将右眼的数据提取到r_eye中。第4步-分类器会将眼睛分类为睁眼或闭眼。使用CNN分类器进行眼睛状态预测。因为模型需要从正确的尺寸开始,所以在将图像输入模型之前需要做一些事情。首先,使用r_eye=cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)将彩色图像转换为灰度图像。然后,由于模型是在24*24像素的图像上测试的,因此需要将图像调整为24*24像素:cv2.resize(r_eye,(24,24))。我们对数据进行归一化处理以获得更好的收敛性:r_eye=r_eye/255(所有值都在0-1之间)。扩展维度以输入到分类器。使用model=load_model('models/cnnCat2.h5')加载模型。现在我们使用模型来预测每只眼睛的状态:lpred=model.predict_classes(l_eye)。如果lpred[0]=1,眼睛是睁着的;如果lpred[0]=0,眼睛是闭着的。第5步-计算分数确定驾驶员是否疲劳分数基本上是一个确定驾驶员可以闭眼多长时间的值。因此,如果双眼都闭上,分数会不断增加,而当双眼睁开时,分数会下降。使用cv2.putText()函数将结果绘制在屏幕上,这将显示驱动程序的实时状态。cv2.putText(frame,"Open",(10,height-20),font,1,(255,255,255),1,cv2.LINE_AA)阈值由以下方法确定:例如,如果score大于15表示司机已关闭如果眼睛时间较长,则阈值为15。此时,我们将使用sound.play()发出警报。主要文件的源代码如下:importcv2importosfromkeras.modelsimportload_modelimportnumpyasnpfrompygameimportmixerimporttimemixer.init()sound=mixer.Sound('alarm.wav')face=cv2.CascadeClassifier('haarcascadefiles\haarcascade_frontalface_alt.xml')leye=cv2.CascadeClassifier('haarcascadefiles\haarcascade_lefteye_2splits.xml')reye=cv2.CascadeClassifier('haarcascadefiles\haarcascade_righteye_2splits.xml')lbl=['Close','Open']model=load_model('models/cnncat2.h5')path=os.getcwd()cap=cv2.VideoCapture(0)font=cv2.FONT_HERSHEY_COMPLEX_SMALLcount=0score=0thicc=2rpred=[99]lpred=[99]while(True):ret,frame=cap.read()高度,宽度=frame.shape[:2]gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)faces=face.detectMultiScale(灰色,minNeighbors=5,scaleFactor=1.1,minSize=(25,25))left_eye=leye.detectMultiScale(灰色)right_eye=reye.detectMultiScale(灰色)cv2.rectangle(frame,(0,height-50),(200,height),(0,0,0),thickness=cv2.FILLED)for(x,y,w,h)infaces:cv2.rectangle(frame,(x,y),(x+w,y+h),(100,100,100),1)for(x,y,w,h)inright_eye:r_eye=frame[y:y+h,x:x+w]count=count+1r_eye=cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)r_eye=cv2.resize(r_eye,(24,24))r_eye=r_eye/255r_eye=r_eye.reshape(24,24,-1)r_eye=np.expand_dims(r_eye,axis=0)rpred=model.predict_classes(r_eye)if(rpred[0]==1):lbl='Open'if(rpred[0]==0):lbl='Closed'breakfor(x,y,w,h)inleft_eye:l_eye=frame[y:y+h,x:x+w]count=count+1l_eye=cv2.cvtColor(l_eye,cv2.COLOR_BGR2GRAY)l_eye=cv2.resize(l_eye,(24,24))l_eye=l_eye/255l_eye=l_eye.reshape(24,24,-)1)l_eye=np.expand_dims(l_eye,axis=0)lpred=model.predict_classes(l_eye)if(lpred[0]==1):lbl='Open'if(lpred[0]==0):lbl='Closed'breakif(rpred[0]==0andlpred[0]==0):score=score+1cv2.putText(frame,"Closed",(10,height-20),font,1,(255,255,255),1,cv2.LINE_AA)#if(rpred[0]==1orlpred[0]==1):else:score=score-1cv2.putText(frame,"Open",(10,height-20),font,1,(255,255,255),1,cv2.LINE_AA)if(score<0):score=0cv2.putText(frame,'Score:'+str(score),(100,height-20),font,1,(255,255,255),1,cv2.LINE_AA)if(score>15):#personisfeelingsleepysowbeepthealarmcv2.imwrite(os.path.join(path,'image.jpg'),frame)try:sound.play()except:#isplaying=Falsepassif(thicc<16):thicc=thicc+2else:thicc=thicc-2if(thicc<2):thicc=2cv2.rectangle(frame,(0,0),(width,height),(0,0,255),thicc)cv2.imshow('frame',frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()Python工程实例启动工程,查看运行情况要启动的项目对于这个项目,您需要打开命令提示符并转到主文件“drowsinessdetection.py”所在的目录。使用以下命令运行脚本。python"drowsinessdetection.py"可能需要几秒钟才能打开网络摄像头并开始检测。示例屏幕截图:输出屏幕截图:1.闭眼检测2.睁眼检测3.疲劳警告这个Python项目构建了一个驾驶员疲劳警告系统,您可以通过多种方式实现该系统。我们使用OpenCV通过Haar级联分类器检测人脸和眼睛,然后根据CNN模型预测状态。哪个更适合规范驾驶?Python安全官会帮助你。为了自己和他人的安全,请不要疲劳驾驶!
