从0到1学习使用DepthAI-疲劳检测

这篇文章将介绍如何在DepthAI上实现疲劳检测,可应用于疲劳驾驶检测。
分析项目
首先,我们需要解决一个问题,什么样可以视为疲劳?
频繁的眨眼/眨一次眼所用时间很长

不停的打哈欠

不停的点头

通过分析,我们得到了检测疲劳的三个标准:眨眼,打哈欠,头部姿态。
这三个标准可以让我们知道需要什么样的模型:
能够检测人脸的模型
能够获取面部大部分特征点的模型
寻找合适的模型
1.人脸检测模型
这个我们最熟悉了,可以使用openvino open_model_zoo中的face-detection-retail-0004模型。
2.面部特征点检测模型
我们可以通过搜索引擎找到一个叫做PINTO_model_zoo的项目。在这个项目中可以找到大量模型。
拉取这个项目:
git clone https://github.com/PINTO0309/PINTO_model_zoo.git
进入这个项目,找到043_face_landmark,这个就是面部特征点检测模型,它可以检测出68个特征点。
然后进入05_openvino文件夹,执行shell脚本:
./download.sh
这样我们就可以获得OpenVINO IR文件了。再将OpenVINO IR编译为blob文件:
export MYRIAD_COMPILE=$(find /opt/intel/ -iname myriad_compile)
$MYRIAD_COMPILE -m face_landmark_160x160.xml -ip U8 -VPU_MYRIAD_PLATFORM VPU_MYRIAD_2480 -VPU_NUMBER_OF_SHAVES 4 -VPU_NUMBER_OF_CMX_SLICES 4
注:使用模型转换工具需要安装openvino,安装时要注意DepthAI对OpenVINO版本有要求。 详情请参照openvino安装:https://docs.oakchina.cn/en/latest/pages/tutorials/local_convert_openvino/#id2
代码原理说明
首先运行face-detection-retail-0004模型检测图像中的人脸,并截取面部图像。

然后运行face_landmark_160x160模型从传入的面部图像中检测出68个特征点的位置。利用这些特征点,我们可以检测眨眼,打哈欠和头部姿态。
眨眼
一只眼睛有6个特征点

我们利用欧氏距离计算上下眼皮之间的距离和眼睛的宽度

计算眼睛的长宽比

打哈欠与眨眼的计算原理相同
头部姿态检测
第一步:2D人脸关键点检测;
第二步:3D人脸模型匹配;
第三步:求解3D点和对应2D点的转换关系;
第四步:根据旋转矩阵求解欧拉角。

设置帧数和阈值判断是否眨眼,打哈欠又或是点头并统计次数。
最后根据眨眼,打哈欠,点头的次数判断是否疲劳。

注:由于每个人的五官不一样,眼睛和嘴巴的欧氏距离有差距,可以更换为符合自己的阈值。
国内在哪里能买到DepthAI?
目前国内唯一的购买渠道是派驰的淘宝店:
OAK-D -派驰电子 淘宝:https://sourl.cn/9YEFE5
OAK-1 -派驰电子 淘宝:https://sourl.cn/4CpZUZ
参考链接:
OAK 中国:https://sourl.cn/6wt8sm
OAK 中文文档:https://sourl.cn/rawPZD
CSDN-Dlib模型之驾驶员疲劳检测一:https://link.zhihu.com/?target=https%3A//blog.csdn.net/cungudafa/article/details/103477960
CSDN-Dlib模型之驾驶员疲劳检测二:https://link.zhihu.com/?target=https%3A//blog.csdn.net/cungudafa/article/details/103496881
CSDN-Dlib模型之驾驶员疲劳检测三:https://link.zhihu.com/?target=https%3A//blog.csdn.net/cungudafa/article/details/103499230