项目记录:基于OPENMV的疲劳状态识别

本文介绍了作者在2023年电子系统综合设计项目中,使用OpenMV4Plus和STM32H7开发的智能车载终端,其中包含基于MicroPython的疲劳驾驶检测功能,通过眨眼频率算法和TensorFlowLite的轻量级神经网络进行人脸识别。实验证明方案二在资源节约和性能上更优,且已实现上云功能。
摘要由CSDN通过智能技术生成

2023年大三下学期的电子系统综合设计作品,全部项目为智能车载终端,我负责的部分为如标题所示,写个博客记录一下

一、硬件部分

使用的是B站一个大佬自制的OpenMV4Plus,MCU是STM32H7,如下图

二、程序设计

 用Micro Python编程语言,开发者可以方便地编写代码,利用OPENMV模块的功能和API进行图像处理和算法实现。Micro Python语言简洁易懂,适合快速原型开发。

方案一:(取自一篇硕士学位论文[1]许龙铭. 基于OpenMV的疲劳驾驶检测系统的设计与实现[D].华南理工大学,2021.DOI:10.27151/d.cnki.ghnlu.2020.001392.)

该方案选择基于机器视觉的疲劳检测算法,来实现疲劳检测,即眨眼频率算法,该算法在一个检测周期 t1至 t4的时间里检测人眼的闭合程度,同样参考 P80 标准的 PERCLOS 算法,取眼睛闭合程度达到 80%作为眼睛闭合标准,检测实时人眼的瞳孔面积,每次眨眼过程中眼睛闭合程度超过 80%时计为 1 次眨眼,即图 中的 t2和 t3位置。得到一个周期里总的眨眼次数为 c,设 f 为眨眼频率,由眨眼频率的算法原理得到 f 计算公式

最终算法为

瞳孔识别一个流程完成后根据返回的瞳孔位置和大小矩形元组的值便可得到识别结果,如果返回非空元组表示识别瞳孔成功,如果返回的是空元组则表示识别瞳孔失败,即表示驾驶员处于眨眼状态。通过瞳孔识别的结果计算和统计驾驶员一段时间内的眨眼频率,如果眨眼频率过快则表示用户可能处于疲劳驾驶状态。研究表明,一般情况下人正常的眨眼频率是 16 次/分钟-20 次/分钟,每次眨眼时间的时间约为 3 秒,如果人处于疲劳的状态下,他的眨眼频率会相应的提高。虽然疲劳状态下人眨眼过程中闭眼的时间也会相应的变长,但总体的趋势还是人越感觉疲劳,他的眨眼频率越高。因此,驾驶员驾车时的眨眼频率能很好的反应他当前的疲劳程度。通过实验验证,驾驶员长时间连续驾车,疲劳程度随驾车时间慢慢变强,同时眨眼频率也慢慢提高,当眨眼频率在 30 次/分钟左右时,驾驶员开始打哈欠,出现较为明显疲劳状态。本方案选择 30 次/分钟作为疲劳驾驶判断的眨眼阈值,当驾驶员眨眼频率高于阈值则判断其当前处于疲劳驾驶的状态,同时定义疲劳概率::=min[当前眨眼频率,30]/30,并将该输出概率用平滑滤波器处理作为最后的判别结果。

方案二:

该方案选择基于面向移动端的轻量级神经网络框架TensorFlow Lite完成在OpenMv上部署Transfer Learning神经网络,在这个过程中只需要调用TensorFlow Lite的API接口进行神经网络的训练,再将训练好的结果直接保存成tflie文件便可在嵌入式系统上运行神经网络进行图像分类。在本项目中选用了932张人脸照片作为,训练集241张作为测试集共1173张照片。神经网络的部署过程在星瞳科技官网有详细的教程,这里不再赘述

最终设计到的算法流程为

其中的Haar人脸识别算子在OpenMV开发的IDE中全部封装为函数,直接调用即可,其中的一些参数设置在文档中有详细说明,只需根据项目需求平衡响应时间和精度即可,同时我自己设置了一个4阶的均值滤波器来对神经网络反馈出的识别概率进行平滑处理以满足后续对结果传至ESP8266上云的需求,滑动窗长度为4,其内数据分别为当前帧图像的分类结果和向前三个时间节点的分类结果,对当前帧的权重为0.5,其余三个帧分别为权重分别为0.2、0.2、0.1,如此设计的理由如下:对当前的疲劳监测状态更接近真实状态,故权重更高。

未平滑输出

滤波后输出

最终实测后,发现方案一对摄像头要求较高(瞳孔识别),当像素数过大时系统响应相当慢而且对环境光要求极为苛刻,准确率较低。而方案二加入人脸识别后再调用神经网络这一机制可以大大节约系统资源,故选择了方案二进行。

三、实验结果

将数据集传入预训练模型MobileNetV2 96x96 0.35接口中进行训MobileNetV2中主要引入线性瓶颈结构和反向残差结构。MobileNetV2网络模型中有共有17个Bottleneck层(每个Bottleneck包含两个逐点卷积层和一个深度卷积层),一个标准卷积层(conv),两个逐点卷积层(pw conv),共计有54层可训练参数层。MobileNetV2中使用线性瓶颈(Linear Bottleneck)和反向残差(Inverted Residuals)结构优化了网络,使得网络层次更深了,但是模型体积更小,速度更快了。训练轮数20,学习率为0.005最终得到的模型理论效果如下:

将分类效果可视化可得:

图29 可视化效果图

同时TensorFlow Lite还提供了该模型对硬件的需求,即将该模型量化为int8后,对硬件需求将其可视化后得

图30 模型对硬件需求

据此,OpenMV的硬件条件可以满足该需求。

实测结果如下:

效果演示为OpenMV实现疲劳检测(球球三联)

额外说明:数据集全是自己的拍的照比较丑,就不公布了但是实测对其他人也能实现疲劳识别,不得不说神经网络是个好东西

四、总结

至此完成了核心内容,后续我们还实现了将该结果上云并用手机可以查看实时状态,剩下的功能以后有时间再记录吧

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值