我需要使用 OpenCV Cascades 实时检测人。目前我正在使用 OpenCV 附带的经过训练的级联文件,但稍后我将训练自己的 LBP 级联以实现更快的速度。我确实有一个问题。
有哪些方法可以加快级联检测?例如,看看这个视频。它非常快,使用 Haar 级联并且很好。我可以做些什么来达到这个速度,特别是对于实时应用程序?有什么技巧和窍门吗?
我需要使用 OpenCV Cascades 实时检测人。目前我正在使用 OpenCV 附带的经过训练的级联文件,但稍后我将训练自己的 LBP 级联以实现更快的速度。我确实有一个问题。
有哪些方法可以加快级联检测?例如,看看这个视频。它非常快,使用 Haar 级联并且很好。我可以做些什么来达到这个速度,特别是对于实时应用程序?有什么技巧和窍门吗?
我不确定您在视频示例中所说的“速度”是什么意思,因为很难弄清楚在那里进行的检测是什么“速度”。在计算机视觉中,当我们谈论检测的“速度”时,我们通常指的是单个或一组视频的每秒帧数 (FPS) 或算法的毫秒运行时间。如果算法实现的 FPS 与输入视频的 FPS 相同,则称为实时或 1x 处理速度。如果处理 FPS 大于输入 FPS,则您的处理速度比实时处理快,如果它更小,那么您的处理速度比实时慢。当你说“速度”时,我会假设你的意思是一样的。
鉴于此,让我给你两种方法来加快检测速度。我真的建议阅读这两篇在过去几年中真正为行人检测设定标准的论文:The Fastest Pedestrian Detector in the West和Pedestrian detection at 100 frames per second,两者都针对多尺度执行检测的计算瓶颈进行了优化在传统的检测设置中。后者在此处和此处具有公开可用的代码。但这是需要改进的领域之一:规模大小。
在 OpenCV 中本机实现的方法基于 Viola-Jones 方法的变体,该变体扩展了检测中使用的 Haar-like 特征集。另一个需要考虑的改进领域称为窗口化。传统的检测方法,包括在 OpenCV 中本地实现的方法,要求您在图像上按比例滑动窗口,通常从左上角到右下角逐行滑动。解决此问题的经典方法称为高效子窗口搜索 (ESS),它执行分支定界优化。已经有许多扩展从这里构建,但它是开始和了解对象检测基础知识的好地方。
现在,当然,加速检测过程的一种非常明显的方法是并行化您的代码,例如多线程或 GPU。有几个公开可用的 GPU 实现,例如这里使用基于支持向量机的检测器。
如果您需要提高 HAAR 级联检测的速度,我建议您使用Simd Library,它改进了HAAR 和 LBP 级联分类器的实现(它们使用 SSE4.1、AVX2 和 NEON(ARM),因此它适用于 2 -3 倍于原始 OpenCV)。请注意,它可以使用来自 OpenCV 的标准 HAAR 和 LBP 级联。
处理图像处理时的一个主要因素是输入图像的大小。考虑缩小图像。在您的示例中,汽车以已知方向和合理可预测的速度移动,因此在检测到汽车的情况下,可以在下一帧中搜索该区域周围图像的感兴趣区域部分更快的检测。
https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf
这是一篇关于提高级联检测速度的论文,我希望这会有所帮助