我正在尝试将图像数据集作为numpy数组加载。如何做到这一点,使我不强调本地计算机上RAM的限制,或创建需要太多内存的数组?较大的图像集是训练集,总计约为2GB的图像。你知道吗
这是训练一个残差神经网络,要求输入数据是一个numpy数组。我使用了glob、PIL、skimage、sklearn和numpy模块来尝试加载图像,但我这样做的方式可能很幼稚,因为~2GB的图像变成了~17(!)GB numpy阵列。我尝试过寻找解决方案、示例等,但我对Python还比较陌生,所以这个过程非常缓慢。你知道吗
用于天真地加载图像的代码是
import glob
from skimage.transform import resize
import numpy as np
from sklearn import datasets
from PIL import Image
def root_2_numpy(data_root):
"""
Load raw images and output a numpy array of all images and numpy array of labels
Also preprocesses each image to (224,224) using anti-aliasing
"""
# load images into numpy array
all_image_paths = list(data_root.glob('*/*')) # get image paths
all_image_paths = [str(path) for path in all_image_paths] # convert to string
image_ds = np.zeros([len(all_image_paths), 224, 224,3]) # initialize image dataset
for i in range(len(all_image_paths)):
print(i)
im = Image.open(all_image_paths[i]) # read image as RGB using matplotlib
if im.mode == 'RGBA' or im.mode == 'L' or im.mode == 'CMYK':
im = im.convert('RGB')
elif im.mode =='P':
im = im.convert('RGBA')
im = im.convert('RGB')
im = np.array(im)
im = resize(im, (224,224), anti_aliasing=True) # resize image using skimage
image_ds[i,:,:,:] = im
# load labels into numpy array
label_ds = datasets.load_files(data_root, load_content=False, shuffle=False) # get labels
n_classes = len(label_ds.target_names)
Y_ds = np.eye(len(label_ds.target_names))[label_ds.target.reshape(-1)]
return image_ds, Y_ds, n_classes
我希望它返回一个~2GB的numpy数组,该数组的维数(N,W,H,C)表示图像的数量、图像的宽度、图像的高度,以及图像的3个通道。这不是现在的问题,但是我还希望有标签的数据,这些标签是根目录中的类别名称。你知道吗
除了帮助我高效地加载数据外,我非常希望能够深入了解我的代码如何创建如此大的numy数组。当我写这篇文章时,我有一种感觉,那就是当转换非RBG图像的图像类型时,可能会创建比预期更多的图像。你知道吗
由
numpy.zeros
创建的数组的默认数据类型是64位浮点。所以image_ds = np.zeros([len(all_image_paths), 224, 224,3])
创建了一个比需要大8倍的数组。添加dtype
参数,使image_ds
具有数据类型uint8
(8位无符号整数):相关问题 更多 >
编程相关推荐