MONAI کا استعمال کرتے ہوئے الٹراساؤنڈ ڈیٹا پر ٹیومر سیگمنٹیشن ماڈل کی تربیت کیسے کریں۔

زیادہ تر سیگمنٹیشن ٹیوٹوریلز ایک ماڈل کو منتخب کرنے، امیجز داخل کرنے، اور میٹرکس بہتر ہونے تک ہائپر پیرامیٹر کو ٹیون کرنے سے شروع ہوتے ہیں۔ تاہم، یہ سب سے اہم قدم کو چھوڑ دیتا ہے: ڈیٹا کو سمجھنا۔

اس ٹیوٹوریل میں، ہم سب سے پہلے ڈیٹاسیٹ کو پروفائل کریں گے اور پھر ان مشاہدات کو MONAI سیگمنٹیشن پائپ لائن کے تمام ڈیزائن کے فیصلوں کو چلانے کے لیے استعمال کریں گے۔

ہم کیا احاطہ کریں گے:

یہ کس کے لیے ہے؟

یہ مشق فرض کرتی ہے کہ آپ کو ازگر سے کچھ واقفیت ہے اور اعصابی نیٹ ورکس کی تربیت کی بنیادی باتیں۔ MONAI سے متعلقہ حصے (لغت کی تبدیلی، DiceCELoss، DiceMetric) اور میڈیکل امیجنگ کی اصطلاحات (BI-RADS، hypoechoic، مریض گروپ فولڈنگ) ظاہر ہوتی ہیں۔ الٹراساؤنڈ کے پہلے تجربے کی ضرورت نہیں ہے۔

ڈیٹا سیٹ کی معلومات

ڈیٹاسیٹ BUS-BRA ہے، چھاتی کے الٹراساؤنڈ امیجز کا عوامی مجموعہ جس میں بایپسی ثابت شدہ لیبلز اور ٹیومر سیگمنٹیشن ماسک ہیں۔

ہر تصویر میں ایک بے نائین/ملیگننٹ لیبل، بریسٹ امیجنگ رپورٹنگ اور ڈیٹا سسٹم (BI-RADS) زمرہ (ریڈیالوجسٹ کا شک کا سکور 2 سے 5)، ہسٹولوجی سٹرنگ، اور بائنری ٹیومر ماسک ہوتا ہے۔ اس کے ساتھ موجود CSV میں پہلے سے طے شدہ کراس توثیق فولڈز بھی شامل ہیں۔

آپریشن بائنری ہیں۔ ٹیومر کو پس منظر سے الگ کریں۔ BUS-BRA میں برازیل کے انسٹی ٹیوٹ آف کینسر ریسرچ کے چار سکینرز پر حاصل کیے گئے 1,064 مریضوں کی 1,875 B-موڈ بریسٹ الٹراساؤنڈ تصاویر ہیں۔

MONAI کیا ہے اور میں اسے کیوں استعمال کروں؟

MONAI (میڈیکل اوپن نیٹ ورک فار AI) ایک اوپن سورس PyTorch فریم ورک ہے جو خاص طور پر میڈیکل امیجنگ کے لیے بنایا گیا ہے۔ یہ PyTorch کے اوپر ایک ڈومین کے لیے مخصوص پرت ہے۔ آپ ایک معیاری PyTorch ٹریننگ لوپ لکھتے ہیں، لیکن MONAI میڈیکل امیجنگ کے لیے مخصوص اجزاء فراہم کرتا ہے لہذا آپ کو اسے خود بنانے کی ضرورت نہیں ہے۔

یہ آپ کو دیتا ہے:

  • تبدیلی میڈیکل ڈیٹا کے لیے، لوڈنگ فارمیٹس جیسے DICOM اور NIfTI، شدت کو نارملائزیشن، اسکیلنگ، اور اضافہ سبھی ایک لغت پر مبنی پائپ لائن کے ذریعے انجام دیا جاتا ہے جو تصاویر اور ماسک کو مطابقت پذیر رکھتی ہے۔

  • نیٹ ورک فن تعمیر یہ ہیلتھ کیئر سیگمنٹیشن (U-Net، UNETR، SegResNet، وغیرہ) میں عام انسٹی ٹیشن کے لیے تیار ہے۔

  • نقصان کا فنکشن اور میٹرکس ڈائس پر مبنی نقصان اور ڈائس میٹرکس سمیت سیگمنٹیشن کے لیے ڈیزائن کیا گیا ہے۔

نتیجہ کم بوائلر پلیٹ اور امیجز اور ماسک کے سیدھ سے باہر ہونے کے امکانات کم ہیں۔

