【问题标题】:Create a list with numpy arrays from a list that contains the directories of images in Google Colaboratory从包含 Google Colaboratory 中图像目录的列表中创建一个包含 numpy 数组的列表
【发布时间】:2021-08-31 00:55:33
【问题描述】:

我在 Google Colab 的驱动器中有一个名为 dir 的列表,其中包含 18900 个 RGB 图像(3 个通道)的目录,尺寸为 64x64 像素。我使用 PIL 库中的 Image 模块打开了第一张图片:img = Image.open(dir[0])。我将图像转换为带有 numpy 库的数组:array = np.asarray(img)。现在,我想用代表我的图像的数组制作一个列表。因此,我使用循环制作了以下脚本以打开所有图像:

img = [None]* len(dir)

for i in range(len(dir)):
  img[i] = Image.open(dir[i])

但它会持续运行大约 20 分钟,我没有结果。 有没有最快的方法可以从包含我的图像的 18900 个目录的列表中创建一个包含 18900 个数组的列表?

【问题讨论】:

  • Google Colab 在从云端硬盘加载图像时特别长,因此即使您的图像非常小(例如 256x256 像素),Colab 花费这么多时间也是正常的。只要您继续使用云端硬盘,恐怕没有完美的答案,但我听说过其他可能会提高全局运行时间的解决方案(例如 GCP)。
  • 我的图像是 RGB(3 通道),尺寸为 64x64 像素。
  • 这并不能解决问题:即使您的图像很轻,与您在本地计算机上可以实现的相比,Colab 仍然会花费大量时间来加载它们
  • 不知道 Colab ,但多线程通常用于这种情况,例如。 with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor: executor.map(read_image, range(len(dir)))def read_image(i): img[i] = numpy.asarray(Image.open(dir[i]))

标签: python numpy python-imaging-library google-colaboratory


【解决方案1】:

您的代码受 IO 限制。这是行话:当您的代码运行时,它大部分时间都在等待您的硬盘驱动器发送数据。不幸的是,没有任何一条神奇的语句可以让你的 IO 运行得更快。但是,您可以更改两件事,以最大程度地减少(松散的)复杂性增加的痛苦。

  1. 将文件格式更改为支持多个图像的格式(例如 tiff)或直接使用二进制格式(npz、h5)。打开一个新文件比重复使用一个已经打开的文件要贵得多
  2. 压缩磁盘上的数据。读取数据后,数据膨胀需要一些时间,但根据与存储的连接情况,速度可能会快得多。
  3. 更改存储的文件系统(重新格式化)。这在协作中是不可能的,但为了完整起见,我还是在这里添加了它。
  4. 升级到具有更好文件系统的付费实例。

在所有这些选项中,我会选择第一个和第二个。我会将所有数据下载到您的本地计算机,并且假设所有数据都适合内存,我将创建一个压缩的 npz 文件(或 h5),其中包含沿新批次维度存储的所有图像。我会将那个上传到协作,看看这是否不会将加载时间减少到可接受的水平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多