如何解决制作具有内存限制的h5py文件的有效方法
假设我的图片如下:
root
|___dog
| |___img1.jpg
| |___img2.jpg
| |___...
|
|___cat
|___...
我想将图像文件转换为h5py文件。
首先,我尝试读取所有图像文件并将其制作为h5文件。
import os
import numpy as np
import h5py
import PIL.Image as Image
datafile = h5py.File(data_path,'w')
label_list = os.listdir('root')
for i,label in enumerate(label_list):
files = os.listdir(os.path.join('root',label_list))
for filename in files:
img = Image.open(os.path.join('root',label,filename))
ow,oh = 128,128
img = img.resize((ow,oh),Image.BILINEAR)
data_x.append(np.array(img).tolist())
data_y.append(i)
datafile = h5py.File(data_path,'w')
datafile.create_dataset("data_image",dtype='uint8',data=data_x)
datafile.create_dataset("data_label",dtype='int64',data=data_y)
但是由于内存限制,我无法做到这一点(每个文件夹的图像超过200,000张,尺寸为224x224)。
那么,将此图像制作为h5文件的最佳方法是什么?
解决方法
HDF5 / h5py数据集对象的内存占用空间比相同大小的NumPy数组小得多。 (这是使用HDF5的优点之一。)您可以在开始循环播放图像文件之前创建HDF5文件并分配数据集。然后您可以一次对图像进行操作(读取,调整大小和写入图像0,然后写入图像1,等等)。
下面的代码创建必要的数据集,大小可预先设置为200,000张图像。重新排列了代码逻辑,使其按照我的描述工作。 img_cnt
变量用于在现有数据集中放置新图像数据。 (注意:我认为这是按书面要求进行的。但是,由于没有数据,我无法测试,因此可能需要进行一些细微调整。)如果以后要调整数据集大小,则可以添加maxshape=()
create_dataset()
函数的参数。
# Open HDF5 and create datasets in advance
datafile = h5py.File(data_path,'w')
datafile.create_dataset("data_image",(200000,224,224),dtype='uint8')
datafile.create_dataset("data_label",),dtype='int64')
label_list = os.listdir('root')
img_cnt = 0
for i,label in enumerate(label_list):
files = os.listdir(os.path.join('root',label_list))
for filename in files:
img = Image.open(os.path.join('root',label,filename))
ow,oh = 128,128
img = img.resize((ow,oh),Image.BILINEAR)
datafile["data_image"][img_cnt,:,:] = np.array(img).tolist())
datafile["data_label"][img_cnt] = i
img_cnt += 1
datafile.close()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。