Skip to content

Commit 1a3fae3

Browse files
authored
Merge pull request larymak#298 from mtnvdsk/codespace-mtnvdsk-ideal-space-waffle-vwjx5v7q4gq3pv6
Added the Lung cancer detection using CNN
2 parents 130a64d + 21c0ea4 commit 1a3fae3

File tree

5 files changed

+208
-0
lines changed

5 files changed

+208
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import matplotlib.pyplot as plt
2+
import pandas as pd
3+
import numpy as np
4+
import seaborn as sns
5+
import keras
6+
from keras.models import Sequential
7+
from keras.layers import Dense, Conv2D , MaxPool2D , Flatten , Dropout , BatchNormalization
8+
from keras.preprocessing.image import ImageDataGenerator
9+
from sklearn.model_selection import train_test_split
10+
from sklearn.metrics import classification_report,confusion_matrix
11+
from keras.callbacks import ReduceLROnPlateau
12+
import cv2
13+
import os
14+
15+
labels = ['PNEUMONIA', 'NORMAL']
16+
img_size = 150
17+
def get_training_data(data_dir):
18+
data = []
19+
for label in labels:
20+
path = os.path.join(data_dir, label)
21+
class_num = labels.index(label)
22+
for img in os.listdir(path):
23+
try:
24+
img_arr = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
25+
resized_arr = cv2.resize(img_arr, (img_size, img_size)) # Reshaping images to preferred size
26+
data.append([resized_arr, class_num])
27+
except Exception as e:
28+
print(e)
29+
return np.array(data)
30+
31+
train = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/train')
32+
test = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/test')
33+
val = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/val')
34+
35+
l = []
36+
for i in train:
37+
if(i[1] == 0):
38+
l.append("Pneumonia")
39+
else:
40+
l.append("Normal")
41+
sns.set_style('darkgrid')
42+
sns.countplot(l)
43+
44+
plt.figure(figsize = (5,5))
45+
plt.imshow(train[0][0], cmap='gray')
46+
plt.title(labels[train[0][1]])
47+
48+
plt.figure(figsize = (5,5))
49+
plt.imshow(train[-1][0], cmap='gray')
50+
plt.title(labels[train[-1][1]])
51+
52+
x_train = []
53+
y_train = []
54+
55+
x_val = []
56+
y_val = []
57+
58+
x_test = []
59+
y_test = []
60+
61+
for feature, label in train:
62+
x_train.append(feature)
63+
y_train.append(label)
64+
65+
for feature, label in test:
66+
x_test.append(feature)
67+
y_test.append(label)
68+
69+
for feature, label in val:
70+
x_val.append(feature)
71+
y_val.append(label)
72+
73+
x_train = np.array(x_train) / 255
74+
x_val = np.array(x_val) / 255
75+
x_test = np.array(x_test) / 255
76+
77+
x_train = x_train.reshape(-1, img_size, img_size, 1)
78+
y_train = np.array(y_train)
79+
80+
x_val = x_val.reshape(-1, img_size, img_size, 1)
81+
y_val = np.array(y_val)
82+
83+
x_test = x_test.reshape(-1, img_size, img_size, 1)
84+
y_test = np.array(y_test)
85+
86+
datagen = ImageDataGenerator(
87+
featurewise_center=False,
88+
samplewise_center=False,
89+
featurewise_std_normalization=False,
90+
samplewise_std_normalization=False,
91+
zca_whitening=False,
92+
rotation_range = 30,
93+
zoom_range = 0.2,
94+
width_shift_range=0.1,
95+
height_shift_range=0.1,
96+
horizontal_flip = True,
97+
vertical_flip=False)
98+
99+
100+
datagen.fit(x_train)
101+
102+
model = Sequential()
103+
model.add(Conv2D(32 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu' , input_shape = (150,150,1)))
104+
model.add(BatchNormalization())
105+
model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))
106+
model.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))
107+
model.add(Dropout(0.1))
108+
model.add(BatchNormalization())
109+
model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))
110+
model.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))
111+
model.add(BatchNormalization())
112+
model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))
113+
model.add(Conv2D(128 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))
114+
model.add(Dropout(0.2))
115+
model.add(BatchNormalization())
116+
model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))
117+
model.add(Conv2D(256 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu'))
118+
model.add(Dropout(0.2))
119+
model.add(BatchNormalization())
120+
model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same'))
121+
model.add(Flatten())
122+
model.add(Dense(units = 128 , activation = 'relu'))
123+
model.add(Dropout(0.2))
124+
model.add(Dense(units = 1 , activation = 'sigmoid'))
125+
model.compile(optimizer = "rmsprop" , loss = 'binary_crossentropy' , metrics = ['accuracy'])
126+
model.summary()
127+
128+
learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience = 2, verbose=1,factor=0.3, min_lr=0.000001)
129+
130+
history = model.fit(datagen.flow(x_train,y_train, batch_size = 32) ,epochs = 12 , validation_data = datagen.flow(x_val, y_val) ,callbacks = [learning_rate_reduction])
131+
132+
print("Loss of the model is - " , model.evaluate(x_test,y_test)[0])
133+
print("Accuracy of the model is - " , model.evaluate(x_test,y_test)[1]*100 , "%")
134+
135+
epochs = [i for i in range(12)]
136+
fig , ax = plt.subplots(1,2)
137+
train_acc = history.history['accuracy']
138+
train_loss = history.history['loss']
139+
val_acc = history.history['val_accuracy']
140+
val_loss = history.history['val_loss']
141+
fig.set_size_inches(20,10)
142+
143+
ax[0].plot(epochs , train_acc , 'go-' , label = 'Training Accuracy')
144+
ax[0].plot(epochs , val_acc , 'ro-' , label = 'Validation Accuracy')
145+
ax[0].set_title('Training & Validation Accuracy')
146+
ax[0].legend()
147+
ax[0].set_xlabel("Epochs")
148+
ax[0].set_ylabel("Accuracy")
149+
150+
ax[1].plot(epochs , train_loss , 'g-o' , label = 'Training Loss')
151+
ax[1].plot(epochs , val_loss , 'r-o' , label = 'Validation Loss')
152+
ax[1].set_title('Testing Accuracy & Loss')
153+
ax[1].legend()
154+
ax[1].set_xlabel("Epochs")
155+
ax[1].set_ylabel("Training & Validation Loss")
156+
plt.show()
157+
158+
predictions = model.predict(x_test)
159+
predictions = predictions.reshape(1,-1)[0]
160+
y_pred = np.where(predictions > 0.5,1,0)
161+
predictions[:15]
162+
163+
print(classification_report(y_test, y_pred, target_names = ['Pneumonia (Class 0)','Normal (Class 1)']))
164+
165+
cm = confusion_matrix(y_test,y_pred)
166+
cm
167+
168+
cm = pd.DataFrame(cm , index = ['0','1'] , columns = ['0','1'])
169+
170+
correct = np.nonzero(predictions == y_test)[0]
171+
incorrect = np.nonzero(predictions != y_test)[0]
172+
173+
i = 0
174+
for c in correct[:6]:
175+
plt.subplot(3,2,i+1)
176+
plt.xticks([])
177+
plt.yticks([])
178+
plt.imshow(x_test[c].reshape(150,150), cmap="gray", interpolation='none')
179+
plt.title("Predicted Class {},Actual Class {}".format(predictions[c], y_test[c]))
180+
plt.tight_layout()
181+
i += 1
182+
183+
i = 0
184+
for c in incorrect[:6]:
185+
plt.subplot(3,2,i+1)
186+
plt.xticks([])
187+
plt.yticks([])
188+
plt.imshow(x_test[c].reshape(150,150), cmap="gray", interpolation='none')
189+
plt.title("Predicted Class {},Actual Class {}".format(predictions[c], y_test[c]))
190+
plt.tight_layout()
191+
i += 1
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Detecting face from photo or camera
2+
___
3+
### Setup
4+
`pip install -r requirements.txt`
5+
6+
___
7+
### Usage
8+
`python3 main.py` Detection of lung cancer using CNN
9+
10+
___
11+
Here the data is taken from the kaggle.com
12+
13+
Dataset Link:https://www.kaggle.com/code/tarunm561/lung-cancer-detection-using-cnn/input
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pandas
2+
sea-born
3+
keras
4+
matplotlib

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy