Ejemplo n.º 1
0
    def _build(self):
        input_img = Input(self.config.net_input_shape, name='input')
        input_mask = Input(self.config.net_mask_shape, name='dist_mask')

        unet_kwargs = {
            k[5:]: v
            for (k, v) in vars(self.config).items() if k.startswith('unet_')
        }
        unet = unet_block(**unet_kwargs)(input_img)
        if self.config.net_conv_after_unet > 0:
            unet = Conv2D(self.config.net_conv_after_unet,
                          self.config.unet_kernel_size,
                          name='features',
                          padding='same',
                          activation='relu')(unet)

        output_prob = Conv2D(1, (1, 1),
                             name='prob',
                             padding='same',
                             activation='sigmoid')(unet)
        output_dist = Conv2D(self.config.n_rays, (1, 1),
                             name='dist',
                             padding='same',
                             activation='linear')(unet)
        return Model([input_img, input_mask], [output_prob, output_dist])
Ejemplo n.º 2
0
    def _build_unet(self):
        assert self.config.backbone == 'unet'

        input_img = Input(self.config.net_input_shape, name='input')
        if backend_channels_last():
            grid_shape = tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[:-1])) + (1,)
        else:
            grid_shape = (1,) + tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[1:]))
        input_mask = Input(grid_shape, name='dist_mask')

        unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')}

        # maxpool input image to grid size
        pooled = np.array([1,1,1])
        pooled_img = input_img
        while tuple(pooled) != tuple(self.config.grid):
            pool = 1 + (np.asarray(self.config.grid) > pooled)
            pooled *= pool
            for _ in range(self.config.unet_n_conv_per_depth):
                pooled_img = Conv3D(self.config.unet_n_filter_base, self.config.unet_kernel_size,
                                    padding="same", activation=self.config.unet_activation)(pooled_img)
            pooled_img = MaxPooling3D(pool)(pooled_img)

        unet     = unet_block(**unet_kwargs)(pooled_img)
        if self.config.net_conv_after_unet > 0:
            unet = Conv3D(self.config.net_conv_after_unet, self.config.unet_kernel_size,
                          name='features', padding='same', activation=self.config.unet_activation)(unet)

        output_prob = Conv3D(1,                  (1,1,1), name='prob', padding='same', activation='sigmoid')(unet)
        output_dist = Conv3D(self.config.n_rays, (1,1,1), name='dist', padding='same', activation='linear')(unet)
        return Model([input_img,input_mask], [output_prob,output_dist])
Ejemplo n.º 3
0
    def _build(self):
        self.config.backbone == 'unet' or _raise(NotImplementedError())
        unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')}

        input_img  = Input(self.config.net_input_shape, name='input')

        # maxpool input image to grid size
        pooled = np.array([1,1])
        pooled_img = input_img
        while tuple(pooled) != tuple(self.config.grid):
            pool = 1 + (np.asarray(self.config.grid) > pooled)
            pooled *= pool
            for _ in range(self.config.unet_n_conv_per_depth):
                pooled_img = Conv2D(self.config.unet_n_filter_base, self.config.unet_kernel_size,
                                    padding='same', activation=self.config.unet_activation)(pooled_img)
            pooled_img = MaxPooling2D(pool)(pooled_img)

        unet        = unet_block(**unet_kwargs)(pooled_img)
        if self.config.net_conv_after_unet > 0:
            unet    = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size,
                             name='features', padding='same', activation=self.config.unet_activation)(unet)

        output_prob  = Conv2D(1,                  (1,1), name='prob', padding='same', activation='sigmoid')(unet)
        output_dist  = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet)
        return Model([input_img], [output_prob,output_dist])
Ejemplo n.º 4
0
    def _build(self):
        #self.config.backbone == 'unet'|'unet2' or _raise(NotImplementedError())
        self.config.backbone in ('unet','unet2') or _raise(NotImplementedError())
        
        input_img  = Input(self.config.net_input_shape, name='input')
        if backend_channels_last():
            grid_shape = tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[:-1])) + (1,)
        else:
            grid_shape = (1,) + tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[1:]))
        input_mask = Input(grid_shape, name='dist_mask')

        unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')}

        # maxpool input image to grid size
        pooled = np.array([1,1])
        pooled_img = input_img
        while tuple(pooled) != tuple(self.config.grid):
            pool = 1 + (np.asarray(self.config.grid) > pooled)
            pooled *= pool
            for _ in range(self.config.unet_n_conv_per_depth):
                pooled_img = Conv2D(self.config.unet_n_filter_base, self.config.unet_kernel_size,
                                    padding='same', activation=self.config.unet_activation)(pooled_img)
            pooled_img = MaxPooling2D(pool)(pooled_img)

        if(self.config.backbone == 'unet2'):
            unet       = unet_block2(**unet_kwargs)(pooled_img)
            if self.config.net_conv_after_unet > 0:
                unet    = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size,
                                 name='features', padding='same', activation=self.config.unet_activation)(unet)
                ## extra dropout layer after the feature layer
                unet = Dropout(rate = self.config.feature_dropout)(unet)

            output_prob  = Conv2D(1, (1,1), name='prob', padding='same', activation='sigmoid',kernel_initializer='glorot_uniform' )(unet)
            if self.config.y_range is None:
                output_dist  = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet)
            else: 
                output_dist  = Conv2D(self.config.n_rays, (1,1), name='linear', padding='same', activation='linear')(unet)
                output_dist  = RangedSig(y_min=self.config.y_range[0], y_max=self.config.y_range[1], name='dist')(output_dist)
           
