Специальная функция на картах объектов сверточного слоя - PullRequest
0 голосов
/ 25 января 2019

Короче говоря:

Как передать карты объектов из сверточного слоя, определенного в Keras, в специальную функцию (средство предложения областей), которая затем передается в другие слои Keras (например, классификатор Softmax)?

Long:

Я пытаюсь реализовать что-то вроде Fast R-CNN ( not Faster R-CNN) в Керасе. Причина этого в том, что я пытаюсь реализовать собственную архитектуру, как показано на рисунке ниже:

from

Вот код для рисунка выше (без учета ввода кандидатов):

from keras.layers import Input, Dense, Conv2D, ZeroPadding2D, MaxPooling2D, BatchNormalization, concatenate
from keras.activations import relu, sigmoid, linear
from keras.initializers import RandomUniform, Constant, TruncatedNormal, RandomNormal, Zeros

#  Network 1, Layer 1
screenshot = Input(shape=(1280, 1280, 0),
                   dtype='float32',
                   name='screenshot')
conv1 = Conv2D(filters=96,
               kernel_size=11,
               strides=(4, 4),
               activation=relu,
               padding='same')(screenshot)
pooling1 = MaxPooling2D(pool_size=(3, 3),
                        strides=(2, 2),
                        padding='same')(conv1)
normalized1 = BatchNormalization()(pooling1)  # https://stats.stackexchange.com/questions/145768/importance-of-local-response-normalization-in-cnn

# Network 1, Layer 2

conv2 = Conv2D(filters=256,
               kernel_size=5,
               activation=relu,
               padding='same')(normalized1)
normalized2 = BatchNormalization()(conv2)
conv3 = Conv2D(filters=384,
               kernel_size=3,
               activation=relu,
               padding='same',
               kernel_initializer=RandomNormal(stddev=0.01),
               bias_initializer=Constant(value=0.1))(normalized2)

# Network 2, Layer 1

textmaps = Input(shape=(160, 160, 128),
                 dtype='float32',
                 name='textmaps')
txt_conv1 = Conv2D(filters=48,
                   kernel_size=1,
                   activation=relu,
                   padding='same',
                   kernel_initializer=RandomNormal(stddev=0.01),
                   bias_initializer=Constant(value=0.1))(textmaps)

# (Network 1 + Network 2), Layer 1

merged = concatenate([conv3, txt_conv1], axis=-1)
merged_padding = ZeroPadding2D(padding=2, data_format=None)(merged)
merged_conv = Conv2D(filters=96,
                     kernel_size=5,
                     activation=relu, padding='same',
                     kernel_initializer=RandomNormal(stddev=0.01),
                     bias_initializer=Constant(value=0.1))(merged_padding)

Как видно выше, последний шаг сети, которую я пытаюсь построить, - это ROI Pooling , что делается в R-CNN:

from main publication of Fast R-CNN on Arxiv

Теперь есть код для слоя ROI Pooling в Keras , но на этот уровень мне нужно передать регионов предложений . Как вы, возможно, уже знаете, предложения по регионам обычно выполняются с помощью алгоритма, известного как Выборочный поиск , который уже реализован в Python .

.

Проблема:

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

from selective search Github page

Теперь проблема в том, что вместо изображения я должен передать карту объектов из слоя merged_conv1, как видно из кода выше:

merged_conv = Conv2D(filters=96,
                     kernel_size=5,
                     activation=relu, padding='same',
                     kernel_initializer=RandomNormal(stddev=0.01),
                     bias_initializer=Constant(value=0.1))(merged_padding)

Слой выше является не чем иным, как ссылкой на форму, поэтому, очевидно, он не будет работать с селективным поиском:

>>> import selectivesearch
>>> selectivesearch.selective_search(merged_conv, scale=500, sigma=0.9, min_size=10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/somepath/selectivesearch.py", line 262, in selective_search
    assert im_orig.shape[2] == 3, "3ch image is expected"
AssertionError: 3ch image is expected

Думаю, мне следует сделать:

from keras import Model
import numpy as np
import cv2
import selectivesearch
img = cv2.imread('someimage.jpg')
img = img.reshape(-1, 1280, 1280, 3)
textmaps = np.ones(-1, 164, 164, 128)  # Just for example
model = Model(inputs=[screenshot, textmaps], outputs=merged_conv)
model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
feature_maps = np.reshape(model.predict([img, textmaps]), (96, 164, 164))
feature_map_1 = feature_maps[0][0]
img_lbl, regions = selectivesearch.selective_search(feature_map_1, scale=500, sigma=0.9, min_size=10)

Но что тогда, если я хочу добавить, скажем, классификатор softmax, который принимает переменную "регионов"? (Между прочим, я знаю, что есть проблемы с выборочным поиском, который берет что-то кроме ввода канала 3, но это не относится к вопросу)

Вопрос:

Предложение области (с использованием выборочного поиска) является важной частью нейронной сети, как я могу изменить ее так, чтобы она брала карты объектов (активации) из сверточного слоя merged_conv?

Может быть, я должен создать свой собственный слой Keras?

1 Ответ

0 голосов
/ 25 января 2019

Насколько я понимаю, selective-search возьмите вход и верните n нет патчей разных (H,W).Таким образом, в вашем случае, feature-map имеет значение dims (164,164,96), вы можете принять (164,164) в качестве входных данных для выборочного поиска, и это даст вам n количество патчей, для exp как (H1,W1), (H2,W2),....Таким образом, теперь вы можете добавить все channel как есть, к этому патчу, чтобы он стал с dims (H1,W1,96),(H2,W2,96),.....

Примечание: Но есть и обратная сторона в этом.Алгоритм Selective-Search использует стратегию, в которой он разбивает изображение в сетках, а затем повторно присоединяет эти патчи согласно тепловой карте объекта.Вы не сможете сделать это на карте возможностей.Но вы можете использовать метод случайного поиска, и это может быть полезно.

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