[]史上最强副驾驶——开车打瞌睡?Python叫醒你( 二 )


2.模型文件夹包含我们的模型文件“cnnCat2.h5” , 该文件是在卷积神经网络上进行训练的 。
3.我们有一段音频“alarm.wav” , 用于在驾驶员昏昏欲睡时播放 。
4.“Model.py”文件包含一个程序 , 通过该程序对数据集进行训练来构建分类模型 。 您可以从此文件中了解卷积神经网络的执行情况 。
5.“Drowsinessdetection.py”是本项目的主要文件 。 开始检测时 , 我们必须要运行此文件 。

[]史上最强副驾驶——开车打瞌睡?Python叫醒你
本文插图

图源:unsplash
接下来 。 让我们逐步了解该算法是怎么工作的 。
第1步-从相机中获取图像作为输入
使用网络摄像头获取图像作为输入 。 为了访问网络摄像头 , 我们进行了无限循环以捕获每一帧 。 我们使用OpenCV提供的方法cv2.VideoCapture(0)来访问摄像机并设置捕获对象(cap) 。 cap.read()将读取每一帧 , 并将图像存储在帧变量中 。
第2步-检测图像中的脸部并创建一个感兴趣区(ROI)
为了检测图像中的人脸 , 首先需要将图像模式转换为灰度 , 因为用于对象检测的OpenCV算法需要输入灰度图像 。 因此无需颜色信息即可检测物体 。
我们将使用haar级联分类器来检测人脸 。 通过face =cv2.CascadeClassifier('抵达haar级联xml文件的路径')设置分类器 , 然后使用faces =face.detectMultiScale(gray)执行检测 。 进而产生带有x、y坐标以及高度(对象边界框的宽度)的检测数组 。 现在我们可以迭代这些脸并为每张人脸绘制边界框 。
for (x,y,w,h)in faces:cv2.rectangle(frame,(x,y), (x+w, y+h), (100,100,100), 1 )
第3步-从ROI中检测人眼并将其输入分类器
检测人脸的过程也同样适用于检测人眼 。
首先 , 我们分别在leye和reye中为眼睛设置级联分类器 , 然后使用left_eye =leye.detectMultiScale(gray)来检测人眼 。 现在 , 我们只需要从完整图像中提取出人眼数据即可 。 这可以通过提取眼睛的边界框来实现 , 然后可以使用此代码从帧中提取眼睛图像 。
l_eye =frame[ y : y+h, x : x+w ]
【[]史上最强副驾驶——开车打瞌睡?Python叫醒你】l_eye仅包含左眼的图像数据 。 这将被输入到CNN分类器中 , 该分类器将预测眼睛是处于睁开还是闭合状态 。 同样 , 我们将右眼的数据提取到r_eye中 。

[]史上最强副驾驶——开车打瞌睡?Python叫醒你
本文插图

图源:unsplash
第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()函数在屏幕上绘制结果 , 该函数将显示驾驶员的实时状态 。


推荐阅读