【问题标题】:Import images to Numpy array, then divide into training and test sets将图像导入 Numpy 数组,然后分为训练集和测试集
【发布时间】:2020-09-13 15:07:46
【问题描述】:

我有一组 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】:

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

    具体来说,您可以通过将图像排列在子目录中(将单个标签中的所有图像放在同一个子目录下)或创建一个数据框来指示每个图像路径的标签是什么,从而自动上传每个类别的图像。请相应地参考flow_from_directoryflow_from_dataframe

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

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

    说了这么多,如果您想像以前一样将所有图像加载到内存中并轻松拆分它们,您可以使用 scikit learn - train_test_split,如 here 所述,例如。

    PS

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

    【讨论】:

    • 这很有帮助,我的工作起点有点不同,所以我想在这里征求您的意见。基本上,我拥有的是一个目录中的一堆图像文件,名称为图像 ID,然后我有两个 csv 文件(一个用于训练,一个用于验证),表示按图像 ID 对图像进行分类。尝试编写一些自动化程序以根据他们的训练/验证指定和 0/1 分类将文件保存到新目录中,这是最有效的方法吗?类似于您链接的教程中所做的?
    • 如果您已经有 csv 文件,您可以使用 panda 的 'DataFrame' 类('from_csv' 方法)将 csv 加载到数据框,然后使用上面描述的 flow_from_dataframe。但是,将图像复制到不同的目录也可以,由您决定什么对您更方便...
    猜你喜欢
    • 2019-12-15
    • 2017-09-30
    • 2017-06-11
    • 2021-03-13
    • 2017-11-01
    • 1970-01-01
    • 2021-05-24
    • 2019-05-01
    • 2021-11-12
    相关资源
    最近更新 更多