我写了一段代码来获取图像中给定位置的RGB值,并对它花了多长时间感到惊讶。 这是我使用的代码:
path ="Images/"
listFiles = [f for f in listdir(path) if isfile(join(path, f))]
listFiles.sort()
rgbValue = np.zeros((len(listFiles), 3))
start = timeit.default_timer()
for i in range(50):
for index, file in enumerate(listFiles):
im = Image.open(path+file)
pix = im.load()
rgbValue[index, :] = pix[50, 50] # Get the RGBA Value of the a pixel of an image in the position 50, 50
im.close()
end = timeit.default_timer()
print("Done in {} s. Average time is {} s.".format(end-start, (end-start)/50))
我使用了Google图片中的一组(狗)图像。共有68幅图像,总计约500 kb。鉴于我通过数据集50次,我使用4300张图像和大约2.5 Mb。 这需要3到4秒!
因此,我使用cProfile查看代码中瓶颈的位置。我将主要部分放在一个名为pxValues的函数中,然后从cProfile中调用它:
def pxValues():
for i in range(50):
for index, file in enumerate(listFiles):
im = Image.open(path+file)
pix = im.load()
rgbValue[index, :] = pix[50, 50]
im.close()
return True
cProfile.run('pxValues()')
615404 function calls in 3.655 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.075 0.075 3.655 3.655 <ipython-input-5-ccab4473739f>:1(pxValues)
1 0.000 0.000 3.655 3.655 <string>:1(<module>)
3400 0.003 0.000 0.003 0.000 BmpImagePlugin.py:49(_accept)
3400 0.002 0.000 0.002 0.000 GifImagePlugin.py:38(_accept)
3400 0.003 0.000 0.003 0.000 Image.py:2492(_decompression_bomb_check)
3400 0.024 0.000 0.702 0.000 Image.py:2512(open)
3400 0.019 0.000 0.350 0.000 Image.py:2556(_open_core)
3400 0.002 0.000 0.002 0.000 Image.py:358(preinit)
3400 0.010 0.000 0.019 0.000 Image.py:418(_getdecoder)
3400 0.006 0.000 0.006 0.000 Image.py:519(__init__)
3400 0.022 0.000 0.036 0.000 Image.py:560(close)
3400 0.003 0.000 0.005 0.000 Image.py:586(__del__)
6800 0.006 0.000 0.009 0.000 Image.py:794(load)
3400 0.059 0.000 2.837 0.001 ImageFile.py:130(load)
3400 0.005 0.000 0.062 0.000 ImageFile.py:259(load_prepare)
3400 0.001 0.000 0.001 0.000 ImageFile.py:268(load_end)
27200 0.010 0.000 0.016 0.000 ImageFile.py:522(_safe_read)
3400 0.001 0.000 0.001 0.000 ImageFile.py:66(_tilesort)
3400 0.013 0.000 0.298 0.000 ImageFile.py:78(__init__)
3400 0.033 0.000 0.047 0.000 JpegImagePlugin.py:151(SOF)
3400 0.025 0.000 0.033 0.000 JpegImagePlugin.py:199(DQT)
3400 0.002 0.000 0.002 0.000 JpegImagePlugin.py:292(_accept)
3400 0.068 0.000 0.275 0.000 JpegImagePlugin.py:304(_open)
3400 0.002 0.000 0.007 0.000 JpegImagePlugin.py:418(_getmp)
3400 0.005 0.000 0.005 0.000 JpegImagePlugin.py:481(_getmp)
17000 0.016 0.000 0.037 0.000 JpegImagePlugin.py:52(Skip)
3400 0.026 0.000 0.041 0.000 JpegImagePlugin.py:57(APP)
3400 0.013 0.000 0.317 0.000 JpegImagePlugin.py:763(jpeg_factory)
3400 0.002 0.000 0.002 0.000 TiffImagePlugin.py:252(_accept)
3400 0.003 0.000 0.011 0.000 __init__.py:1284(debug)
3400 0.003 0.000 0.003 0.000 __init__.py:1528(getEffectiveLevel)
3400 0.004 0.000 0.008 0.000 __init__.py:1542(isEnabledFor)
81600 0.015 0.000 0.015 0.000 _binary.py:23(i8)
74800 0.029 0.000 0.054 0.000 _binary.py:71(i16be)
6800 0.005 0.000 0.009 0.000 _util.py:13(isPath)
3400 0.002 0.000 0.002 0.000 _util.py:23(__init__)
3400 0.006 0.000 0.006 0.000 {built-in method PIL._imaging.jpeg_decoder}
3400 0.057 0.000 0.057 0.000 {built-in method PIL._imaging.new}
74800 0.025 0.000 0.025 0.000 {built-in method _struct.unpack}
3400 0.002 0.000 0.002 0.000 {built-in method builtins.divmod}
1 0.000 0.000 3.655 3.655 {built-in method builtins.exec}
6800 0.004 0.000 0.004 0.000 {built-in method builtins.getattr}
10200 0.007 0.000 0.007 0.000 {built-in method builtins.hasattr}
10200 0.006 0.000 0.006 0.000 {built-in method builtins.isinstance}
23800 0.003 0.000 0.003 0.000 {built-in method builtins.len}
3400 0.268 0.000 0.268 0.000 {built-in method io.open}
13600 0.002 0.000 0.002 0.000 {method 'append' of 'list' objects}
3400 0.002 0.000 0.002 0.000 {method 'cleanup' of 'ImagingDecoder' objects}
3400 0.150 0.000 0.150 0.000 {method 'close' of '_io.BufferedReader' objects}
3400 2.486 0.001 2.486 0.001 {method 'decode' of 'ImagingDecoder' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
3400 0.003 0.000 0.003 0.000 {method 'pixel_access' of 'ImagingCore' objects}
122400 0.095 0.000 0.095 0.000 {method 'read' of '_io.BufferedReader' objects}
10200 0.016 0.000 0.016 0.000 {method 'seek' of '_io.BufferedReader' objects}
3400 0.004 0.000 0.004 0.000 {method 'setimage' of 'ImagingDecoder' objects}
3400 0.006 0.000 0.007 0.000 {method 'sort' of 'list' objects}
麻烦制造者就是这条线(在报告的末尾):
3400 2.486 0.001 2.486 0.001 {method 'decode' of 'ImagingDecoder' objects}
我的问题如下:
1)我使用合适的工具吗?我的知识有限。
2)为什么这一步成为瓶颈?什么样的操作会对CPU产生这样的影响?我希望将图像转换为RGB数组相当“快”。
3)有没有办法提高我的代码速度?我有几个Gb的图像数据集,它永远需要与它们一起工作。
答案 0 :(得分:1)
解压缩JPEG文件需要相当多的CPU,所以如果您要做很多事情,我会考虑将您的文件转换为要求较低的格式,例如NetPBM {{1} (便携式PixMap)。您可以使用安装在大多数Linux发行版上的 ImageMagick 轻松完成此操作,并且可用于macOS和Windows。这将为当前目录中的所有JPEG文件制作PPM
格式副本:
PPM
然后尝试使用相应的magick mogrify -format ppm *jpg
文件代替JPEG。
您可以轻松做的另一件事是并行化,并使用多线程或多处理一次执行多个图像。
最后......
你为什么要经历这套50次?
您是否可以一次性获得所需的一切,以避免每次都解压缩?
你究竟想要做什么?