用 _many_ b/n GIF 创建一个单文件数据集



我有很多100x100px的黑/白GIF图像。我想在 Numpy 中使用它们来训练机器学习算法,但我想将它们保存在一个在 Python/Numpy 中易于阅读的文件中。我说的很多是指几十万,所以我想利用每像素仅携带 1 位的图像。

关于我该怎么做的任何想法?

编辑:

我使用了位串模块中的BitArray对象。然后我用numpy.savez保存了它。问题是需要很长时间才能保存。我从未设法在整个数据集上看到这个过程的结束。我试图保存一个小子集,它花了 10 分钟,大约是小子集本身大小的 20 倍。

我将尝试使用布尔数组,感谢您的参考。

编辑(已解决):

我通过使用与您链接的问题中发现的方法不同的方法来解决问题。我在这里找到了numpy.packbits函数:具有1位条目的numpy布尔数组

我在这里报告我的代码,以便它对其他人有用:

accepted_shape = (100, 100)
images = []
for file_path in gifs:
    img_data = imread(file_path)
    if img_data.shape != accepted_shape:
        continue
    max_value = img_data.max()
    min_value = img_data.min()
    middle_value = (max_value - min_value) // 2
    image = np.packbits((img_data.ravel() > middle_value).astype(int))
    images.append(image)
np.vstack(images)
np.savez_compressed('dataset.npz', shape=accepted_shape, images=images)

这在解压缩时需要注意一些,因为如果位数不是 8 的倍数,则会添加一些零作为填充。这是我解压缩文件的方式:

data = np.load('dataset.npz')
shape = data['shape']
images = data['images']
nf = np.prod(shape)
ne = images.size / nf
images = np.unpackbits(images, axis=1)
images = images[:,:nf]

PyTables 在这里似乎是一个不错的选择。像这样的东西可能会起作用:

import numpy as np
import tables as tb
nfiles = 100000 #or however many files you have
h5file = tb.openFile('data.h5', mode='w', title="Test Array")
root = h5file.root
x = h5file.createCArray(root,'x',tb.Float64Atom(),shape=(100,100,nfiles))
x[:100,:100, 0] = np.random.random(size=(100,100)) # Now put in some data
h5file.close()

相关内容

最新更新