ڈائس کیا ہیں؟

ڈائس (ڈائس مماثلت کا گتانک) پیمائش کرتا ہے کہ دو علاقے کتنے اوورلیپ ہوتے ہیں۔ سیگمنٹیشن ماڈل کے پیش گوئی شدہ ماسک کا اصل ماسک سے موازنہ کرتا ہے اور 0 اور 1 کے درمیان سکور دیتا ہے۔ 0 کا مطلب بالکل بھی اوورلیپ نہیں ہوتا ہے اور 1 کا مطلب ایک بہترین میچ ہوتا ہے۔

فارمولا ہے:

Dice = 2 × (overlap) / (predicted area + true area)

"2

یہ سبق دو چیزیں کرتا ہے:

  • کے طور پر میٹرک نظامڈائس اسکور کرنے کا ایک طریقہ ہے۔ 0.876 کی توثیق نرد کا مطلب ہے کہ پیشن گوئی شدہ ٹیومر ماسک حقیقی ماسک کو اوسطاً 88 فیصد تک اوورلیپ کرتا ہے۔

  • کے طور پر نقصان (DiceCELoss)، ڈائس پر مبنی اصطلاحات وہی ہیں جو ماڈل سیکھتا ہے۔ یہ طبقاتی عدم توازن کے مسئلے کا ایک اہم حصہ ہے۔ چونکہ ڈائس کی پیمائش فی پکسل درستگی کے بجائے اوورلیپ ہوتی ہے، اس لیے ماڈل ہر چیز کو پس منظر کے طور پر لیبل لگا کر اچھا اسکور نہیں کر سکتا۔ چھوٹے ٹیومر اتنے ہی اہم ہوتے ہیں جتنے بڑے، اس لیے ماڈل کو ٹیومر کے علاقے تلاش کرنے پر مجبور کیا جاتا ہے۔

حصہ 1 – ماڈلنگ سے پہلے ڈیٹا پروفائل

یہ پہلا مرحلہ ڈیٹا پروفائلنگ ہے۔ یہ تمام تصاویر اور ماسک کو ایک بار پڑھتا ہے اور سوالات کی ایک مختصر فہرست کا جواب دیتا ہے جو پائپ لائن کی تعمیر کا طریقہ طے کرتی ہے۔ ان چیکوں کو چلنے میں چند سیکنڈ لگتے ہیں اور بعد میں اس سے بہت زیادہ اندازہ لگا لیتے ہیں۔

ذیل کا سنیپ شاٹ ان خصوصیات کا خلاصہ کرتا ہے جو پائپ لائن کے ڈیزائن کو براہ راست متاثر کرتی ہیں۔ یہ مشاہدات ورک فلو کے ہر قدم کا تعین کرتے ہیں۔

کیا سنیپ شاٹ اقدامات نمبر یہ کیا مجبور کرتا ہے
منفرد تصویری ریزولوشن سینکڑوں مختلف (چوڑائی، اونچائی) جوڑے بیچ پروسیسنگ سے پہلے اپنی تصاویر کو ایک مقررہ سائز میں تبدیل کرنا یقینی بنائیں۔
طبقاتی توازن پس منظر: پیش منظر ≒ 10.6 : 1 ایک عام پکسل کے حساب سے نقصان زیادہ تر پس منظر کی پیشن گوئی کی طرف متوجہ ہو سکتا ہے۔ اس کی وجہ یہ ہے کہ ایسا کرنے سے پہلے ہی غیر متوازن ڈیٹا سیٹ پر پکسل کی اعلی درستگی پیدا ہوتی ہے۔
چمک فی تصویر ڈیٹا سیٹ میں وسیع پیمانے پر پھیلا ہوا ہے۔ شدت کو معمول پر لانے کا تعلق تبدیلی کی پائپ لائن سے ہے۔
مریض بمقابلہ تصویر 1,064 مریض، 1,875 تصاویر (بائیں/دائیں جوڑا بنائے گئے نظارے) حصوں کو مریض کے لحاظ سے گروپ کیا جانا چاہئے۔ ورنہ وہی شخص ٹرین اور تصدیق میں لیک ہو جائے گا۔
ماسک کا جزو تمام ماسک ایک منسلک خطہ ہیں۔ متعدد منقطع بلابس کا استعمال کرتے ہوئے پیش گوئیاں واضح طور پر غلط ہیں۔
پکسل فارمیٹ تصویر 8 بٹ گرے اسکیل ہے اور ماسک 1 بٹ بائنری ہے۔ اسے ایک چینل کے طور پر لوڈ کریں اور لوڈ کرنے کے بعد ماسک کو بائنرائز کریں۔

ان میں سے دو کو قریب سے دیکھنے کے قابل ہے کیونکہ وہ دو اہم ترین فیصلے کرتے ہیں۔

کلاس بیلنس ٹاس چلاتا ہے۔

ٹیومر چھوٹا ہے۔ ڈیٹا سیٹ میں، بیک گراؤنڈ پکسلز ٹیومر پکسلز سے 10 گنا زیادہ ہیں۔

عام بائنری کراس اینٹروپی کے ساتھ تربیت یافتہ ماڈل ہر چیز کو پس منظر کے طور پر لیبل لگا کر تقریباً 91% پکسل کی درستگی حاصل کر سکتا ہے۔ یہ زیادہ تعداد ٹیومر تلاش کرنے کی صلاحیت کے بجائے عدم توازن کو ظاہر کرتی ہے۔

ٹھیک کرنا وہ نقصان ہے جہاں انعام اصل ٹیومر کے علاقے کو اوور لیپ کرتا ہے جو براہ راست ڈائس کی طرف اشارہ کرتا ہے۔

BUS-BRA ڈیٹاسیٹ میں پیش منظر اور پس منظر کے پکسلز کا موازنہ کرنے والا بار چارٹ۔ بیک گراؤنڈ پکسلز ٹیومر پکسلز کی تعداد تقریباً 10.6:1 سے زیادہ ہیں، جو مضبوط طبقاتی عدم توازن کو ظاہر کرتا ہے۔

تقسیم مریضوں کی تعداد کی وجہ سے ہوتی ہے۔

امیجز سے کم مریض ہیں کیونکہ بہت سے مریضوں کے بائیں اور دائیں دونوں اسکین ہوتے ہیں۔ اگر آپ تربیت کے لیے مریض کے بائیں اسکین کو تصادفی طور پر تقسیم کرتے ہیں اور تصدیق کے لیے دائیں اسکین کو، توثیق کا اسکور لیکیج کی وجہ سے بڑھ جائے گا۔

ڈیٹا سیٹ کے مصنفین نے پہلے ہی اس مسئلے کو حل کر دیا ہے۔ CSV ہے۔ K5P کالم: 5-پلائی تقسیم خون مریض کے گروپ کے لئے کھڑا ہے۔ اس کا مطلب ہے کہ کسی خاص مریض کی تمام تصاویر ایک ہی فولڈر میں موجود ہیں۔ ایک ہی گروپ کو دوبارہ استعمال کرنا اس سے زیادہ محفوظ ہے کہ اسے خود دوبارہ بنائیں۔

ان جوابات کی بنیاد پر، پائپ لائن میں ابھی تعمیر کرنے کے لیے وضاحتیں ہیں۔

حصہ 2 – پائپ لائن کی تعمیر

ذیل میں دی گئی تمام اشیاء سیگمنٹیشن سے متعلق کارروائیوں کے لیے MONAI کا استعمال کرتی ہیں۔
تبدیلی، ڈیٹاسیٹ ریپنگ، نیٹ ورک، نقصان، میٹرکس۔

سنگل کنفیگریشن آبجیکٹ

پائپ لائن ایک ڈیٹا کلاس سے تمام نوبس پڑھتی ہے۔ نیچے کی طرف کوئی ہارڈ کوڈنگ مستقل نہیں ہے، اس لیے تجربہ کو مختلف فولڈ یا تصویر کے سائز کے ساتھ دوبارہ چلانا ایک ہی ترمیم ہے۔

from dataclasses import dataclass
from typing import Tuple, Optional
from pathlib import Path

@dataclass
class TrainConfig:
    data_root: Optional[Path] = None
     fold_column: str = "K5P"          # patient-grouped 5-fold (dev set)
    val_fold: int = 1                 # which K5P fold is validation
    test_column: str = "HOP"          # patient-grouped hold-out partition
    test_group: int = 1               # HOP value reserved as the test set

    image_size: Tuple[int, int] = (256, 256)
    batch_size: int = 16
    lr: float = 1e-3
    epochs: int = 30
    use_amp: bool = True              # mixed precision
    ckpt_path: str = "best_model.pt"

cfg = TrainConfig()

