基于Matlab深度学习的驾驶员疲劳检测系统

        随着城市化进程不断加快,中国汽车的需求 量和保有量也急剧上升。 截至 2020 年 9 月,中国 汽车保有量达到了 2.75 亿辆,随着车辆保有量的 增加,交通事故的发生率也在逐年上升。2017 年交通事故共计 20.3 万起,因车祸死亡人数 6.3 万 人,2018 年交通事故较 2017 年上升 20.6%,2019 年交通事故较 2018 年下降 18.3% ,虽然事故率 有所下降但仍不容乐观。研究表明疲劳驾驶是致 使车祸发生的重要原因之一,如果能够在交通事 故前检测出驾驶员的疲劳行为并及时提醒可以有 效减少因疲劳驾驶而导致的车祸的发生,因此研 究疲劳检测算法对改善交通道路安全有着重要 意义。目前疲劳检测主要分为三大类:基于车辆信息 的检测方法,基于驾驶员信息的检测方法和基于多 信息融合的检测方法 。 基于车辆信息的检测方 法包括车辆加速度信息、车辆转向角信息等来判断 驾驶员的疲劳情况,该方法对于外界环境变化敏 感,针对于不同的路况、驾驶员驾驶习惯、天气等变 化因素难以定量分析,所以并不是疲劳驾驶的主要 研究方向。 基于驾驶员信息的检测方法分为两种 信息类型,一种是驾驶员的生理参数,主要检测参 数包括脑电信号、心率等;另一种是驾驶员的行为 特征,包括眼动特征、嘴部状态,头部姿态等,不论 是驾驶员的生理参数还是行为特征在当前科技迅 速发展的情况下都是容易收集并处理的。

基于Matlab深度学习的驾驶员疲劳检测系统_第1张图片

一、算法框架

       目前检测疲劳驾驶状态的方法主要可以分为如下三类: 第一类,基于生理状态的检测;第二类,基于驾驶行为;第 三类,基于图像。第一类,主要是通过可穿戴设备完成信 息的采集,检测精度高、效果好,但是相关传感器设备费 用较高,且跟人体有直接接触,用户体验可能不好;第二 类,通过传感器采集车道偏移、方向盘反转角度、刹车踩。踏次数和力度等相关行为信息,从而 完成对疲劳驾驶状态的判定,但是不 同司机个人驾驶习惯、特点等有差异 性,会对准确率造成不同的影响;第 三类,车载摄像头实时采集司机面部 图像,对眼部、嘴部图像或者是对整 个人脸提取特征进行处理,从而完成 司机驾驶状态的判断。由于基于图像 的疲劳驾驶检测,没有与人体直接接 触,并且能够提取到疲劳驾驶的关键 特征,利用机器学习的方法也能很大 程度提高检测精度。本文将介绍基于 图像的疲劳驾驶检测方法,完成实际 情况下疲劳驾驶检测的相关方法研究。

         Yolo 由 Redmon 等于 2016 年首次提出。 在 Yolo 提出之前,传统的检测算法的流程通常是先通 过计算机图形学(或者深度学习)的方法,对图片进 行查找,找出若干个可能存在物体的区域,将这些 区域截取在进行分类。 而 Yolo 不需要提前找到可 能存在目标的图像位置,可以实现端到端的目标 检测 。本方案对眼部图像进行分析,分类情景相对单一。模型选用ResNet-101 网络,其在一定条件下,比VGG和GoogLeNet的准确度要高,计算效率更优, 在进行特征提取的时候优势很大。 ResNet网络中使用了2种残差单元,不同的网络,有不同的策略。最 优的残差结构,没有增加额外参数,计算的复杂度也没有加大,类似于 同等映射的效果。整个网络仍然可以端到端反向传播进行训练。该网络 解决了退化问题,相关数据显示,深度加深,性能相应得到了提升。 在实验中,我们从10位实验人员录制的疲劳和非疲劳视频中,手动 选取相关帧,送入人眼检测。将人眼检测所得到的人眼区域图像作为数 据集,送入ResNet网络进行特征提取,从而得到全连接层输出的特征向量。

        随着交通运输行业和自动驾驶行业的发展,公路上每天行驶的车辆都会产生许多 未知的风险,因此车辆安全领域的科研人员对 ABS、ESP、电子手刹、驾驶员疲劳检测 系统等车辆主动安全设备进行了广泛的研究。驾驶员疲劳检测技术是车辆主动安全设 备的关键部分,旨在通过监控司机状态并进行预警,达到保障司机及行人财产和生命 安全的目的。 首先,对目前驾驶员疲劳检测的关键技术——特征提取算法和状态分类算法的原 理和优缺点进行研究,并最终选取深度学习作为驾驶员疲劳检测系统的特征提取和状 态分类方法。然后基于深度学习方法设计疲劳检测系统的特征提取算法与状态分类算 法,其中特征提取算法用于驾驶员的脸部区域图像提取,状态分类算法将对瞌睡、哈 欠、抽烟、打电话、正常驾驶五种状态进行分类。对深度学习算法的脆弱性进行分析, 并设计了一个生成对抗网络算法作为攻击模块,通过其生成的疲劳对抗样本和采集的 驾驶员真实样本同时训练状态分类网络,使分类网络具备区分对抗样本与真实样本的 能力,提高对疲劳对抗样本的防御能力。 其次,提出了一种将卷积神经网络和生成对抗网络进行级联的驾驶员疲劳检测框 架,主要包括信息采集模块、特征提取模块、攻击模块、状态分类模块和判定及预警 模块。信息采集模块:通过红外摄像头采集驾驶员的实时状态视频,然后从视频中获 取表征驾驶员状态的帧图像;状态分类模块:将驾驶员图像作为输入,获取驾驶员的 人脸范围和关键点坐标,然后根据获取的人脸及关键点位置对驾驶员脸部进行区域划 分和区域提取,获得驾驶员耳朵、嘴巴、眼睛的区域图像;攻击模块:使用生成对抗 网络技术,通过噪声生成驾驶员的疲劳对抗样本,即伪瞌睡、伪哈欠图像,并将其标 记为非疲劳状态;状态分类模块:使用真实样本与疲劳对抗样本共同训练,使状态分 类模块在区分驾驶员状态的同时具备抵抗伪疲劳图像攻击的能力,其能够对五种驾驶 员状态进行分类,包括正常驾驶、瞌睡、哈欠、打电话、抽烟;判定及预警模块:将 经过状态分类后的图像作为输入,根据 PERCLOS 算法和一段时间内驾驶员特征判定驾 驶员是否处于疲劳状态,并对疲劳状态进行记录和预警。 最后,对疲劳检测系统的硬件解方案进行研究,提出了使用树莓派 3B+、英特尔神 经计算棒作为硬件解决方案,满足了算法运行的需求同时具有较高的性价比。然后对提出的级联卷积神经网络和生成对抗网络的驾驶员疲劳检测系统的可行性进行验证, 其中包括对区域提取算法准确率的验证、疲劳检测系统准确率的验证,并使用恶意图 像进行攻击从而验证系统的鲁棒性。实验表明,本文在防御疲劳对抗样本攻击方面, 经过对抗样本训练的状态分类网络对伪疲劳图像的检出率从 15%提高到 84%,说明本 检测系统具备一定的防御伪疲劳图像攻击的能力。提出的区域提取算法对驾驶员五官 的提取准确率达到 94%以上,疲劳检测系统在对驾驶员疲劳状态的检测中,准确率达 到了 92%。综上所述,本文提出的硬件方案检测效果较好,能够满足疲劳检测系统的 运行需求。

