APP下载

基于树莓派的驾驶员分心驾驶检测系统

2023-11-19莫紫雯王江涛张子翔

电子制作 2023年21期
关键词:级联关键点人脸

莫紫雯,王江涛,张子翔

(淮北师范大学 物理与电子信息学院,安徽淮北,235000)

0 引言

随着社会不断地发展,汽车成为人们出行必不可少的交通工具,但每年汽车交通事故的数量也在不断增长,而分心驾驶是导致交通事故的重要原因之一。驾驶员分散注意力进行非驾驶相关活动,如低头看手机、转头聊天、发呆等,会降低对道路和周围环境的注意力,增加发生事故的风险。因此,研究一款分心驾驶检测系统可以及时发现驾驶员的分心行为,采取警示措施,减少交通事故的发生,提高道路安全。

1 系统总体设计

基于树莓派的分心驾驶检测系统由树莓派4B、树莓派显示屏、树莓派摄像头、蜂鸣器模块组成,通过摄像头进行实时图像采集,将采集到的人脸特征关键点进行数据处理,经过计算与设定阈值进行比较判断是否达到分心驾驶状态。

图1 系统总体结构图

2 分心驾驶检测系统的原理

■2.1 系统硬件实现

完成本次系统设计的硬件组成为树莓派(Raspberry Pi)。其部分参数配置如表1 所示。

表1 系统硬件参数

图2 本文分心驾驶系统的具体实物图

■2.2 系统软件实现

系统的软件主要是在树莓派上搭建OpenCV运行环境,程序运行时启动摄像头,系统进行人脸识别并抓取面部关键点,然后通过转换3D-2D 模型,将旋转向量转换为旋转矩阵,并分解投影矩阵,对头部姿态进行识别,与设定角度进行比较并判定是否处于分心驾驶,对数据进行预处理,实现分心驾驶的检测与提示。

3 系统设计方案

■3.1 系统工作流程

检测方式通过实时摄像头检测,打开摄像头后,完成界面和变量的初始化,然后使用基于HOG 特征的级联分类器来检测视频帧中的人脸,并提取人脸关键点(如眼睛、鼻子、嘴巴等)的坐标[1]。然后,定义一个头部的3D 模型,将2D 的人脸关键点坐标与3D 模型中对应的点建立起对应关系。通过将2D-3D 对应点作为输入,使用PnP 算法估计得到的旋转向量和平移向量。最后,通过将旋转向量转换为旋转矩阵,并分解投影矩阵,可以计算头部的欧拉角(如俯仰角、偏航角、滚动角)。设置低头阈值角度为10 度,如果在连续3s 内检测的头部偏转角度都大于阈值角度,则将被判定为分心驾驶;同理,设置左右偏头阈值为10 度,如果在连续3s 内检测的头部偏转角度大于10 度或小于-10度也将被判定为分心驾驶,系统将进行警报提示。

图3 分心驾驶检测系统软件实现流程图

图4 分心驾驶检测系统总体设计流程图

■3.2 关键步骤

(1)创建一个人脸检测器detector 和一个关键点预测器predictor。detector 使用Dlib 的默认人脸检测器来检测输入帧中的人脸,predictor 使用预训练的模型来预测人脸关键点。

(2)读取视频流的每一帧。对于每一帧,使用人脸检测器检测人脸的边界框face_rects。

(3)如果检测到人脸,则利用关键点预测器获取人脸的68 个关键点坐标shape,这些关键点包括眼睛、眉毛、鼻子、嘴巴等[2]。

(4)调用get_head_pose()函数,传入关键点坐标shape,以估计头部的旋转角度和俯仰角度。函数返回投影后的关键点坐标reprojectdst 和欧拉角euler_angle。

(5)将投影后的关键点坐标用线段连接起来,以显示头部的姿态估计。

(6)将欧拉角的X、Y 和Z 分量分别赋值给变量ab 和yh,若在连续3 秒内ab 大于10 度或yh 大于10 度或yh 小于-10 度,则判定为分心驾驶。

(7)如果系统被判定为分心驾驶,显示屏显示提示字样且蜂鸣器进行警报提示。

4 系统算法实现细节

我们在使用Dlib 库进行人脸识别时,获取了人脸68 个特征点,并根据这些点的位置信息分别获取左右眼面部标志的索引。在本文中,我们采用了Dlib 库中的两个核心函数:dlib.get frontal face detector() 和dlib.shape predictor()。前者是一种基于HOG pyramid 算法的内置人脸检测器,能够准确地识别出人脸区域的范围。而后者则是针对特定区域内的特征点进行检测和坐标输出的函数,但需要通过文件路径传入一个事先练习好的模型才能工作。

