Kaggle = https://www.kaggle.com/code/beraterolelk/brain-tumor-classification-with-cnn-grad-cam
Medium = https://medium.com/@beratcelikk02/brain-tumor-mri-ed486d24dcfd
Bu proje, beyin tümörlerini glioma, meningioma, pituitary ve no tumor olmak üzere 4 sınıfta sınıflandırmak için Convolutional Neural Network (CNN) kullanmaktadır. Ayrıca modelin hangi bölgeleri dikkate aldığını görselleştirmek için Grad-CAM yöntemi uygulanmıştır.
os,random→ Dosya işlemleri ve rastgele seçimlernumpy→ Sayısal hesaplamalarmatplotlib→ Görselleştirmetensorflow.keras→ Derin öğrenme ve CNN modellemesklearn.metrics→ Confusion Matrix ve Classification Reportseaborn→ Confusion Matrix heatmap görselleştirmecv2→ OpenCV ile görüntü işleme
- Training:
Training/klasörü altında dört sınıf - Testing:
Testing/klasörü altında dört sınıf
Sınıflar:
gliomameningiomanotumorpituitary
- Görüntüler 224x224 boyutuna yeniden boyutlandırıldı
- Piksel değerleri [0,1] aralığına normalize edildi
- Data augmentation ile:
- ±15° döndürme
- %10 yatay/dikey kaydırma
- %10 zoom
- Shear transform
- Yatay çevirme
- Validation split: %20
Katmanlar:
- Conv2D (32 filtre, 3x3, ReLU) → MaxPooling2D
- Conv2D (64 filtre, 3x3, ReLU) → MaxPooling2D
- Conv2D (128 filtre, 3x3, ReLU) → MaxPooling2D
- Flatten
- Dense (128 nöron, ReLU)
- Dropout (%50)
- Dense (4 nöron, softmax) → 4 sınıf için çıkış
Optimizasyon ve Kayıp:
- Loss: Categorical Crossentropy
- Optimizer: Adam
- Metric: Accuracy
Eğitim:
- Epoch: 20
- Batch Size: 32
- En yüksek doğruluk (validation): ~81%
- Test set doğruluk: ~86%
- Eğitim ve doğrulama kaybı ve doğruluk grafikleri matplotlib ile çizildi
- Confusion Matrix ile gerçek vs tahmin edilen sınıflar karşılaştırıldı
- Her sınıf için precision, recall, f1-score hesaplandı
- Heatmap seaborn ile görselleştirildi
Örnek Confusion Matrix: [[241 41 1 17] [ 17 196 61 32] [ 2 1 402 0] [ 3 2 0 295]]
- Modelin hangi bölgeleri dikkate aldığını görselleştirmek için Grad-CAM kullanıldı
- Son Conv2D katmanı:
conv2d_5 - Heatmap oluşturuldu ve orijinal görüntü üzerine süperimpose edildi
- Görselleştirme OpenCV ve matplotlib ile yapıldı
Adımlar:
- Test görüntüsü 1xHxWxC formatına çevrildi
- Grad-CAM heatmap hesaplandı
- Heatmap yeniden boyutlandırıldı ve Jet colormap ile renklendirildi
- Orijinal görüntü ile birleştirildi (%40 heatmap, %60 orijinal)
- Sonuç matplotlib ile gösterildi
# Test görüntüsünü al
img, label = test_gen[0][0][0], test_gen[0][1][0]
img_array = np.expand_dims(img, axis=0)
# Grad-CAM heatmap oluştur
heatmap = get_grad_cam_heatmap_seq(model, img_array, last_conv_layer)
# Heatmap'i orijinal görüntü ile birleştir
img_rgb = img.astype(np.uint8)
heatmap_resized = cv2.resize(heatmap, (img_rgb.shape[1], img_rgb.shape[0]))
heatmap_colored = cv2.applyColorMap(np.uint8(255*heatmap_resized), cv2.COLORMAP_JET)
superimposed_img = heatmap_colored * 0.4 + img_rgb
# Görselleştir
plt.imshow(superimposed_img.astype(np.uint8))
plt.axis('off')
plt.show()