ImageDataGenerator: как добавить 4-е измерение в массив Numpy? - PullRequest
3 голосов
/ 24 апреля 2019

У меня есть следующий код, который читает изображение с помощью 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()

Я хочу сгенерировать несколько случайных изображений с помощью кера, поэтому я определю этот генератор:

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)

Я получаю эту ошибку:

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

И мне кажется очевидным: RGB, изображение, конечно, это 3 измерения! Что мне здесь не хватает? В документации сказано, что ему нужен 4-мерный массив, но не указывается что я должен поместить в 4-е измерение !

И как сделать этот 4-х мерный массив ? У меня есть, пока (ширина, высота, канал), это 4-е измерение идет в начале или в конце ?

Я также не очень знаком с numpy: как я могу изменить существующий массив img для добавления 4-го измерения?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Использование np.expand_dims():

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

Первое измерение указывает количество изображений (в вашем случае 1 изображение).

1 голос
/ 24 апреля 2019

В качестве альтернативы, вы можете использовать numpy.newaxis или None для продвижения вашего 3D-массива в 4D, например:

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

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

Первое измерение обычно batch_size.Это дает вам большую гибкость, когда вы хотите полностью использовать современное аппаратное обеспечение, такое как графические процессоры, при условии, что ваш тензор умещается в памяти графического процессора.Например, вы можете передать 64 изображения, сложив 64 изображения вдоль первого измерения.В этом случае ваш 4D массив будет иметь форму (64, width, height, channels).

...