UMat速度慢(OpenCV、Python)
我一直在修补OpenCV,以调整大量(100k+)图像(16-24MP)的大小。不知何故,CPU的使用速度似乎总是快30-50%。 由于我正在运行ryzen 1700x和1080ti,我原本希望它是另一种方式。 如果有人能告诉我我做错了什么,那就太好了。UMat速度慢(OpenCV、Python),python,opencv,gpu,cpu,image-resizing,Python,Opencv,Gpu,Cpu,Image Resizing,我一直在修补OpenCV,以调整大量(100k+)图像(16-24MP)的大小。不知何故,CPU的使用速度似乎总是快30-50%。 由于我正在运行ryzen 1700x和1080ti,我原本希望它是另一种方式。 如果有人能告诉我我做错了什么,那就太好了。 我正在运行OpenCV 4.0.0.pre和OpenCL 1.2 #!/usr/bin/python import numpy as np import cv2 as cv import glob from multiprocessing im
我正在运行OpenCV 4.0.0.pre和OpenCL 1.2
#!/usr/bin/python
import numpy as np
import cv2 as cv
import glob
from multiprocessing import Pool
import time
path =''
dic=[]
def resizer(file):
img = cv.imread(file)
height, width = img.shape[:2]
dim = float(width)/float(height)
if dim > 1:
width=4000
height= 4000/dim
start_time = time.time()
res = cv.resize(cv.UMat(img), (int(width), int(height)), interpolation=cv.INTER_CUBIC)
print("--- %s seconds ---" % (time.time() - start_time))
else:
width=4000*dim
height= 4000
start_time = time.time()
res = cv.resize(cv.UMat(img), (int(width), int(height)), interpolation=cv.INTER_CUBIC)
print("--- %s seconds ---" % (time.time() - start_time))
name=file.split('/')[-1]
cv.imwrite('/small/{}'.format(name), res)
for file in glob.glob(path+'*.JPG'):
dic.append(file)
if __name__ == "__main__":
pool=Pool(16)
pool.map(resizer, dic)
pool.terminate()
GPU具有很高的处理能力,因此这意味着它执行计算的速度比CPU快得多,但当您在代码中执行大量赋值操作时,它不是最佳选择,因为GPU的内存能力低于CPU。这就是为什么在CPU上运行代码片段时效率更高的原因,在CPU中,主要的操作是分配。对于计算简单的任务,如调整大小,将数据发送到GPU内存并再次返回所需的时间比通过更快的计算进行保存所需的时间更长
特别是因为openCV将在resize中添加并行CPU内核和CPU上的长指令字SIMD光电汇编程序。我怀疑您使用了错误的工具。据我所知,OpenCV更适合“计算机视觉”任务。我建议您考虑<代码> vip或它的Python绑定,用于后处理或调整大小。“我正在运行OpenCV 4.0.0。Prime-”这看起来像是来自主分支的不稳定开发构建——这可能在一些新的主要版本的工作进展中处于混乱状态。除非您正在处理OpenCV代码本身,否则最好使用一个稳定的版本(由标记构建,例如3.4.1)。我们还在3.4.0版本中对其进行了测试,结果也是一样的。@Eviloblubb是的,我有点期待,但觉得这很重要。当我最近尝试实现一个新的转换选项时,我在
cvtColor
中注意到了类似的行为。我试着比较我从中得到灵感的现有实现,OpenCL变体并不比基于并行CPU的IMPL快多少。我还得深入调查,弄清楚到底发生了什么。。。到目前为止,这是相当令人费解的,我和你有着相同的期望(我打消了从GPU内存(AFAICT)到GPU内存(AFAICT)的传输开销)@evilblubb你可能想尝试并启用(请参阅该页的下半部分),看看调用了哪些函数来了解发生了什么。或者尝试做一些分析,看看它在哪里花费的时间最多。