在这个项目中,我们使用了一个开源的模型shape predictor 68 face,通过它可以获取到人脸的68 个特征点位置的坐标信息。将这些坐标点连线之后,可以得到如图所示的效果展示(红框为HOG pyramid 检测器的结果,绿框为predictor 函数的结果,仅连接了同一个器官的特征点)所得效果如图5 所示。

通过数据分析,结合产品总出成和综合售价两个方面的综合考虑,在毛鸡只重为5.10×500g时,有相对较高的总出成和最高的综合售价。所以,确定车间肉鸡屠宰中毛鸡的最佳只重为5.10×500g,对养殖端的毛鸡养殖的最佳只重范围提供一定理论依据,进而对屠宰车间的最大化价值生产提供一定的原料支持。

图5 人脸面部68 个特征关键点识别图

在这个项目中,我们使用了眼睛长宽比(EAR)来计算眼睛的状态。当人眼睁开时,EAR会在一个值域内浮动。然而,当人眼闭上时,EAR会迅速下降,接近于零。一般情况下,我们设置同一次眨眼的连续帧数为1 到3 帧。因此,两个阈值都需要根据实际情况进行设置。眼部抓取的6 个关键特征点如图6 所示。

图6 眼部6 个关键特征点识别图

图7 面部68 个关键特征点标识图

图8 3D 坐标系与2D 坐标系关系转换图

通过式(1):

计算出眼部阈值,我们通过比较当前帧与前一帧的两只眼睛的宽高比的绝对差值,此外,下方的面部关键特征点标识图展示了人脸68 个关键特征点的位置信息,37~42 代表左眼,43~48 代表右眼。

在该项目中,我们首先需要定义一个合适的坐标系来描述头部的姿态。通常使用的是一个以人脸中心或眼睛中心为原点,与图像平面垂直的坐标系。然后使用dlib.shape predictor()函数获取人脸关键点,该函数使用了人脸关键点检测算法,该算法基于形状模型和回归方法,能够对人脸进行准确的特征点定位。通过使用训练好的形状模型,可以在新的人脸图像中预测并定位出相应的关键点,通常会包括眼睛、鼻子和嘴巴等特征点[3]。接着通过眼睛关键点的均值来计算眼睛的中心点,例如左眼关键点的均值和右眼关键点的均值。使用眼睛中心点计算头部在水平方向上的旋转角度。

■4.1 Dlib 框架

本文主要运用Dlib 包中的图像处理库包,其中包括基本图像处理、形态学运算、图像变换、特征提取等功能。人脸检测和人脸识别是本文所设计系统中的两个重要功能,其中人脸检测是Dlib 库中的人脸检测算法基于HOG 特征和级联分类器[4],该算法能够快速准确地检测出图像中的人脸。Dlib 提供了多种人脸检测器,其中正面人脸检测器是最为常用的,具有高准确率和快速度。通过使用Dlib 库提供的人脸检测器,可以获得人脸位置和大小等信息。Dlib 提供了基于ResNet 网络的人脸识别器,该识别器能够将人脸图像转换为一个128 维的向量表示。这个向量表示能够很好地表征人脸的特征,不仅在同一个人的不同姿态、表情、光照等变化下保持一致,而且在不同人之间也能够区分开来。Dlib 还提供了人脸跟踪器,可以跟踪一个人脸在视频中的位置和姿态,并对其进行实时的识别。

■4.2 基于HOG 特征的级联分类器的详细介绍的基本原理

本文中使用了dlib.get frontal face detector()函数,它的作用是在图像或视频中检测出人脸的位置和边界框。该函数使用了基于HOG 特征的级联分类器来进行人脸检测。

(1)HOG 特征

HOG 特征是一种基于图像梯度方向的特征表示方法,用于描述图像中的纹理和形状信息。它的主要思想是将图像划分为小的局部区域,计算每个区域内梯度的方向和强度,并统计这些梯度方向的直方图作为特征表示。HOG 特征在人脸检测中非常有效,因为人脸的纹理和形状信息可以通过梯度方向进行捕捉。

级联分类器是一种多阶段的分类器,由多个弱分类器组成。它的设计目标是在保持高检测率的同时降低计算成本,以实现实时目标检测。级联分类器通过级联的方式将输入样本逐步过滤,将大多数负样本(非目标)快速排除,只保留可能是目标的区域进行进一步检测。

在人脸检测中,级联分类器通常采用AdaBoost 算法来训练弱分类器,并通过级联的方式组合这些弱分类器。每个级联阶段包含多个弱分类器,只有当一个区域通过当前阶段的所有弱分类器时,才会进入下一阶段的检测。

