基于Android Studio开发的驾驶员危险驾驶行为实时监测系统源码+详细文档+汇报 PPT,出现危险驾驶行为时进行语音提醒

3. 软件设计  

3.1 软件体系结构设计  

3.1.1 软件体系结构的逻辑模型  

该软件系统大致可以分为智能手机端的“驾驶提醒App”子系统和设备终端“网络摄像头”子系统。前者的职责是实时监测驾驶员,在驾驶过程中,进行疲劳检测和不当行为检测,并及时发出警报提醒驾驶员。后者的职责是实时传输视频流给App,感应用户位置,进行跟随;感知环境亮度,即时切换日/夜检测模式,见图1。

图1 “驾驶员危险驾驶行为检测系统”体系结构图

(1)智能手机终端“驾驶提醒App”子系统    

它负责在智能手机端接受并解码来自网络摄像头的视频流,并且根据视频实时监测和分析驾驶员的驾驶状态,如果检测到驾驶员在驾驶过程中出现疲劳驾驶或者其他不当行为,手机端将会及时发出警报提醒驾驶员。

(2)设备终端“网络摄像头”子系统

它负责在后端控制摄像头的运行,摄像头将感应用户位置,可设置摄像头朝向跟随驾驶员,实时记录驾驶员的面部变化和行为状态,将视频流传输给手机端进行行为检测;根据昼夜光线的变化,调整切换日/夜检测模式。

图2描述了“驾驶员危险驾驶行为检测系统”设计架构,图中用户界面层和业务处理层的类由需求用例模型和用例交互模型改写而来。

用户界面层中,主要涉及的是六个活动类。addCameraActivity是用户登录和连接摄像头的界面,SettingUserActivity是设置用户密码的界面,StartActivity是软件加载的界面,PlayActivity是监测用户状态的主界面,SettingAlarmActivity是设置摄像头移动追踪人形的界面,SettingActivity是设置的总界面。

业务处理层中,接口PlayInterface被PlayActivity所实现,主要功能是获得视频流回调的数据。VideoFramePool类是存储视频帧数据的类,以恒定速率向MyRender类传输视频帧。MyRender类和PlayActivity的一个视图对象绑定,通过视频帧数据渲染界面,从而达到稳定传输视频画面的功能。FaceDetect和TensorFlowObjectDetectionAPIModel实现了利用AI模型监测视频流的功能。NativeCaller类的功能是Android端向摄像头发送指令。Timer类则起到了一个定时的作用,定期提醒软件系统,监测驾驶员行为。MediaPlayer类则是播放警报提醒用户。

基础服务层的“网络摄像头接口包”是由libvstc2_jni.so文件实现的,是支持智能手机终端与网络摄像头进行互联的接口;“网络传输解码包”是由libmi_decoder.so文件实现,用于编码智能手机向网络摄像头传输的控制命令和解码网络摄像头向智能手机设备传输的视频流解码。    

图2 “驾驶员危险驾驶行为检测系统”设计架构

3.1.2 软件体系结构的部署模型  

图3描述了“驾驶员危险驾驶行为检测系统”部署图,其中“驾驶提醒App”子系统部署在位于前端基于Android操作系统的智能手机上;“网络摄像头”子系统部署在后端的网络摄像头上。前后端软件通过网络进行连接,通过HTTP协议进行1对1交互和数据传输。    

图3 “驾驶员危险驾驶行为检测系统”部署图

3.2 用户界面设计  

根据“驾驶员危险驾驶行为监测系统”的用例描述以及每个用例的交互图,可以发现该软件系统在手机端的App需要有以下一组界面以支持用户的操作:

(1)加载界面“StartActivity”,App启动时用于展示该软件。

(2)连接界面“addCameraActivity”,其职责是帮助用户连接摄像头、登录软件以及进入设置界面、进入视频监测界面。

(3)视频监测界面“PlayActivity”,其职责是进入预览模式,显示摄像头拍到的画面。

(4)设置界面“SettingActivity”,其职责是帮助用户配置软件,可进入设置用户信息界面和设置移动布防界面。    

(5)设置用户信息界面“SettingUserActivity”,其职责是帮助用户修改登录信息。

