使用OpenCV/EmguCV改进人脸检测性能
本文关键字:检测 性能 OpenCV EmguCV 使用 | 更新日期: 2023-09-27 18:02:07
我目前正在使用EmguCV (OpenCV c#包装器)成功地实时检测人脸(网络摄像头)。我得到大约7 FPS。
现在我正在寻找提高性能(并节省CPU周期),我正在寻找选项,以下是我的想法:
-
检测人脸,挑选人脸的特征,并尝试在下一帧中找到这些特征(使用SURF算法),所以这就变成了"人脸检测+跟踪"。
-
检测人脸,在下一帧中,尝试在之前人脸所在的ROI中检测人脸(即在图像的较小部分中寻找人脸)。
-
Side idea:如果2-3帧没有检测到人脸,并且图像中没有移动,在检测到移动之前不要再尝试检测人脸。
你有什么建议吗?
谢谢。
你介绍的所有解决方案似乎都很聪明合理。但是,如果您使用Haar进行人脸检测,您可能会尝试创建具有较少阶段的级联。虽然面部检测建议分为20个阶段,但10-15个阶段可能就足够了。这将显著提高性能。关于创建自己的级联的信息可以在教程中找到:OpenCV haartraining(基于haar样特征的增强分类器级联的快速对象检测)。
同样,使用SURF是一个好主意。你也可以尝试P-N学习:通过结构约束引导二元分类器。YouTube上有一些有趣的视频介绍了这种方法,试着找到它们。
-
对于SURF算法,您可以尝试,但我不确定它是否提供了面部的相关特征,可能是眼睛周围,或者如果您离得很近并且皮肤不规则,或者再次可能在头发上,如果分辨率足够。此外,SURF并不是真的非常快,如果你想节省CPU时间,我只是想避免做更多的计算。
-
roi是一个好主意,你会通过做camshift算法来选择它,它不会节省很多CPU,但你可以尝试作为camshift是一个非常轻量级的算法。我不确定它是否真的相关,但你在第二篇文章中得到了一个好主意:最小化搜索区域…
-
这个侧面的想法对我来说似乎很好,你可以尝试检测运动(例如全局运动),如果没有那么多,那么不要试图再次检测你已经检测到的…你可以尝试用运动模板来做,就像你知道的,从meanshift或人脸检测中得到的轮廓。一个非常简单,轻量级但不健壮的模板与帧n-1和帧n匹配,可以给你一个系数,衡量这两个帧之间的相似性,你可以说,低于一定的阈值,你激活人脸检测....为什么不呢?如果c#包装器具有matchTemplate()等效函数,则应该需要5分钟才能实现。
如果我有更好(更深入)的想法,我会再来的,但是现在,我刚下班回来,很难再想更多……
朱利安,这不是一个完美的答案,只是一个建议。
在CS B.Tech的最后一个学期的数字图像处理课程中,我学习了位位置切片,以及仅具有MSB平面信息的图像如何提供几乎70%的有用图像信息。因此,您将使用几乎原始图像,但只有原始图像的八分之一大小。
所以,虽然我还没有实现它在我自己的项目,我想知道它,以加快人脸检测。因为后面的眼睛检测、瞳孔检测、眼角检测也会占用大量的计算时间,使得整个程序运行缓慢。