Brain Tumor Detection Localization 1682362328
Brain Tumor Detection Localization 1682362328
ipynb - Colaboratory
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import zipfile
import cv2
from skimage import io
import tensorflow as tf
from tensorflow.python.keras import Sequential
from tensorflow.keras import layers, optimizers
from tensorflow.keras.applications import DenseNet121
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, load_model
from tensorflow.keras.initializers import glorot_uniform
from tensorflow.keras.utils import plot_model
from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint, Learni
from IPython.display import display
from tensorflow.keras import backend as KAA
from sklearn.preprocessing import StandardScaler, normalize
import os
import glob
import random
from google.colab import files #library to upload files to colab notebook
%matplotlib inline
brain_df = pd.read_csv('data_mask.csv')
brain_df
patient_id image_path
Data Visualization
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 1/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
2500
2000
1500
1000
500
0
−0.5 0 0.5
fig.tight_layout()
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 2/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 3/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
VAL_SPLIT = 0.15
IMAGE_SIZE = 256
IMAGE_CHAN = 3
BATCH_SIZE = 16
# Create a data generator which scales the data from 0 to 1 and makes validation split of 0.15
datagen = ImageDataGenerator(rescale=1./255., validation_split = VAL_SPLIT)
train_generator=datagen.flow_from_dataframe(
dataframe=train,
directory= './',
x_col='image_path',
y_col='mask',
subset="training",
batch_size=BATCH_SIZE,
shuffle=True,
class_mode="categorical",
target_size=(IMAGE_SIZE,IMAGE_SIZE))
valid_generator=datagen.flow_from_dataframe(
dataframe=train,
directory= './',
x_col='image_path',
y_col='mask',
subset="validation",
batch_size=BATCH_SIZE,
shuffle=True,
class_mode="categorical",
target_size=(IMAGE_SIZE,IMAGE_SIZE))
test_generator=test_datagen.flow_from_dataframe(
dataframe=test,
directory= './',
x_col='image_path',
y_col='mask',
batch_size=BATCH_SIZE,
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 4/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
shuffle=False,
class_mode='categorical',
target_size=(IMAGE_SIZE,IMAGE_SIZE))
basemodel.summary()
Model: "resnet50"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 256, 256, 3 0 []
)]
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 5/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
headmodel = basemodel.output
headmodel = AveragePooling2D(pool_size = (4,4))(headmodel)
headmodel = Flatten(name= 'flatten')(headmodel)
headmodel = Dense(256, activation = "relu")(headmodel)
headmodel = Dropout(0.3)(headmodel)#
headmodel = Dense(256, activation = "relu")(headmodel)
headmodel = Dropout(0.3)(headmodel)
headmodel = Dense(2, activation = 'sigmoid')(headmodel)
class earlyStopAcc(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
if logs.get('accuracy') >= 0.99:
self.model.stop_training = True
print('Reached 99% accuracy, stopping training.')
callbacks = earlyStopAcc()
Epoch 1/10
178/178 [==============================] - ETA: 0s - loss: 0.8047 - accuracy: 0.7288
Epoch 1: val_loss improved from inf to 0.68236, saving model to classifier-resnet-weights.hdf5
178/178 [==============================] - 2327s 13s/step - loss: 0.8047 - accuracy: 0.7288 - val_loss: 0.6824 - val_accuracy: 0.62
Epoch 2/10
178/178 [==============================] - ETA: 0s - loss: 0.4264 - accuracy: 0.8137
Epoch 2: val_loss did not improve from 0.68236
178/178 [==============================] - 40s 226ms/step - loss: 0.4264 - accuracy: 0.8137 - val_loss: 0.8954 - val_accuracy: 0.62
Epoch 3/10
178/178 [==============================] - ETA: 0s - loss: 0.3463 - accuracy: 0.8549
Epoch 3: val_loss did not improve from 0.68236
178/178 [==============================] - 40s 226ms/step - loss: 0.3463 - accuracy: 0.8549 - val_loss: 9.0716 - val_accuracy: 0.62
Epoch 4/10
178/178 [==============================] - ETA: 0s - loss: 0.2921 - accuracy: 0.8824
Epoch 4: val_loss did not improve from 0.68236
178/178 [==============================] - 40s 226ms/step - loss: 0.2921 - accuracy: 0.8824 - val_loss: 1.3434 - val_accuracy: 0.62
Epoch 5/10
178/178 [==============================] - ETA: 0s - loss: 0.2712 - accuracy: 0.8961
Epoch 5: val_loss did not improve from 0.68236
178/178 [==============================] - 40s 226ms/step - loss: 0.2712 - accuracy: 0.8961 - val_loss: 1.1871 - val_accuracy: 0.62
Epoch 6/10
178/178 [==============================] - ETA: 0s - loss: 0.2206 - accuracy: 0.9151
Epoch 6: val_loss improved from 0.68236 to 0.28902, saving model to classifier-resnet-weights.hdf5
178/178 [==============================] - 45s 252ms/step - loss: 0.2206 - accuracy: 0.9151 - val_loss: 0.2890 - val_accuracy: 0.88
Epoch 7/10
178/178 [==============================] - ETA: 0s - loss: 0.1893 - accuracy: 0.9253
Epoch 7: val_loss did not improve from 0.28902
178/178 [==============================] - 41s 227ms/step - loss: 0.1893 - accuracy: 0.9253 - val_loss: 0.4487 - val_accuracy: 0.84
Epoch 8/10
178/178 [==============================] - ETA: 0s - loss: 0.2275 - accuracy: 0.9172
Epoch 8: val_loss did not improve from 0.28902
178/178 [==============================] - 41s 228ms/step - loss: 0.2275 - accuracy: 0.9172 - val_loss: 0.3519 - val_accuracy: 0.86
Epoch 9/10
178/178 [==============================] - ETA: 0s - loss: 0.1981 - accuracy: 0.9267
Epoch 9: val_loss did not improve from 0.28902
178/178 [==============================] - 41s 228ms/step - loss: 0.1981 - accuracy: 0.9267 - val_loss: 0.3746 - val_accuracy: 0.92
Epoch 10/10
178/178 [==============================] - ETA: 0s - loss: 0.1586 - accuracy: 0.9465
Epoch 10: val_loss improved from 0.28902 to 0.25490, saving model to classifier-resnet-weights.hdf5
178/178 [==============================] - 45s 252ms/step - loss: 0.1586 - accuracy: 0.9465 - val_loss: 0.2549 - val_accuracy: 0.92
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 6/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
fig , ax = plt.subplots(1,2)
train_acc = history.history['accuracy']
train_loss = history.history['loss']
fig.set_size_inches(12,4)
ax[0].plot(history.history['accuracy'])
ax[0].plot(history.history['val_accuracy'])
ax[0].set_title('Training Accuracy vs Validation Accuracy')
ax[0].set_ylabel('Accuracy')
ax[0].set_xlabel('Epoch')
ax[0].legend(['Train', 'Validation'], loc='upper left')
ax[1].plot(history.history['loss'])
ax[1].plot(history.history['val_loss'])
ax[1].set_title('Training Loss vs Validation Loss')
ax[1].set_ylabel('Loss')
ax[1].set_xlabel('Epoch')
ax[1].legend(['Train', 'Validation'], loc='upper left')
plt.show()
test_predict
array([[5.2313250e-01, 4.7567496e-01],
[3.3152360e-01, 5.3402841e-01],
[9.9842691e-01, 3.2981671e-04],
...,
[9.9970090e-01, 3.8473314e-05],
[1.8170524e-06, 9.8368144e-01],
[5.1167026e-02, 6.9102901e-01]], dtype=float32)
for i in test_predict:
predict.append(str(np.argmax(i)))
predict = np.asarray(predict)
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 7/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
len(predict)
576
original = np.asarray(test['mask'])[:len(predict)]
len(original)
576
cm = confusion_matrix(original, predict)
plt.figure(figsize = (7,7))
sns.heatmap(cm, annot=True)
<Axes: >
/usr/local/lib/python3.9/dist-packages/numpy/lib/arraysetops.py:604: FutureWarning:
elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
/usr/local/lib/python3.9/dist-packages/numpy/lib/arraysetops.py:604: FutureWarning:
elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
/usr/local/lib/python3.9/dist-packages/numpy/lib/arraysetops.py:604: FutureWarning:
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 8/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
/usr/local/lib/python3.9/dist-packages/numpy/lib/arraysetops.py:604: FutureWarning:
elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
brain_df_mask = pd.read_csv('brain_df_mask.csv')
brain_df_mask
Unnamed:
patient_id image_path
0
val_ids = list(X_val.image_path)
val_mask= list(X_val.mask_path)
import keras
class DataGenerator(keras.utils.Sequence):
def __init__(self, image_filenames, mask_filenames, batch_size=32):
self.image_filenames = image_filenames
self.mask_filenames = mask_filenames
self.batch_size = batch_size
def __len__(self):
return (np.ceil(len(self.image_filenames) / float(self.batch_size))).astype(np.int)
training_generator = DataGenerator(train_ids,train_mask)
validation_generator = DataGenerator(val_ids,val_mask)
# main path
X = Conv2D(f, kernel_size = (1,1) ,strides = (1,1),kernel_initializer ='he_normal')(X)
X = BatchNormalization()(X)
X = Activation('relu')(X)
# Short path
X_copy = Conv2D(f, kernel_size = (1,1), strides =(1,1), kernel_initializer ='he_normal')(X_cop
X_copy = BatchNormalization()(X_copy)
# Adding the output from main path and short path together
X = Add()([X,X_copy])
X = Activation('relu')(X)
return X
return merge
input_shape = (256,256,3)
X_input = Input(input_shape)
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 10/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
# Final Output
output = Conv2D(1, (1,1), padding = "same", activation = "sigmoid")(up_4)
model_seg.summary()
'batch_normalization_13[0][0]']
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 11/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
import tensorflow as tf
@tf.function
def focal_tversky(y_true, y_pred):
alpha = 0.7
beta = 0.3
smooth = 1e-6
return focal_tversky_loss
`np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify a
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
Epoch 1/100
37/37 [==============================] - ETA: 0s - loss: 0.9647 - tversky: 0.1453
Epoch 1: val_loss improved from 0.97449 to 0.97357, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 379ms/step - loss: 0.9647 - tversky: 0.1453 - val_loss: 0.9736 - val_tversky: 0.109
Epoch 2/100
37/37 [==============================] - ETA: 0s - loss: 0.9640 - tversky: 0.1481
Epoch 2: val_loss improved from 0.97357 to 0.97245, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 15s 401ms/step - loss: 0.9640 - tversky: 0.1481 - val_loss: 0.9724 - val_tversky: 0.1140
Epoch 3/100
37/37 [==============================] - ETA: 0s - loss: 0.9633 - tversky: 0.1506
Epoch 3: val_loss improved from 0.97245 to 0.97120, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 387ms/step - loss: 0.9633 - tversky: 0.1506 - val_loss: 0.9712 - val_tversky: 0.1190
Epoch 4/100
37/37 [==============================] - ETA: 0s - loss: 0.9627 - tversky: 0.1530
Epoch 4: val_loss improved from 0.97120 to 0.96986, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 381ms/step - loss: 0.9627 - tversky: 0.1530 - val_loss: 0.9699 - val_tversky: 0.124
Epoch 5/100
37/37 [==============================] - ETA: 0s - loss: 0.9620 - tversky: 0.1554
Epoch 5: val_loss improved from 0.96986 to 0.96844, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 379ms/step - loss: 0.9620 - tversky: 0.1554 - val_loss: 0.9684 - val_tversky: 0.1299
Epoch 6/100
37/37 [==============================] - ETA: 0s - loss: 0.9614 - tversky: 0.1577
Epoch 6: val_loss improved from 0.96844 to 0.96688, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 381ms/step - loss: 0.9614 - tversky: 0.1577 - val_loss: 0.9669 - val_tversky: 0.1360
Epoch 7/100
37/37 [==============================] - ETA: 0s - loss: 0.9608 - tversky: 0.1601
Epoch 7: val_loss improved from 0.96688 to 0.96539, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 381ms/step - loss: 0.9608 - tversky: 0.1601 - val_loss: 0.9654 - val_tversky: 0.141
Epoch 8/100
37/37 [==============================] - ETA: 0s - loss: 0.9601 - tversky: 0.1624
Epoch 8: val_loss improved from 0.96539 to 0.96415, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 382ms/step - loss: 0.9601 - tversky: 0.1624 - val_loss: 0.9641 - val_tversky: 0.1464
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 12/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
Epoch 9/100
37/37 [==============================] - ETA: 0s - loss: 0.9595 - tversky: 0.1648
Epoch 9: val_loss improved from 0.96415 to 0.96315, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 379ms/step - loss: 0.9595 - tversky: 0.1648 - val_loss: 0.9632 - val_tversky: 0.150
Epoch 10/100
37/37 [==============================] - ETA: 0s - loss: 0.9588 - tversky: 0.1672
Epoch 10: val_loss improved from 0.96315 to 0.96234, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 15s 387ms/step - loss: 0.9588 - tversky: 0.1672 - val_loss: 0.9623 - val_tversky: 0.1530
Epoch 11/100
37/37 [==============================] - ETA: 0s - loss: 0.9581 - tversky: 0.1696
Epoch 11: val_loss improved from 0.96234 to 0.96165, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 384ms/step - loss: 0.9581 - tversky: 0.1696 - val_loss: 0.9616 - val_tversky: 0.155
Epoch 12/100
37/37 [==============================] - ETA: 0s - loss: 0.9574 - tversky: 0.1721
Epoch 12: val_loss improved from 0.96165 to 0.96097, saving model to ResUNet-weights.hdf5
37/37 [==============================] - 14s 382ms/step - loss: 0.9574 - tversky: 0.1721 - val_loss: 0.9610 - val_tversky: 0.1580
Epoch 13/100
37/37 [==============================] - ETA: 0s - loss: 0.9567 - tversky: 0.1746
Epoch 13: val loss improved from 0 96097 to 0 96034 saving model to ResUNet weights hdf5
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 13/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
1/1 [==============================] - 0s 229ms/step
1/1 [==============================] - 0s 241ms/step
1/1 [==============================] - 0s 234ms/step
1/1 [==============================] - 0s 222ms/step
1/1 [==============================] - 0s 402ms/step
1/1 [==============================] - 0s 418ms/step
1/1 [==============================] - 0s 281ms/step
1/1 [==============================] - 0s 420ms/step
1/1 [==============================] - 0s 227ms/step
1/1 [ ] 0 139 / t
0 TCGA_DU_A5TU_19980312/TCGA_DU_A5TU_19980312_2.tif No mask 0
[[[[1.0467481e-06], [5.357521e-06],
1 TCGA_CS_5393_19990606/TCGA_CS_5393_19990606_11... 1
[1.1778262...
2 TCGA_CS_6186_20000601/TCGA_CS_6186_20000601_12... No mask 0
3 TCGA_DU_A5TT_19980318/TCGA_DU_A5TT_19980318_32... No mask 0
[[[[8.7850566e-07], [3.1529933e-06],
4 TCGA_HT_7608_19940304/TCGA_HT_7608_19940304_16... 1
[5.1284e-...
[[[[7.233639e-07], [2.7730584e-06],
585 TCGA_HT_7684_19950816/TCGA_HT_7684_19950816_19... 1
[5.9065937...
[[[[7.142406e-07], [2.5996076e-06],
586 TCGA_HT_A61A_20000127/TCGA_HT_A61A_20000127_41... 1
[4.7269205...
patient_id image_path
count = 0
fig, axs = plt.subplots(10, 5, figsize=(30, 50))
for i in range(len(df_pred)):
if df_pred['has_mask'][i] == 1 and count < 10:
# read the images and convert them to RGB format
img = io.imread(df_pred.image_path[i])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
axs[count][0].title.set_text("Brain MRI")
axs[count][0].imshow(img)
img_ = io.imread(df_pred.image_path[i])
img_ = cv2.cvtColor(img_, cv2.COLOR_BGR2RGB)
img_[predicted_mask == 1] = (0, 255, 0)
axs[count][4].title.set_text("MRI with AI Predicted Mask")
axs[count][4].imshow(img_)
count += 1
fig.tight_layout()
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 15/16
18/04/2023 14:50 Brain Tumor Detection & Localization.ipynb - Colaboratory
https://colab.research.google.com/drive/1U0v3vdem32O7v-qf2-zwiA60sfZlTed2#scrollTo=jr5Bz-_SMr0k&printMode=true 16/16