اوپر کا کوڈ ہے۔ TrainConfig ایک ڈیٹا کلاس جس میں پائپ لائن کے لیے درکار تمام ترتیبات موجود ہیں: کالم اور فولڈز کو توثیق کرنے کے لیے فولڈ کریں، تصویر کا ہدف، بیچ کا سائز، سیکھنے کی شرح، عہدوں کی تعداد، مخلوط درستگی سوئچ، اور بہترین ماڈل کو کہاں اسٹور کرنا ہے۔ بنانا cfg یہ بعد کے تمام مراحل کے لیے ان ترتیبات کو ایک بار پڑھنے کے لیے ایک جگہ فراہم کرتا ہے۔

مریضوں کے گروپ کی تقسیم

تقسیم کرنے میں دو پہلے سے طے شدہ کالم استعمال ہوتے ہیں۔ HOP (ہولڈ آؤٹ پارٹیشن) ٹیسٹ سیٹ کے طور پر مریض سے الگ سلائسز محفوظ رکھتا ہے اور آخر تک کوئی تبدیلی نہیں ہوتی۔ ترقی کے باقی سیٹ کے اندر K5P فولڈ تصدیق شدہ ہے اور باقی چار تربیت یافتہ ہیں۔ مختصر دعوی اس بات کو یقینی بناتا ہے کہ مریض ایک سے زیادہ تقسیم میں ظاہر نہیں ہوتا ہے۔

dev_df   = manifest[manifest[cfg.test_column] != cfg.test_group]
test_df  = manifest[manifest[cfg.test_column] == cfg.test_group]

train_df = dev_df[dev_df[cfg.fold_column] != cfg.val_fold]
val_df   = dev_df[dev_df[cfg.fold_column] == cfg.val_fold]

# no patient may appear in more than one split
for a, b in [(train_df, val_df), (train_df, test_df), (val_df, test_df)]:
    assert not (set(a["Case"]) & set(b["Case"])), "patient leakage"

اوپر کوڈ سب سے پہلے HOP ایک ٹیسٹ سیٹ منتخب کریں، پھر بقیہ ترقی کی قطاروں کو توثیق (منتخب قطاروں) میں تقسیم کریں۔ K5P فولڈ) اور ٹرین (باقی)۔ پھر ہم اس بات کو یقینی بناتے ہیں کہ تمام تقسیم شدہ جوڑے کسی بھی مریض کو شریک نہیں کرتے ہیں۔ Case. اگر ایسا ہے تو، دعوی فوری طور پر ناکام ہوجاتا ہے.

اسنیپ شاٹ کے ذریعے منتخب کردہ تبدیلی

MONAI کی لغت کی تبدیلی کا نام ہے ("image" اور "label") مماثل آپریشن دونوں پر لاگو ہوتا ہے۔ یہاں ہر قدم درج ذیل جواب فراہم کرتا ہے: حصہ 1 ڈیٹا پروفائل تلاش کریں

from monai.transforms import (
    Compose, LoadImaged, EnsureChannelFirstd, ScaleIntensityd,
    AsDiscreted, Resized, RandFlipd, EnsureTyped,
)
import torch

base = [
    LoadImaged(keys=["image", "label"], reader="PILReader", image_only=True),
    EnsureChannelFirstd(keys=["image", "label"]),
    ScaleIntensityd(keys="image"),                       # brightness spread
    AsDiscreted(keys="label", threshold=0.5),            # clean {0, 1} mask
    Resized(keys=["image", "label"],                     # hundreds of sizes
            spatial_size=cfg.image_size,
            mode=("bilinear", "nearest")),
]

train_transforms = Compose(base + [
    RandFlipd(keys=["image", "label"], prob=0.5, spatial_axis=1),  # horizontal
    EnsureTyped(keys=["image", "label"], dtype=torch.float32),
])
val_transforms = Compose(base + [
    EnsureTyped(keys=["image", "label"], dtype=torch.float32),
])

مندرجہ بالا کوڈ بنیادی اقدامات کی مشترکہ فہرست بناتا ہے، PNG لوڈ کرتا ہے، چینل کو آگے بڑھاتا ہے، اور تصویر کا سائز تبدیل کرتا ہے۔ [0, 1]ماسک کو بائنرائز کریں اور دونوں کا سائز 256×256 کر دیں۔ پھر ہم اس فہرست کو دو پائپ لائنوں میں لپیٹ دیتے ہیں۔ ٹریننگ پائپ لائن بے ترتیب افقی فلپنگ کا اضافہ کرتی ہے، توثیق پائپ لائن ایسا نہیں کرتی ہے۔ لہذا، تشخیص ہمیشہ تصویر کو ویسا ہی دیکھتا ہے۔