(6)设置移动布防界面“SettingAlarmActivity”,其职责是帮助用户设置摄像头移动布防程度。

3.2.1 用户界面跳转关系的顺序图  

如图4所示,在加载界面,进程睡眠一段时间之后跳转到连接界面,如果成功登录,则可以跳转到视频监测界面和设置界面。在设置界面,可以继续跳转到设置用户信息界面和设置移动布防界面。

          

图4 描述“驾驶员危险驾驶行为监测系统”用户界面跳转关系的顺序图

3.2.2 界面原型及界面设计  

(1)本界面为本软件的加载界面:    

图5 手机端“加载界面”

(2)本界面为连接界面,可进行连接、登录和设置操作:

图6 手机端“连接界面”

(3)本界面为“视频监测”的功能界面,可预览摄像头拍到的画面:    

图7 手机端“视频监测界面”

(4)本界面为设置界面,可设置用户信息和移动布防:

图8 手机端“设置界面”

(5)本界面为设置用户信息界面:    

图9 手机端“设置用户信息界面”

(6)本界面为设置移动布防界面:

图10 手机端“设置移动布防界面”    

3.3 用例设计  

3.3.1 “用户登录”用例实现的设计方案  

如图11所示,加载界面StartActivity3秒后会自动跳转到登录界面addCameraAcitity,在此之前会调用NativaCaller的PPPPInitial方法对能否使用网络摄像头接口的SDK验证,该方法的参数是一个常值字符串。在登录界面addCameraActivity中,调用NativeCaller的Init方法,初始化NativeCaller。再调用loginAndConnect方法,返回login_input_Valid判断输入的用户名密码是否有效,如果用户名密码输入有效,则调用NativeCaller中的StartPPPPExt(account,pwd,deviceId)方法,向网络摄像头传输指令。用户的账号密码信息均存储在网络摄像头中,且与设备ID,即deviceId对应。网络摄像头核对后会反馈登录是否成功的信息。如果login_input_Valid为false,则直接反馈输入值无效给addCameraActivity。

图11 “用户登录”用例的顺序图    

3.3.2 “系统登录-设置用户信息”用例实现的设计方案  

如图12所示,在设置界面SettingActivity里面,可以选择设置用户信息,跳转到用户信息设置界面SettingUserActivity。在用户信息设置界面SettingUserActivity里面,调用checkValidInput方法返回input_Valid,检查输入的新用户名密码是否合法,合法的话就调用NativeCaller的PPPPUserSetting(deviceId,newPwd,newAccount)发送设置用户信息的消息,更新数据库中的用户名和密码,网络摄像头也会发送修改反馈信息。

图12 “系统登录-设置用户信息”用例的顺序图

3.3.3 “系统登录-设置移动监测”用例实现的设计方案  

如图13所示,设置界面SettingActivity进入移动布防设置界面SettingAlarmActivity,可以选择设置驾驶员脸部移动的监测(移动布防)。调用InitAlarm方法输入alarm_level,返回openAlarm,判断是否打开网络摄像头的移动布防。如果需要打开,再调用NativaCaller的PPPPAlarmSetting(alarm_level),其中alarm_level是移动布防的敏感等级,取值在1到10。设置成功后,网络摄像头在监测过程中镜头朝向会跟随驾驶员。    

图13 “系统登录-设置移动监测”用例的顺序图

3.3.4 “实时视频传输”用例实现的设计方案  

如图14所示,从连接界面addCameraActivity到监控界面PlayActivity需要先调用checkStatus方法,判断目前是否登录成功。如果login_status!=ture,说明登录已断开,反馈错误。若登录成功,监控界面PlayActivity就调用视频帧池VideoFramePool的setFramaRate方法,此方法的参数FramaRate的类型是整型,此方法设置了发送抽样视频帧的速率,即FramaRate 帧/s。之后进入获取视频流的循环,调用NativeCaller的StartPPPPLivestream方法请求网络摄像头返回视频流。NativeCaller将从网络摄像头获取到的视频信息传回到监控界面PlayActivity。视频帧池通过pushBytes方法将获取的视频流数据存储起来。同时调用图形渲染器MyRender的writeSample方法向其循环发送视频流数据,传送给图像渲染器。由于MyRender和PlayActivity中的视图绑定了,所以图像渲染器MyRender调用draw方法,则会在PlayActivity的视图上显示视频信息。监控界面可根据反馈的视频流信息判断驾驶员的状态。    

