我正在尝试使用pytables存储图像数据集。我正在使用Earray追加读取的每个图像。我的Earray和图片的尺寸是相同的(除了第一个,附加的尺寸)。我正在使用以下代码:
atom = Atom.from_dtype(np.dtype(np.uint32,(278,278,1)))
i=0
for <read each image from folder using os into img>:
im = cv2.imread(img.path,0)
im = np.expand_dims(im,2) #this is because keras needs 3d images and grayscale images are 2d
if not i:
X = data.create_earray(dataGroup,"X",atom,(0,)+im.shape,chunkshape=(20,20,20,1))
X.append(np.expand_dims(im,0)) #as appending require same dim.
i=1
但是当我运行代码时,它仍然给出ValueError,说我的对象等级是1,X等级是4。当我使用im分配X大小时,怎么可能呢?我什至尝试打印im的形状,它给出(278,278,1)。那么,有什么问题呢?我是第一次使用Pytables,所以请不要深入了解它们。
答案 0 :(得分:0)
首先,请注意,在加载第一个图像数据集之前不必创建EArray。 Pytables很聪明,可以从第一个对象确定原子和形状定义。
没有完整的示例和数据,我很难练习您的代码。因此,我创建了一个非常简单的示例,该示例使用np.arange()
创建了两个(278,278)
图像数组,然后在2和0方向上进行扩展。希望这可以模拟您要加载到EArray的数据。 2个Pytables函数(file.create_earray
和earray.append
)创建2行数据,每个“图像” 1行。运行后,使用HDFView打开image_data1.h5
并检查数据。
也许这可以帮助您了解如何将图像加载到HDF5 Earrays:
import tables as tb, numpy as np
data = tb.open_file("image_data1.h5", mode='w')
dataGroup = data.create_group(data.root, 'MyData')
im = np.arange(278*278).reshape((278,278))
im = np.expand_dims(im,2)
im = np.expand_dims(im,0)
X = data.create_earray( dataGroup,"X",obj=im )
print ('dim=', X.ndim, ', rows = ', X.nrows)
im = np.arange(278*278, 278*278+278*278).reshape((278,278))
im = np.expand_dims(im,2)
im = np.expand_dims(im,0)
X.append( im )
print ('dim=', X.ndim, ', rows = ', X.nrows)
data.close()
答案 1 :(得分:0)
使用更复杂的写入方法和一个EArray.read
示例添加第二个答案。坦白说,我更喜欢我的更简单的方法(上面)来创建定义了obj=
的EArray,并让Pytables处理数据结构。但是,如果您希望自己进行管理,请参见下面的示例2。注意的关键项目:
im = np.expand_dims(im,0)
完成,直到在im.shape
之后引用了
创建时定义EArray形状。[下面的更新代码]
import tables as tb, numpy as np
data = tb.open_file("image_data1.h5", mode='w')
dataGroup = data.create_group(data.root, 'MyData')
MyAtom = tb.Atom.from_dtype(np.dtype(np.uint32,(0,278,278,1)))
im = np.arange(278*278).reshape((278,278))
im = np.expand_dims(im,2)
X = data.create_earray(dataGroup,"X", MyAtom, (0,)+im.shape)
im = np.expand_dims(im,0)
X.append( im )
print ('flavor =', X.flavor )
print ('dim=', X.ndim, ', rows = ', X.nrows)
im = np.arange(278*278,278*278+278*278).reshape((278,278))
im = np.expand_dims(im,2)
im = np.expand_dims(im,0)
X.append( im )
print ('dim=', X.ndim, ', rows = ', X.nrows)
data.close()
以下是从EArray X读取数据所需的行(带有几条print
语句以验证拐角处的值)。只要EArray的样式为Numpy(如我的示例),这就应该起作用。您也可以使用out=
参数指定一个NumPy数组来接收输出数据。还有其他访问EArray数据的方法,包括.iterrows()
进行迭代和.__getitem__()
进行带花式索引的切片。如果要执行任何这些操作,请阅读Pytables文档。
Y_1 = X.read( 0 )
print (Y_1[0,0,0])
print (Y_1[-1,-1,-1])
Y_2 = X.read( 1 )
print (Y_2[0,0,0])
print (Y_2[-1,-1,-1])