前言
自动驾驶是计算机视觉在现实生活中的一个应用。目标检测、光流估计、图像分割等技术在自动驾驶上应用广泛。然而自动驾驶技术距离完全落地实用还有一定的距离,计算机视觉在自动驾驶上更多的只是辅助驾驶的作用,今天我们就来讨论一下如何使用计算机视觉技术来检测驾驶员是否睡着。
睡意检测
我主要使用dlib包来进行睡意检测,dlib的安装可以参考:
小糊糊:win10+dlib+python3.7+minGW编译安装zhuanlan.zhihu.com我是通过视频图像中的驾驶员是否长时间闭眼来判断该驾驶员是否有睡意。那么给定一帧图像,我们首先应该找到图像中驾驶员的脸部位置,这是一个目标检测问题,可以使用任意的目标检测模型实现。这里我使用的是dlib中已经训练好的人脸检测模型:
dlib
在得到脸部位置之后,我们需要检测出面部标志,也就是眼睛、眉毛、鼻子、下吧的位置。dlib中也有训练好的面部标志检测模型:
dlib
dlib的面部标志检测模型返回的是68个点的坐标,这68个点按照序号对应人脸的各个位置如下图所示:
通过面部标志结果我们可以很容易得到眼睛的位置,每只眼睛用6个点表示,也就是编号37-42(右眼),43-48(左眼)。接下来我们要判断眼睛是闭眼还是睁眼,我参考的是这篇论文的方法:
http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdfvision.fe.uni-lj.si论文使用的方法简单有效,根据眼睛长宽比来判断是睁眼还是闭眼,如下图所示:
眼睛长宽比的计算方式如下:
如果ERA大于所设阈值,则认为是睁眼,否则则认为是闭眼。
因为人是会不断眨眼的,所以我们判断睡意时将一定数量的连续视频帧都闭眼才认定为驾驶员有睡意。
代码实现
# USAGE
代码中使用了dlib预训练的模型,得先下载好再将路径传入。下载地址:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2dlib.net代码中检测到睡意后还可以播放警报提示音,对应--alarm参数,需要将提示音乐文件路径传入。代码逻辑很简单,就不再细说。
总结
上面方法除了可以检测睡意外,还可以运用到相机上检测是否眨眼。如果你的应用场景跟人脸相关的话,可以考虑使用dlib包。