Keras ImageDataGenerator
类提供了两种流方法flow(X, y)
和flow_from_directory(directory)
(https://keras.io/preprocessing/image/)。
为什么是参数
target_size:整数元组,默认值:(256,256)。找到所有图像的尺寸将调整大小
仅由 flow_from_directory(目录)提供?使用 flow(X,y)向预处理管道添加图像重塑的最简洁方法是什么?
答案 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中所做的那样,最好分批进行。据我所知,除了操作整个数据集之外,还有两种方法可以实现此目的:
如果您使用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)
答案 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,您将仅需要传递调整大小的图像,否则,请使用自定义生成器来动态调整它们的大小。