环境:Win10 家庭版
OpenCV 4.1.2
OpenVINO R3
CUDA 10.1
CUDNN 7.6.5
Python3.6.4
VTK 7.1
VulkanSDK-1.1.121.2
Halide commit 9bbcb6b4f2d49a4a112e370993709d95c544547f
OpenCL 1.2
CPU:Intel i5-8300 2.3GHz
GPU:Intel UHD Graphics 630
NVIDIA GeForce GTX 1050 Ti
边缘设备:Intel计算棒2代
OpenCV 4.2.0已经release了,最大的改变就是OpenCV DNN模块支持CUDA了。
前一篇博客【OpenCV】Win10 Cmake源码编译OpenCV4.2.0 + contrib + CUDA10.1 + OpenVINO R3 + Vulkan + Halide并编译python3接口已经将OpenCV 4.2.0成功编译,这里就来测试一下DNN模块的性能。
DNN_BACKEND_HALIDE | DNN_BACKEND_INFERENCE_ENGINE | DNN_BACKEND_OPENCV | DNN_BACKEND_VKCOM | DNN_BACKEND_CUDA | ||||||
C++ | Python | C++ | Python | C++ | Python | C++ | Python | C++ | Python | |
DNN_TARGET_CPU | 744.61 822.227 |
745.088 838.629 |
205.57 240.103 |
201.354 253.531 |
274.918 324.736 |
280.105 331.224 |
NS | NS | NS | NS |
DNN_TARGET_OPENCL | NS | NS | 261.341(Intel GPU) 367.843(Intel GPU) |
263.439(Intel GPU) 385.385(Intel GPU) |
852.463(NVIDIA GPU) 896.781(NVIDIA GPU) |
852.758(NVIDIA GPU) 901.395(NVIDIA GPU) |
NS | NS | NS | NS |
DNN_TARGET_OPENCL_FP16 | NS | NS | 262.172(Intel GPU) 367.895(Intel GPU) |
263.176(Intel GPU) 386.948(Intel GPU) |
852.799(NVIDIA GPU) 897.422(NVIDIA GPU) |
856.228(NVIDIA GPU) 905.916(NVIDIA GPU) |
NS | NS | NS | NS |
DNN_TARGET_MYRIAD | NS | NS | 392.649 424.472 |
389.34 464.974 |
NS | NS | NS | NS | NS | NS |
DNN_TARGET_VULKAN | NS | NS | NS | NS | NS | NS | 2755.32(Intel GPU) 2794.85(Intel GPU) |
2723.809(Intel GPU) 2777.27(Intel GPU) |
NS | NS |
DNN_TARGET_FPGA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
DNN_TARGET_CUDA | NS | NS | NS | NS | NS | NS | NS | NS | 47.036(NVIDIA GPU) 91.323(NVIDIA GPU) |
47.435(NVIDIA GPU) 97.386(NVIDIA GPU) |
DNN_TARGET_CUDA_FP16 | NS | NS | NS | NS | NS | NS | NS | NS | 2218.55(NVIDIA GPU) 2264.74(NVIDIA GPU) |
2194.48(NVIDIA GPU) 2243.033(NVIDIA GPU) |
注1:NS表示不支持的组合。
注2: NA表示没有硬件没有测试。
注3: OpenCV官方代码里的注释
* List of supported combinations backend / target:
* | | DNN_BACKEND_OPENCV | DNN_BACKEND_INFERENCE_ENGINE | DNN_BACKEND_HALIDE | DNN_BACKEND_CUDA |
* |------------------------|--------------------|------------------------------|--------------------|-------------------|
* | DNN_TARGET_CPU | + | + | + | |
* | DNN_TARGET_OPENCL | + | + | + | |
* | DNN_TARGET_OPENCL_FP16 | + | + | | |
* | DNN_TARGET_MYRIAD | | + | | |
* | DNN_TARGET_FPGA | | + | | |
* | DNN_TARGET_CUDA | | | | + |
* | DNN_TARGET_CUDA_FP16 | | | | + |
*/
可以看到DNN_BACKEND_HALIDE和DNN_TRGET_OPENCL这种组合官方是支持的,但是我这里会报错。
不知道是不是OpenCL版本的问题 ,我这里用的OpenCV是安装CUDA里面带的OpenCL,版本是1.2。
注四:DNN_TARGET_CUDA和DNN_TARGET_CUDA_FP16性能差别很大,猜想应该是我的显卡对半精度FP16支持的不好造成的。
注五:DNN_BACKEND_VKCOM和DNN_TARGET_VULKAN的组合对比【OpenCV】最全的OpenCV4.1.2 DNN模块darknet YOLOv3 C++接口python接口性能测试时间增加。4.1.2用的是NVIDIA GPU,而4.2.0用的是Intel GPU。