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।