Spaces:
Sleeping
Sleeping
| import tensorflow as tf | |
| from tensorflow.keras import layers, models | |
| def conv_block(input_tensor, num_filters): | |
| x = layers.Conv2D(num_filters, (3, 3), padding="same")(input_tensor) | |
| x = layers.BatchNormalization()(x) | |
| x = layers.Activation("relu")(x) | |
| x = layers.Conv2D(num_filters, (3, 3), padding="same")(x) | |
| x = layers.BatchNormalization()(x) | |
| x = layers.Activation("relu")(x) | |
| return x | |
| def encoder_block(input_tensor, num_filters): | |
| x = conv_block(input_tensor, num_filters) | |
| p = layers.MaxPooling2D((2, 2))(x) | |
| return x, p | |
| def decoder_block(input_tensor, concat_tensor, num_filters): | |
| x = layers.Conv2DTranspose(num_filters, (2, 2), strides=(2, 2), padding="same")(input_tensor) | |
| x = layers.concatenate([x, concat_tensor]) | |
| x = conv_block(x, num_filters) | |
| return x | |
| def build_unet(input_shape=(256, 256, 3)): | |
| """Builds a U-Net architecture for image segmentation.""" | |
| inputs = layers.Input(shape=input_shape) | |
| # Encoder | |
| e1, p1 = encoder_block(inputs, 64) | |
| e2, p2 = encoder_block(p1, 128) | |
| e3, p3 = encoder_block(p2, 256) | |
| e4, p4 = encoder_block(p3, 512) | |
| # Bridge | |
| b = conv_block(p4, 1024) | |
| # Decoder | |
| d1 = decoder_block(b, e4, 512) | |
| d2 = decoder_block(d1, e3, 256) | |
| d3 = decoder_block(d2, e2, 128) | |
| d4 = decoder_block(d3, e1, 64) | |
| # Output (1 class for Oil Spill vs Background) | |
| outputs = layers.Conv2D(1, (1, 1), padding="same", activation="sigmoid")(d4) | |
| model = models.Model(inputs, outputs, name="U-Net") | |
| return model | |
| if __name__ == "__main__": | |
| model = build_unet() | |
| model.summary() | |