сегментация последовательности изображений в FCN с помощью модуля GRU (керас) - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно сегментировать некоторые изображения через 2D CNN. Примером NN может быть двумерная сеть U-Net, где на входе что-то вроде этого (batch_size, row, cols, channel). В моем случае количество каналов равно 1. В выводе у меня будет маска метки того же размера, что и входное изображение. Принимая во внимание, что существует ряд последовательностей изображений, например, для захвата временной информации между изображениями определенной последовательности для улучшения сегментации (*). Я пытаюсь скопировать эту сеть https://arxiv.org/pdf/1809.01015.pdf

введите описание изображения здесь (*) Как и в этой статье, я пытался добавить слой GRU в свой FCN, но я плохо понималкак это реализовано. Я хочу дать на входе одно изображение и использовать слой GRU для улучшения сегментации текущего изображения, используя некоторые функции предыдущего изображения.

Это только путь кодера моей сети

conv1 = TimeDistributed(Conv2D(32, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv1')(inputs)
    conv1 = TimeDistributed(BatchNormalization(axis=3, scale=False), name= 'bn1')(conv1)
    conv1 = TimeDistributed(Conv2D(32, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv11')(conv1)
    conv1 = TimeDistributed(BatchNormalization(axis=3, scale=False), name='bn11')(conv1)

    pool1 = TimeDistributed(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), name ='pool1')(conv1)

    conv2 = TimeDistributed(Conv2D(64, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv2')(pool1)
    conv2 = TimeDistributed(BatchNormalization(axis=3, scale=False), name= 'bn2')(conv2)
    conv2 = TimeDistributed(Conv2D(64, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv21')(conv2)
    conv2 = TimeDistributed(BatchNormalization(axis=3, scale=False), name='bn21')(conv2)

    pool2 = TimeDistributed(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), name ='pool2')(conv2)

    conv3 = TimeDistributed(Conv2D(128, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv3')(pool2)
    conv3 = TimeDistributed(BatchNormalization(axis=3, scale=False), name= 'bn3')(conv3)
    conv3 = TimeDistributed(Conv2D(128, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv31')(conv3)
    conv3 = TimeDistributed(BatchNormalization(axis=3, scale=False), name='bn31')(conv3)

    pool3 = TimeDistributed(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), name ='pool3')(conv3)

    conv4 = TimeDistributed(Conv2D(256, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv4')(pool3)
    conv4 = TimeDistributed(BatchNormalization(axis=3, scale=False), name= 'bn4')(conv4)
    conv4 = TimeDistributed(Conv2D(256, (3,3), padding='same', activation='relu', kernel_initializer = 'he_normal', use_bias=False), name='conv41')(conv4)
    conv4 = TimeDistributed(BatchNormalization(axis=3, scale=False), name= 'bn41')(conv4)

    conv4 = TimeDistributed(Flatten())(conv4)
    conv4 = GRU(....)(conv4)

Какой вход сети? и как мне нужно настроить слой GRU для вывода тензора того же размера, что и предыдущий слой?

Форма вывода слоя перед модулем GRU с учетом Nx256x256x1 в качестве входного размера изображения будет Nx32x32x256,с размером N batch_size. Входные данные GRU задаются как (сэмплы, time_steps, feature), где пространственные объекты 32x32x256 -> flatten -> 262144. Поскольку мне нужно учитывать time_steps, используется TimeDistributed. При последовательности из пяти изображений форма ввода будет (N, 5, 256, 256, 1), где 5 представляет time_steps уровня GRU. Это правильно?

...