افقی پلٹنا ایک سادہ اضافہ ہے جو اس ڈیٹا سیٹ میں جسمانی اعتبار کو محفوظ رکھتا ہے۔ زیادہ جارحانہ اضافہ، جیسے بڑی گردش یا لچکدار اخترتی، طبی لحاظ سے معنی خیز ڈھانچے کو بگاڑ سکتی ہے اور ان کی احتیاط سے توثیق کی جانی چاہیے۔

تصاویر میں شدت کے میلان کو محفوظ رکھنے کے لیے دو لکیری انٹرپولیشن کا استعمال کیا گیا ہے، اور ماسک قریب ترین پڑوسی انٹرپولیشن کا استعمال کرتے ہیں، اس لیے کلاس لیبل سختی سے 0 یا 1 رہتے ہیں۔ ماسک کا بلینیئر انٹرپولیشن آبجیکٹ کی حدود کے ساتھ مصنوعی لیبل کی قدریں تخلیق کرتا ہے۔

ماڈلز، نقصانات، اور میٹرکس

نیٹ ورک MONAI ہے۔ UNet ایک ان پٹ چینل (گرے اسکیل) اور ایک آؤٹ پٹ چینل (ٹیومر لاگٹ) ہے۔ نقصان وہ نقصان ہے جس کی نشاندہی کلاس بیلنس کے سروے کے نتائج سے ہوتی ہے۔

U-Net ایک انکوڈر پر مشتمل ہوتا ہے جو بتدریج کم ریزولوشنز پر سیاق و سباق کو پکڑتا ہے اور ایک ڈیکوڈر جو باریک مقامی تفصیلات کو دوبارہ تشکیل دیتا ہے۔ کنکشنز کو چھوڑیں ہائی ریزولوشن فیچرز کو براہ راست انکوڈر سے ڈیکوڈر میں منتقل کرتے ہیں، جس سے U-Net کو باؤنڈری-کریٹیکل میڈیکل سیگمنٹیشن کے لیے خاص طور پر موثر بنایا جاتا ہے۔

from monai.networks.nets import UNet
from monai.losses import DiceCELoss
from monai.metrics import DiceMetric
from monai.transforms import Activations, AsDiscrete

model = UNet(
    spatial_dims=2, in_channels=1, out_channels=1,
    channels=(16, 32, 64, 128, 256), strides=(2, 2, 2, 2),
    num_res_units=2,
).to(device)

loss_fn = DiceCELoss(sigmoid=True)       # Dice handles the imbalance; CE smooths the gradient
metric  = DiceMetric(include_background=True, reduction="mean")
post_pred = Compose([Activations(sigmoid=True), AsDiscrete(threshold=0.5)])
   

مذکورہ کوڈ ایک U-Net (پانچ ریزولوشن لیولز، ایک ان پٹ اور ایک آؤٹ پٹ چینل) بناتا ہے اور اسے GPU میں منتقل کرتا ہے۔ پھر ہمارے پاس تین عناصر ہیں: نقصان، توثیق میٹرکس؛ post_pred مرحلہ یہ ہے کہ خام ماڈل آؤٹ پٹ کو 0.5 پر سگمائڈ اور تھریشولڈنگ لگا کر صاف 0/1 ماسک میں تبدیل کیا جائے۔

DiceCELoss دونوں اصطلاحات کو یکجا کرتا ہے۔ چونکہ نرد کا حصہ پیش منظر کے علاقے میں پیمانے پر غیر متزلزل ہوتا ہے، اس لیے ایک چھوٹے ٹیومر کو ایک بڑے ٹیومر کے برابر شمار کیا جاتا ہے اور ماڈل ٹیومر کو نظر انداز کر کے جیت نہیں سکتا۔ کراس اینٹروپی حصہ ایک ہموار میلان کا اضافہ کرتا ہے جہاں ڈائس فلیٹ ہوتا ہے۔ کہ sigmoid=True جھنڈا ہمیں نقصان پر ایکٹیویشن کو لاگو کرنے کو کہتا ہے، لہذا ماڈل خام لاگٹ اور استعمال کرتا ہے۔ post_pred مرحلہ تشخیص کے دوران سگمائڈ اور حد کو ہینڈل کرتا ہے۔ یہ U-Net تقریباً 1.6 ملین پیرامیٹرز حاصل کرتا ہے۔

ٹریننگ لوپ خود زیادہ تر معیاری PyTorch ہے۔ MONAI اصلاح کی منطق سے باہر ہے، صرف تقسیم سے متعلقہ حصے نقصان، تبدیلی اور تشخیصی میٹرکس ہیں۔

for epoch in range(1, cfg.epochs + 1):
    model.train()
    for batch in train_loader:
        img, lab = batch["image"].to(device), batch["label"].to(device)
        optimizer.zero_grad(set_to_none=True)
        with torch.amp.autocast("cuda", enabled=cfg.use_amp):
            loss = loss_fn(model(img), lab)
        scaler.scale(loss).backward()
        scaler.step(optimizer); scaler.update()

    model.eval(); metric.reset()
    with torch.no_grad():
        for batch in val_loader:
            img, lab = batch["image"].to(device), batch["label"].to(device)
            pred = post_pred(model(img))
            metric(y_pred=pred, y=lab)
    val_dice = metric.aggregate().item()
    if val_dice > best_dice:
        best_dice = val_dice
        torch.save(model.state_dict(), cfg.ckpt_path)

مندرجہ بالا کوڈ میں، ہر دور دو پاسوں کو انجام دیتا ہے۔ ٹریننگ پاس تمام بیچوں کو GPU میں منتقل کرتا ہے، مخلوط درستگی کے ساتھ نقصان کا حساب کرتا ہے، اور گریڈینٹ اسکیلر کے ذریعے وزن کو اپ ڈیٹ کرتا ہے۔ توثیقی پاس پھر گریڈینٹ کو آف کر کے چلایا جاتا ہے اور پیشین گوئی کو اس میں تبدیل کر دیتا ہے: post_predاور ہم فولڈ میں ڈائس جمع کرتے ہیں۔ جب بھی کسی دور کا ڈائس اس نے کبھی دیکھے گئے بہترین سے آگے نکل جاتا ہے، تو ماڈل کے وزن کو ڈسک میں محفوظ کر لیا جاتا ہے۔

نتائج پڑھیں

دو منحنی خطوط رن کا خلاصہ کرتے ہیں۔ تربیت کا نقصان مسلسل کم ہوتا ہے اور 0.12 کے قریب چپٹا ہو جاتا ہے۔ 0.57 کے قریب تصدیقی ڈائس پلیٹاؤس۔ 0.866 عہد 28 کو پہنچ گیا ہے۔

تربیتی منحنی خطوط، جو ظاہر کرتا ہے کہ نقصان 30 نسلوں سے مسلسل کم ہوتا جا رہا ہے جب کہ توثیق ڈائس بڑھتا ہے اور 0.866 کے قریب پلیٹاؤس، معمولی حد سے زیادہ فٹنگ کی طرف اشارہ کرتا ہے۔

اس وکر کے بارے میں پڑھنے کے لئے کچھ چیزیں:

  • یکسر طور پر کم ہونے والے نقصان کا مطلب ہے کہ ماڈل سیکھ رہا ہے۔ تدریجی سگنل حقیقی ہیں۔

  • نقصانات صفر تک پہنچنے کے بجائے صفر سے اوپر جانے کی توقع ہے۔ DiceCELoss کراس اینٹروپی اصطلاح میں ایک منزل ہوتی ہے کیونکہ یہ مبہم باؤنڈری پکسلز پر مکمل طور پر ختم نہیں ہوتی ہے۔ 0 تک پہنچنے والا نقصان ایک انتباہی نشان ہوگا، جیت نہیں۔

  • حقیقت یہ ہے کہ توثیق ڈائس پلیٹاؤس ~ 0.85 سے اوپر ہے جبکہ تربیتی نقصان مسلسل گر رہا ہے یہ ایک حد سے زیادہ موزوں خصوصیت ہے۔ اضافی عہد زیادہ تر پاؤں کے نرد کو حرکت دیے بغیر ٹرین کے نقصانات کو کم کرتے ہیں۔ یہاں کچھ بھی سنجیدہ نہیں ہے، اس لیے 30 جنریشن کا بجٹ ٹھیک ہے، لیکن صبر کی بنیاد پر جلد رکنے کا اصول ایک معقول اضافہ ہوگا۔

0.866 کی توثیق ڈائس اس ڈیٹاسیٹ پر باقاعدہ 2D U-Net کے لیے مناسب حد میں ہے۔ تاہم، تصدیقی نرد منتخب چوکیوں کی پیمائش کے لیے ایک ہی سیٹ کا استعمال کرتا ہے، اس لیے یہ قدرے پر امید طریقے سے چلتا ہے۔

