使用CV2读取图像太慢



我有6000张300*300像素的图像,当我在python中读取这些图像时,我有一个时间问题。我需要在一个列表中收集所有的图像,以便我可以将它们用于我的模型。所以我写了一个for循环,读取每个图像,并将其附加到X中,作为一个blow代码:

train_img=sorted(list(paths.list_images("path")))
X=[]
y=[]
for img in train_img:
X.append(cv2.imread(img))
y.append(img.split(os.path.sep)[6])

但是非常慢!每次我想处理这些数据时,我都必须花费大量时间将所有图像收集到一个List中!

所以,你能给我一些建议或建议我的问题吗?是否有比Open-CV读取图像更快的软件包?

这里有一个很好的不同阅读方法的基准。根据它,pyvips和PIL是很好的选择。

例如,

from PIL import Image
import numpy as np
...
im = np.asarray(Image.open(f))
...

此外,正如在评论中建议的那样,考虑其他格式存储图像可能会很有用。我想TIFF或BMP也可以。

保存和加载压缩的图像格式总是比读取未压缩的格式花费更多的时间。

你没有说你是使用压缩的JPEG或PNG,还是未压缩的BMP。TIFF可以压缩也可以不压缩(它可以保存JPEG数据)。

您应该将数据转换为未压缩的格式。这将占用更多的磁盘空间。某些特定格式的BMP或TIFF甚至可以"内存映射",因此无论大小,都不需要太多的RAM。

我不推荐"腌制"。您的数据。这只是图像数据,而不是任意/一般数据。它应该以典型的图像文件格式存储。

您选择的库:

  • OpenCV,它使用各种开放库作为其图像文件I/O
  • Python图像库或枕头
  • tifffile可以执行内存映射技巧

也看看pyvips,这似乎是围绕libvips的包装。我没有使用它,但另一个答案指出了它。

任务可能是I/O绑定。并发。期货,以并行/异步方式读取图像。如果文件存储在慢速介质(如网络共享)上,请使用大量线程(例如32),否则请使用更少的线程(~CPU count)。

from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=32) as executor:
X = list(executor.map(cv2.imread, train_img))

对于更复杂的用例,请考虑使用任务或磁盘映像。

最新更新