【问题标题】:Special function on feature maps of convolutional layer卷积层特征图上的特殊功能
【发布时间】:2019-06-19 09:08:02
【问题描述】:

简而言之:

如何将特征图从 Keras 中定义的卷积层传递给特殊函数(区域提议者),然后再传递给其他 Keras 层(例如 Softmax 分类器)?

长:

我正在尝试在 Keras 中实现类似 Fast R-CNNnot Faster R-CNN)的东西。这样做的原因是因为我正在尝试实现如下图所示的自定义架构:

这是上图的代码(不包括候选人输入):

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 池化,它在 R-CNN 中以这种方式完成:

现在是there is a code for ROI Pooling layer in Keras,但我需要向该层传递区域提案。您可能已经知道,区域建议通常由称为 Selective Search 的算法完成,which is already implemented in the Python


问题:

Selective Search 可以轻松获取正常图像并为我们提供如下区域建议:

现在问题是,我应该从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 层?

【问题讨论】:

  • 您可以尝试根据您的特征图的暗淡修改selectivesearch文件。它是为3 通道输入图像编写的。适应这个,你很容易通过roi-pooling
  • @AnkishBansal 感谢您的回复。是的,这是第二个问题。事实上,我不知道特征图是否被正确提取 - 你可以在我的最后一个代码块中看到它,我以一个单一的特征图为例。我是否应该获取每个特征图(形状为(164, 164))并将其传递给selectivesearch?或者我应该修改selectivesearch 以便它接受形状(164, 164, 96) 通道的完整输入?再次感谢您。

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

据我所知,selective-search 接受输入并返回 n 没有不同 (H,W) 的补丁。所以在你的情况下,feature-map 是暗淡的(164,164,96),你可以假设(164,164) 作为选择性搜索的输入,它会给你n 补丁数量,对于 exp 为(H1,W1), (H2,W2),...。因此,您现在可以将所有 channel 按原样附加到该补丁,因此它变为暗淡 (H1,W1,96),(H2,W2,96),....

注意:但这样做也有不利之处。 Selective-Search 算法使用的策略是破坏网格中的图像,然后根据对象的热图重新加入这些补丁。您将无法在特征图上做到这一点。但是你可以在上面使用随机搜索方法,它会很有用。

【讨论】:

  • 感谢您的回答。我不太能理解这个帖子。 selective-search 会在特征图上工作吗?或者它将无法执行selective-search 算法的特定部分(通过对象的热图重新加入补丁)。
  • 我不确定selective-serach 在特征图上是否能正常工作。让我们先了解选择性搜索,它是如何工作的。
  • 选择性搜索算法的工作方式是将图像划分为网格并使用某种方式将它们组合成有用的补丁。例如,在您发布的上图中,您可以看到如果搜索算法给我们一个只包含眼睛的补丁,那么只有眼睛是没有用的。所以它结合这些补丁在那个补丁中有一张脸,这将是进一步处理的有用补丁。更多你可以在这里阅读cs.brown.edu/~pff/papers/seg-ijcv.pdf
  • 这很有趣。我想我仍然会使用selectivesearch 考虑到这个问题与另一件事有关。但是您是否知道其他可能对特征图更好的方法?
  • 我一直在尝试Faster-RCNN,但我发现它无法工作,因为它会造成漏洞。您可能已经知道,他们使用需要单独训练的区域提议网络,但如果我的基础网络未经训练,那么there is a loophole。我想修改选择性搜索是唯一的方法。感谢您的帮助
猜你喜欢
  • 2019-07-21
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多