【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

在这里插入图片描述

嗜睡驾驶者警报系统

在这里插入图片描述
防止司机疲劳驾驶警报系统
中级 Python 项目 - 司机疲劳检测系统

疲劳检测是一种安全技术,能够预防因司机在驾驶过程中入睡而造成的事故。

本中级 Python 项目的目标是建立一个疲劳检测系统,该系统将检测到一个人的眼睛闭合了一段时间。当检测到疲劳时,该系统会向司机发出警报。

司机疲劳检测系统
在这个 Python 项目中,我们将使用 OpenCV 从网络摄像头获取图像,并将其输入到一个深度学习模型中,该模型将分类人的眼睛是“睁着”还是“闭着”。我们为这个 Python 项目采用的方法如下:

步骤 1 - 从相机接收图像作为输入。

步骤 2 - 检测图像中的人脸,并创建一个感兴趣区域 (ROI)。

步骤 3 - 从 ROI 中检测眼睛,并将其输入到分类器中。

步骤 4 - 分类器将对眼睛的状态进行分类,确定是睁着还是闭着。

步骤 5 - 计算得分以检查该人是否疲劳。

司机疲劳检测数据集
用于构建这个模型的数据集是我们自行创建的。为了构建数据集,我们编写了一个脚本,该脚本从相机捕获眼睛图像并存储在本地磁盘上。我们将这些图像按照“睁着”和“闭着”两个标签进行了分类。数据经过了手动清理,移除了对构建模型不必要的图片。数据集包括在不同光照条件下大约 7000 张人眼图像。在用我们的数据集训练模型后,我们附上了模型权重和模型架构文件“models/cnnCat2.h5”。

现在,您可以使用这个模型来分类一个人的眼睛是睁着还是闭着的。

另外,如果您想构建和训练您自己的模型,您可以下载数据集:如果您想要构建和训练自己的模型,可以下载数据集:链接: 驾驶员嗜睡检测数据集
数据介绍:
Driver Drowsiness Data
The dataset consists of 2900 images which include both normal and yawning images. Dataset is divided into training and testing, which is used in the project for training and testing respectively.

It is an excellent dataset for people who want to learn machine learning techniques for driver drowsiness detection.

Sample Data:
在这里插入图片描述

模型架构
我们使用的模型是基于 Keras 构建的卷积神经网络 (CNN)。卷积神经网络是一种专门用于图像分类的深度神经网络,其表现极其出色。CNN 通常包括一个输入层、一个输出层和一个可能包含多个隐藏层的结构。卷积操作使用一个滤波器在各层上进行 2D 矩阵乘法。

CNN 模型架构包含以下层:

  • 卷积层;32 个节点,内核大小为 3
  • 卷积层;32 个节点,内核大小为 3
  • 卷积层;64 个节点,内核大小为 3
  • 全连接层;128 个节点
  • 最终层也是一个全连接层,包含 2 个节点。除了输出层使用了 Softmax 激活函数外,所有的层都使用了 ReLU 激活函数。

项目先决条件
本 Python 项目需要一个网络摄像头来捕获图像。您需要在系统上安装 Python(推荐版本 3.6),然后使用 pip 安装必要的包。

  • OpenCV - pip install opencv-python(用于脸部和眼睛检测)
  • TensorFlow - pip install tensorflow(Keras 使用 TensorFlow 作为后端)
  • Keras - pip install keras(用于构建分类模型)
  • Pygame - pip install pygame(用于播放警报声)

执行司机疲劳检测的步骤
从提供的 zip 文件中下载司机疲劳检测系统的项目源代码,并将文件解压到您的系统中:: 司机疲劳检测项目代码链接

zip 文件的内容:
在这里插入图片描述

项目文件结构 - 中级 Python 项目

“Haar 级联文件”文件夹包含用于从图像中检测对象的 xml 文件。我们的情况下,用于检测人的脸部和眼睛。
models 文件夹包含我们的模型文件“cnnCat2.h5”,该文件是在卷积神经网络上训练的。
我们有一个音频文件“alarm.wav”,在检测到人感到疲劳时会播放。
“Model.py”文件包含了我们通过训练数据集构建分类模型的程序。您可以在这个文件中看到卷积神经网络的实现。
“Drowsiness_detection.py”是我们项目的主要文件。要开始检测过程,我们需要运行这个文件。

现在我们来逐步了解算法的工作原理。

步骤 1 - 从相机接收图像作为输入

使用网络摄像头,我们将接收图像作为输入。为了访问摄像头,我们创建了一个无限循环,该循环将捕获每一帧。我们使用 OpenCV 提供的方法 cv2.VideoCapture(0) 来访问摄像头并设置捕获对象 (cap)。cap.read() 会读取每一帧,并将其存储在 frame 变量中。

步骤 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 ]

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

步骤 4 - 分类器将对眼睛是睁着还是闭着进行分类

我们使用 CNN 分类器来预测眼睛状态。为了将图像输入模型,需要执行某些操作,因为模型需要正确的维度才能开始工作。首先,我们使用 r_eye = cv2.cvtColor(r_eye, cv2.COLOR_BGR2GRAY) 将彩色图像转换为灰度图。然后,我们将图像大小调整为 2424 像素,因为我们的模型是在 2424 像素的图像上训练的,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 )

