6

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

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

  • 检测人脸,提取人脸特征并尝试在下一帧中找到这些特征(使用SURF算法),这样就变成了“人脸检测+跟踪”。如果未找到,请再次使用人脸检测。

  • 检测人脸,在下一帧中,尝试在人脸之前所在的 ROI 中检测人脸(即在图像的较小部分中寻找人脸)。如果找不到人脸,请尝试再次在整个图像中查找。

  • 附带的想法:如果 2-3 帧没有检测到人脸,并且图像中没有移动,在检测到移动之前不要尝试检测更多的人脸。

你对我有什么建议吗?

谢谢。

4

3 回答 3

3
  • 对于 SURF 算法,您可以尝试,但我不确定它是否在面部提供相关特征,可能在眼睛周围,或者如果您靠近并且有皮肤不规则,或者如果分辨率足够,可能在头发中。此外,SURF 并不是真的很快,如果你想节省 CPU 时间,我会避免做更多的计算。

  • roi 是个好主意,你可以通过 camshift 算法来选择它,它不会节省很多 CPU,但是你可以尝试一下,因为 camshift 是一个非常轻量级的算法。我再次不确定它是否真的相关,但你在第二篇文章中得到了一个好主意:最小化搜索区域......

  • 侧面的想法对我来说似乎很好,你可以尝试检测运动(例如全局运动),如果没有那么多,那么不要再尝试检测你已经检测到的东西......你可以尝试用运动来做模板,正如您所知道的来自 meanshift 或人脸检测的轮廓...一个非常简单、轻量级但不健壮的模板与第 n-1 帧和第 n 帧匹配可以给你一个系数来衡量这两个帧之间的一种相似性,你可以说低于某个阈值你会激活人脸检测....为什么不呢?如果 C# 包装器具有 matchTemplate() 等效函数,则需要 5 分钟才能实现...

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

朱利安,

于 2011-07-15T18:06:08.107 回答
3

您介绍的所有解决方案似乎都很聪明合理。但是,如果您使用 Haar 进行人脸检测,您可能会尝试创建具有较少阶段的级联。虽然建议使用 20 个阶段进行人脸检测,但 10-15 可能就足够了。这将显着提高性能。有关创建自己的级联的信息可以在教程:OpenCV haartraining(使用基于 Haar 特征的增强分类器级联的快速对象检测)中找到。

同样,使用 SURF 是个好主意。您还可以尝试PN learning:Bootstrapping binary classifiers by structure constraint。YouTube上有一些有趣的视频介绍了这种方法,试着找到它们。

于 2011-07-16T16:14:01.957 回答
0

这不是一个完美的答案,而只是一个建议。

在我最后一个学期 B.Tech in CS 的数字图像处理课程中,我了解了位位置切片,以及仅具有 MSB 平面信息的图像如何提供几乎 70% 的有用图像信息。因此,您将使用几乎原始图像,但尺寸仅为原始图像的八分之一。

所以虽然我没有在我自己的项目中实现它,但我想知道它,以加快人脸检测。因为后面的眼睛检测,瞳孔和眼角检测也占用了大量的计算时间,使整个程序变慢。

于 2012-04-29T05:49:12.663 回答