从_many_ b / n GIF创建单文件数据集

时间:2014-12-23 14:00:28

标签: python numpy

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

我对如何做到这一点有任何想法?

编辑:

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

我将尝试使用BoolArray,感谢您的参考。

编辑(已解决):

我通过使用与您链接的问题中找到的方法不同的方法解决了问题。我在这里找到了numpy.packbits函数:numpy boolean array with 1 bit entries

我在这里报告我的代码,因此对其他人有用:

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]

1 个答案:

答案 0 :(得分:0)

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()