图14 “实时视频传输”用例的顺序图

3.3.5 “疲劳监测”用例实现的设计方案  

如图15所示,监控界面PlayActivtiy调用多个Timer的schedule方法,设置多个定时任务TimerTask。之后在TimerTask设定的周期时间里,监控界面PlayActivity调用callBackVideoData方法获得视频流数据videoData,在循环将获取到的视频信息发送到人脸识别控制器FaceDetect中,后者通过detect方法对收到的人脸信息开始监测,智能手机后台计算驾驶员是否处于疲劳状态,最终返回人脸监测信息faceDetectInformations。当超过TimerTask设定的时间周期时,Timer会调用消息处理器timeHandler的sendMessage方法提醒需要进行某种监测了(如眨眼检测、偏头检测等),同时PlayActivity向timeHandler传递刚才的人脸监测信息faceDetectInformations。最终timeHandler调用handleMessage方法处理信息,得到疲劳监测结果。疲劳监测的过程是一直持续的。    

图15 “疲劳监测”用例的顺序图

3.3.6 “注意力检测”用例实现的设计方案  

如图16所示,监控界面PlayActivity调用callBackVideoData方法获得视频流数据videoData,监控界面对象PlayActivity将视频信息发送给人脸识别控制器FaceDetect,智能手机计算驾驶员是否集中注意力的结果,将计算得到的结果发送回监控界面,由监控界面调用judgeAttention对得到的结果判别是否处于分散注意力的状态。    

图16 “注意力检测”用例的顺序图

3.3.7 “不当行为检测”用例实现的设计方案  

如图17所示,监控界面对象PlayActivity先执行callBackVideoData获得视频流数据,再通过createBitmap方法将视频信息提取成单张位图信息mBitmap,发送给人体行为检测器TensorflowObjectDetectionAPIModel,调用手机CPU计算驾驶员有不当行为的情况,将计算得到的结果List发送回监控界面,其中Recognition是一个类,记录了不当行为的检测结果。最后监控界面调用classfyFrame对得到的List判别是否处于分散注意力的状态。    

图17 “不当行为检测”用例的顺序图

3.3.8 “提醒服务”用例实现的设计方案  

如图18所示,监控界面PlayActivity调用音频播放器MediaPlayer的makeAlarm(alarm_type)方法,其中alarm_type是需要发出的警报类型。之后MediaPlayer通过checkPlayer检测此时是否处于播放警报的状态isAlarming。如果此时正在播放,那么不会打断播放。如果此时MediaPlayer空闲,则会调用playAlarm播放警报提醒用户,此时isAlarming=true。播放完毕再调用changePlayerStatus,将isAlarming设置为false。    

图18 “提醒服务”用例的顺序图

3.3.9 子系统设计类图  

图19描述了“驾驶提醒App”子系统的设计类图。    

图19 设计类图

3.4 类设计  

3.4.1 精化类间关系  

在基于分析类图中监控界面的类间关系,继续精化设计类图中PlayActivity的类间关系。

PlayActivity调用makeAlarm方法,向其传递alarm_type参数,MediaPlayer根据参数的不同,播放不同的警报,故二者构成依赖关系。

PlayActivity实现了PlayInterface中的callBackVideoData方法,获取了视频流数据的回调,故PlayAcitivity1实现了PlayInterface。

一组类PlayActivity、Timer、timeHandler、MyRender。针对这些设计类间关系的精化设计描述如下,具体见图20。PlayActivity是监控界面,里面含有三个Timer,它们的作用分别是给规定一段时间初始化用户姿态、规定一段时间周期进行眨眼检测和哈欠检测和规定一段时间周期进行偏头检测。除第一个Timer外,后两个检测是一直在进行的,所以需要一个任务(TimerTask)规定时间周期,定时发送消息。一个timeHandler,用来处理定时发送的消息,和Timer配合达到定时提醒的功能,timerHandler根据不同的Timer发送的不同的消息,二者是依赖关系。还有一个MyRender类,该类的功能是渲染与其绑定的视图,与PlayActivity的视图playSurface绑定后,便可更新PlayActivity中的视图。PlayActivity控制此三个类的生命周期,具有“同生共死”的特性,因此它们之间的关系是组合。    

