ImageDataGenerator:如何向numpy数组添加第四个维度?

5
我有以下的代码,使用opencv读取并显示一张图片:
import cv2, matplotlib.pyplot as plt
img = cv2.imread('imgs_soccer/soccer_10.jpg',cv2.IMREAD_COLOR)
img = cv2.resize(img, (128, 128))
plt.imshow(img)
plt.show()

我希望使用 Keras 生成一些随机图片,因此我定义了以下生成器:

image_gen = ImageDataGenerator(rotation_range=15,
                           width_shift_range=0.1,
                           height_shift_range=0.1,
                           shear_range=0.01,
                           zoom_range=[0.9, 1.25],
                           horizontal_flip=True,
                           vertical_flip=False,
                           fill_mode='reflect',
                           data_format='channels_last',
                           brightness_range=[0.5, 1.5])

但是,当我以这种方式使用它:

image_gen.flow(img)

I get this error:

'Input data in `NumpyArrayIterator` should have rank 4. You passed an array with shape', (128, 128, 3))

在我看来很明显:RGB图像当然是三维的!那么我错在哪里了?文档说明它需要一个四维数组,但没有指定第四维应该放什么

还有,这个四维数组应该如何创建?目前我拥有的是(width, height, channel)的数组,这第四维应该放在开始还是结尾

我对numpy也不是很熟悉: 如何修改现有的img数组以添加第四个维度?

2个回答

4

使用np.expand_dims()函数:

import numpy as np
img = np.expand_dims(img, 0)
print(img.shape) # (1, 128, 128, 3)

第一维指定图像的数量(在你的情况下为1张图片)。


啊,好的,理论上我可以通过使用单个数组将任意数量的图像传递给生成器!谢谢。 - Phate
没错,很高兴能帮忙! - Vlad

1

或者,您可以使用numpy.newaxisNone来将您的3D数组提升为4D,如下所示:

img = img[np.newaxis, ...] 

# or use None
img = img[None, ...]

第一维通常是批处理大小batch_size。这样做可以让您在充分利用现代硬件(例如GPU)时具有很大的灵活性,只要您的张量适合GPU内存即可。例如,您可以通过沿着第一维堆叠64个图像来传递64个图像。在这种情况下,您的4D数组的形状将为(64, width, height, channels)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接