def create_pyramid_features(C3, C4, C5, feature_size=256):
    ''' create pyramid feature '''

    # upsample C5 to get P5 from the FPN paper
    P5 = keras.layers.Conv2D(feature_size,
                             kernel_size=1,
                             strides=1,
                             padding='same',
                             name='C5_reduced')(C5)
    P5_upsampled = layers.UpsampleLike(name='P5_upsampled')([P5, C4])
    P5 = keras.layers.Conv2D(feature_size,
                             kernel_size=3,
                             strides=1,
                             padding='same',
                             name='P5')(P5)

    # add P5 elementwise to C4
    P4 = keras.layers.Conv2D(feature_size,
                             kernel_size=1,
                             strides=1,
                             padding='same',
                             name='C4_reduced')(C4)
    P4 = keras.layers.Add(name='P4_merged')([P5_upsampled, P4])
    P4_upsampled = layers.UpsampleLike(name='P4_upsampled')([P4, C3])
    P4 = keras.layers.Conv2D(feature_size,
                             kernel_size=3,
                             strides=1,
                             padding='same',
                             name='P4')(P4)

    # add P4 elementwise to C3
    P3 = keras.layers.Conv2D(feature_size,
                             kernel_size=1,
                             strides=1,
                             padding='same',
                             name='C3_reduced')(C3)
    P3 = keras.layers.Add(name='P3_merged')([P4_upsampled, P3])
    P3 = keras.layers.Conv2D(feature_size,
                             kernel_size=3,
                             strides=1,
                             padding='same',
                             name='P3')(P3)

    # "P6 is obtained via a 3x3 stride-2 conv on C5"
    P6 = keras.layers.Conv2D(feature_size,
                             kernel_size=3,
                             strides=2,
                             padding='same',
                             name='P6')(C5)

    # "P7 is computed by applying ReLU followed by a 3x3 stride-2 conv on P6"
    P7 = keras.layers.Activation('relu', name='C6_relu')(P6)
    P7 = keras.layers.Conv2D(feature_size,
                             kernel_size=3,
                             strides=2,
                             padding='same',
                             name='P7')(P7)

    return P3, P4, P5, P6, P7
Beispiel #2
0
def __create_pyramid_features(C2, C3, C4, C5, feature_size=256):
    """!@brief
    Creates the FPN layers on top of the backbone features.

    @param C2           : Feature stage C2 from the backbone.
    @param C3           : Feature stage C3 from the backbone.
    @param C4           : Feature stage C4 from the backbone.
    @param C5           : Feature stage C5 from the backbone.
    @param feature_size : The feature size to use for the resulting feature levels.

    @return
        A list of feature levels [P2, P3, P4, P5].
    """
    # upsample C5 to get P5 from the FPN paper
    P5           = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C5_reduced')(C5)
    P5_upsampled = layers.UpsampleLike(name='P5_upsampled')([P5, C4])
    P5           = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P5')(P5)

    # add P5 elementwise to C4
    P4           = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C4_reduced')(C4)
    P4           = keras.layers.Add(name='P4_merged')([P5_upsampled, P4])
    P4_upsampled = layers.UpsampleLike(name='P4_upsampled')([P4, C3])
    P4           = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P4')(P4)

    # add P4 elementwise to C3
    P3           = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C3_reduced')(C3)
    P3           = keras.layers.Add(name='P3_merged')([P4_upsampled, P3])
    P3_upsampled = layers.UpsampleLike(name='P3_upsampled')([P3, C2])
    P3           = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P3')(P3)

    # add P3 elementwise to C2
    P2 = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C2_reduced')(C2)
    P2 = keras.layers.Add(name='P2_merged')([P3_upsampled, P2])
    P2 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P2')(P2)

    # # "P6 is obtained via a 3x3 stride-2 conv on C5"
    # P6 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=2, padding='same', name='P6')(C5)

    # # "P7 is computed by applying ReLU followed by a 3x3 stride-2 conv on P6"
    # P7 = keras.layers.Activation('relu', name='C6_relu')(P6)
    # P7 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=2, padding='same', name='P7')(P7)

    return [P2, P3, P4, P5]