级联分类器的训练过程包括以下步骤:

(1)提取正样本和负样本的特征(如HOG 特征);

(2)使用AdaBoost 算法训练弱分类器,通过选择最佳的特征和阈值进行分类;

(3)逐级训练级联阶段,每个阶段都对前一阶段中被错误分类的样本进行进一步训练;

(4)在级联过程中,随着阶段的增加,误报率逐渐降低,同时保持较高的检测率。

级联分类器的优势在于它能够在较短的时间内快速排除大部分负样本,从而减少后续检测阶段的计算量,提高整体检测速度。因此,本文系统中的dlib.get frontal face detector()函数使用了基于HOG 特征的级联分类器来进行人脸检测。

■4.3 头部姿态

头部姿态估计在很多应用中都有着重要的作用,例如人机交互、情感识别、安防监控等。它可以帮助计算机更好地理解人类的行为和意图,从而提高人机交互的效率和自然度。

要将一个3D坐标系中的点表示为2D 坐标系中的点,需要进行一定的坐标变换。这个变换过程通常包括以下几个步骤:

(1)将3D 坐标系中的点投影到一个平面上,得到一个2D 平面中的点;

(2)对这个2D 平面中的点进行缩放和旋转,以适应实际场景中的尺度和方向;

(3)根据需要对2D 坐标系中的点进行平移,以调整它们在实际场景中的位置。

通过使用OpenCV 提供的solvePnP()函数,可以获得旋转矩阵R。

继而通过以下公式求得欧拉角:

根据眼睛中心点的坐标差异,可以使用函数来计算旋转角度。最后计算头部俯仰角度,头部的俯仰角度通常是相对于一个参考点(例如鼻子关键点)的头部与该点之间的角度。可以计算参考点到眼睛中心点的向量,然后计算该向量与图像平面的夹角。

5 分心驾驶检测系统的实际验证

系统的实际验证情况如图9 所示,图中立方体为根据头部姿态重新建立的空间姿态立方体,将它与图像中的标准坐标对比并将头部的欧拉角信息显示在帧上,最后,打印输出头部的欧拉角信息,并将欧拉角的X、Y 和Z 分量分别赋值给变量,当变量大于或小于设定角度范围则将被判定出行为特征,而当此行为持续超过3s 则将被系统判断为分心驾驶。

图9 向左转头时系统识别情况

图10 向右转头时系统识别情况

图11 低头时系统识别情况

为了测试系统在实际情况下的综合性能表现,采用了同场景下多样本的测试,志愿者的分心次数由两位计数人员和本文所设计的分心驾驶检测系统共同计数,并将汇总的数据整理成表格形式。在这里选取5 名同学来模拟开车状态进行分心检测,试验结果如表2 所示。

表2 检测实验结果

从结果可以看出,本文所设计的分心驾驶检测系统在实际测试场景中有较高的测试精度,整体的检测准确率达到了97.4%。其中在对低头检测的实验中,由于测试时所设阈值角度范围较小,导致了在检测低头时做出了动作但系统误判成向左或向右偏头的情况,后续对本系统的研究仍然需要对这种情况进行改进。出现了误判的现象,但是本文设计的分心驾驶检测系统的整体表现尚可,实际测试结果验证了本文提出的程序的检测系统的准确性和实时性。

6 结论

本文根据实际生活中的需要设计了一款准确且高效的分心驾驶检测预警系统,解决了驾驶员在行车过程中的无意识驾驶行为和一些已有的分心驾驶检测系统的不足。该系统的计数原理是对OpenCV 捕捉的面部信息和头部姿态信息进行识别分析,首先定位抓取面部信息和实时识别驾驶过程中面部关键点和头部姿态相对位置变化信息,通过与预先设置的分心驾驶判定角度进行比较,可以确定当前驾驶员是否处于分心驾驶状态。该系统具有实时采集、同步检测判断、分心状态判定,存储和实时显示计数结果等特性,系统的实时性较佳,对硬件设备要求不高,分心驾驶状态检测精确度高,为后续能真正应用于驾驶员驾驶汽车的场景中提供了参考。

猜你喜欢

级联关键点人脸
聚焦金属关键点
肉兔育肥抓好七个关键点
有特点的人脸
三国漫——人脸解锁
级联LDPC码的STBC-OFDM系统
基于级联MUSIC的面阵中的二维DOA估计算法
马面部与人脸相似度惊人
医联体要把握三个关键点
长得象人脸的十种动物
LCL滤波器在6kV级联STATCOM中的应用