OpenCV 的级联分类器没有利用 CPU 的全部功能

Posted

技术标签:

【中文标题】OpenCV 的级联分类器没有利用 CPU 的全部功能【英文标题】:OpenCV's cascade classifier not utilizing full power of the CPU 【发布时间】:2011-11-13 17:02:49 【问题描述】:

我正在使用 OpenCV 的级联分类器进行检测,但是我的 CPU 利用率从未超过 50%,但应用程序仅以 ~8 FPS 的速度运行,因此应该还有很大的改进空间。我已经用 TBB 安装了 OpenCV。我自己的程序不使用任何多线程,它只是在 OpenCV 的一部分(detectMultiscale 函数)。所有 CPU 内核都在 40% 左右。我尝试将程序的优先级设置为实时,但这没有帮助。会不会有某种我不知道的瓶颈?

构建细节:

我正在使用 Visual Studio 2010 IDE。当前使用这些优化:优化:最大化速度 (/O2),内联函数扩展:默认,启用内部函数:是 (/Oi),支持快速代码 (/Ot),省略帧指针:是 (/Oy),启用光纤- 安全优化:否,整个程序优化:是 (/GL)。我在 Windows 7 64bit 上,在发布模式下将程序构建为 64 位。

【问题讨论】:

【参考方案1】:

也许您有一个采用超线程技术的英特尔处理器。 (每个核心 2 个线程),并且 TBB 足够聪明,每个核心只使用一个线程(通常比两个更好)。操作系统报告一半的可用功率。

编辑

如果你想自己修改分类器,你可以调用 setNumThreads(4);然后映射亲和力,每个核心将有 100%,而不是平均 80%,如 cmets 中所述

你看到的是营销材料(8 核!!)和真相(~3 核)之间的区别

【讨论】:

确实,我有一个带有超线程的英特尔处理器。使用 Process Explorer 检查 CPU 使用率,图表如下所示:i.imgur.com/7oy6r.jpg 似乎 TBB 每个核心使用 2 个线程,但正如您的图表所证明的那样,它比 witohut 它更糟糕。查看这篇关于超线程的令人印象深刻的文章agner.org/optimize/blog/read.php?i=6 感谢您的文章。我无法在 Bios 中关闭超线程,所以我尝试在任务管理器中设置关联,但这并没有帮助。我在没有 TBB 的情况下构建了 OpenCV,但这降低了程序的性能。 RAM会成为瓶颈吗?有点跑题了,但是当我使用 Visual Studio 11 构建相同的程序时,我获得了大约 20% 的性能提升。 无需调优。这就是你的处理器可以做的——它相当于在 4 个内核上工作。你不能让它比每个线程的 40% 更快,这相当于每个内核的 80% - 就是这样。 哦,如果要自己修改分类器,可以调用setNumThreads(4);然后映射亲和力,每个核心将拥有 100%【参考方案2】:

您需要配置允许在 CMake 中使用 TBB 支持构建 OpenCV 的选项。

【讨论】:

它内置了 TBB 支持。所有核心都在 ~40%。 您是否在发布模式下构建(即启用所有优化)?你在哪个平台上? 我正在使用 Visual Studio 2010 IDE。当前使用这些优化:优化:最大化速度 (/O2),内联函数扩展:默认,启用内部函数:是 (/Oi),支持快速代码 (/Ot),省略帧指针:是 (/Oy),启用光纤- 安全优化:否,整个程序优化:是 (/GL)。我在 Windows 7 64 位上,在发布模式下将程序构建为 64 位。

以上是关于OpenCV 的级联分类器没有利用 CPU 的全部功能的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 级联分类器训练模型

opencv5-objdetect之级联分类器

[到手飞] 用OpenCV的级联分类器一键训练自己的目标检测数据集

如何用OpenCV训练自己的分类器

如何用OpenCV训练自己的分类器

OpenCV3.1.0级联分类器训练与使用