Module 8 of 21 · Computer Vision · Intermediate

U-Net for Biomedical Image Segmentation

Duration: 7 min

This module delves into the U-Net architecture, a convolutional neural network designed for biomedical image segmentation. Understanding U-Net is crucial for tasks like identifying and segmenting different tissues or cells in medical images, which is vital for diagnosis and research.

Understanding U-Net Architecture

U-Net consists of a contracting path (encoder) and an expansive path (decoder). The encoder captures context by downsampling the input image, while the decoder enables precise localization by upsampling to produce the output segmentation map. Skip connections between the encoder and decoder help preserve spatial information.

import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate
from tensorflow.keras.models import Model

def unet(input_size=(128, 128, 1)):
    inputs = Input(input_size)
    # Encoder
    c1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    c1 = Conv2D(64, (3, 3), activation='relu', padding='same')(c1)
    p1 = MaxPooling2D((2, 2))(c1)
    
    # Decoder
    u1 = UpSampling2D((2, 2))(p1)
    u1 = concatenate([u1, c1])
    c2 = Conv2D(64, (3, 3), activation='relu', padding='same')(u1)
    c2 = Conv2D(64, (3, 3), activation='relu', padding='same')(c2)
    outputs = Conv2D(1, (1, 1), activation='sigmoid')(c2)
    
    model = Model(inputs=[inputs], outputs=[outputs])
    return model

unet_model = unet()

Try it in Google Colab: Open in Colab

<tensorflow.python.keras.engine.functional.Functional object at 0x...>

Training and Evaluating U-Net

Training U-Net involves using a dataset of labeled biomedical images. The model is typically trained using a loss function like binary cross-entropy. Evaluation metrics such as Dice coefficient or IoU (Intersection over Union) are used to assess the model's performance in segmenting images accurately.

import numpy as np
from sklearn.model_selection import train_test_split

# Assuming X is your input images and y is your segmentation masks
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

unet_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = unet_model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=10, batch_size=32)

💡 Tip: Ensure your dataset is properly preprocessed and augmented to avoid overfitting. Use techniques like data augmentation to increase the diversity of your training data.

❓ What is the primary function of the encoder in U-Net?

❓ Which metric is commonly used to evaluate the performance of U-Net in segmentation tasks?

← Previous Continue interactively → Next →

Related Courses