【问题标题】:Reading images with CV2 is too slow用 CV2 读取图像太慢
【发布时间】:2021-11-10 13:20:32
【问题描述】:

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

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])

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

那么,您能否针对我的问题给我一些建议或建议?还有,有没有比 Open-CV 读取图像更快的包?

【问题讨论】:

  • 读取图像文件取决于文件的格式。你有什么图像文件格式?你试过什么格式?您愿意将数据存储为未压缩的 TIFF 还是 BMP?
  • 你可以腌制你的列表X,这样下次阅读会快很多。
  • 酸洗相当于将图像文件重新保存为位图/TIFF。
  • 您没有提到图像当前存储在磁盘上的格式。也不是 8/16 或 32 位。也不是彩色或灰度。也不是您使用的操作系统。目前阅读它们需要多长时间。也没有你有多少 CPU 内核。如果您使用 turbo-jpeg 也不会。也不是你有什么类型的磁盘。也不是您使用的文件系统....
  • 也可以放在固态硬盘上

标签: python opencv machine-learning computer-vision


【解决方案1】:

阅读here 的不同方法有一个很好的基准。据它说pyvipsPIL 是不错的选择。

例如,

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

另外,作为it was suggested in a comment,考虑其他格式来存储图像可能会很有用。我想 TIFF 或 BMP 可能会奏效。

【讨论】:

  • 内存预分配是一种微优化。这里的时间成本是由于文件格式。
  • 同意。我已将其添加到答案中。
【解决方案2】:

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

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

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

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

您选择的库:

还可以查看pyvips,它似乎是libvips 的包装。我没有使用它,但另一个答案指出了它。

【讨论】:

    【解决方案3】:

    任务大概是I/O bound。尝试concurrent.futures,以并行/异步方式读取图像。如果文件存储在慢速媒体(例如网络共享)上,请使用大量线程(例如 32),否则使用更少(~CPU 计数)。

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

    考虑使用daskdask-image 以获得更复杂的用例。

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 2019-01-04
      • 2020-03-25
      • 1970-01-01
      • 2016-07-25
      • 2019-02-12
      • 2011-08-01
      • 2021-01-01
      • 1970-01-01
      相关资源
      最近更新 更多