Как мне преобразовать изображение RGBA в RGB и передать его обученному CNN в Керасе? - PullRequest
0 голосов
/ 19 марта 2020

Я строю нейронную сеть для двоичной классификации изображений с использованием Python и TensorFlow . Я использую контейнер Docker для выполнения внутри кода (это стандартизирует мою среду разработки и производства), базовый образ - это изображение официального тензорного потока ( здесь ), и я просто установите требуемые минимальные пакеты.

Проблема в следующем, после того как я обучу net Я хочу создать конвейер для его загрузки новыми изображениями, не используя функцию flow_from_directory, передавая каждое изображение в отдельности.

Структура сети в этом коде, пока процесс ее сохранения:

train_dir = 'data_set/train'
train_dir_A = os.path.join(train_dir, 'A')
train_dir_B = os.path.join(train_dir, 'B')

validation_dir = 'data_set/validation'
validation_dir_A = os.path.join(validation_dir, 'A')
validation_dir_B = os.path.join(validation_dir, 'B')

train_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )
dev_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )
test_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )

train_generator = train_datagen.flow_from_directory(train_dir, 
                                                   batch_size = 20, 
                                                   class_mode = 'binary',
                                                   target_size = (300,300))

validator_generator = test_datagen.flow_from_directory(validation_dir, 
                                                      batch_size = 20, 
                                                      class_mode = 'binary',
                                                      target_size = (300,300))

model = tf.keras.models.Sequential([
   tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)),
   tf.keras.layers.MaxPooling2D(2,2),
   tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
   tf.keras.layers.MaxPooling2D(2,2),
   tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
   tf.keras.layers.MaxPooling2D(2,2),
   tf.keras.layers.Flatten(),
   tf.keras.layers.Dense(1024, activation='relu'),
   tf.keras.layers.Dense(1, activation='sigmoid')
])

# train the model 
model.compile(optimizer=RMSprop(lr=0.001),
             loss='binary_crossentropy',
             metrics=['acc'])

history = model.fit_generator(train_generator, 
                             validation_data = validator_generator,
                             steps_per_epoch = 100,
                             epochs = 15,
                             validation_steps = 50,
                             verbose=1)

model.save('results/model_v0')
model.summary()

Я пытаюсь передать новое изображение, выполнив это:

image_data = (ndimage.imread(ROUTE_TO_NEW_IMAGE).astype(float))
image_data = image_data / 255
data = image_data[np.newaxis, ...]

# load model
model = load_model(ROUTE_MODEL)
# summarize model.
model.summary()

# Predict
model.predict(data)

Сообщение об ошибке: ValueError: Error when checking input: expected conv2d_input to have shape (300, 300, 3) but got array with shape (375, 375, 4)

Вопрос в том, как я могу использовать эти изображения в качестве входных данных?

Наблюдения: размер всех изображения (оригинальные, те, которые я использую) одинаковы во всех случаях. Мне не нужен цвет, для меня не проблема адаптировать все для работы в оттенках серого.

1 Ответ

2 голосов
/ 19 марта 2020

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

  1. Загрузить изображение
  2. Преобразовать его в rgb
  3. Изменить его размер
  4. Превратить его в массив
  5. Масштабировать его от 0 до 1
  6. Добавить новое измерение (keras ожидает четырехмерный ввод для цветных изображений)

Все это можно сделать с помощью PIL:

from PIL import Image

pic = Image.open('mypic.png').convert('RGB').resize((300, 300))
pic = np.array(pic)/255
pic = pic[np.newaxis, ...]
...