前提:这篇文章的源头喃,是为了公司的一个训练营里交的实战报告,因为当时也赶时间,所以弄的挺马虎的,但也是一次实践了。想深入了解,或者看一下代码效果的,可以在gitee上找到我的源码,也是有中文注释的。(图像数据集的链接在下面哈)
danger_drive detection: 危险驾驶检测分类,从数据创建到逻辑推理和算法实现。
目录
项目背景
为了在车辆驾驶员处于疲劳驾驶或不专心驾驶等危险驾场景驶时,对驾驶员进行提醒,我们需要对当前驾驶员的驾驶状态进行一个识别分类。
方法逻辑
通过人脸识别,获取驾驶员前脸,当没有识别到前脸时,认为驾驶员没有观察前方车况,识别到前脸后,再识别出人脸的特征标识点,包括左、右眼睛,嘴巴等轮廓标识点,利用眼睛的轮廓标识点判断当前驾驶员眼睛的闭合度,连续低于设定的阈值认为当前处于闭眼状态,利用嘴巴的轮廓标识点判断当前驾驶员嘴巴的打开程度,连续高于某个阈值认为是处于打哈欠状态。基于前面获得的各种状态数据输入分类模型来获得当前是否危险驾驶和危险驾驶的严重性。
数据处理
原始数据集是网上公共的疲劳驾驶图像数据集 :疲劳驾驶行为数据集 - 飞桨AI Studio,我将其分为了训练集和测试集两部分,训练集2475张,测试集439张。就没有弄验证集哈
对图像人脸识别并编码进行逻辑判断得到分类模型训练数据文件data.txt 和分类模型测试数据文件datatest.txt。如下图所示,每一行表示当前一张图片的数据,总共有7个,前5个是模型输入数据,分别表示眼睛轮廓长宽比,被认为是眼的次数,嘴巴轮廓长宽比,被认为是打哈欠的次数,前脸丢失检测的次数,这样的数据不仅包含了当前帧图像的信息,也包括了之前图像的信息;后两个是模型输出真值,分别表示处于危险驾驶,处于非常危险驾驶状态,当都为0表示不是危险驾驶状态。下图是一个部分data.txt的示例
模型构建与选择
前脸以及脸部轮廓标识点识别选择了Dlib人脸识别开源库,Dlib保持着很好的更新节奏,文档也写得相当清晰,是一个优秀的人脸识别开源库。用它来得到我们分类模型的输入数据是一个不错的选择。
因为该数据输入与输出间逻辑性较强,分类模型选择了随机森林分类模型,它是含有多个决策树的分类器,具有训练速度快,抗过拟合能力强的特点。我用sklearn开源库搭建了随机森林分类模型。
代码函数简述
模型评价
效果展示
模型可视化:
4个决策树组成的随机森林模型
Figure1 l连续丢失前脸检测
Figure2 多次被判断为打哈欠或闭眼后仍然存在闭眼
Figure3多次被判断为打哈欠或闭眼后仍然存在打哈欠