یہ آخری اچھوت چیک ہے: HOP تمام تربیت اور ماڈل کا انتخاب مکمل ہونے کے بعد، ٹیسٹ سیٹ بالکل ایک بار اسکور کیا جاتا ہے۔ یہ اندر آتا ہے۔ 0.864یہ بنیادی طور پر 0.866 کی توثیق کے اعداد و شمار سے میل کھاتا ہے۔ ماڈل ان مریضوں کو عام کرتا ہے جو تربیت یا انتخاب کے دوران کبھی نہیں دیکھے گئے تھے، اور توثیق نمبروں نے رساو کو نہیں چھپایا تھا۔

پیش گوئی کرنے والا تصور

میٹرکس کا خلاصہ ہوتا ہے لیکن مجموعی کارکردگی ظاہر نہیں کرتے۔ کس طرح ماڈل انفرادی ٹیومر کو الگ کر رہا ہے۔

نیچے دی گئی تصویر نمائندہ توثیق کی مثال دکھاتی ہے۔ بائیں سے دائیں: ان پٹ الٹراساؤنڈ امیج، زمینی سچ کا ماسک، ماڈل کا پیشین گوئی ماسک، اور پیشین گوئی اصل تصویر پر لپٹی ہوئی ہے۔

پیشین گوئیوں اور زمینی سچائی تشریحات کے درمیان قریبی معاہدہ یہ ظاہر کرتا ہے کہ ماڈل کس طرح زخم کے مقام اور حدود دونوں کو مقامی بناتا ہے۔

نمائندہ سیگمنٹیشن کے نتائج دکھاتے ہوئے چار پینل ویژولائزیشن: اصل چھاتی کی الٹراساؤنڈ تصویر، اصل ٹیومر ماسک، ماڈل کا پیشین گوئی ماسک، اور پیشین گوئی ماسک اصل تصویر پر چڑھا ہوا ہے۔ پیشین گوئیاں تشریح شدہ ٹیومر کی حدود سے قریب سے ملتی ہیں۔

ناکامی کے موڈز اوسط سے زیادہ اہم ہیں۔

0.866 کی اوسط موت بہت مختلف رویے کو چھپا سکتی ہے۔ اس کا مطلب یہ ہو سکتا ہے کہ تمام معاملات معمولی ہیں، یا یہ کہ زیادہ تر معاملات اچھے ہیں اور کچھ بری طرح ناکام ہو جاتے ہیں۔

ان امکانات کے درمیان فرق کرنے کے لیے، تصویر کے ذریعے ترتیب دی گئی توثیق کو ترتیب دیں اور سب سے کم اسکور کرنے والی پیشین گوئی کا معائنہ کریں۔

اس فولڈ میں، توثیق کے 299 کیسز میں سے صرف 4 نے 0.5 (تقریباً 1%) سے کم اسکور کیا۔ ان چار اوورلیز کو دیکھ کر، ایک واضح نمونہ ابھرتا ہے۔ چار بدترین پیشین گوئیوں میں سے تین یہ ہیں: بکھرے ہوئے: ماڈل زمینی سچائی کے ایک خطے کے ساتھ متعدد منقطع بلابس کو آؤٹ پٹ کرتا ہے۔ چوتھا گہرے صوتی سائے کو الجھا دیتا ہے، جو ٹیومر ٹشو کے لیے عام الٹراساؤنڈ نمونے ہیں۔

وہ ٹکڑے ٹکڑے کرنے کا نمونہ براہ راست سنیپ شاٹ کے نتائج کی طرف لے جاتا ہے۔ ڈیٹا کوالٹی پاس کرنے سے درج ذیل کی پیمائش ہوتی ہے: BUS-BRA میں تمام زمینی سچائی کے ماسک واحد جڑے ہوئے اجزاء ہیں۔. لہذا، ڈیٹا سیٹ کی نوعیت کی وجہ سے ملٹی بلاب کی پیشین گوئیاں غلط ہیں۔ اس سے مراد پوسٹ پروسیسنگ کے مراحل میں صرف سب سے بڑے منسلک اجزاء کو برقرار رکھنا ہے۔

from monai.transforms import KeepLargestConnectedComponent

post_pred = Compose([
    Activations(sigmoid=True),
    AsDiscrete(threshold=0.5),
    KeepLargestConnectedComponent(applied_labels=[1]),
])

یہ کوڈ post_pred آخر میں ایک اضافی قدم کے ساتھ ایک پائپ لائن۔ سگمائیڈ اور تھریشولڈ کے بعد بائنری ماسک بنائیں، KeepLargestConnectedComponent ہم سب سے بڑے علاقے کے علاوہ تمام پیشین گوئی والے علاقوں کو مسترد کر دیتے ہیں، لہذا متعدد بلاب میں تقسیم ہونے والی پیشین گوئیاں واحد سب سے بڑے ٹکڑے میں سمٹ جاتی ہیں۔ یہ ڈیٹاسیٹ میں فی ماسک انتساب کے ایک علاقے سے مساوی ہے۔

