Chapter 25

সেগমেন্টেশন

Segmentation
🎬 প্রতি পিক্সেলের গল্প
Segmentation মানে প্রতিটি পিক্সেলকে label দেওয়া। Box-এর চেয়ে নিখুঁত — মেডিকেল ইমেজিং, autonomous driving, satellite analysis-এ অপরিহার্য।

তিন প্রকার Segmentation

ধরন
আউটপুট
উদাহরণ
Semantic
প্রতি পিক্সেল class
"road", "car", "sky"
Instance
একই class-এর আলাদা বস্তু
car #1, car #2
Panoptic
Semantic + Instance
সব একসাথে

জনপ্রিয় Architectures

  • FCN (2015): প্রথম end-to-end segmentation।
  • U-Net (2015): Encoder-decoder + skip connection। মেডিকেলে গোল্ড স্ট্যান্ডার্ড।
  • SegNet, DeepLab v3+: Atrous convolution, ASPP।
  • Mask R-CNN: Instance segmentation।
  • SAM (Segment Anything, 2023): zero-shot segmentation।

U-Net আর্কিটেকচার

Input → Conv-Conv ──── skip ────→ Concat → Conv-Conv → Out
              ↓                          ↑
         MaxPool                     UpSample
              ↓                          ↑
         Conv-Conv ──── skip ────→ Concat
              ↓                          ↑
              ... bottleneck ...

Keras U-Net সরল প্রয়োগ

from tensorflow.keras import layers, models

def conv_block(x, f):
    x = layers.Conv2D(f, 3, padding="same", activation="relu")(x)
    return layers.Conv2D(f, 3, padding="same", activation="relu")(x)

def unet(shape=(128,128,3), n_classes=1):
    inp = layers.Input(shape)
    c1 = conv_block(inp, 32);  p1 = layers.MaxPooling2D()(c1)
    c2 = conv_block(p1, 64);   p2 = layers.MaxPooling2D()(c2)
    c3 = conv_block(p2, 128);  p3 = layers.MaxPooling2D()(c3)
    b  = conv_block(p3, 256)

    u3 = layers.UpSampling2D()(b);  u3 = layers.Concatenate()([u3, c3]); u3 = conv_block(u3, 128)
    u2 = layers.UpSampling2D()(u3); u2 = layers.Concatenate()([u2, c2]); u2 = conv_block(u2, 64)
    u1 = layers.UpSampling2D()(u2); u1 = layers.Concatenate()([u1, c1]); u1 = conv_block(u1, 32)

    out = layers.Conv2D(n_classes, 1, activation="sigmoid")(u1)
    return models.Model(inp, out)

Loss Functions

  • Binary / Categorical Cross-Entropy — সাধারণ।
  • Dice Loss: imbalanced mask-এর জন্য চমৎকার।
  • Focal Loss: hard pixel-এ ফোকাস।
  • Combo (BCE + Dice): সবচেয়ে স্থিতিশীল।
def dice_loss(y_true, y_pred, eps=1e-6):
    inter = tf.reduce_sum(y_true * y_pred)
    union = tf.reduce_sum(y_true) + tf.reduce_sum(y_pred)
    return 1 - (2*inter + eps) / (union + eps)

Evaluation Metric

  • IoU / Jaccard: |A∩B|/|A∪B|।
  • Dice / F1: 2|A∩B|/(|A|+|B|)।
  • Pixel Accuracy: সাধারণ কিন্তু imbalanced-এ বিভ্রান্তিকর।

SAM — Zero-shot Segmentation

from segment_anything import sam_model_registry, SamPredictor
sam = sam_model_registry["vit_b"](checkpoint="sam_vit_b.pth")
pred = SamPredictor(sam)
pred.set_image(image)
masks, _, _ = pred.predict(point_coords=np.array([[500, 375]]),
                           point_labels=np.array([1]))
🔑 SAM বনাম U-Net
Custom domain (মেডিকেল) এ ছোট ডেটায় U-Net + Dice loss এখনও দারুণ। SAM general-purpose prompt-based — অনেক ক্ষেত্রে fine-tune ছাড়াই দারুণ ফল।

অনুশীলন

১. Oxford-IIIT Pet বা cell-segmentation ডেটায় U-Net train করুন।

২. BCE বনাম BCE+Dice — IoU তুলনা করুন।

৩. SAM দিয়ে নিজের ইমেজে point-prompt segmentation করুন।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • Semantic, Instance, Panoptic — তিন প্রকার।
  • U-Net = encoder + decoder + skip — segmentation-এর backbone।
  • Dice loss imbalanced-এ stable; SAM zero-shot strong।