প্রজেক্ট: medical image segmentation
এই project-এ যা করবেন
- Medical dataset preprocess
- U-Net training with Dice loss
- Augmentation, evaluation
- Bangladesh hospital deployment consideration
১ · Project scope
- Chest X-ray → both lung mask.
- Application: TB screening, COVID lesion area, pneumonia.
- Bangladesh need — TB high prevalence, radiologist shortage.
ICDDR,B, BIRDEM, BSMMU — research আছে। 1 radiologist per ~50,000 people. AI-assisted screening — rural area-এ life-saving. Responsible deployment essential.
২ · Dataset
- Montgomery Country (MC): 138 chest X-ray, lung mask annotated. Public NIH.
- Shenzhen: 662 chest X-ray (Bangladesh-relevant, TB cases).
- JSRT: 247 X-ray, lung + heart mask.
- NIH ChestX-ray14: 100K X-ray (no mask).
- Bangladesh data: ICDDR,B partnership essential for local validation.
৩ · Preprocessing
import cv2
import numpy as np
def preprocess_xray(img_path, target_size=512):
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
# Histogram equalization — contrast enhance
img = cv2.equalizeHist(img)
# Or CLAHE — adaptive
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img = clahe.apply(img)
# Resize maintaining aspect ratio
h, w = img.shape
scale = target_size / max(h, w)
new_h, new_w = int(h*scale), int(w*scale)
img = cv2.resize(img, (new_w, new_h))
# Pad to square
pad_h = target_size - new_h
pad_w = target_size - new_w
img = cv2.copyMakeBorder(img, pad_h//2, pad_h-pad_h//2,
pad_w//2, pad_w-pad_w//2,
cv2.BORDER_CONSTANT, value=0)
# Normalize
img = img.astype(np.float32) / 255.0
return img
৪ · U-Net with ResNet encoder
# pip install segmentation-models-pytorch
import segmentation_models_pytorch as smp
import torch
model = smp.Unet(
encoder_name="resnet50", # ImageNet pretrained
encoder_weights="imagenet",
in_channels=1, # grayscale X-ray
classes=1, # binary mask (lung vs background)
activation=None # apply sigmoid externally
)
# Test
x = torch.randn(1, 1, 512, 512)
y = model(x)
print("Output:", y.shape) # (1, 1, 512, 512)
৫ · Loss function
import torch
import torch.nn as nn
class DiceBCELoss(nn.Module):
def __init__(self, dice_weight=0.5):
super().__init__()
self.bce = nn.BCEWithLogitsLoss()
self.dice_weight = dice_weight
def forward(self, pred, target):
bce = self.bce(pred, target)
pred_sig = torch.sigmoid(pred)
smooth = 1.0
intersection = (pred_sig * target).sum()
dice = 1 - (2*intersection + smooth) / (pred_sig.sum() + target.sum() + smooth)
return bce + self.dice_weight * dice
criterion = DiceBCELoss(dice_weight=0.5)
Dice — class imbalance robust. BCE — pixel confidence. Combined — best of both.
৬ · Training loop
from torch.utils.data import DataLoader
from torch.optim import AdamW
from torch.optim.lr_scheduler import CosineAnnealingLR
# Train setup
model = model.to('cuda')
optimizer = AdamW(model.parameters(), lr=1e-4, weight_decay=1e-4)
scheduler = CosineAnnealingLR(optimizer, T_max=50)
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=8)
best_dice = 0
for epoch in range(50):
model.train()
train_loss = 0
for images, masks in train_loader:
images, masks = images.to('cuda'), masks.to('cuda')
optimizer.zero_grad()
pred = model(images)
loss = criterion(pred, masks)
loss.backward()
optimizer.step()
train_loss += loss.item()
# Validation
model.eval()
val_dice = 0
with torch.no_grad():
for images, masks in val_loader:
images, masks = images.to('cuda'), masks.to('cuda')
pred = torch.sigmoid(model(images))
pred_bin = (pred > 0.5).float()
dice = (2 * (pred_bin * masks).sum() + 1) / (pred_bin.sum() + masks.sum() + 1)
val_dice += dice.item()
val_dice /= len(val_loader)
scheduler.step()
print(f"Epoch {epoch+1}: train_loss={train_loss/len(train_loader):.4f}, val_dice={val_dice:.4f}")
if val_dice > best_dice:
best_dice = val_dice
torch.save(model.state_dict(), 'best_lung_unet.pth')
৭ · Augmentation
import albumentations as A
train_transform = A.Compose([
A.Resize(512, 512),
A.HorizontalFlip(p=0.5), # safe (chest symmetry-ish)
A.Rotate(limit=10, p=0.5), # small rotation
A.RandomBrightnessContrast(p=0.3),
A.GaussNoise(var_limit=0.01, p=0.3),
A.ElasticTransform(alpha=1, sigma=50, p=0.2), # tissue elasticity
A.Normalize(mean=[0.5], std=[0.25]),
])
Avoid: vertical flip (heart asymmetry), large rotation (>30°)।
৮ · Evaluation metrics
- Dice coefficient: 2|A∩B| / (|A|+|B|) — primary.
- IoU: Jaccard index.
- Sensitivity (recall): TP / (TP + FN) — miss critical.
- Specificity: TN / (TN + FP) — false alarm.
- Hausdorff distance: boundary precision.
Medical priority: high sensitivity (don't miss disease) over specificity (false alarm OK).
৯ · DICOM handling
Hospital-এ X-ray DICOM format — 12-16 bit, metadata. Conversion essential.
# pip install pydicom
import pydicom
import numpy as np
def load_dicom(path):
ds = pydicom.dcmread(path)
img = ds.pixel_array
# 16-bit → 8-bit windowing
# Use DICOM window center/width if present
wc = ds.get('WindowCenter', np.median(img))
ww = ds.get('WindowWidth', img.max() - img.min())
img_min = wc - ww/2
img_max = wc + ww/2
img = np.clip(img, img_min, img_max)
img = ((img - img_min) / (img_max - img_min) * 255).astype(np.uint8)
return img, ds # also return metadata
১০ · Inference + visualize
def predict_lung_mask(img_path, model_path='best_lung_unet.pth'):
model = smp.Unet(encoder_name="resnet50", in_channels=1, classes=1)
model.load_state_dict(torch.load(model_path))
model.eval().cuda()
img = preprocess_xray(img_path)
img_tensor = torch.tensor(img).unsqueeze(0).unsqueeze(0).cuda()
with torch.no_grad():
pred = torch.sigmoid(model(img_tensor))
mask = (pred > 0.5).cpu().numpy()[0, 0]
# Calculate lung area (cm² estimate)
lung_pixel_count = mask.sum()
return mask, lung_pixel_count
১১ · Bangladesh deployment consideration
Regulatory:
- DGDA approval: Bangladesh Directorate General of Drug Administration.
- Software as Medical Device — clarify level.
- Multi-site validation.
Hospital integration:
- PACS (Picture Archiving) integration.
- HIS (Hospital Information System) interface.
- HL7/DICOM compliance.
- Workflow seamless.
Clinical validation:
- 3+ radiologist concordance.
- Bangladeshi patient demographic data.
- Edge case analysis.
- Failure mode documentation.
Ethics:
- BMRC (Bangladesh Medical Research Council) approval.
- Patient consent.
- Data anonymization.
- Bias audit.
১২ · Bangladesh-specific challenges
- Image quality: rural hospital — older X-ray equipment, more noise.
- Demographic: Bangladesh chest morphology — need local data validation.
- TB prevalence: high — model bias toward TB-positive may overconfide.
- Compute infrastructure: rural — offline inference essential.
- Internet: intermittent — local server needed.
১৩ · Beyond lung — extensions
- TB lesion detect: next layer.
- COVID lesion: pneumonia distinguishing.
- Pneumothorax: emergency.
- Cardiomegaly: heart enlargement.
- Multi-class: all in one model.
ভাবনার প্রশ্ন
প্র ০১ Medical AI accuracy 95%+ হলেও hospital deploy অনেক years lag-এ। কেন?
"AI hype" vs "clinical reality" gap — major barriers.
Validation gap:
- Lab dataset ≠ hospital reality.
- Prospective trial — months to years.
- Multi-site validation.
Regulatory complexity:
- FDA/CE/DGDA approval — 2-5 year typical.
- Documentation extensive.
- Software-as-medical-device classification.
- Update protocol challenge (modeling drift).
Clinical workflow:
- Doctor habit — change resistance.
- EMR integration — IT cost.
- Liability — who responsible if error?
- Reimbursement code — insurance.
Bias risk:
- Training demographic — deployment population mismatch.
- Equipment variation.
- Edge case undocumented.
Trust building:
- Explainability — Grad-CAM, attention map.
- Calibrated confidence — when uncertain, say so.
- Failure mode transparent.
Bangladesh specific:
- DGDA framework gradually maturing.
- Local validation cohort essential.
- Pilot program (BIRDEM, NCC) longer.
- Engineer + clinician collaboration critical.
Cost-benefit reality:
- Bangladesh — radiologist scarcity makes AI valuable.
- Rural deployment particular need.
- Cost-effective vs urban radiologist visit.
মূল উপলব্ধি: Medical AI — high accuracy necessary not sufficient. Trust, workflow, regulatory — clinical adoption-এর co-equal challenges.
প্র ০২ Dice loss vs cross-entropy — medical-এ কেন Dice prefer? Limitations?
Loss function selection — medical CV-র subtle but critical decision.
Cross-entropy issues:
- Per-pixel — class imbalance dominate background.
- Lung segment 30% pixel typical — borderline OK.
- Tumor segment 1% pixel — fail.
Dice advantage:
- Ratio-based — class size invariant.
- Direct optimize evaluation metric.
- Foreground-focused.
Dice limitations:
- Discontinuous gradient at zero overlap.
- Boundary refinement-এ weak gradient.
- Sensitivity to small object.
Combined Dice + BCE:
- BCE — pixel-level confidence signal.
- Dice — overlap-level optimize.
- Best of both.
Other medical loss:
- Tversky: $\alpha, \beta$ — false positive/negative weight.
- Focal Tversky: hard case focus.
- Hausdorff loss: boundary precision.
- Boundary loss: edge-aware.
Per-task selection:
- Lung segment (30% pixel): BCE + Dice OK.
- Tumor (1% pixel): Dice + Focal.
- Boundary critical: + boundary loss.
Hyperparameter:
- Dice weight 0.3-0.7 typical.
- Trade-off pixel accuracy vs overlap.
মূল উপলব্ধি: Loss = task encode mathematical. Dice = overlap-aware. Medical task structure-aware loss critical.
প্র ০৩ Bangladesh hospital pilot — 100 patient. Promising. Scale up — কী challenge?
Pilot to scale — most ML projects fail here.
Pilot success factors:
- Curated dataset.
- Experienced team.
- Best equipment.
- Single hospital culture.
Scale challenges:
- Equipment variability: different X-ray machine — calibration ভিন্ন।
- Patient diversity: rural vs urban, demographic, comorbidity.
- Workflow variation: protocol differ across hospital.
- Operator skill: X-ray technician training varies.
- IT infrastructure: some no PACS, internet poor.
Specific issues:
- Domain shift — accuracy drops 10-20%.
- Edge cases unanticipated.
- Confidence calibration off.
- UI/UX assumptions wrong.
Mitigation:
- Multi-site dataset: 5-10 hospital cohort.
- Continuous learning: failure case retrain.
- Calibration layer: per-site confidence adjust.
- Human-in-the-loop: low confidence radiologist review.
- Monitoring dashboard: performance per site track.
Bangladesh roadmap:
- Pilot: 100 patient single hospital (BIRDEM).
- Validation: 1000 patient, 5 hospital.
- Multi-site cohort: 10K patient.
- DGDA submission.
- Scale-up: nationwide.
Stakeholders:
- Government (Health Ministry).
- Hospital administration.
- Doctor, technician training.
- Patient education.
- Insurance company.
Cost reality:
- Pilot: $50K-100K.
- Validation: $500K-1M.
- Scale: $5M+.
- Funding: USAID, GAVI, Gates Foundation common.
মূল উপলব্ধি: "Pilot success ≠ scale success". Bangladesh medical AI — multi-stakeholder, multi-year journey. Engineering 30%, rest sociology, regulation, business.
প্র ০৪ "Explainable AI" medical-এ critical. Grad-CAM, attention map কীভাবে use? Limitation?
Medical AI trust — transparency essential.
Grad-CAM (২০১৬):
- "Where did model look?" heatmap.
- Gradient-based attribution.
- Last conv layer activation × gradient.
- Coarse but interpretable.
Implementation:
from pytorch_grad_cam import GradCAM
target_layer = model.encoder.layer4
cam = GradCAM(model=model, target_layers=[target_layer])
grayscale_cam = cam(input_tensor=img, targets=None)[0, :]
# Overlay on original image
Use cases:
- Doctor verify — model focusing on relevant region.
- Failure case analyze — model confused by what.
- Trust building.
Other techniques:
- SHAP: per-pixel contribution.
- LIME: local linear approximation.
- Attention map (transformer): direct attention weight.
- Counterfactual: "what would change prediction?"।
Limitations:
- Coarse — pixel-level attribution rough.
- Method-dependent — different XAI different output.
- Confirmation bias — radiologist looks where model points.
- Pseudo-explanation — model may attend wrong region but predict right.
Best practice:
- Multi-method comparison.
- Sanity check — random model XAI compare.
- Quantitative metric (Pointing Game).
- Doctor + AI joint decision.
Calibration:
- Confidence score reliable চাই।
- Temperature scaling.
- Conformal prediction.
- "95% confident" actually 95% accurate.
Regulatory:
- EU AI Act — explainability requirement.
- FDA — increasing focus.
- DGDA — emerging framework.
মূল উপলব্ধি: Black-box ≠ acceptable in medicine. XAI imperfect but essential. Engineering responsibility — interpretable system build.
অনুশীলন
-
Setup: Montgomery dataset download, U-Net train baseline.
Code section ৪-৬। Free Colab GPU 2-3 hour. Final Dice ~0.95 expected.
-
Visualize: Test image-এ predict + Grad-CAM overlay.
pytorch-grad-cam library use. Lung region attention concentrate confirm.
-
ভাবুন: ICDDR,B-এ TB screening AI deploy — কী additional steps medical-grade হতে?
(1) Multi-site Bangladesh data collect. (2) BMRC ethics approval. (3) Radiologist concordance study. (4) Workflow integration. (5) DGDA submission. (6) Continuous monitoring. 2-3 year timeline minimum.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ৩৫ · Course capstone পরবর্তী পাঠকোর্সের সমাপ্তি।
- পাঠ ৩৩ · Project: realtime detection আগের পাঠFirst project.
- পাঠ ২২ · U-Net সম্পর্কিতArchitecture foundation.
- সব AI Courses দেখুন ABCL TECHসব কোর্স।