Beyin Tümörü MRI CNN
Amaç
MRI taramalarında beyin tümörlerini tespit etmek için Evrişimli Sinir Ağlarını kullanımı. Umarım yapılan bu çalışma gelecekte tıbbi görüntüleme teşhisini otomatik hale getirilebilir veya en azından doktorlara ikinci bir görüş sağlayabilir.
Girdiler ve Çıktılar
Girdi [1]:
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D, Conv3D, BatchNormalization
from keras import backend as K
import os
from PIL import Image
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import pandas as pd
TensorFlow backend kullanımı.
Girdi [3]:
/opt/conda/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py:415: FutureWarning: The handling of integer data will change in version 0.22. Currently, the categories are determined based on the range [0, max(values)], while in the future they will be determined based on the unique values. If you want the future behaviour and silence this warning, you can specify "categories='auto'". In case you used a LabelEncoder before this OneHotEncoder to convert the categories to integers, then you can now use the OneHotEncoder directly. warnings.warn(msg, FutureWarning)
Girdi [4]:
data = []
paths = []
ans = []
for r, d, f in os.walk(r'../input/brain-mri-images-for-brain-tumor-detection/yes'):
for file in f:
if '.jpg' in file:
paths.append(os.path.join(r, file))
for path in paths:
img = Image.open(path)
x = img.resize((128,128))
x = np.array(x)
if(x.shape == (128,128,3)):
data.append(np.array(x))
ans.append(enc.transform([[0]]).toarray())
Girdi [5]:
paths = []
for r, d, f in os.walk(r"../input/brain-mri-images-for-brain-tumor-detection/no"):
for file in f:
if '.jpg' in file:
paths.append(os.path.join(r, file))
for path in paths:
img = Image.open(path)
x = img.resize((128,128))
x = np.array(x)
if(x.shape == (128,128,3)):
data.append(np.array(x))
ans.append(enc.transform([[1]]).toarray())
Girdi [8]:
model = Sequential()
model.add(Conv2D(32, kernel_size=(2, 2), input_shape=(128, 128, 3), padding = 'Same'))
model.add(Conv2D(32, kernel_size=(2, 2), activation ='selu', padding = 'Same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, kernel_size = (2,2), activation ='selu', padding = 'Same'))
model.add(Conv2D(64, kernel_size = (2,2), activation ='selu', padding = 'Same'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
model.compile(loss = "categorical_crossentropy", optimizer='Adamax')
print(model.summary())
Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 128, 128, 32) 416 _________________________________________________________________ conv2d_2 (Conv2D) (None, 128, 128, 32) 4128 _________________________________________________________________ batch_normalization_1 (Batch (None, 128, 128, 32) 128 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 64, 64, 32) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 64, 64, 32) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 64, 64, 64) 8256 _________________________________________________________________ conv2d_4 (Conv2D) (None, 64, 64, 64) 16448 _________________________________________________________________ batch_normalization_2 (Batch (None, 64, 64, 64) 256 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 32, 32, 64) 0 _________________________________________________________________ dropout_2 (Dropout) (None, 32, 32, 64) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 65536) 0 _________________________________________________________________ dense_1 (Dense) (None, 512) 33554944 _________________________________________________________________ dropout_3 (Dropout) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 2) 1026 ================================================================= Total params: 33,585,602 Trainable params: 33,585,410 Non-trainable params: 192 _________________________________________________________________ None
Girdi [10]:
Train on 111 samples, validate on 28 samples Epoch 1/30 111/111 [==============================] - 5s 49ms/step - loss: 97.9745 - val_loss: 277.9749 Epoch 2/30 111/111 [==============================] - 0s 2ms/step - loss: 86.0070 - val_loss: 161.2324 Epoch 3/30 111/111 [==============================] - 0s 2ms/step - loss: 44.8761 - val_loss: 22.8152 Epoch 4/30 111/111 [==============================] - 0s 2ms/step - loss: 22.8710 - val_loss: 13.1432 Epoch 5/30 111/111 [==============================] - 0s 2ms/step - loss: 12.6436 - val_loss: 25.8424 Epoch 6/30 111/111 [==============================] - 0s 2ms/step - loss: 8.0254 - val_loss: 15.9823 Epoch 7/30 111/111 [==============================] - 0s 2ms/step - loss: 5.6897 - val_loss: 6.6303 Epoch 8/30 111/111 [==============================] - 0s 2ms/step - loss: 2.4485 - val_loss: 4.8793 Epoch 9/30 111/111 [==============================] - 0s 2ms/step - loss: 0.9813 - val_loss: 4.9282 Epoch 10/30 111/111 [==============================] - 0s 2ms/step - loss: 1.8591 - val_loss: 5.8082 Epoch 11/30 111/111 [==============================] - 0s 2ms/step - loss: 1.8579 - val_loss: 4.9097 Epoch 12/30 111/111 [==============================] - 0s 2ms/step - loss: 0.9552 - val_loss: 4.0293 Epoch 13/30 111/111 [==============================] - 0s 2ms/step - loss: 0.6528 - val_loss: 3.9330 Epoch 14/30 111/111 [==============================] - 0s 2ms/step - loss: 0.4592 - val_loss: 4.3758 Epoch 15/30 111/111 [==============================] - 0s 2ms/step - loss: 0.3196 - val_loss: 5.1238 Epoch 16/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0131 - val_loss: 5.3396 Epoch 17/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1137 - val_loss: 4.8185 Epoch 18/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1940 - val_loss: 3.8550 Epoch 19/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1083 - val_loss: 3.0845 Epoch 20/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0706 - val_loss: 3.0981 Epoch 21/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1765 - val_loss: 3.4054 Epoch 22/30 111/111 [==============================] - 0s 2ms/step - loss: 0.3862 - val_loss: 3.5916 Epoch 23/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0132 - val_loss: 3.7866 Epoch 24/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0541 - val_loss: 3.7140 Epoch 25/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1772 - val_loss: 2.8360 Epoch 26/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0022 - val_loss: 2.1522 Epoch 27/30 111/111 [==============================] - 0s 2ms/step - loss: 6.7226e-04 - val_loss: 2.1731 Epoch 28/30 111/111 [==============================] - 0s 2ms/step - loss: 0.1826 - val_loss: 2.2111 Epoch 29/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0385 - val_loss: 2.5520 Epoch 30/30 111/111 [==============================] - 0s 2ms/step - loss: 0.0615 - val_loss: 3.0602
Girdi [12]:
img = Image.open(r"../input/brain-mri-images-for-brain-tumor-detection/no/N17.jpg")
x = np.array(img.resize((128,128)))
x = x.reshape(1,128,128,3)
answ = model.predict_on_batch(x)
classification = np.where(answ == np.amax(answ))[1][0]
imshow(img)
print(str(answ[0][classification]*100) + '% Confidence This Is ' + names(classification))
100.0% Bu Normal
Girdi [13]:
img = Image.open(r"../input/brain-mri-images-for-brain-tumor-detection/yes/Y3.jpg")
x = np.array(img.resize((128,128)))
x = x.reshape(1,128,128,3)
answ = model.predict_on_batch(x)
classification = np.where(answ == np.amax(answ))[1][0]
imshow(img)
print(str(answ[0][classification]*100) + '% Confidence This Is A ' + names(classification))
100.0% Bu Bir Tümör