def build(conf, name='Enc_Anatomy'):
    """
    Build a UNet based encoder to extract anatomical information from the image.
    """
    spatial_encoder = UNet(conf)
    spatial_encoder.input = Input(shape=conf.input_shape)
    l1_down = spatial_encoder.unet_downsample(
        spatial_encoder.input, spatial_encoder.normalise)  # downsample
    spatial_encoder.unet_bottleneck(l1_down,
                                    spatial_encoder.normalise)  # bottleneck
    l2_up = spatial_encoder.unet_upsample(
        spatial_encoder.bottleneck, spatial_encoder.normalise)  # upsample

    anatomy = Conv2D(conf.out_channels,
                     1,
                     padding='same',
                     activation='softmax',
                     name='conv_anatomy')(l2_up)
    if conf.rounding:
        anatomy = Rounding()(anatomy)

    model = Model(inputs=spatial_encoder.input, outputs=anatomy, name=name)
    log.info('Enc_Anatomy')
    model.summary(print_fn=log.info)
    return model
Example #2
0
    def _decomposer(self):
        """
        Build an image decomposer into a spatial binary mask of the myocardium and a non-spatial vector z of the
        remaining image information.
        :return a Keras model of the decomposer
        """
        input = Input(self.conf.input_shape)

        unet = UNet(self.conf.input_shape, residual=False)
        l = unet.unet_downsample(input)
        unet.unet_bottleneck(l)
        l = unet.bottleneck

        # build Z regressor
        modality = Conv2D(256, 3, strides=1, padding='same')(l)
        modality = BatchNormalization()(modality)
        modality = LeakyReLU()(modality)
        modality = Conv2D(64, 3, strides=1, padding='same')(modality)
        modality = BatchNormalization()(modality)
        modality = LeakyReLU()(modality)
        modality = Flatten()(modality)
        modality = Dense(32)(modality)
        modality = LeakyReLU()(modality)
        modality = Dense(16, activation='sigmoid')(modality)

        l = unet.unet_upsample(unet.bottleneck)
        anatomy = unet.out(l)

        m = Model(inputs=input, outputs=[anatomy, modality], name='Decomposer')
        log.info('Decomposer')
        m.summary(print_fn=log.info)
        return m
Example #3
0
    def build_anatomy_encoder(self):
        """
        Build an encoder to extract anatomical information from the image.
        """
        # Manually build UNet to add Rounding as a last layer
        spatial_encoder = UNet(self.conf.anatomy_encoder_params)
        spatial_encoder.input = Input(shape=self.conf.input_shape)
        l1 = spatial_encoder.unet_downsample(spatial_encoder.input,
                                             spatial_encoder.normalise)
        spatial_encoder.unet_bottleneck(l1, spatial_encoder.normalise)
        l2 = spatial_encoder.unet_upsample(spatial_encoder.bottleneck,
                                           spatial_encoder.normalise)
        anatomy = spatial_encoder.out(l2, out_activ='softmax')
        if self.conf.rounding == 'encoder':
            anatomy = Rounding()(anatomy)

        self.Enc_Anatomy = Model(inputs=spatial_encoder.input,
                                 outputs=anatomy,
                                 name='Enc_Anatomy')
        log.info('Enc_Anatomy')
        self.Enc_Anatomy.summary(print_fn=log.info)