例如,如果得分大于 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 files\haarcascade_frontalface_alt.xml')
leye = cv2.CascadeClassifier('haar cascade files\haarcascade_lefteye_2splits.xml')
reye = cv2.CascadeClassifier('haar cascade files\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_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 = reye.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+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) in left_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]==0 and lpred[0]==0):score=score+1cv2.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-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):# 该人感到困倦,我们发出警报声cv2.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)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

司机疲劳检测系统执行
现在让我们执行司机疲劳检测系统,并看看我们 ML 项目的工作情况。要开始项目,您需要打开命令提示符,进入“drowsiness detection.py”主要文件所在的目录。使用以下命令运行脚本。

python “drowsiness detection.py”

打开摄像头和开始检测可能需要几秒钟的时间。

示例截图:

  • 运行疲劳检测程序 - 带有源代码的 Python 项目
    在这里插入图片描述

  • 训练新手的闭眼检测 Python 项目
    在这里插入图片描述

  • 初学者 Python 开源项目的睁眼检测
    在这里插入图片描述

  • 带有警报的 Python 开源项目
    在这里插入图片描述

总结
在这个 Python 项目中,我们构建了一个可以以多种方式实施的疲劳驾驶警报系统。我们使用 OpenCV 通过 Haar 级联分类器检测人脸和眼睛,然后使用 CNN 模型预测状态。

参考资料

  1. Haar 级联分类器介绍
  2. 卷积神经网络基础
  3. 如何使用 OpenCV 进行面部检测
  4. Python 用于图像处理的教程
  5. 使用 Keras 构建深度学习模型的指南
  6. 理解 Softmax 激活函数
  7. Pygame 的简介与使用
  8. 实时视频处理中的 OpenCV 用法
  9. 在汽车中实现疲劳检测的技术探讨
  10. 机器学习在疲劳检测中的应用研究
  11. 用于检测驾驶员疲劳的深度学习模型详解

参考链接:https://data-flair.training/blogs/python-project-driver-drowsiness-detection-system/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu本地部署网站

目录 1.介绍 2.安装apache 3.网页升级 1.介绍 网站其实就相当于一个文件夹&#xff0c;用域名访问一个网页&#xff0c;就相当于访问了一台电脑的某一个文件夹&#xff0c;在网页中看见的视频&#xff0c;视频和音乐其实就是文件夹里面的文件。为什么网页看起来不像电脑文件夹…

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…

【Linux】13.Linux进程概念(2)

文章目录 3. 进程进程进程状态查看僵尸进程危害进程状态总结孤儿进程 4. 进程优先级基本概念查看系统进程PRI and NIPRI vs NI使用top更改进程优先级 3. 进程 进程 看看Linux内核源代码怎么说。 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…

【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法

目录 一、程序介绍 二、mysqld--mysql服务器介绍 三、mysql - MySQL 命令行客户端 3.1 客户端介绍 3.2 mysql 客户端选项 指定选项的方式 mysql 客户端命令常用选项 在命令行中使用选项 选项(配置)文件 使用方法 选项文件位置及加载顺序 选项文件语法 使用举例&am…

[0242-07].第09节:SpringBoot中简单功能分析

SpringBoot学习大纲 一、静态资源访问分析&#xff1a; 1.1.静态资源默认路径&#xff1a; a.官网说明&#xff1a; 1.静态资源访问路径官方文档说明的路径 2.只要是静态资源&#xff0c;都默认放在类路径下&#xff1a; /static or /public or /resources or /META-INF/res…

28:CAN总线入门一:CAN的基本介绍

CAN总线入门 1、CAN总线简介和硬件电路1.1、CAN简要介绍1.2、硬件电路1.3、CAN总线的电平标准 2、帧格式2.1、数据帧&#xff08;掌握&#xff09;2.2、遥控帧&#xff08;掌握&#xff09;2.3、错误帧&#xff08;了解&#xff09;2.4、过载帧&#xff08;了解&#xff09;2.5…

nginx 配置域名前缀访问 react 项目

说明一下&#xff1a;我是使用域名转发访问的&#xff0c;访问流程如下&#xff1a; 浏览器 》 服务器1 》 服务器2 由于服务器1已经为 https 的访问方式做了 ssl 证书等相关配置&#xff0c;然后转发到服务器2&#xff0c; 所以在服务器2中不需要再配置 ssl 证书相关的东西了&…

Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

Web3与加密技术的结合:增强个人隐私保护的未来趋势

随着互联网的快速发展&#xff0c;个人隐私和数据安全问题越来越受到关注。Web3作为新一代互联网架构&#xff0c;凭借其去中心化的特性&#xff0c;为个人隐私保护提供了全新的解决方案。而加密技术则是Web3的重要组成部分&#xff0c;进一步增强了隐私保护的能力。本文将探讨…

ElasticSearch下

DSL查询 叶子查询&#xff1a;在特定字段里查询特定值&#xff0c;属于简单查询&#xff0c;很少单独使用复合查询&#xff1a;以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理&#xff1a; 排序&#xff1a;按照1个或多个字段做排序分页…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)

在开发一款影视APP时&#xff0c;首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力&#xff0c;还能有效地推广重点内容。为了提升应用的性能和用户体验&#xff0c;可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。 1.…

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统&#xff09;指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…

大疆发布可折叠航拍无人机,仅重249g,支持 4800 万像素拍摄

在以往的无人机使用经历中&#xff0c;携带不便一直是个让人头疼不已的问题。那些体积硕大的无人机&#xff0c;每次出行都像是一场艰难的搬运&#xff0c;塞进车里都费劲&#xff0c;更别提轻松地穿梭在城市街头或是户外探险中了。但就在大家对这些问题习以为常、感到无奈时&a…

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…

从 SQL 语句到数据库操作

1. SQL 语句分类 数据定义语言 DDL &#xff1a; 用于定义或修改数据库中的结构&#xff0c;如&#xff1a;创建、修改、删除数据库对象。create、drop alter 数据操作语言 DML &#xff1a; 用于添加、删除、更新数据库中的数据。select、insert alter、drop 数据控制语言 D…