基于Matlab深度学习的驾驶员疲劳检测系统_第2张图片

 

二、代码实现

        由于目前特征提取算法和状态分类算法不能满足疲劳检测系统的需求,本章将基 于深度学习算法设计驾驶员的特征提取算法和状态分类算法,为了增强疲劳检测系统 的扩展能力,特征提取算法将驾驶员图像作为输入,最终输出驾驶员的耳部、嘴部、 眼部的图像;状态分类网络将对提取的驾驶员图像进行分类,该分类网络能够识别以 下五种驾驶员图像:正常驾驶、瞌睡、哈欠、抽烟、打电话。

2.1 特征提取算法

        本文提出的特征提取算法由驾驶员脸部关键点提取算法和区域图像提取算法组成。 驾驶员脸部关键点提取算法将驾驶员图像作为输入,经过神经网络的卷积计算和反向 传播算法,最终输出一个十元组,即驾驶员的眼睛、鼻子以及两个嘴角——五个关键 点。将驾驶员脸部关键点坐标输入到区域提取算法中,最终将获得驾驶员的眼部、耳 部、嘴部图像。

2.2 状态分类算法

        纵观图像分类网络的发展过程,从 VGG、Inception-NET到 RES-NET,为 了提高特征提取的维度,分类网络的识别准确率,神经网络的层数越来越高,模型也 变得越来越厚重。即使经过区域提取算法得到的驾驶员区域图像尺寸较小,在图像分 类网络训练过程中能够较快的进行特征提取和学习,如果在状态分类网络中设计的层 数较高,要想应用到嵌入式设备中仍然无法满足实时性的要求。 我们调研发现网络结构对运算时间的影响巨大,本文在设计状态分类网络时对网 络结构进行了优化,尽可能使用低计算量的网络结构,以获得实时性更好的疲劳检测 系统。在对神经网络优化的研究中,A.G. Howard 等人做了大量的工作,他 们提出的深度级可分离卷积(depthwise separable convolution),将标准卷积分解为深 度卷积+逐点卷积,这种分解能够有效的大量减少计算量以及模型的大小,在实验中显 示在输入输出效率和性能不变的情况下,计算量降低 9 倍。因此,本文设计的驾驶员状态分类网络采用深度级可分离卷机代替普通卷积的方式,加速网络的运算过程。

