使用CV2读取图像太慢

2024-06-01 03:17:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是它非常慢!每次我想处理这些数据时,我都要花很多时间收集一个列表中的所有图像

那么,你能就我的问题给我一些建议吗?还有,有没有一个软件包可以比打开的CV更快地读取图像


Tags: path代码模型图像列表imgfor时间
3条回答

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

比如说,

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

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

任务可能是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

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

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

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

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

您选择的图书馆:

还可以看看^{},它似乎是libvips的包装器。我没有用过,但另一个答案指出了这一点

相关问题 更多 >