将图像导入Numpy数组,然后分为训练集和测试集

问题描述 投票:0回答:1

我有一组要从磁盘导入的20,000张图像,如下所示。

imgs_dict={}
path="Documents/data/img"
os.listdir(path)
valid_images =[".png"]

for f in os.listdir(path):
    ext= os.path.splitext(f)[1]
    if ext.lower() not in valid_images:
        continue
    img_name=os.path.basename(f)
    img_name=os.path.splitext(img_name)[0]
    img=np.asarray(Image.open(os.path.join(path,f)))
    imgs_dict.update([(img_name,img)])

之所以将其转换为字典,是因为我还有另外两个字典,分别指定图像ID,分类以及它是训练集还是验证集的一部分。这些词典中的一个对应于应作为训练数据一部分的所有数据,另一个则指定应作为验证数据一部分的数据。分离它们之后,需要将它们恢复为图像的标准阵列格式(高度,宽度,通道)。如何获取图像字典并将其转换回我想要的格式?当我执行以下操作时,它将生成一个形状为(8500,)的数组,这是我的训练集中的图像数量,但显然不能反映高度,宽度和通道。

x_train=np.array(list(training_images.values()))
np.shape(x_train)
(8500,)

或者其次,这是我做错了吗?有没有比这更简单的方法来处理图像了?从一开始就将图像保留在numpy数组中似乎会更好,但是据我所知,无法让数组具有任何类型的键值/标签,因此我无法提取特定的图像。

编辑:对于更多上下文,我本质上想做的是将数据转换为以下链接中所述的格式。

https://elitedatascience.com/keras-tutorial-deep-learning-in-python

我遇到问题的特定部分是这个:

from keras.datasets import mnist

# Load pre-shuffled MNIST data into train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

当我们加载MNIST数据时,如何确定X_train和y_train之间的关系?如何复制我的数据?

python image numpy image-processing numpy-ndarray
1个回答
0
投票

是,在Keras中有一种更简单的处理图像数据的方法。具体来说,当处理大型数据集时,您想使用生成器而不是将所有图像都加载到内存中,因此,请特别参考ImageDataGenerator类。数据生成器中的此类已在Keras中实现,因此,除非需要任何特殊操作等,否则至少在基本项目中,它可以成为“常客”。这也将允许您定义基本的扩充和标准化(例如-重新缩放,标准化数据,旋转等)。

[具体来说,您可以通过按子目录将它们排列(将所有图像从同一子目录下的单个标签放置)或创建一个为每个图像路径指示其标签的数据框来自动上传每个类的图像。相应地参考flow_from_directoryflow_from_dataframe

对于火车测试拆分,最简单的方法是将火车和测试集保存在不同的目录(例如data / train和data / test)中,并创建2个不同的生成器。例如,this教程中的一个图:

using ImageDataGenerator

[如果您不想将火车和测试数据放在不同的目录中,则可以在初始化生成器(例如,validation_split)时使用validation_split=0.2参数,然后在调用flow_from_directory时添加参数subset='validation' or subset='training'

话虽如此,如果您希望像以前那样将所有图像都加载到内存中并轻松地分割它们,则可以使用scikit Learn-train_test_split,例如here所述。

PS

关于MNIST-这是一个完善的基准,严格定义用于训练和测试集,因此每个人都可以在完全相同的图像上比较他们的评估。这就是它已经预先拆分的原因。

© www.soinside.com 2019 - 2024. All rights reserved.