1、基于 Odroid 的疲劳驾驶检测研究 旷文腾 黄家才 毛宽诚 南京工程学院自动化学院 河海大学能源与电气学院 摘 要: 基于眼睛闭合状态识别的方法设计了一种嵌入式疲劳检测平台, 能够实时采集驾驶员图像并进行疲劳检测。方法:疲劳检测的步骤为:首先用摄像头实时采集驾驶员图像, 并对获取的图像进行人脸检测;然后, 在识别出的人脸区域进行人眼位置检测, 进而识别眼睛闭合状态;最后根据 Perclos 疲劳判定标准判别驾驶员是否疲劳, 如果发现疲劳给予报警。最终将计算机上开发的疲劳检测程序移植到嵌入式设备, 通过 Qt 开发用户界面, 实现了嵌入式平台的疲劳检测。关键词: 疲劳驾驶; 人脸检测; 人眼
2、识别; 嵌入式; Linux; 收稿日期:2017.8.4基金:江苏省自然科学基金项目 (BK20151463) Research on Fatigue Driving Detection Based on Odroid SystemAbstract: This paper designs an embedded fatigue detection device based on the eye closed state recognition method which can collect the driver image and fatigue detection in real tim
3、e.Methods:The steps of fatigue detection are as follow:First, the image of driver is collected using real-time camera;Second, the face is found from the image by face detection method, and the eye position is located from the face area the eye state is recognized;Finally, after detecting the open or
4、 closing state of the eyes, the Perclos fatigue criterion is used to determine whether the driver is fatigue driving, and the alarm is given if fatigue is found.This design transplants the fatigue detection procedures from computer to embedded device.Though develop the UI by Qt, the whole embedded f
5、atigue detection system is realized.Keyword: fatigue driving; face detection; eye recognition; embedded system; Linux; Received: 2017.8.4疲劳驾驶检测研究的目的是开发出一个便携的检测设备实时监控驾驶人行车状态, 当驾驶人疲劳时及时检测出危险而报警或采取其他有效保护措施, 预防交通事故的发生, 从而降低交通事故发生率2。1 系统方案设计整个嵌入式疲劳检测系统由嵌入式硬件系统和嵌入式软件系统构成, 硬件部分围绕嵌入式处理器构建硬件开发平台, 包括核心嵌入式开发板、
6、高清摄像头、显示器、键盘、鼠标。软件部分是在嵌入式 Linux 操作系统下开发的疲劳检测程序。基于以上的设计思路, 所设计的疲劳检测硬件系统框图如图 1 所示:图 1 嵌入式系统疲劳检测流程图 下载原图设计中搭建的硬件平台如图 2 所示:图 2 嵌入式系统疲劳检测硬件平台图 下载原图2 嵌入式硬件系统整个系统实现的硬件核心为嵌入式系统, 承担了采集图像、识别运算、显示结果、给予警报等所有的步骤, 真正实现了实时、便携的特点。本系统采用了Odroid-XU3 开发板作为核心处理平台, 开发板有充足的硬件资源, 为嵌入式开发提供了很大的便利。通过外接摄像头、显示器、键盘鼠标等构成嵌入式开发平台。系
7、统硬件框图如图 3 所示:图 3 嵌入式系统硬件框图 下载原图2.1 Odroid-XU3 嵌入式开发板本设计采用的是 Odroid-XU3 嵌入式 ARM 开发板, O-droid 开发板是 2014 年韩国硬件供应商 Hardkernel 公司发布的新一代嵌入式计算设备, 搭载了三星公司的 Exynos5422 处理器。该开发板效能更高并且尺寸更小, 能够运行各种 Linux发行版本操作系统, 并提供开源支持。此外, e MMc5.0 存储卡、USB3.0 接口的支持可以让嵌入式开发板实现更快的数据传输能力, 并且对于那些需要快速大量数据处理的应用场合如 3D 图形运算或视觉运算, Odr
8、oid 开发板是首选。2.2 外设部分外设部分包括摄像头和显示器, 摄像头用于采集图像, 显示器用于显示结果和提供报警信息。考虑到是为嵌入式设备配置采集图像的摄像头装置, Odroid 开发板必须得有相应外设的驱动, 所以摄像头选型时选择了 Hardkernel 公司发布的适配 O-droid-XU3 的 720p 高清摄像头, 分辨率为 1280*720, 输出 RGB 格式。为了能够方便地通过摄像头采集图像, 必须给开发板安装官方提供的嵌入式Linux 操作系统, 安装好操作系统后, 通过 Linux 系统的底层摄像头驱动实现USB 图像采集, 具体采集步骤如下:配置系统能识别的摄像头,
9、加载 UVC 设备, 然后即可基于 V4L2 (Video for Linux 2) 协议使用摄像头完成实时驾驶员图像采集。UVC (USB Video Class) 是各大视频设备厂商针对 USB 视频设备提供的统一数据交换协议。相关驱动程序已固化在系统内核中, 只要是符合 UVC 规格的视频设备, 都可以通过在程序中配置好相关参数, 实现即插即用。显示设备的选型考虑了两个方面, 一是要适配开发板接口, 二是要升级系统驱动。开发板接口是 HDMI (High Definition Multimedia Interface) 接口, 而一般的电脑显示器是 VGA (Video Graphics
10、 Array) 接口, 最终购买了两个显示器, 一个是 Hardkernel 公司的 7 寸触摸屏显示器, 显示器型号为 OdroidVU7 Plus, 分辨率为 1024*600, 支持多点触控;另一个是 21 寸 HDMI 接口显示器。为了能显示操作系统的图形界面, 同样需要配置驱动。需要升级系统内核版本和在显示驱动文件中添加 1024*600 的分辨率选项。3 嵌入式疲劳检测系统的实现3.1 基于人脸关键点定位的人眼状态识别算法人脸关键点检测目前也是研究热门的一类人脸检测算法, 多用于表情检测等场合, 通过定位人脸 68 个或更多位置的关键点实现人脸检测和人脸各区域特征的检测, 比如眼睛
11、、鼻子、嘴巴等器官的检测。本设计通过采用开源的 Dlib 机器学习库设计了人眼检测算法, 效果良好。Dlib机器学习开源库提供了基于 HOG (Histograms of Oriented Gradients) 特征点检测的人脸识别和人眼状态识别算法。基本原理为人脸检测器使用经典的方向梯度直方图结合滑动窗口检测、线性分类器分类的方法, 实现在人脸标定 68个特征点, 包括眼睛、眉毛、鼻子、嘴巴等。通过对输入图像的 68 点特征和人脸标定好的特征点进行检测比对, 比对上判定为人脸, 同时重新对人脸区域的人眼位置的 6 个点进行校正, 确定人眼位置。具体步骤为:第一步:HOG 特征提取, 组成代表
12、人脸各个区域点的特征向量。图 4 HOG 特征向量提取图 下载原图第二步:通过收集的 HOG 特征, 组成特征向量, 进行正负样本分类训练, 具体训练方式通过支持向量机 SVM 训练, 具体过程为:1) 提取正负样本 hog 特征向量;2) 使用 SVM 支持向量机训练, 得到训练模型;3) 由模型生成检测子;4) 利用检测子检测负样本, 从负样本得出难检样本;5) 将难检样本的 hog 特征向量加入第一步中的特征一起训练, 得到最终检测子。第三步:输入一幅待检图像, 通过滑动窗口利用训练好的检测子检测待检图片。Dlib 库的开发工程师们利用超过 300 万张图片进行大量训练得到了检测率非常高
13、的 68 点检测训练数据, 通过写好人眼检测程序, 调用检测数据, 就能检测人脸和人眼, 同时用 12 个点框住人眼眼睑, 随着人眼睁闭, 关键点也随时更新眼睛的变化, 实时框住人眼目的, 具体流程如图 4 所示。通过以上算法, 配置好 Dlib 库, 设计人眼识别程序, 效果如图 5 所示, 人眼部可以由六个点完全圈住, 同时随着眼睛闭合, 人眼处关键点也跟着闭合, 只需计算出上下眼睑处关键点的距离即可判断人眼闭合的状态。图 5 关键点检测效果图 下载原图3.2 基于 Perclos 的疲劳判断卡内基梅隆研究所经过反复实验和论证, 提出了度量疲劳/瞌睡的物理量Perclos3, 其定义为单位
14、时间内 (一般取 1min 或者 30s) 眼睛闭合一定比例 (70%或 80%) 所占的时间4。满足下式时就认为发生了瞌睡, 其计算公式为:frame:眼睛闭合帧数;sumframe:制定时间段总帧数。通常认为 Perclos 判定疲劳方法有三种标准, 本设计取其中的 P80 标准, P80标准定义为:眼睑遮住瞳孔的面积超过 80%就认为眼睛闭合, 统计在一定时间内眼睛闭合时所占的时间比例5。本设计使用 30s 作为一个计时单元, 在检测过程中用 30s 内所收集图像的有用帧数做 Perclos 测量计算, 若 Perclos 值40%或眼睛持续闭合大于 3s 时, 就认为驾驶员处于疲劳状态
15、, 判定为疲劳驾驶6。3.3 嵌入式系统程序移植传统的嵌入式软件开发步骤是先在计算机上的 Linux 系统编写好程序, 在开发板上移植上 Linux 系统和配置好需要用到的链接库, 然后在计算机上通过交叉编译器 ARM-Linux-GCC 编译成可在 ARM 嵌入式开发板上运行的程序, 拷贝到开发板上执行。一般通过 NFS 挂载的方式拷贝过去, 在此过程中要注意计算机上Linux 内核版本、嵌入式 Linux 内核版本等诸多问题, 同时需要确保用到的各种软件库版本在计算机上和 Linux 上必须完全一样。交叉编译是目前运用最广泛的嵌入式开发方式, 一般在没有桌面环境的嵌入式 ARM 开发板且无
16、法在板上直接编译的时候, 选择交叉编译。在嵌入式开发板上设计 Qt UI 界面程序的具体步骤为:1) 计算机上写好程序源码, 计算机上运行测试成功;2) 拷贝源码到开发板上, 进入源码文件夹, 命令行执行 qmake-project 命令, 生成后缀.Pro 文件, 同上节方式一样添加上包含路径, 一定是在开发板上的链接库和包含文件的路径;3) 命令行执行 qmake 命令生成 Makefile 文件;4) 执行 make 开始编译, 生成可执行文件。图 6 为有界面的基于关键点检测开发的疲劳检测程序, 能检测人脸并将其显示与界面上, 同时找到人眼并圈住人眼, 具有很好的可视化效果。图 7 为
17、基于人脸关键点检测算法的程序在嵌入式开发板上运行效果, 人脸被成功识别, 并将人眼通过六个关键点实时框住。4 实验结果分析本设计通过在 Windows 平台、计算机上的 Linux 平台和嵌入式的 Linux 平台上分别开发了两种不同的疲劳检测算法程序, 通过 Qt 设计了界面, 基本实现了疲劳检测功能。实验结果表明:本设计的算法利用 Opencv 库和 Dlib 库, 基于 HOG特征向量检测原理设计, 运行效果较好, 优点是运用了 Dlib 提供的训练好的大量的人脸关键点数据, 准确率更高, 适应条件更好, 戴眼镜的情况也能检测, 开发难度更小。在三种平台上的整体速度相较于第一种都较快,
18、同时在计算机的 Windows 系统运行速度相较于 Linux 系统更快一些, 基本达到每秒处理 9 帧左右, Linux 系统下的运行速度约在每秒 7 帧左右。缺点是移植性相较于第一种方法较差, 需要多配置一个 Dlib 库。同样, 在嵌入式上执行速度依旧不如计算机, 基本上还是每秒一帧。图 6 嵌入式系统 Qt 界面效果图 下载原图图 7 嵌入式系统人脸关键点检测效果图 下载原图为了优化算法执行效率, 减少检测计算的时间, 采用了缩小图片窗口大小的办法, 嵌入式开发板搭载的摄像头分辨率为 1024*720, 每帧图像采集进来后大小为 1024*720 的图片大小, 处理器在进行人脸识别和眼
19、睛状态识别时运算量很大, 如果对采集的图像重新调整大小将分辨率降低到 480*360 的话, 可以大大减少计算量, 而且不影响人脸识别算法的实现。通过添加 resize 函数重设图像大小, 减少了大约三分之一的计算时间, 能够实现一帧 700ms 左右的处理时间, 通过程序设计, 将每一帧的处理时间显示在命令行环境中, 效果如图 8 所示:图 8 嵌入式系统优化后检测速度效果图 下载原图5 结束语本设计主要实现了一种疲劳驾驶综合检测系统的设计, 主要完成了疲劳检测系统的嵌入式平台构建和嵌入式程序移植, 实现了一种在嵌入式 ARM 开发板上基于眼睛睁闭状态判断的疲劳检测系统。参考文献1牛清宁, 周志强, 金立生, 等.基于眼动特征的疲劳驾驶检测方法J.哈尔滨工程大学学报, 2015 (3) :394-398 2石春林.监控司机疲劳驾驶的实时图像处理系统研究D.武汉:武汉理工大学, 2007 3谢秀珍.基于机器视觉的驾驶员疲劳检测研究D.长沙:中南大学, 2010 4孟子诤, 刘金明, 刘厚军.机车司机疲劳检测系统研究与应用J.中国铁路, 2013 (5) :105-108 5柳露艳.驾驶员疲劳驾驶检测系统的研究与实现D.上海:东华大学, 2014 6熊池亮.基于 Adaboost 算法的驾驶员疲劳驾驶检测D.成都:电子科技大学, 2013