Kadir Terzi
Projelere dön

Makine öğrenmesi · Web arayüzü

NeuroVision (MRI)

Transfer learning ile MRI görüntülerinin dört sınıfa ayrılması.

PythonCNNResNetTransfer learning

Test sonuçları

Test kümesi, 1405 görüntü
ModelDoğru / ToplamDoğruluk
ResNet501368 / 1405%97,4
ResNet1011395 / 1405%99,3

Sınıflar: glioma, meningioma, notumor (tümör yok), pituitary.

Neler yaptım

Veri

Kaggle Brain Tumor MRI Dataset içindeki Training ve Testing klasörlerini birleştirerek 7.023 görüntüyle çalıştım: glioma 1.621, meningioma 1.645, notumor 2.000 ve pituitary 1.757. Rastgele bölmeyle %72 eğitim, %8 doğrulama ve %20 test kümesi oluşturdum.

  • 7.023 görüntü
  • 4 sınıf
  • %72 / %8 / %20
Ön işleme ve veri artırma

Görüntüleri 224×224×3 boyutuna getirdim ve etiketleri one-hot kodladım. Eğitimde 40° döndürme, 0,2 kaydırma/shear/zoom ve yatay çevirme kullandım; boşluklar nearest yöntemiyle dolduruldu.

  • 224×224×3
  • One-hot
  • ImageDataGenerator
Model kurulumu

ImageNet ağırlıklı ResNet50 ve ResNet101 ağlarında ilk 30 / 50 katmanı dondurdum; kalan katmanları eğitime açık bıraktım. Sınıflandırma katmanlarına GlobalAveragePooling2D, iki dropout katmanı, 128 ReLU birimi ve dört sınıflı softmax ekledim; dropout oranları sırasıyla 0,5 / 0,6 idi.

  • ImageNet
  • 30 / 50 dondurulmuş
  • Dropout 0,5 / 0,6
Eğitim

Adam ile öğrenme oranlarını 0,001 / 0,0001, batch boyutlarını 32 / 16 seçtim. ModelCheckpoint, ReduceLROnPlateau ve EarlyStopping kullandım; 50 epoch sınırına karşı eğitimler 18 / 36. epoch’ta durdu. ResNet50 yerel CPU’da, ResNet101 Google Colab Tesla T4 üzerinde eğitildi.

  • Adam
  • Batch 32 / 16
  • 18 / 36 epoch
Değerlendirme

İki modeli aynı 1.405 görüntülük test kümesinde karşılaştırdım. Doğruluk ve kayıp eğrilerinin yanında karışıklık matrisi, precision, recall ve F1 ile sınıf bazındaki hataları inceledim.

  • 1.405 test görüntüsü
  • Karışıklık matrisi
  • Precision / recall / F1
Web arayüzü

İlk Flask prototipini Django arayüzüne taşıdım. MRI yükleme ve ResNet50/101 seçimini, tahmin edilen sınıfı ve sınıf olasılıklarını gösteren bir akışta birleştirdim.

  • Flask → Django
  • Model seçimi
  • Sınıf olasılıkları

Model eğitimi

ResNet50 / ResNet101 — mimari akış
  1. MRI girişi224×224×3
  2. ResNet50 / ResNet101 · ImageNetİlk 30 / 50 katman: dondurulmuşKalan katmanlar: eğitilen
  3. GlobalAveragePooling2D
  4. Dropout · 0.5 / 0.6
  5. Dense 128 · ReLU
  6. Dropout · 0.5 / 0.6
  7. Dense 4 · softmax
  8. glioma / meningioma / notumor / pituitary
Notebook’taki gerçek eğitim ayarları
AyarResNet50ResNet101
Giriş224×224×3224×224×3
Ön eğitimImageNetImageNet
Dondurulan ilk katman3050
Dropout (iki katman)0.50.6
OptimizerAdamAdam
Öğrenme oranı0.0010.0001
Kayıpcategorical_crossentropycategorical_crossentropy
Batch size3216
Epoch sınırı5050
Durduğu epoch1836
ModelCheckpointval_loss · save_best_onlyval_loss · save_best_only
EarlyStopping patience57
ReduceLROnPlateau patience35
ReduceLROnPlateau factor / min_lr0.1 / 0.0000010.1 / 0.000001
OrtamYerel CPUColab · Tesla T4

Sonuçlar ve analiz

Karışıklık matrisleri

