如何在 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 中处理大型图像数据集?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R/Python 中迭代/循环一个大型(>2GB)JSON 数据集? [复制]
Spacy,在 python 中的大型数据集上使用 nlp.pipe,多处理导致进程进入睡眠状态。如何正确使用所有 CPU 内核?