【问题标题】:Resizing images in data preprocessing for training convolution network在数据预处理中调整图像大小以训练卷积网络
【发布时间】:2020-10-03 21:44:30
【问题描述】:

我正在尝试从 jpeg 文件加载数据来训练卷积网络。图像很大,但有 2400 万像素,因此无法加载和使用全分辨率。

为了将图像转换为更有用的格式,我尝试加载每个图像,重新缩放它,然后将其附加到列表中。完成后,我可以将列表转换为 numpy 数组并像往常一样输入网络进行训练。

我的问题是我的数据集非常大,重新缩放每个图像大约需要一秒钟,这意味着按照我目前实现的方式调整每个图像的大小是不可行的:

length_training_DF = 30000
for i in range(length_training_DF):
    im = plt.imread(TRAIN_IM_DIR + trainDF.iloc[i]['image_name'] + '.jpg')
    image = block_reduce(im, block_size=(10, 10, 1), func=np.max)
    trainX.append(image)

我还使用了以下内容:

length_training_DF = 30000
from keras.preprocessing import image
for i in range(50):
    img = image.load_img(TRAIN_IM_DIR + trainDF.iloc[0]['image_name'] + '.jpg', target_size=(224, 224))
    trainX.append(ima)

有什么方法可以更快地将这些图像加载到训练网络的格式中?我曾考虑过使用 keras 数据集,可能是通过使用 tf.keras.preprocessing.image_dataset_from_directory(),但存储图像数据的目录未正确格式化为包含与此方法所需的相同目标的文件夹。

图像用于二元分类问题。

【问题讨论】:

    标签: python dataframe tensorflow machine-learning keras


    【解决方案1】:

    通常的方法是编写一个预处理脚本来加载大图像,重新缩放它们,在需要时应用其他操作,然后根据ImageDataGenerator 的要求将每个类保存到单独的目录中。

    这样做至少有三个充分的理由:

    • 通常,您将运行您的训练过程数十次。您不想每次都进行重新缩放或例如自动白平衡。
    • ImageDataGenerator 提供了增强训练数据集的重要方法。
    • 这是一款开箱即用的好生成器。您可能不想将整个数据集加载到内存中。

    【讨论】:

    • 好的,谢谢。这是否意味着没有办法避免漫长的图像加载步骤,我们只需要实现它,以便尽可能少地执行此操作吗?
    • 您不会一次加载所有这些,而是​​分批加载。当一个批次正在处理时,下一个批次可以被提取并缓存在内存中,因此只要您不必进行任何繁重的预处理,几乎不会受到任何惩罚。为了避免这种情况,我们预先对数据进行预处理。也可以考虑将数据保存到例如HDF5 或 TFRecord(直接加载数据),但除非我有很好的理由,否则我不会走这条路。
    猜你喜欢
    • 2016-12-27
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2018-10-19
    相关资源
    最近更新 更多