2.3 攻击算法

        本文设计的攻击算法将采用噪声作为输入,通过驾驶员状态分类网络结合生成对 抗网络的方法生成对抗样本,对驾驶员状态分类模块进行攻击。经过调研,深度卷积 生成对抗网络[45](DCGAN)在 GAN 提出后,在生成图像上表现出非常优异的结果, 本文将采用 DCGAN 生成驾驶员的疲劳对抗样本包含瞌睡和哈欠的对抗样本。因为本 文希望模拟对检测系统的黑盒攻击,即从噪声生成对抗样本,因此将对 DCGAN 进行 改进。本文将使用中的方法,此方法使用生成样本代替原始图像进行训练,第 二部分与 D. Song 等人在中提出的 advGAN(生成对抗样本的生成对抗网络)算 法相似。 本文设计的攻击模块算法如图 3-8 所示。正常训练部分的目的是使 DCGAN 学习 到符合正常数据集的数据分布,网络包含生成器与判别器。生成器从任意噪声中生成 生成样本(),判别器将生成样本与真实样本之间的距离反馈给生成器,使生成器能 够生成更加真实的照片,同时使判别器的判别能力得到提高。共同构成 DCGAN 的损失 函数,见式(3.14)。其中,、分别为生成器和判别器的损失函数,D(x)为真实 样本的概率,D(G(z))为生成样本的概率。

function varargout = main(varargin)
% MAIN MATLAB code for main.fig
%      MAIN, by itself, creates a new MAIN or raises the existing
%      singleton*.
%
%      H = MAIN returns the handle to a new MAIN or the handle to
%      the existing singleton*.
%
%      MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in MAIN.M with the given input arguments.
%
%      MAIN('Property','Value',...) creates a new MAIN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before main_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to main_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help main

% Last Modified by GUIDE v2.5 18-Apr-2022 10:33:59

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @main_OpeningFcn, ...
                   'gui_OutputFcn',  @main_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before main is made visible.
function main_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to main (see VARARGIN)

% Choose default command line output for main
handles.output = hObject;

set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',0);

axes(handles.axes1); %指定需要清空的坐标轴
cla reset;
box on;
set(handles.axes1,'xtick',[]);
set(handles.axes1,'ytick',[]);
axes(handles.axes2); %指定需要清空的坐标轴
cla reset;
box on; %在坐标轴四周加上边框
set(handles.axes2,'xtick',[]);
set(handles.axes2,'ytick',[]);
axes(handles.axes3); %指定需要清空的坐标轴
cla reset;
box on; %在坐标轴四周加上边框
set(handles.axes3,'xtick',[]);
set(handles.axes3,'ytick',[]);
set(handles.edit1,'string','');
set(handles.edit2,'string','');
set(handles.edit3,'string','');
set(handles.edit4,'string','');

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = main_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clc;
clear;
output=VOCxml_to_matlab_main();
save dataSet output;

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global inputSize;
data=load('dataSet');
data=data.output;

% 数据存储在一个包含三列的表中,其中第一列包含图像文件路径,第二列包含车辆边界框,
% 第三列对应的类别。
% 将数据集分成训练集、验证集和测试集。选择 60% 的数据用于训练,10% 用于验证,
% 其余用于测试经过训练的检测器

shuffledIndices = randperm(height(data));
idx = floor(0.6 * height(data));

trainingIdx = 1:idx;
trainingDataTbl = data(shuffledIndices(trainingIdx),:);

validationIdx = idx+1 : idx + 1 + floor(0.1 * length(shuffledIndices) );
validationDataTbl = data(shuffledIndices(validationIdx),:);

testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = data(shuffledIndices(testIdx),:);

% 使用 imageDatastore 和 boxLabelDatastore 创建数据存储,
% 以便在训练和评估期间加载图像和标签数据
imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,2:end));


imdsValidation = imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,2:end));

imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,2:end));

%组合图像和边界框标签数据存储
trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);

%显示其中一个训练图像和边界框标签
data = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

%是否需要训练
doTraining=true;

end

基于Matlab深度学习的驾驶员疲劳检测系统_第3张图片

 基于Matlab深度学习的驾驶员疲劳检测系统_第4张图片

参考文献

【1】刘梦佳,赵建国.基于 SVM 的疲劳驾驶人脸图像特征检测算法 [J].半导体光电,2020.

【2】 吴雪,宋晓茹,高嵩,陈超波.基于深度学习的目标检测算法综 述[J].传感器与微系统,2021. 


         详情资料请扣扣:1341703358基于面部特征的疲劳驾驶检测算法通常效果较好,但其特征提取大都基于人脸检测实现,设计了一种基于深度学习 的多特征融合疲劳驾驶检测系统,该系统基于深度卷积神经网络,采用开源的深度学习框架搭建网络,自制数据集,完成人眼与 嘴巴标注并用于网络训练。 通过对比试验,训练后的网络能够适应复杂外部干扰,解决了传统算法对头部姿态和面部遮挡鲁棒性 差的问题,能有效识别疲劳状态,在测试集中总体准确率能到 96%。

你可能感兴趣的:(项目实战,matlab,算法,图像处理)