Передача изображений в модель Keras 'CNN с 6 каналами - PullRequest
0 голосов
/ 27 февраля 2020

У меня проблемы с Keras imagedatagenerator классом. Я хочу передать ему изображение с 6 каналами для обучения вычитанию фона - у меня есть изображение, сложенное по глубине с его фоном, которое рассчитывается с использованием алгоритма SubSense. Это дает изображение формы (X,X,6) вместо двух изображений с (X,X,3)

Но opencv на самом деле не позволяет вам сохранить это, поэтому мне пришлось сохранить его как numpy файл. Теперь я хочу передать этот numpy файл в Keras как изображение для обучения CNN, который в конечном итоге будет возвращать только маски переднего плана, но, очевидно, попытка запустить его через ImageDataGenerator возвращает 0 изображений, потому что у него слишком много каналов.

Мой код:

all_files = os.listdir("null/train")
arr=[]

for i in all_files:
    file_path= "null/train/" + i
    X = np.load(file_path)
    arr.append (X)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

datagen.fit(arr)

Получившаяся ошибка была:

null / anaconda3 \ envs \ensorflow \ lib \ site-packages \ keras_preprocessing \ image \ image_data_generator.py: 940: UserWarning: ожидаемый ввод в качестве изображений (в виде массива Numpy) в соответствии с соглашением о формате данных «channel_last» (каналы на оси 3), то есть ожидается, что на оси 3 будут 1, 3 или 4 канала. Однако он был передан массив с формой (451, 321, 321, 6) (6 каналов). 'channel).')

Есть ли способ заставить его принимать numpy файлов с 6 каналами?

1 Ответ

0 голосов
/ 27 февраля 2020

для вашего случая, вам нужно изменить функцию preprocessing_function, которая считывает ваше изображение 3 ранга в качестве входных данных. что бы вы ни делали, чтобы сделать его 6-канальным изображением, сделайте это внутри этой функции. см. пример (я передаю 3-канальное изображение в ImageGenerator).

см. ниже, arr - это 3-канальное изображение. Я пишу preProsFun c и присваиваю его preprocessing_function ImageGenerator. Я просто конкатенирую, чтобы сделать 6-канальное изображение. Точно так же вы можете написать свою логику c внутри proprocessing_function

import tensorflow as tf
import numpy as np

arr = np.zeros((4,4,3))
arr = np.expand_dims(arr, axis=0)

def preProsFunc(arr):
  arr1 = np.zeros((4,4,3))
  arr1 = np.expand_dims(arr1, axis=0)
  return np.concatenate((arr, arr1), axis=2)

datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    preprocessing_function=preProsFunc
    )

datagen.fit(arr)

Дайте мне знать, что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...