ResNet50 toplam 37, ResNet101 10 görüntüyü yanlış sınıflandırdı. ResNet50'de en büyük hata 18 meningioma görüntüsünün pituitary olarak tahmin edilmesi; ayrıca 5 meningioma görüntüsü 'tümör yok' olarak etiketlendi. ResNet101'in 10 hatasının tamamı meningioma ile ilgili (meningioma'nın başka sınıf sanılması ya da başka sınıfların meningioma sanılması); ResNet50'nin 37 hatasının 31'i meningioma ile ilgili. Meningioma her iki modelde de en zor sınıf.

ResNet50 — karışıklık matrisi

ResNet101 — karışıklık matrisi

Sınıf bazlı rapor

Meningioma recall’u (0,92) ve pituitary precision’ı (0,94) en düşük değerler; ikisi büyük ölçüde aynı hatadan, meningioma görüntülerinin pituitary sanılmasından kaynaklanıyor. “Tümör yok” sınıfında recall, raporun iki ondalık gösteriminde 1,00 (418/419).

ResNet50, test — sınıf bazlı rapor

Doğruluk ve kayıp eğrileri

ResNet101 — doğruluk

Eğitim ve doğrulama doğruluğu yaklaşık 10. epoch’tan sonra %99 civarında birleşiyor. Sonraki bölümde büyük bir ayrışma görünmüyor; bu grafik tek başına genelleme başarısını kanıtlamaz.

ResNet101 — kayıp

Eğitim ve doğrulama kaybı ilk epoch’lardaki dalgalanmanın ardından hızla düşüyor. Yaklaşık 10. epoch’tan sonra ikisi de düşük seviyede; doğrulama kaybında sürekli bir yükseliş görünmüyor.

ResNet50 — doğruluk

Doğrulama doğruluğu başlangıçta dalgalanıyor ve yaklaşık 6. epoch’ta belirgin biçimde yükseliyor. Son bölümde eğitim yaklaşık %99, doğrulama %97 civarında; küçük fark aşırı öğrenmeyi tek başına kanıtlamaz. Grafiğin “test” etiketi notebook’taki val_accuracy, yani doğrulama serisidir.

ResNet50 — kayıp

Başlangıçtaki doğrulama kaybı yaklaşık 450’ye ulaştığı için dikey ölçek çok geniş. Sonraki değerler sıfıra yakın sıkışıyor; geç epoch’lardaki küçük değişimler bu grafikten güvenilir biçimde okunamıyor. Grafiğin “test” etiketi notebook’taki val_loss, yani doğrulama serisidir.

Veri dağılımı

Dört sınıf birbirine yakın dengede (1.621–2.000); en küçük sınıf glioma, en büyük notumor. Bölme grafiği %72 eğitim, %8 doğrulama ve %20 testi; test sınıf grafiği ise 310 / 326 / 419 / 350 görüntüyü gösteriyor.

Veri dağılımı — eğitim %72, doğrulama %8, test %20

Test kümesinin sınıf dağılımı

Veri artırma örneği

Eğitim görüntülerine 40° döndürme, 0,2 genişlik/yükseklik kaydırma, shear ve zoom ile yatay çevirme uygulandı. Boşluklar nearest yöntemiyle dolduruldu; doğrulama ve test için yeni artırılmış örnekler üretilmedi.

Veri artırma örneği

Temel kavramlar

CNN (evrişimli sinir ağı)

Görüntüyü küçük filtrelerle tarayarak desenleri öğrenir: ilk katmanlar kenar ve doku, derin katmanlar şekil ve yapı. Projede ResNet50 ve ResNet101 bu tür ağlardır.

Havuzlama (pooling)

Havuzlama (pooling): özellik haritasını küçültür, önemli bilgiyi korur; işlem yükünü azaltır. Türleri: max pooling (her pencerenin en büyük değeri), average pooling (pencere ortalaması), global average pooling (her kanalın tamamını tek sayıya indirir). Projede iki tür kullanıldı. ResNet'in ilk bloğunda max pooling, görüntüyü küçültürken her bölgedeki en büyük değeri korur. ResNet'in son katmanından sonra ise global average pooling kullanıldı: her özellik haritasını tek bir ortalama değere indirir ve elde edilen sayılar, sınıflandırma yapan katmanlara giriş olur.

Max pooling örneği (2×2 pencere, adım 2)
Öğretici örnek: örtüşmeyen 2×2 pencereler, adım 2. Her renk bir çeyreği ve sonucunu eşler.
Max pooling örneği (2×2 pencere, adım 2). 2×2 max pooling: 4×4 girdideki her bloğun en büyük değeri alınır. Sonuç 6, 5, 3, 8.
Transfer öğrenme ve katman dondurma

ImageNet’te önceden eğitilmiş ağın ilk katmanlarını (ResNet50’de 30, ResNet101’de 50) dondurup, eklediğimiz sınıflandırma katmanlarını ve ağın kalan katmanlarını MRI verisiyle eğittik.

Aşırı öğrenmeyi önleme

Veri artırma, dropout (0,5 / 0,6) ve EarlyStopping ile modelin eğitim verisini ezberlemesini sınırladık.

Başarı ölçütleri

Doğruluk, precision, recall, F1 ve karışıklık matrisiyle değerlendirdik. Matriste satırlar gerçek sınıf, sütunlar tahmin; köşegen doğru tahminlerdir. ResNet50’de 18 meningioma görüntüsü pituitary olarak tahmin edildi.

Teknolojiler

Model ve görüntü işleme
  • Pythonuygulama ve eğitim kodu
  • TensorFlowmodel eğitimi ve çıkarım
  • Keras (tf.keras)sınıflandırma katmanları ve eğitim API’si
  • NumPydizi işlemleri
  • scikit-learnveri bölme ve değerlendirme
  • OpenCVgörüntü okuma ve boyutlandırma
Web arayüzü ve kayıtlar
  • Djangoweb arayüzü, kullanıcı girişi ve kayıtlar
  • Pillowyüklenen görüntüyü işleme
  • SQLiteDjango kayıtlarının saklanması
Görselleştirme
  • Matplotlibdoğruluk, kayıp ve dağılım grafikleri
  • seabornkarışıklık matrisi görselleştirmesi