在Keras ImageDataGenerator流方法中调整图像大小

时间:2017-01-20 07:39:05

标签: image-processing keras

Keras ImageDataGenerator类提供了两种流方法flow(X, y)flow_from_directory(directory)https://keras.io/preprocessing/image/)。

为什么是参数

  

target_size:整数元组,默认值:(256,256)。找到所有图像的尺寸将调整大小

仅由 flow_from_directory(目录)提供?使用 flow(X,y)向预处理管道添加图像重塑的最简洁方法是什么?

5 个答案:

答案 0 :(得分:8)

flow_from_directory(directory)从具有任意图像集合的目录生成增强图像。因此需要参数target_size来制作相同形状的所有图像。

虽然flow(X, y)增加了已经存储在X中的序列中的图像,这些图像只是numpy矩阵,并且在传递给flow之前可以很容易地进行预处理/调整大小。所以不需要target_size参数。至于调整大小,我更喜欢使用scipy.misc.imresize而非PIL.Image resize或cv2.resize,因为它可以对numpy图像数据进行操作。

import scipy
new_shape = (28,28,3)
X_train_new = np.empty(shape=(X_train.shape[0],)+new_shape)
for idx in xrange(X_train.shape[0]):
    X_train_new[idx] = scipy.misc.imresize(X_train[idx], new_shape)

答案 1 :(得分:1)

X_data_resized = [skimage.transform.resize(image, new_shape) for image in X_data]

因为上面的代码现在已经折旧了......

答案 2 :(得分:1)

还有(较新的)方法 flow_from_dataframe() 接受带有文件路径和 y 数据作为列的 Pandas 数据框 - 它还允许指定目标大小。以防万一您的图像数据不是按目录组织的!

答案 3 :(得分:0)

对于大型训练数据集,执行转换(例如调整整个训练数据的大小)非常消耗内存。就像Keras在ImageDataGenerator中所做的那样,最好分批进行。据我所知,除了操作整个数据集之外,还有两种方法可以实现此目的:

  1. 您可以使用Lambda Layer创建一个图层,然后向其输入原始训练数据。输出是您需要的调整大小。

如果您使用TensorFlow作为Keras的后端,则为以下示例代码:

original_dim = (32, 32, 3)
target_size = (64, 64)
input = keras.layers.Input(original_dim)
x = tf.keras.layers.Lambda(lambda image: tf.image.resize(image, target_size))(input)
  1. 如@Retardust所述,也许您可​​以自定义自己的ImageDataGenerator以及preprocessing_function。

答案 4 :(得分:0)

对于其他想要执行此操作的人,ImageDataGenerator的.flow方法没有target_shape参数,并且由于文档说明The function will run after the image is resized and augmented. The function should take one argument: one image (Numpy tensor with rank 3), and should output a Numpy tensor with the same shape. ,我们无法使用preprocessing_function参数来调整图像的大小 因此,为了使用.flow,您将仅需要传递调整大小的图像,否则,请使用自定义生成器来动态调整它们的大小。