前言
近期探讨到了使用GPU加速Opencv处理图像的过程,相必大家在日常处理非深度学习任务图像数据的过程中使用的绝大多数是CPU进行处理的数据,例如对图像进行灰度化、添加噪声、滤波等操作。这里我们采用实验数据比较mat和Umat的特点说明Umat的优势
实验
实验准备
PC端配置:CPU:11400F - i5 GPU: GTX1660ti
常见图像像素尺寸例举:
img0.shape = 237 x 250 x 3
img1.shape = 512 x 384 x 3 (标清)
img2.shape = 640 x 352 x 3 (DVD)
img3.shape = 640 x 480 x 3 (数字电视RTSP)
img4.shape = 800 x 480 x 3 (数字电视RTSP)
img5.shape = 1024x 534 x 3 (数字电视RTSP)
img6.shape = 1280x 720 x 3 (直播)
img7.shape = 1280x 960 x 3 (工业相机)
img8.shape = 1920x 1080 x 3 (监控相机)
实验步骤
图像处理步骤:
- 读取图像
- 图像灰度话
- 添加高斯噪声
- Canny边缘检测
统计方式:
计算循环100次的处理FPS均值,通过比较处理不同像素大小的图像进而比较在何时使用 mat 何时使用 Umat
处理结果:
512x384:
GPU: 302.8824480662899
CPU: 304.31073670160845
640X480
GPU: 204.14862846096017
CPU: 207.01862159693542
1024X543
GPU: 117.21923353899794
CPU: 131.77444173577712
1280X960
GPU: 61.402272955890474
CPU: 64.44232134963245
1920X1080
GPU: 31.742890957261825
CPU: 30.31974624205707
总结:
mat2Umat的过程中也会耗费一定的时间,如果在工程应用中处理的是小尺寸图像&Opencv的计算量不大的情况下建议使用mat格式数据进行操作即可(这样避免了 mat2Umat过程的时间损耗);如果处理的是大尺寸图像并且需要大量使用opencv内置函数进行处理数据的话,大家可以使用mat2Umat进行转换数据到GPU上去进行 提速运算
demo
import cv2 import time FpsList = [] for i in range(100): t1 = time.time() img = cv2.UMat(cv2.imread("512384.jpg", cv2.IMREAD_COLOR)) # img = cv2.imread("512384.jpg", cv2.IMREAD_COLOR) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (7, 7), 1.5) gray = cv2.Canny(gray, 0, 50) t2 = time.time() FPS = 1 / (t2 - t1) FpsList.append(FPS) cv2.putText(img, "FPS= %.2f" % FPS, (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.imshow("edges", img) cv2.waitKey(1) print(sum(FpsList) / len(FpsList))