我可以在 OpenCV 中为 CascadeClassifier GPU 使用 gpu::Stream 吗?如何使用?

Posted

技术标签:

【中文标题】我可以在 OpenCV 中为 CascadeClassifier GPU 使用 gpu::Stream 吗?如何使用?【英文标题】:Can I use gpu::Stream for CascadeClassifier_GPU on OpenCV and how? 【发布时间】:2015-02-16 07:54:23 【问题描述】:

我使用Opencv 2.4.10(当前稳定版本)。我使用gpu::CascadeClassifier_GPU::detectMultiScale 来检测人脸。我想将它 async 与我在单独的 cudaStream_t 中启动的 CUDA 内核代码一起使用。但默认情况下,CascadeClassifier_GPU 在默认的 zero-stream 中启动,这使得在 GPU 上无法启动任何与此异步的东西。

我在这里看到没有办法将gpu::Stream 用于CascadeClassifier_GPU:OpenCV DOC link

我可以将gpu::Stream 用于CascadeClassifier_GPU 吗?如何使用? 如果不是,那么我可以在哪个版本的 OpenCV 中执行此操作?

更新:到目前为止,我发现的唯一方法是使用单独的 CPU 线程来执行 gpu::CascadeClassifier_GPU::detectMultiScale 的功能并在单独的 GPU 上执行。但为此至少我需要 2 个 GPU。

【问题讨论】:

【参考方案1】:

CascadeClassifier_GPU 使用混合 GPU/CPU 实现并在内部执行额外的同步,这就是它不支持带有 gpu::Stream 参数的异步模式的原因。为了与您的代码异步启动它,您需要为其使用单独的 CPU 线程。

【讨论】:

好的,我知道这一点,但即使我使用单独的 CPU 线程,我的自定义 CUDA 内核函数或 cudaMemcpy 仍然无法同时执行异步,因为 @987654323 中的所有 CUDA 内核@ 在 默认零流 中启动,这使得 不可能 在 GPU 上执行任何 async-simultaneously 的操作。到目前为止,我发现的唯一方法 - 使用单独的 CPU 线程来执行 gpu::CascadeClassifier_GPU::detectMultiScale 的功能并在单独的 GPU 上执行它。但为此至少我需要 2 个 GPU。

以上是关于我可以在 OpenCV 中为 CascadeClassifier GPU 使用 gpu::Stream 吗?如何使用?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV C++ 中为 OCR 规范化车牌

我是不是必须在 Opencv C 包装器中为 C++ 接口释放 New 分配的内存

在 Ubuntu 18.04 Jetson 中为 cv_bridge 链接 opencv 3.2

在 OpenCV 2.3 中为 Mat 数组赋值的问题 - 看起来很简单

如何在opencv中为图像添加边框,边框颜色必须与图像颜色相同

如何在 Ubuntu 12.04 中为 Qt Creator 安装和设置 OpenCV 2.6.1