如何在 python 中处理大型图像数据集?

Posted

技术标签:

【中文标题】如何在 python 中处理大型图像数据集?【英文标题】:How do I process a large dataset of images in python? 【发布时间】:2021-06-23 10:33:08 【问题描述】:

我有一个从 Google 驱动器导入的大约 10,000 张图像的大型数据集,我希望将它们变成一个 numpy 数组,以便我可以训练我的机器学习模型。问题是我的方式耗时太长,而且在 RAM 上非常占用空间。

from PIL import Image
import glob  

train_images = glob.glob('/content/drive/MyDrive/AICW/trainy/train/*.jpg')

x_train = np.array([np.array(Image.open(image)) for image in train_images])

这些代码行即使在 30 分钟后仍在运行,即使我设法获得了一个 numpy 数组。它是不同尺寸和尺寸的图像的集合(例如,一些是 450 X 600,另一些是 500 X 600),当我将它们输入我的模型时会出现问题。一定有一种更节省时间和空间的方法吧?

P.s 我在 Google colab 上运行所有这些。图像总数为 10,270。尺寸因图像而异,但它们的尺寸通常为 450 x 600 x 3。

【问题讨论】:

将图像调整为更小并批量训练? Image 中查找调整大小的方法。在尝试将它们组合到数组之前执行此操作。你的机器学习模型是什么?来自keras 之类的导入,还是您自己的numpy?从您的描述中很难判断缓慢是由于图像数量的剪切,还是您达到了内存管理限制。 450*600*3*10270/1e9 是 8Gb 元素。将其乘以 1、4 或 8,具体取决于 dtype 将最后一行的列表转换为 numpy 数组并没有太大的优势,而且您可以更灵活地使用列表(例如,用于内存管理)。 您可以并行加载它们,尽管这在 Python 中很麻烦(您需要使用多处理,这不太适合您进行计算... 【参考方案1】:

cmets 中有很多好的建议(最重要的是x_train 的总大小,如果您不调整图像大小)。如前所述,如果您想使用不同大小的数组,只需将x_train 设为一个列表(而不是 np.array)。最终,您可能需要调整大小以进行训练和测试。 Pillow 文档使用.asarray() 显示图像转换为 NumPy 数组。不确定这是否重要。 我将您的代码修改为 1)创建 train_x 作为 dtype=object 的空数组(以保存图像数组),2)调整图像大小和 3)使用 .asarray() 转换图像。在具有 24 GB RAM 的桌面系统上,它可以在几秒钟内将 26640 张图像读入一个数组。以下代码:

train_images = glob.glob('*/*.jpg', recursive=True)
x_train = np.empty(shape=(len(train_images),), dtype=object)
size = 128, 128

for i, image in enumerate(train_images):
    x_train[i] = np.asarray(Image.open(image).thumbnail(size))

【讨论】:

以上是关于如何在 python 中处理大型图像数据集?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中处理大型数据集的最佳方法

如何在 R/Python 中迭代/循环一个大型(>2GB)JSON 数据集? [复制]

Spacy,在 python 中的大型数据集上使用 nlp.pipe,多处理导致进程进入睡眠状态。如何正确使用所有 CPU 内核?

Keras 处理无法装入内存的大型数据集

如何在 pytorch 中处理大型数据集

在 R 中处理大型数据集