代码之家  ›  专栏  ›  技术社区  ›  ShellRox

卷积层特征图的特殊函数

  •  4
  • ShellRox  · 技术社区  · 6 年前

    简而言之:

    我如何将特征映射从keras中定义的卷积层传递到一个特殊函数(区域提议器),然后该函数被传递到其他keras层(例如softmax分类器)?

    长:

    我正在尝试实现 Fast R-CNN ( 更快的R-CNN)在喀拉斯。原因是我正在尝试实现一个定制的体系结构,如下图所示:

    from "TextMaps" by Tom Gogar

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

    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中是这样做的:

    from main publication of Fast R-CNN on Arxiv

    现在 there is a code for ROI Pooling layer in Keras 但是到那一层我需要通过 区域建议 . 正如您可能已经知道的,区域建议通常是通过称为选择性搜索的算法完成的, which is already implemented in the 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)
    

    上面的层只是对形状的引用,因此显然它不适用于SelectiveSearch:

    >>> 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 回复  |  直到 6 年前
        1
  •  1
  •   Ankish Bansal    6 年前

    据我所知, selective-search 接受输入并返回 n 不同的补丁数 (H,W) . 所以在你的情况下, feature-map 是迪姆斯 (164,164,96) 你可以假设 (164,164) 作为选择性搜索的输入,它会给你 n 补丁数量,用于exp as (H1,W1), (H2,W2),... . 现在可以附加所有 channel 照它的样子,到了那个补丁,它就变成了暗淡的。 (H1,W1,96),(H2,W2,96),.... .

    注意:但是这样做也有缺点。 Selective-Search 算法采用的策略是将图像分割成网格,然后根据对象的热图重新加入这些补丁。你不能在功能图上这样做。但是你可以在上面使用随机搜索方法,它是有用的。