yazılar

Medikal Görüntü İşlemede Transfer Learning

Deep Learning · Transfer Learning · Computer Vision · TensorFlow · Medikal AI

X-ray, MR, CT görüntülerinin analizinde derin öğrenme modelleri, uzman hekimlere yakın ya da bazen üstün doğruluk sergileyebiliyor. Ancak medikal veri etiketlemek pahalı ve yavaş — bu noktada transfer learning devreye giriyor.

Bu yazıda Kaggle’daki “Chest X-Ray Images (Pneumonia)” veri setiyle ResNet50 kullanarak zatürre tespiti yapıyoruz.

Veri Seti

Guangzhou Kadın ve Çocuk Tıp Merkezi’nden 1–5 yaş arası çocuklara ait 5.863 göğüs röntgeni. İki sınıf: NORMAL ve PNEUMONIA.

import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, Model
from sklearn.model_selection import train_test_split

IMG_SIZE = (224, 224)
BATCH_SIZE = 32

Veri Dengesizliği

Veri seti dengesiz: PNEUMONIA sınıfı belirgin biçimde fazla. İki yöntemle çözüyoruz:

Undersampling — fazla sınıfı azalt:

pneumonia_files = pneumonia_files[:target_count]

Data Augmentation — az sınıfı artır:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

aug = ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
)

Model Mimarisi

ResNet50’yi ImageNet ağırlıklarıyla yüklüyoruz, katmanlarını donduruyoruz, üstüne kendi sınıflandırma katmanlarımızı ekliyoruz:

base_model = ResNet50(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)
base_model.trainable = False  # freeze

x = base_model.output
x = layers.Flatten()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
output = layers.Dense(1, activation='sigmoid')(x)

model = Model(inputs=base_model.input, outputs=output)

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

Eğitim

Callback’lerle eğitimi kontrol altında tutuyoruz:

callbacks = [
    tf.keras.callbacks.ReduceLROnPlateau(
        monitor='val_loss', factor=0.5, patience=3
    ),
    tf.keras.callbacks.EarlyStopping(
        monitor='val_loss', patience=5, restore_best_weights=True
    ),
    tf.keras.callbacks.ModelCheckpoint(
        'best_model.h5', save_best_only=True
    ),
]

history = model.fit(
    train_dataset,
    validation_data=val_dataset,
    epochs=30,
    callbacks=callbacks,
)

Eğitim verisi %80, test verisi %20 — stratified sampling ile sınıf dağılımı korundu.

Sonuçlar

Metrik Değer
Hassasiyet (Recall) %97.46
Özgüllük (Specificity) %93.99
Kesinlik (Precision) %95.30
Doğruluk (Accuracy) %95.92
F1 Skoru 0.9637
AUC 0.99

Model PNEUMONIA vakalarının %97.46’sını yakaladı. Medikal bağlamda recall kritik — bir vakayı kaçırmak, yanlış alarm vermekten daha tehlikeli.

Öğrenilen Dersler

Veri ön işleme başarının anahtarı. Dengesizliği çözmeden modeli eğitmiş olsaydım, model her şeyi PNEUMONIA tahmin ederek yüksek accuracy görünür, ama işe yaramaz olurdu.

Transfer learning büyük avantaj sağladı: ResNet50’nin ImageNet’te öğrendiği kenar, doku, şekil özellikleri tıbbi görüntülere de aktarıldı. Sıfırdan eğitmek hem daha fazla veri ister hem de daha uzun sürer.


Kaggle notebook: chest-xray

Bu yazının orijinali Medium’da yayınlanmıştır.