#           if self.config.y_range is not None: 
#                y_min = self.config.y_range[0]
#                y_max = self.config.y_range[1]
#                output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', 
#               ==                       activation=Activation(lambda x: output_to_y_range(x, y_min, y_max)))(unet)
#            else:
#                output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet)
        
        else:
            unet       = unet_block(**unet_kwargs)(pooled_img)

            if self.config.net_conv_after_unet > 0:
                unet    = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size,
                                 name='features', padding='same', activation=self.config.unet_activation)(unet)

            output_prob  = Conv2D(1,                  (1,1), name='prob', padding='same', activation='sigmoid')(unet)
            if self.config.y_range is not None: 
                y_min = self.config.y_range[0]
                y_max = self.config.y_range[1]
                output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', 
                                     activation=Activation(lambda x: output_to_y_range(x, y_min, y_max)))(unet)
            else:
                output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet)
#           output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet)


        return Model([input_img,input_mask], [output_prob,output_dist])
Ejemplo n.º 5
0
    def _build(self):

        #~~
        #with tf.device('gpu:0'):
        #~~Indentation

        self.config.backbone == 'unet' or _raise(NotImplementedError())

        input_img = Input(self.config.net_input_shape, name='input')
        if backend_channels_last():
            grid_shape = tuple(n // g if n is not None else None
                               for g, n in zip(self.config.grid, self.config.
                                               net_mask_shape[:-1])) + (1, )
        else:
            grid_shape = (1, ) + tuple(
                n // g if n is not None else None for g, n in zip(
                    self.config.grid, self.config.net_mask_shape[1:]))
        input_mask = Input(grid_shape, name='dist_mask')

        unet_kwargs = {
            k[len('unet_'):]: v
            for (k, v) in vars(self.config).items() if k.startswith('unet_')
        }

        # maxpool input image to grid size
        pooled = np.array([1, 1])
        pooled_img = input_img
        while tuple(pooled) != tuple(self.config.grid):
            pool = 1 + (np.asarray(self.config.grid) > pooled)
            pooled *= pool
            for _ in range(self.config.unet_n_conv_per_depth):
                pooled_img = Conv2D(
                    self.config.unet_n_filter_base,
                    self.config.unet_kernel_size,
                    padding='same',
                    activation=self.config.unet_activation)(pooled_img)
            pooled_img = MaxPooling2D(pool)(pooled_img)

        unet = unet_block(**unet_kwargs)(pooled_img)
        if self.config.net_conv_after_unet > 0:
            unet = Conv2D(self.config.net_conv_after_unet,
                          self.config.unet_kernel_size,
                          name='features',
                          padding='same',
                          activation=self.config.unet_activation)(unet)

        output_prob = Conv2D(1, (1, 1),
                             name='prob',
                             padding='same',
                             activation='sigmoid')(unet)
        output_dist = Conv2D(self.config.n_rays, (1, 1),
                             name='dist',
                             padding='same',
                             activation='linear')(unet)

        #~~
        #with tf. device("gpu:0"):
        compModel = Model([input_img, input_mask], [output_prob, output_dist])
        compModel.compile(optimizer=keras.optimizers.Adagrad(
            lr=self.config.lr))

        return compModel
Ejemplo n.º 6
0
def build_single_unet_per_channel(input_shape,
                                  last_activation,
                                  n_depth=2,
                                  n_filter_base=16,
                                  kernel_size=(3, 3, 3),
                                  n_conv_per_depth=2,
                                  activation="relu",
                                  batch_norm=False,
                                  dropout=0.0,
                                  pool_size=(2, 2, 2),
                                  residual=False,
                                  prob_out=False,
                                  eps_scale=1e-3):
    """ TODO """

    if last_activation is None:
        raise ValueError(
            "last activation has to be given (e.g. 'sigmoid', 'relu')!")

    all((s % 2 == 1 for s in kernel_size)) or _raise(
        ValueError('kernel size should be odd in all dimensions.'))

    channel_axis = -1 if backend_channels_last() else 1

    n_dim = len(kernel_size)
    conv = Conv2D if n_dim == 2 else Conv3D

    num_channels = input_shape[channel_axis]

    input = Input(input_shape, name="input")

    out_channels = []
    num_channel_out = 1
    for i in range(num_channels):
        c = Lambda(lambda x: x[:, ..., i:i + 1])(input)
        unet = unet_block(n_depth,
                          n_filter_base,
                          kernel_size,
                          activation=activation,
                          dropout=dropout,
                          batch_norm=batch_norm,
                          n_conv_per_depth=n_conv_per_depth,
                          pool=pool_size,
                          prefix='channel_{}'.format(i))(c)

        final = conv(num_channel_out, (1, ) * n_dim, activation='linear')(unet)
        if residual:
            if not (num_channel_out == 1
                    if backend_channels_last() else num_channel_out == 1):
                raise ValueError(
                    "number of input and output channels must be the same for a residual net."
                )
            final = Add()([final, input])
        final = Activation(activation=last_activation)(final)

        if prob_out:
            scale = conv(num_channel_out, (1, ) * n_dim,
                         activation='softplus')(unet)
            scale = Lambda(lambda x: x + np.float32(eps_scale))(scale)
            final = Concatenate(axis=channel_axis)([final, scale])

        out_channels.append(final)

    if len(out_channels) > 1:
        output = Concatenate(axis=channel_axis)(out_channels)
        return Model(inputs=input, outputs=output)
    else:
        return Model(inputs=input, outputs=out_channels[0])