میں نے توثیق کے سیٹ پر اس کی پیمائش کی، اور ایماندار نتائج "مفت درستگی” سے زیادہ اہم ہیں۔ اگرچہ یہ کچھ بکھرے ہوئے معاملات کو بحال کرتا ہے، اوسط ڈائس میں خالص تبدیلی کم سے کم ہے اور تھوڑی منفی بھی ہو سکتی ہے۔ اگر اصل گھاو کے دو رابطے کے ٹکڑے ہونے کی پیش گوئی کی جاتی ہے، تو چھوٹے کو ضائع کرنے کے نتیجے میں ایک حقیقی مثبت علاقہ ضائع ہو جاتا ہے۔ لہذا یہ ایک مخصوص ناکامی کے موڈ کے لیے ایک ٹارگٹڈ لیور ہے بجائے اس کے کہ ایک فری بوسٹ۔ اسے آنکھیں بند کر کے اپنانے کے بجائے دریافت کرنے کے قابل ہے۔

شیڈو کنفیوژن کیسز زیادہ مشکل ہیں۔ یہ ہمیں بتاتا ہے کہ گہرے سائے والے علاقوں میں ہائپوکوک ٹیومر کو بعض اوقات سیاق و سباق کی ضرورت ہوتی ہے جسے چھوٹی گرے اسکیل فصلیں نہیں بتا سکتیں۔ یہ مستقبل کے تجربات کی سمت کے طور پر اعلی ریزولیوشن یا وسیع تر قابل قبول فیلڈز کی طرف اشارہ کرتا ہے۔

آگے کہاں جانا ہے۔

ایک قابل اعتماد بیس لائن کا ہونا آپ کے اگلے تجربات کو بہت زیادہ معنی خیز بنا دیتا ہے۔ تصادفی طور پر بڑے ماڈلز کو آزمانے کے بجائے مشاہدہ شدہ ناکامی کے طریقوں سے شروع کریں۔

  • توجہ U-Net یا DynUNet کے ساتھ 2D U-Net کو تبدیل کریں۔

  • چھوٹے گھاووں کو بہتر طور پر پکڑنے کے لیے اعلیٰ ریزولیوشن پر ٹرین کریں۔

  • تخمینہ کے دوران منسلک اجزاء کے تجزیہ کو منتخب طور پر لاگو کرتا ہے۔

  • اپنے امتحانی وقت کو بڑھانے پر ایک نظر ڈالیں۔

  • انتہائی غیر متوازن گھاووں کے لیے، DiceCE کا فوکل Tversky نقصان سے موازنہ کریں۔

ٹیک آؤٹ

تھرو لائن ڈیٹا کو پروفائل کرنا ہے اور پھر جو کچھ آپ کو ملتا ہے اس کی بنیاد پر فیصلے کرنا ہے۔

نیا سائز ریزولوشن چیک سے کیا گیا تھا۔ نقصان کلاس بیلنس چیک میں ہوا۔ تقسیم مریضوں کی تعداد سے ہوئی۔ سب سے زیادہ مفید پوسٹ پروسیسنگ آئیڈیا ماسک کے اجزاء کی جانچ سے آیا جو تربیت شروع ہونے سے پہلے چلتا ہے۔ ان میں سے کوئی بھی اندازہ نہیں تھا، اور نہ ہی انہیں دریافت کرنے کے لیے وسیع تحقیق کی ضرورت تھی۔

ماڈل بنانا آسان ہے۔ ایک ایسا ماڈل جس میں ہر انتخاب کی وجہ ہوتی ہے اس پر بھروسہ کرنا آسان ہوتا ہے، ڈیبگ کرنا آسان ہوتا ہے اور اگلے قاری کو سمجھانا آسان ہوتا ہے۔

حوالہ

اس مشق کے لیے مکمل قابل عمل کوڈ MONAI نوٹ بک کے طور پر دستیاب ہے۔ busbra_segmentation_monai.ipynb. یہ Kaggle یا Colab میں اوپر سے نیچے تک چلتا ہے اور اگر ڈیٹا سیٹس پہلے سے منسلک نہیں ہیں تو خود بخود ڈاؤن لوڈ ہو جاتا ہے۔

اوپر تک سکرول کریں۔