使用OpenCV/EmguCV提高面部检测性能

7

我目前正在成功地使用EmguCV(OpenCV C#包装器)实时检测人脸(网络摄像头)。我得到大约7 FPS的速度。

现在我想提高性能(并节省CPU周期),我正在寻找选项,以下是我的想法:

  • 检测面部,拾取面部特征,并尝试在下一帧中找到这些特征(使用SURF算法),因此这变成了“面部检测+跟踪”。如果未找到,则再次使用面部检测。

  • 检测面部,在下一帧中,尝试在先前面部所在的ROI中检测面部(即在图像的较小部分中查找面部)。如果未找到面部,则尝试再次在整个图像中查找。

  • 附加想法:如果连续2-3帧未检测到面部,并且图像中没有移动,则不要再尝试检测面部,直到检测到移动。

你有任何建议吗?

谢谢。

3个回答

4
你介绍的所有解决方案似乎都很聪明合理。然而,如果你使用Haar进行人脸检测,可以尝试创建一个阶段更少的级联分类器。虽然面部检测建议使用20个级别,但10-15个也足够了。这将显着提高性能。有关创建自己级联分类器的信息可以在教程: OpenCV haartraining (基于Haar特征的级联增强分类器的快速对象检测)中找到。
同样,使用SURF是一个好主意。你还可以尝试P-N学习:通过结构约束引导二元分类器。YouTube上有一些有趣的视频介绍了这种方法,试着找找看。

3
  • 对于SURF算法,你可以尝试使用,但我不确定它是否能提供与面部相关的特征,可能只适用于眼睛周围、皮肤不规则的部位或头发(如果分辨率足够高)。此外,SURF并不是非常快速,如果想节省CPU时间,最好避免进行更多的计算。

  • ROI是一个不错的想法,你可以通过camshift算法来选择它,虽然这不会节省太多CPU,但你可以尝试一下,因为camshift是一个非常轻量级的算法。再次说明,我不确定它是否真正相关,但你在第二篇文章中的想法很好:最小化搜索区域......

  • 侧面的想法听起来还不错,你可以尝试检测运动(例如全局运动),如果没有太多运动,则不要再次尝试检测已经检测到的内容...你可以尝试使用运动模板来实现,因为你可以从meanshift或人脸检测中得到轮廓...一个非常简单、轻量级但不稳健的模板匹配,使用n-1帧和n帧,也可以给出一个系数,衡量这两个帧之间的相似度,你可以说在某个阈值以下,你激活人脸检测...为什么不呢?如果C#包装器有matchTemplate()等效函数,实现起来应该只需5分钟...

如果我有更好(更深入)的想法,我会回来的,但现在,我刚下班回来,很难再思考更多......

朱利安


太好了!Camshift是我曾经看到过的(结合人脸检测),但我以为它是SURF算法。谢谢您,camshift似乎非常适合,比整个面部识别更快。此外,它可以帮助我识别和跟踪一个用户并追踪他的动态。 - Matthieu Napoli
我也会研究模板匹配,谢谢你的建议。如果你有更多想法,我很乐意听取。我会点赞你的答案并等待其他建议。 - Matthieu Napoli
1
没问题,帮助另一个INSA的同学总是一件愉快的事情,我会看看其他算法,希望能对你有所帮助... - jmartel

0

这不是完美的答案,但只是一些建议。

在我本科最后一个学期的数字图像处理课程中,我学习了位平面分解,以及仅使用最高有效位(MSB)平面信息的图像提供了几乎70% 的有用图像信息。因此,您将使用几乎原始图像,但仅为原始大小的八分之一。

尽管我没有在自己的项目中实现它,但我在思考它,以加速人脸检测。因为随后的眼睛检测、瞳孔和眼角检测也会占用大量计算时间,使整个程序变慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接