我有很多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()