الرؤية الحاسوبية متقدم · Advanced 15 دقيقة

U-Net

معمارية المشفر-المفكك بوصلات التخطي التي أصبحت معياراً في تقسيم الصور الطبية.

تقدّمك في المسار0%

البنية

  • مسار التقليص: كتل من التفافين 3×3 مع ReLU ثم Max Pooling، ويتضاعف عدد القنوات مع كل مستوى.
  • عنق الزجاجة: أعمق تمثيل وأصغر دقة مكانية.
  • مسار التوسيع: تكبير ثم دمج مع خرائط المستوى المقابل من المشفر (وصلة التخطي) ثم التفافان.
  • الطبقة الأخيرة: التفاف 1×1 يعطي قناة لكل فئة.

تطبيق مختصر في PyTorch

import torch, torch.nn as nn

def block(cin, cout):
    return nn.Sequential(
        nn.Conv2d(cin, cout, 3, padding=1), nn.BatchNorm2d(cout), nn.ReLU(inplace=True),
        nn.Conv2d(cout, cout, 3, padding=1), nn.BatchNorm2d(cout), nn.ReLU(inplace=True))

class UNet(nn.Module):
    def __init__(self, in_ch=1, n_classes=1, base=32):
        super().__init__()
        self.e1, self.e2, self.e3 = block(in_ch, base), block(base, base*2), block(base*2, base*4)
        self.pool = nn.MaxPool2d(2)
        self.mid = block(base*4, base*8)
        self.u3, self.d3 = nn.ConvTranspose2d(base*8, base*4, 2, 2), block(base*8, base*4)
        self.u2, self.d2 = nn.ConvTranspose2d(base*4, base*2, 2, 2), block(base*4, base*2)
        self.u1, self.d1 = nn.ConvTranspose2d(base*2, base, 2, 2), block(base*2, base)
        self.out = nn.Conv2d(base, n_classes, 1)
    def forward(self, x):
        e1 = self.e1(x); e2 = self.e2(self.pool(e1)); e3 = self.e3(self.pool(e2))
        m = self.mid(self.pool(e3))
        d3 = self.d3(torch.cat([self.u3(m), e3], 1))
        d2 = self.d2(torch.cat([self.u2(d3), e2], 1))
        d1 = self.d1(torch.cat([self.u1(d2), e1], 1))
        return self.out(d1)              # logits

print(UNet()(torch.randn(2, 1, 128, 128)).shape)   # (2, 1, 128, 128)

التدريب

def dice_loss(logits, target, eps=1e-6):
    p = torch.sigmoid(logits)
    inter = (p * target).sum(dim=(2, 3))
    return 1 - ((2 * inter + eps) / (p.sum(dim=(2, 3)) + target.sum(dim=(2, 3)) + eps)).mean()

bce = nn.BCEWithLogitsLoss()
loss_fn = lambda lo, t: bce(lo, t) + dice_loss(lo, t)

الامتدادات

  • 3D U-Net: لأحجام CT وMRI.
  • Attention U-Net وUNet++: تحسينات على وصلات التخطي.
  • nnU-Net: يضبط المعالجة والمعمارية والتدريب تلقائياً، ويُعد خط أساس قوياً جداً في مسابقات التقسيم الطبي.
  • MONAI: إطار مفتوح مبني على PyTorch لتطبيقات الذكاء الاصطناعي الطبي.

مصطلحات الدرس

nnU-Net no-new-Net
إطار يضبط تلقائياً المعالجة المسبقة ومعمارية U-Net والتدريب وفق خصائص مجموعة البيانات.
الالتفاف المنقول Transposed Convolution
عملية تكبير قابلة للتعلم تزيد الأبعاد المكانية لخريطة السمات.
وصلة التخطي Skip Connection
وصلة تنقل خرائط السمات من طبقة في المشفر إلى الطبقة المقابلة في المفكك لاستعادة التفاصيل المكانية.

الملخص

قدّم Ronneberger وزملاؤه U-Net عام 2015 لتقسيم الصور الطبية الحيوية. تتكون من مسار تقليص (مشفر) يلتقط السياق، ومسار توسيع (مفكك) يستعيد الدقة المكانية، ووصلات تخطي تنقل خرائط السمات عالية الدقة من المشفر إلى المفكك. تعمل جيداً مع بيانات تدريب محدودة بمساعدة زيادة البيانات، وتُدرب غالباً بخسارة Dice أو مزيج Dice وCross-Entropy. لها امتدادات ثلاثية الأبعاد، ويوفر إطار nnU-Net ضبطاً آلياً لها.

أسئلة مراجعة

  1. ما دور وصلات التخطي في U-Net؟

    نقل التفاصيل المكانية الدقيقة من المشفر إلى المفكك، لأن التقليص يفقد معلومات الموقع الدقيقة اللازمة لحدود دقيقة.

  2. لماذا تُستخدم خسارة Dice كثيراً مع U-Net في الصور الطبية؟

    لأن منطقة الآفة صغيرة غالباً مقارنة بالخلفية، وDice أقل تأثراً بهذا عدم التوازن من Cross-Entropy وحدها.

المصادر والمراجع

  1. Ronneberger, Fischer & Brox (2015) U-Net: Convolutional Networks for Biomedical Image Segmentation — arXiv
  2. Isensee et al. (2021) nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation — Nature Methods
  3. MONAI — Medical Open Network for AI

إكمال الدرس