此外PlayActivity依赖VideoFramePool的pushBytes方法,将视频流存储进去。而VideoFramePool存在类成员MyRender,从而向其传输视频流数据。二者具有聚合的关系。    

图20 精化PlayActivity有关的类的类间关系

3.4.2 精化用户界面之间的关系  

根据图4所示的界面之间的跳转顺序图,显然界面之间有如图21所描述的关联关系。用户从StartActivity加载界面,自动跳转到addCameraActivity连接界面。连接成功后,即可进入PlayActivity视频监控界面,或者SettingActivity设置界面。在设置界面可以进一步进入SettingUserAcitivity和SettingAlarmActivity,进行进一步的设置。    

图21 精化用户界面之间的关系

3.4.3 精化关键设计类间的关系  

如图22所示,PlayActivity、FaceDetect、Recognition、Classifier、TensorFlowObjectDetectionAPIModel、智能收集是有关疲劳检测和不当行为检测的关键设计类。

PlayActivity是视频监控界面,调用TensorFlowObjectDetectionAPIModel中的recognizeImage方法对PlayActivity提供的mBitmap进行判断,进一步传递给智能手机,在后台进行计算。TensorFlowObjectDetectionAPIModel得到不当行为的计算结果后,反馈给PlayActivity。FaceDetect类同理,需要PlayActivity提供的videoData数据,同时将结果反馈给PlayActivity。因此都是双向关联关系。其中TensorFlowObjectDetectionAPIModel实现类分类器Classifier的recognizeImage方法,二者为实现关系。分类器Classifier里有一个类Recognition是检测结果类。通常一个分类器Classifier中含有一组检测结果Recognition。因此,Classifier和Recognition是聚合关系,且数量对应关系是1对m。    

图22 精化关键设计类间的关系

3.4.4 精化addCameraActivity的类属性  

作为连接界面的addCameraActivity,在用户界面设计中,有addCameraActivity界面用于支持用户输入账号和密码登录到系统之中,具体见图23 所示。addCameraActivity界面类属性的精化设计描述如下。

account为用户账号,pwd为用户密码,deviceId为设备Id号,三者的类型为用户输入元素,如文本框,最后会转化为字符串类型。其初值分别是:admin、888888、VSTK091497LLBPL,对外不可见,均为私有变量。login_status是表面连接状态的布尔类型的变量,初值为false,说明当前未登录,login_input_Valid是表示输入账号密码是否为空的布尔类型的变量,初值为true,因为account和pwd的初值是输入有效的非空值。该两种状态私有,对外界不可见,在界面跳转或者调用其他类函数时会在addCameraActivity内部用checkStatus和loginAndConnect方法进行判定。    

图23 精化addCameraActivity的类属性

3.4.5 精化VideoFramePool的类属性  

作为存储接收的视频流数据的类VideoFramePool,存在一个私有的类属性framaPool,类型是LinkedBlockingQueue存储byte类型的一个特殊队列。对外不可见所以是私有。存在一个MyRender类的类属性,这是因为需要向MyRender类传递视频数据,仅对VideoFramePool可见,为私有变量。还有一个int类型的类属性framaRate,初值为15,意思是按15帧/s的速率向MyRender传输视频帧数据。可以通过公开的方法setFrameRate设置该属性,因此也应该是私有变量。

    

图24 精化VideoFramePool的类属性

3.4.6 精化NativeCaller的类方法  

图25描述了NativeCaller的类方法,该类主要是和网络摄像头的交互接口。下面是详细解释。

+ void PPPPInitialOther(String constan_string) :该方法功能是初始化网络摄像头的SDK。参数是字符串类型,是一个常量类型的字符串,值为:ADCBBFAOPPJAHGJGBBGLFLAGDBJJHNJGGMBFBKHIBBNKOKLDHOBHCBOEHOKJJJKJBPMFLGCPPJMJAPDOIPNL

+ void Init() :该方法的作用是初始化NativeCaller。

