欢迎来到网际学院,让您的头脑满载而归!

DMS算法技术详解

发布日期:2020-04-22 21:46:51 作者:管理员 阅读:181

DMS(Driver Monitor System)——驾驶员监控系统DMS概述DMS系统最开始的应用是监控驾驶员的状态,以防止驾驶员疲劳,分神等危害驾驶过程的行为发生。随着计算机视觉技术的发展,现在DMS系统基本涵盖了整个车载视觉解决方案

DMS算法技术详解

DMS(Driver Monitor System)——驾驶员监控系统

DMS概述

DMS系统最开始的应用是监控驾驶员的状态,以防止驾驶员疲劳,分神等危害驾驶过程的行为发生。随着计算机视觉技术的发展,现在DMS系统基本涵盖了整个车载视觉解决方案。

传统DMS功能分为:

1、疲劳驾驶检测

2、分心驾驶检测

当前车厂提出的需求:

1、司机视线检测

2、手势识别(与车机交互)

3、人脸识别(不同的驾驶员调整座椅高度等个性化设置)

4、表情识别


DMS算法技术详解


疲劳检测

何谓疲劳?百度百科上这样解释的

疲劳是一种主观不适感觉,但客观上会在同等条件下,失去其完成原来所从事的正常活动或工作能力

从我们主观感受来看,判断一个人是否疲劳,也就是这个人是否打哈欠了,是否闭眼了。从而转换到计算机视觉中,就是检测闭眼动作和打哈欠动作了,打哈欠也就是张嘴动作。

那么,闭眼和张嘴动作如何识别?

目前常用的有两种方法,第一种是人脸landmark,第二种是图像分类

人脸landmark如下图所示

DMS算法技术详解


对于眼睛来说,根据眼睛上眼睑、下眼睑,左右眼角的landmark坐标来计算眼睛的开合程度

对于嘴巴亦是如此。

使用landmark方法,其优点就是思路比较简单,只需要根据landmark的坐标计算即可,其缺点也显而易见,此算法精度跟landmark定位精度息息相关,如果landmark定位很准,那么最终计算结果就很准。

使用图像分类方法

DMS算法技术详解

此类方法对landmark的精度要求不是很高,这里常用方法是收集正负样本,训练一个鲁棒性比较强的分类器来对状态进行判断。直接由分类器来输出最终的结果。


分心驾驶检测

在驾驶过程中,一切注意力不在驾驶上的行为都被称为分心行为。例如,低头找东西,看窗外的风景,接打电话,喝水,等等。所以在分心驾驶检测算法中,就要对这些出现的动作全部检出。

对于这些异常情况,可以将其分为两种。例如低头或者看窗外都是跟人头有关,如果能够得到人头姿态角度,那么问题就可以解决;喝水,打电话等动作,都属于动作识别,设计一个动作识别的算法也可以解决。

人头姿态角算法

DMS算法技术详解


得到人头姿态角度,一般有两种方法。第一种是上文中提到的landmark,人脸上关键点的坐标全部已知,使用PnP算法可以直接拟合出人头三维角度;第二种是使用标记好的yaw,pitch,roll三个角度的人脸图片直接训练一个小型网络,网络输出层直接回归三个float量,简单粗暴,精度较高,训练数据集直接使用开源人脸数据集,无需标注。

动作识别算法

DMS算法技术详解


在DMS应用中,一般需要识别出打电话动作,喝水动作,抽烟动作。如果单纯地将其是作为动作行为识别,使用LSTM或者3D-Conv算法,其计算消耗资源很严重,杀鸡焉用牛刀?所以,一般有两种比较简单的方法。第一种是将此类的动作识别视为目标检测问题,例如打电话识别,就将手机视为待检目标,喝水检测就将水杯视为待检目标。这种方法思路很简单,但是有一个缺点就是,例如DMS摄像头装在汽车A柱,司机右手打电话,这时候成像画面中是看不到手机的,所以这种场景下检出率不高。另一种方法是将动作识别视为单帧图像分类任务,采集多种动作行为下的图片,人工标注监督信号进行训练,使用分类器判断最后的动作分类。

视线检测

司机在驾驶过程中,其注视方向,也是一个值得关注的问题。

DMS系统可谓是一个比较复杂的系统了,因为其涉及到的知识面比较广,例如人脸检测,人脸关键点检测,人脸识别,目标检测,动作识别,等等,基本上涵盖了计算机视觉中的常见算法。

群里有同学讨论跟踪算法和目标检测的区别和联系,其实在视频目标检测相关应用中都会有跟踪算法的需求,比如DMS中,其实也可以上跟踪算法。一般跟踪算法相比目标检测算法其资源消耗较少,并且会有ID信息输出,在多目标检测中一般都会上跟踪。跟踪算法后面有机会再聊。

OK,咱们回到DMS算法


系统流程

下面是一般DMS系统算法流程图,看完这张流程图,看完就会有对系统有个完整的概念

DMS算法技术详解

人脸检测

人脸检测算法在系统中起着至关重要的作用,因为整个系统中,如果没有人脸,那么所有后续的算法都将没有意义。人脸检测还有一个作用就是可以做“司机不在驾驶位”这个应用判断。

mtcnn应该是耳熟能详的一个经典算法了,虽然目前不算最牛逼的,但是其思想非常值得学习。目前嵌入式端比较实用的算法,像 BlazeFace[1]CenterFace[2]RetinaFace[3]貌似都不错。或者像我这样,自己撸一个人脸检测器,时间消耗自己改,改到自己爽为止,我现在觉得resnet10-ssd做人脸检测挺好,精度也还够用。如果有想法的同学,可以加我微信交流。

关键点检测

关键点检测算法目前来讲,如果想要做的好,最缺的其实是数据。虽说目前开源数据比较多,但是DMS系统中一般使用的红外图像,开源的RGB图像数据集其实具有局限性。如果有足够的数据一切都好说。

目前关键点检测,比较适合部署的几个思路。

1、类似于MTCNN算法中的LNet那样(可能很多人不知道mtcnn的第四阶段LNet)自己加数据训练;

2、利用wing-Loss[4]自己撸一个主干网络,然后加数据训练

3、直接使用SeetaFace2[5]中的landmark,效果还真不错;

4、使用PFLD[6]算法

PFLD算法肯定是最先进的,推荐研究一波

人脸三维角度回归

自己撸一个网络,最后一层设计为全连接层,输出维度为3

直接使用公开数据集,预处理一下训练样本,只留下3维角度监督信息

简单的5层CNN即可拟合出不错效果。比landmark计算的坐标然后再PnP算法拟合角度,要靠谱一些。

References

[1] BlazeFace: https://github.com/tkat0/PyTorch_BlazeFace
[2] CenterFace: https://github.com/Star-Clouds/CenterFace
[3] RetinaFace: https://github.com/deepinsight/insightface/tree/master/RetinaFace
[4] wing-Loss: https://github.com/610265158/face_landmark
[5] SeetaFace2: https://github.com/seetafaceengine/SeetaFace2
[6] PFLD: https://github.com/guoqiangqi/PFLD


Copyright oneie ©2014-2017 All Rights Reserved. 所有资料来源于互联网对相关版权责任概不负责。如发现侵犯了您的版权请与我们联系 QQ:86662817。 网际学院 版权所有 京ICP备14031243号-3
免责声明  商务合作及投稿请联系 QQ:86662817