首页 > 编程知识 正文

用于校准厂家检测系统的是(检测系统组成)

时间:2023-05-03 22:52:18 阅读:78364 作者:3403

白天和晚上,无数人在高速公路上开车。 出租车司机、公共汽车司机、卡车司机和长途旅行者睡眠不足。 因此,感到困倦时开车非常危险。

大部分事故都是由司机的睡意引起的。 因此,为了防止这些事故,使用Python、OpenCV、Keras构建系统,在驾驶员感到困倦时向驾驶员发出警报。

困倦探测是一种安全技术,可以防止开车时司机睡着导致的事故。 这个系统检测人的眼睛闭了几秒钟。 一旦检测到困倦,该系统就会警告驾驶员。

在本项目中,您将使用OpenCV从网络摄像机收集图像,并输入深度学习模型,以分类人眼是“打开”还是“关闭”。 用于此Python项目的方法如下:

1、图像作为照相机的输入。

2、检测图像中的人脸,建立感兴趣区域(ROI )。

3、从ROI中检测眼睛,输入分类器。

4、分类器对是睁开眼睛还是闭上眼睛进行分类。

5、计算分数,检查那个人是否有睡意。

收集

数据集

睁眼和闭眼数据集,分别分为“开”或“闭眼”标签。 删除不需要的图像并手动清洁数据。 构建模型不需要这些图像。 数据在不同的照明条件下包含约5000张人眼图像。 在数据集上训练模型后,我们附上了最终权重和模型体系结构文件“models/cnnCat2.h5”。

现在,可以使用该模型来分类人眼是睁着还是闭着。

模型架构

我们使用的模型是使用Keras,利用卷积神经网络(CNN )构建的。 卷积神经网络是一种特殊类型的深度神经网络,在图像分类方面非常优秀。 CNN基本上由一个输入层、一个输出层和可包括多个层的一个隐藏层构成。 使用在层和过滤器上执行二维矩阵乘法的过滤器对这些层执行卷积操作。

CNN模型体系结构包括以下层次:

折叠层; 核心大小为3卷积层的32个节点; 核心大小为3卷积层的32个节点; 64个节点,核心大小3所有连接层; 128个节点的最后一层也是具有2个节点的完全连接的层。 在所有层上,使用Relu激活函数,Softmax的输出层除外。

条件需求

opencvpipinstallopencv-python (脸部和眼睛检测)。 tensorflowpipinstalltensorflow () Keras使用tensor flow作为后端)。 keraspipinstallkeras (创建我们的分类模型。 pygame播放报警音。 1 .将图像作为来自照相机的输入

使用网络摄像头,将图像作为输入。 因此,要访问网络摄像头,请进行无限循环,捕获各帧。 OpenCV提供的方法使用cv2.videocapture(0)访问摄影机并设置捕获对象。 cap.read ) )读取每个帧并将图像存储在frame变量中。

2、在图像中检测脸部,建立感兴趣区域(ROI )

要检测图像中的脸部,必须首先将图像转换为灰度。 这是因为用于对象检测的OpenCV算法在输入过程中获取了灰度图像。 检测物体不需要颜色信息。 使用haar级联分类器检测脸部。 使用face=cv2.CascadeClassifier设置分类器。 然后,使用faces=face.detect multiscale (gray )运行测试。 返回具有x、y坐标和高度(对象边界框宽度)的检测数组。 现在,可以遍历这些面,并为每个面绘制边界框。

3、从ROI中检测眼睛,输入分类器

与检测脸部相同的过程也被用于眼睛的检测。 首先,在leye和明理的热狗上分别设置用于眼睛的级联分类器,然后使用left _ eye=leye.detect multiscale (gray )检测眼睛。 现在,您只需要从完整的图像中提取眼睛数据。 这可以通过提取眼睛的边界框来实现。 然后,可以使用这个代码从帧中提取眼睛的图像。

l_eye只包含眼睛的图像数据。 这将输入到我们的CNN分类器中。 这个分类器预测眼睛是睁着还是闭着。 同样,将右眼提取到r_eye。

4、分类器对眼睛是睁开还是闭上进行分类

我们使用CNN分类器预测眼睛的状态。 要将图像导入到模型中,模型必须具有正确的大小,因此必须执行一些操作。 首先,使用r_eye=cv2.Cvtcolor(r_eye,cv2.c

OLOR_BGR2GRAY)将彩色图像转换为灰度。然后,当我们的模型在24 * 24像素图像cv2.resize(r_eye,(24,24))上训练时,我们将图像调整为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()函数在屏幕上绘制结果,该函数将显示人员的实时状态。

例如,如果得分变得大于15,则定义一个阈值,这意味着该人的眼睛长时间闭合。这时我们使用sound.play()发出警报声。

import cv2 import os from keras.models import load_model import numpy as np from pygame import mixer import time mixer.init() sound = mixer.Sound('alarm.wav') face = cv2.CascadeClassifier('haar cascade fileshaarcascade_frontalface_alt.xml') leye = cv2.CascadeClassifier('haar cascade fileshaarcascade_lefteye_2splits.xml') 明理的热狗 = cv2.CascadeClassifier('haar cascade fileshaarcascade_righteye_2splits.xml') lbl=['Close','Open'] model = load_model('models/cnncat2.h5') path = os.getcwd() cap = cv2.VideoCapture(0) font = cv2.FONT_HERSHEY_COMPLEX_SMALL count=0 score=0 thicc=2 rpred=[99] lpred=[99] while(True): ret, frame = cap.read() height,width = frame.shape[:2] gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face.detectMultiScale(gray,minNeighbors=5,scaleFactor=1.1,minSize=(25,25)) left_eye = leye.detectMultiScale(gray) right_eye = 明理的热狗.detectMultiScale(gray) cv2.rectangle(frame, (0,height-50) , (200,height) , (0,0,0) , thickness=cv2.FILLED ) for (x,y,w,h) in faces: cv2.rectangle(frame, (x,y) , (x+w,y+h) , (100,100,100) , 1 ) for (x,y,w,h) in right_eye: r_eye=frame[y:y+h,x:x+w] count=count+1 r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY) r_eye = cv2.resize(r_eye,(24,24)) r_eye= r_eye/255 r_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' break for (x,y,w,h) in left_eye: l_eye=frame[y:y+h,x:x+w] count=count+1 l_eye = cv2.cvtColor(l_eye,cv2.COLOR_BGR2GRAY) l_eye = cv2.resize(l_eye,(24,24)) l_eye= l_eye/255 l_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' break if(rpred[0]==0 and lpred[0]==0): score=score+1 cv2.putText(frame,"Closed",(10,height-20), font, 1,(255,255,255),1,cv2.LINE_AA) # if(rpred[0]==1 or lpred[0]==1): else: score=score-1 cv2.putText(frame,"Open",(10,height-20), font, 1,(255,255,255),1,cv2.LINE_AA) if(score<0): score=0 cv2.putText(frame,'Score:'+str(score),(100,height-20), font, 1,(255,255,255),1,cv2.LINE_AA) if(score>15): #person is feeling sleepy so we beep the alarm cv2.imwrite(os.path.join(path,'image.jpg'),frame) try: sound.play() except: # isplaying = False pass if(thicc<16): thicc= thicc+2 else: thicc=thicc-2 if(thicc<2): thicc=2 cv2.rectangle(frame,(0,0),(width,height),(0,0,255),thicc) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

结论

我们构建了一个简单的困倦驾驶员警报系统,您可以通过多种方式实施该系统 。我们使用Haar级联分类器使用OpenCV检测面部和眼睛,然后使用CNN模型预测状态。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。