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
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
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)