Ejemplo n.º 1
0
    def build_segnet(self):
        img_w = self.width
        img_h = self.height
        n_labels = 2
        kernel = (3, 3)

        encoding_layers = [
            Conv2D(64, kernel, padding='same', input_shape=(img_h, img_w, 3)),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(64, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            MaxPool2D(),
            Conv2D(128, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(128, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            MaxPool2D(),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            MaxPool2D(),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            MaxPool2D(),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            MaxPool2D(),
        ]

        autoencoder = Sequential()
        autoencoder.encoding_layers = encoding_layers

        for l in autoencoder.encoding_layers:
            autoencoder.add(l)
            print(l.input_shape, l.output_shape, l)

        decoding_layers = [
            UpSampling2D(),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            UpSampling2D(),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(512, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            UpSampling2D(),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(256, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(128, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            UpSampling2D(),
            Conv2D(128, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(64, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            UpSampling2D(),
            Conv2D(64, kernel, padding='same'),
            BatchNormalization(),
            Activation('relu'),
            Conv2D(n_labels, (1, 1), padding='valid'),
            BatchNormalization(),
        ]
        autoencoder.decoding_layers = decoding_layers
        for l in autoencoder.decoding_layers:
            autoencoder.add(l)
            print(l.input_shape, l.output_shape, l)

        autoencoder.add(Reshape((n_labels, img_h * img_w)))
        autoencoder.add(Permute((2, 1)))
        autoencoder.add(Reshape((img_h, img_w, n_labels)))
        autoencoder.add(Activation('softmax'))

        return autoencoder