opencv+dlib+于仕琪算法实现人脸检测和简单疲劳检测

时间:2024-03-25 18:08:28

刚开始接触人脸识别,特征点提取方面,主要根据人脸的特征判定人(司机)是否疲劳,先上一张效果图:

opencv+dlib+于仕琪算法实现人脸检测和简单疲劳检测

具体实现分为以下几个步骤:

1.算法环境搭建:

这个部分网上教程很多,可自行百度。主要涉及到opencv安装,配置,dlib配置以及于仕琪库的应用。

2.人脸识别:

opencv自带人脸识别直接启用,识别精度低,达不到效果,采用的是于仕琪的人脸识别,识别快而且比较精准,这样保证人脸特征点找的比较准确,在后续的疲劳判定上就比较可靠了。

3.人脸特征点检测:

调用dlib开源库,把第二部的人脸框传递给dlib就可以得出68个特征点。

4.疲劳检测算法:

根据得出的眼部特征点,根据形状可以判断人脸是否闭合,如果超过多长时间则可以判定疲劳状态。

dlib实现的ert算法来源文章One Millisecond Face Alignment with an Ensemble of Regression Trees,该算法根据人脸框中随机点对的像素差和一个随机阈值进行比较,判断是否人脸特征。算法参数设置为10层级联,每层500棵树,树深度为5,其他参数参见论文。算法具体思路如下:

1.训练样本

(1)归一化样本。所有样本的形状shape进行归一化(保证左右样本基准一致),然后计算所有样本的平均值(mean shape),把除去样本的其他任何一个样本的shape作为当前的形状(current shape)

(2)生成特征池。在人脸区域产生随机位置,并根据mean shape找出与之最近landmark点位置,并且保存对应的landmark索引和之间偏置(detx, dety),循环此过程长生500个特征

(3)回归。首先从500个特征中随机选取10个随机点对,循环10个点对求出最优分裂点,分裂规则为根据点对的像素差和随机阈值比较,判定分为左节点和右节点上。最后计算残差,根据学习率更新current shape,再次进行回归,一般回归10次。

2.预测。

根据训练得出的阈值进行样本shape迭代,回归到真实shape。具体算法可以参见dest-master


最后说明:算法帧率最大可以达到100fps,且在关照条件好的情况下特征点检出效果还是很不错的,当然对于特殊场景下的人脸识别不一定很好,这个可以自行训练特殊场景的人脸样本,然后把识别的dlib模型替换成自己训练的模型。当然你也可以尝试其他更先进的方法。对于嵌入式的开发,算法则需要进行优化,尤其是在人脸检出部分,于仕琪的linux库没有编译成功,有成功的可以告知一下,三克斯。