+ int StartPPPPExt(String account, String pwd, String deviceId) :该方法的作用是建立与网络摄像头的连接,参数依次为账号、密码和设备Id,返回值为int类型。(0:连接中、1:已连接,正在初始化、2:在线、3:连接失败、4:连接已关闭、5:⽆效的设备id、6:设备不在线、7:连接超时、8:密码错误)

+ int PPPPAlarmSetting(int alarm_level):该方法的作用是设置移动监测,参数是int类型,表示移动监测的敏感程度。返回值为int类型(0:设置失败、1:设置成功)

+ int PPPPUserSetting(String deviceId,String newAccount, String newPwd):该方法的设置新的账号密码,参数均为String类型,返回值为int类型(0:设置失败、1:设置成功)

+ int StartPPPPLivestream(String deviceId),功能是请求视频流回调,参数是设备Id,返回值为int类型(0:回调失败、1:回调成功)    

图25 精化NativeCaller的类方法

3.4.7 精化timeHandler类的handleMessage方法  

该方法是在收集完疲劳检测的数据后,对数据进行处理,从而判断疲劳程度的方法。

如图26所示,该方法首先进行消息判断,如果消息是偏头检测类型的,则进行偏头类型检测,计算10s偏头的比例rate,rate = nodFrame/totalFrame,若rate大于0.3则视为产生了疲劳,需要偏头提醒。

如果消息类型是疲劳检测类型的,则需要计算Fatigue值,Fatigue = perclos+0.8*avgBlinkTimer+0.5*yawnNumber。如图所示,Fatigue在不同的值区间,对应不同的疲劳程度。

其中:

perclos = eyesCloseFrame (闭眼帧数)/ totalFrame(总帧数)

avgBlinkTimer=总眨眼时间/blinkNumber(总眨眼次数)    

=  {eyesCloseFrame (闭眼帧数)/ totalFrame(总帧数)* 60 } / blinkNumber(总眨眼次数)

即等于 perclos*60/ blinkNumber(总眨眼次数)    

图26 精化timeHandler类的handleMessage方法    

3.4.8 精化PlayActivity类的judgeAttention方法  

如图27所示,PlayActivity循环调用的judgeAttention方法如下,先获得瞳孔的关键点信息,之后根据该信息计算deviation:

deviation = 瞳孔中间到眼角的距离/眼眶总宽度

如果deviation在0.45到0.65之间,则视为为失去注意力,将loseAttentionFrame置为0,反之则连续失去注意力的帧数loseAttentionFrame+1。之后进行判断,如果连续失去注意的帧数达到40帧及以上,则视为驾驶时注意力不集中。    

图27 精化PlayActivity类的judgeAttention方法

3.4.9 构造addCameraActivity类的状态图  

总共有三种状态,“离线”、 “正在连接”、 “已连接”。如图28所示。处在离线状态可以选择 “登录”操作,处于 “正在连接”状态的,一段时间后建立稳定连接就会转为 “已连接”状态。在此状态下,若连接的网络热点断开,则会回到 “离线”状态。    

图28 addCameraActivity类对象状态图

如果某个类在实现其职责过程中需要执行一系列的方法、与其他的对象进行诸多的交互,那么可以考虑构造和绘制针对该类某些职责的活动图。图29用UML 的活动图及泳道机制描述了addCameraActivity、NativeCaller、网络摄像头三个对象之间如何通过交互和协作来实现用户登录的功能。

图29 addCameraActivity类对象状态图    

3.4.10 构造PlayActivity类的状态图  

如图30所示,总共有三种状态,“初始化用户姿态”,“正在检测”,“停止检测”。

刚进入PlayActivity界面,开始“初始化用户姿态”,如果此时间段用户姿态正确,则初始化成功,进入“正在检测状态”,如果在初始化期间,移动摄像头朝向、离开摄像头范围和姿态不正确,均会导致初始化失败,重新进行初始化。“正在检测”状态下,移动镜头朝向,则会重新初始化用户姿态。若未检测到人脸,则会进入“停止检测”状态,此状态下检测到人脸,则返回“正在检测”状态。

三种状态均可以退出系统。

图30 PlayActivity类对象状态图

完整代码下载地址:基于Android Studio开发的驾驶员危险驾驶行为实时监测系统