为何CuPy(GPU)预处理图像耗时远超OpenCV(CPU)?
问题背景
以下代码分别使用OpenCV(CPU)和CuPy(GPU)实现图像预处理,但运行结果显示CuPy耗时远高于OpenCV,请问性能差异的成因是什么?
测试代码
import cv2 import numpy as np import cupy as cp import time def op_image(image): start_time = time.time() image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (640, 480)) image_mean = np.array([127, 127, 127]) image = (image - image_mean) / 128 image = np.transpose(image, [2, 0, 1]) image = np.expand_dims(image, axis=0) image = image.astype(np.float32) print("Opencv End time : ",time.time() - start_time) def Cu_image(image): start_time = time.time() image = cp.array(image) image = cp.ascontiguousarray(image[:, :, ::-1]) image = cp.resize(image, (640, 480,3)) image_mean = cp.array([127, 127, 127]) image = (image - image_mean) / 128 image = cp.transpose(image, (2, 0, 1)) image = cp.expand_dims(image, axis=0) image = cp.expand_dims(image, axis=0) image = image.astype(cp.float32) print("Cupy End time : ",time.time() - start_time) image = cv2.imread("/home/nextbrain-ssd/Vision/cctv-server/assets/event_created_images/camera_0_9_509_2024-05-23T04:14:32.931834Z.jpg") op_image(image=image) image = cv2.imread("/home/nextbrain-ssd/Vision/cctv-server/assets/event_created_images/camera_0_9_509_2024-05-23T04:14:32.931834Z.jpg") Cu_image(image=image)
运行输出
Opencv End time : 0.00825643539428711 Cupy End time : 0.10329556465148926
性能差异成因分析
- 数据传输开销主导:CuPy需要先把CPU内存中的图像数据拷贝到GPU显存(
cp.array(image)),这个跨设备数据传输的延迟远高于GPU本身的计算耗时。对于单张640×480的小图来说,传输成本完全盖过了GPU的计算优势。 - 任务规模太小:GPU擅长处理大规模并行任务,单张小图的预处理计算量极小,GPU的并行计算能力根本无法发挥。反而CPU上的OpenCV针对这类小任务做了极致优化,执行效率更高。
- OpenCV底层优化优势:OpenCV的
cvtColor、resize等核心函数基于高度优化的汇编实现(如Intel IPP库),针对CPU架构做了指令级优化,单线程就能跑出极高效率。 - CuPy代码存在冗余操作:对比OpenCV版本,CuPy多调用了一次
cp.expand_dims;cp.resize的实现逻辑与OpenCV的resize不同,额外增加了计算开销;另外cp.ascontiguousarray会带来内存整理成本,而OpenCV的cvtColor直接输出连续内存数组,无需额外处理。
内容的提问来源于stack exchange,提问作者RajeshKumar S
相关产品推荐
相关产品推荐

