OpenCV DNN with GPU Computing

跑分第一的手机未必能跑得动神经网络,因为 CPU 的浮点计算能力很有限,在执行图像处理、机器视觉等一些计算密集型任务时,效率会非常低。处理那样的任务是 GPU 的专长,图形硬件不仅能 3D 绘图渲染,还能通过 OpenCL 等接口使用它的计算能力。这里将展示 PC 平台上图形硬件对神经网络的计算加速,在 OpenCV DNN 图像检测程序中对比 CPU 和 GPU 计算的效能差别。

在 Windows 10 上创建 VC++ 应用程序,程序打开摄像头运行 OpenCV DNN 对摄像头画面做图像检测。使用的是 Darknet 预训练的 YOLO 模型,模型约 194M 支持 80 种物体的识别,上图即是图像检测的截图,用的是 CPU 计算。

下图是使用 CPU 计算时的情况,帧率大约 0.2-0.5 之间,CPU 占用 50%-80% 之间,没有占用 GPU,Memory 约占 850M。

CPU 计算,资源占用

然后是通过 OpenCL 把计算交给 GPU 去完成,OpenCV DNN 调用 setPreferableTarget(DNN_TARGET_OPENCL),代码说明如下。编译执行,计算任务已经转到 GPU 上,程序对 CPU 的占用只有几个点。

/**
* @brief Enum of target devices for computations.
*/
enum Target
{
DNN_TARGET_CPU,
DNN_TARGET_OPENCL
};

/**
* @brief Ask network to make computations on specific target device.
* @param[in] targetId target identifier.
* @see Target
*/
CV_WRAP void setPreferableTarget(int targetId);

下图是使用 GPU 计算时的情况,帧率大约 1.6-2.5 之间,CPU 占用一般少于 5%,GPU 占用 70%-95%,Memory 约占 1438M。

GPU 计算,资源占用

图形硬件是 i7-4600U(笔记本低电压版)自带的 HD Graphics 4400,驱动支持 OpenCL 1.2。系统是 Windows 10 x64,开发环境是 Visual Studio 2015 Community,VC++ Application 和 OpenCV Library 都是 x64。下面还有个简单的效能对比列表,作者的图形驱动没有更新,程序处理也有可优化之处,数据仅供参考!

硬件信息

YOLO 计算 帧率 CPU 占用 GPU 占用 内存占用
CPU 0.2-0.5 50%-80% 0 850M
GPU 1.6-2.5 <5% 70%-95% 1438M

相关博文可点击 OpenCV 标签,以下是一些参考资料

YOLO https://arxiv.org/abs/1612.08242
Darknet https://pjreddie.com/darknet/yolo/
IEEE 754 https://en.wikipedia.org/wiki/IEEE_754
OpenCL https://www.khronos.org/opencl/
OpenCV DNN https://github.com/opencv/opencv/tree/master/samples/dnn/

最近更新 2018-03-20