base_model = keras.applications.vgg16.VGG16(
include_top=False, input_shape=(width, height, 3))
layer_names = ['block1_pool', 'block2_pool',
'block3_pool', 'block4_pool', 'block5_pool']
base_model_outputs = [base_model.get_layer(
name).output for name in layer_names]
base_model.trainable = False
VGG_16 = keras.Model(inputs=base_model.input, outputs=base_model_outputs)
def fcn8_decoder(convs, n_classes):
f1, f2, f3, f4, p5 = convs
n = 4096
c6 = keras.layers.Conv2D(n, (7, 7), activation='relu', padding='same')(p5)
c7 = keras.layers.Conv2D(n, (1, 1), activation='relu', padding='same')(c6)
f5 = c7
o = keras.layers.Conv2DTranspose(
n_classes, (4, 4), strides=(2, 2), use_bias=False)(f5)
o = keras.layers.Cropping2D((1, 1))(o)
o2 = keras.layers.Conv2D(
n_classes, (1, 1), activation='relu', padding='same')(f4)
o = keras.layers.Add()([o, o2])
o = keras.layers.Conv2DTranspose(
n_classes, (4, 4), strides=(2, 2), use_bias=False)(o)
o = keras.layers.Cropping2D((1, 1))(o)
o2 = keras.layers.Conv2D(
n_classes, (1, 1), activation='relu', padding='same')(f3)
o = keras.layers.Add()([o, o2])
o = keras.layers.Conv2DTranspose(
n_classes, (8, 8), strides=(8, 8), use_bias=False)(o)
o = keras.layers.Activation('softmax')(o)
return o