Brain Tumor Classification
Brain Tumor Classification
# 0 - Tumor
# 1 - Normal
[26]: OneHotEncoder()
for r, d, f in os.walk(r'/kaggle/input/
↪brain-mri-images-for-brain-tumor-detection/yes'):
for file in f:
if '.jpg' in file:
paths.append(os.path.join(r, file))
1
img = Image.open(path)
img = img.resize((128,128))
img = np.array(img)
if(img.shape == (128,128,3)):
data.append(np.array(img))
result.append(encoder.transform([[0]]).toarray())
[28]: # This cell updates result list for images without tumor
paths = []
for r, d, f in os.walk(r"/kaggle/input/
↪brain-mri-images-for-brain-tumor-detection/no"):
for file in f:
if '.jpg' in file:
paths.append(os.path.join(r, file))
2
[36]: # Create a bar plot
plt.bar(labels, counts, color=colors)
plt.title('Distribution of Tumor and Normal Samples')
plt.xlabel('Class')
plt.ylabel('Count')
plt.show()
3
# Create a pie chart
plt.pie(counts, labels=labels, autopct='%1.1f%%', startangle=90, colors=colors)
plt.title('Distribution of Tumor and Normal Samples')
plt.show()
1 Model Building
[40]: model = Sequential()
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
4
model.add(Dropout(0.25))
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'))
print(model.summary())
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 128, 128, 32) 416
5
dropout_2 (Dropout) (None, 32, 32, 64) 0
=================================================================
Total params: 33585602 (128.12 MB)
Trainable params: 33585410 (128.12 MB)
Non-trainable params: 192 (768.00 Byte)
_________________________________________________________________
None
[41]: y_train.shape
[41]: (111, 2)
Epoch 1/30
3/3 [==============================] - 4s 993ms/step - loss: 24.8259 - accuracy:
0.5586 - val_loss: 24.8785 - val_accuracy: 0.6429
Epoch 2/30
3/3 [==============================] - 3s 911ms/step - loss: 10.7795 - accuracy:
0.7658 - val_loss: 52.9129 - val_accuracy: 0.5357
Epoch 3/30
3/3 [==============================] - 3s 1s/step - loss: 5.2803 - accuracy:
0.8108 - val_loss: 20.1909 - val_accuracy: 0.6071
Epoch 4/30
3/3 [==============================] - 3s 903ms/step - loss: 4.3104 - accuracy:
0.8468 - val_loss: 5.9880 - val_accuracy: 0.7857
Epoch 5/30
3/3 [==============================] - 3s 897ms/step - loss: 2.7308 - accuracy:
0.8198 - val_loss: 8.7455 - val_accuracy: 0.7500
Epoch 6/30
3/3 [==============================] - 3s 926ms/step - loss: 2.8426 - accuracy:
0.8649 - val_loss: 6.9631 - val_accuracy: 0.7857
Epoch 7/30
3/3 [==============================] - 3s 919ms/step - loss: 3.6575 - accuracy:
0.8739 - val_loss: 3.5022 - val_accuracy: 0.7500
Epoch 8/30
3/3 [==============================] - 3s 912ms/step - loss: 0.8377 - accuracy:
0.9550 - val_loss: 2.1859 - val_accuracy: 0.8571
6
Epoch 9/30
3/3 [==============================] - 3s 896ms/step - loss: 0.1041 - accuracy:
0.9730 - val_loss: 2.9074 - val_accuracy: 0.8571
Epoch 10/30
3/3 [==============================] - 3s 913ms/step - loss: 0.6969 - accuracy:
0.9730 - val_loss: 4.9856 - val_accuracy: 0.7500
Epoch 11/30
3/3 [==============================] - 3s 893ms/step - loss: 0.6225 - accuracy:
0.9279 - val_loss: 9.5634 - val_accuracy: 0.6786
Epoch 12/30
3/3 [==============================] - 3s 923ms/step - loss: 0.0299 - accuracy:
0.9820 - val_loss: 13.0166 - val_accuracy: 0.6429
Epoch 13/30
3/3 [==============================] - 3s 919ms/step - loss: 0.9034 - accuracy:
0.9459 - val_loss: 10.9552 - val_accuracy: 0.6786
Epoch 14/30
3/3 [==============================] - 3s 969ms/step - loss: 0.0088 - accuracy:
1.0000 - val_loss: 5.7940 - val_accuracy: 0.6786
Epoch 15/30
3/3 [==============================] - 3s 909ms/step - loss: 0.1493 - accuracy:
0.9910 - val_loss: 2.7623 - val_accuracy: 0.8929
Epoch 16/30
3/3 [==============================] - 3s 918ms/step - loss: 0.0491 - accuracy:
0.9820 - val_loss: 1.5802 - val_accuracy: 0.9286
Epoch 17/30
3/3 [==============================] - 3s 918ms/step - loss: 0.1676 - accuracy:
0.9820 - val_loss: 1.2122 - val_accuracy: 0.9286
Epoch 18/30
3/3 [==============================] - 3s 926ms/step - loss: 0.0321 - accuracy:
0.9820 - val_loss: 1.3319 - val_accuracy: 0.9286
Epoch 19/30
3/3 [==============================] - 3s 923ms/step - loss: 0.0052 - accuracy:
1.0000 - val_loss: 1.7577 - val_accuracy: 0.8929
Epoch 20/30
3/3 [==============================] - 3s 890ms/step - loss: 5.0721e-06 -
accuracy: 1.0000 - val_loss: 2.2900 - val_accuracy: 0.8929
Epoch 21/30
3/3 [==============================] - 3s 901ms/step - loss: 2.4730e-04 -
accuracy: 1.0000 - val_loss: 2.6473 - val_accuracy: 0.8929
Epoch 22/30
3/3 [==============================] - 3s 910ms/step - loss: 0.0033 - accuracy:
1.0000 - val_loss: 2.9575 - val_accuracy: 0.8571
Epoch 23/30
3/3 [==============================] - 3s 894ms/step - loss: 8.8237e-04 -
accuracy: 1.0000 - val_loss: 3.2664 - val_accuracy: 0.8571
Epoch 24/30
3/3 [==============================] - 3s 901ms/step - loss: 1.6099e-05 -
accuracy: 1.0000 - val_loss: 3.4935 - val_accuracy: 0.8214
7
Epoch 25/30
3/3 [==============================] - 3s 912ms/step - loss: 2.3977e-04 -
accuracy: 1.0000 - val_loss: 3.6547 - val_accuracy: 0.7857
Epoch 26/30
3/3 [==============================] - 3s 975ms/step - loss: 0.0020 - accuracy:
1.0000 - val_loss: 3.8493 - val_accuracy: 0.7857
Epoch 27/30
3/3 [==============================] - 3s 890ms/step - loss: 0.2364 - accuracy:
0.9550 - val_loss: 3.1200 - val_accuracy: 0.8214
Epoch 28/30
3/3 [==============================] - 3s 917ms/step - loss: 1.9975e-07 -
accuracy: 1.0000 - val_loss: 2.3774 - val_accuracy: 0.8571
Epoch 29/30
3/3 [==============================] - 3s 895ms/step - loss: 0.1725 - accuracy:
0.9910 - val_loss: 2.1835 - val_accuracy: 0.8929
Epoch 30/30
3/3 [==============================] - 3s 909ms/step - loss: 4.9021e-05 -
accuracy: 1.0000 - val_loss: 2.0379 - val_accuracy: 0.8929
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.grid(True)
plt.show()
8
1.1 Just Checking the Model
[46]: def names(number):
if number==0:
return 'Its a Tumor'
else:
return 'No, Its not a tumor'
x = np.array(img.resize((128,128)))
x = x.reshape(1,128,128,3)
res = model.predict_on_batch(x)
classification = np.where(res == np.amax(res))[1][0]
imshow(img)
print(str(res[0][classification]*100) + '% Confidence This Is ' +␣
↪names(classification))
9
[51]: from matplotlib.pyplot import imshow
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)
res = model.predict_on_batch(x)
classification = np.where(res == np.amax(res))[1][0]
imshow(img)
print(str(res[0][classification]*100) + '% Confidence This Is A ,' +␣
↪names(classification))
10
1.2 Accuracy, Precision, recall, and F1 score
[56]: from sklearn.metrics import precision_score, recall_score, f1_score,␣
↪accuracy_score
print("Accuracy: {:.4f}".format(accuracy))
print("Precision: {:.4f}".format(precision))
print("Recall: {:.4f}".format(recall))
11
print("F1 Score: {:.4f}".format(f1))
12