diff --git a/MachineLearning Projects/Lung Cancer Detection using CNN/Lung Cancer Detection Using CNN b/MachineLearning Projects/Lung Cancer Detection using CNN/Lung Cancer Detection Using CNN new file mode 100644 index 00000000..4cefff8b --- /dev/null +++ b/MachineLearning Projects/Lung Cancer Detection using CNN/Lung Cancer Detection Using CNN @@ -0,0 +1,191 @@ +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np +import seaborn as sns +import keras +from keras.models import Sequential +from keras.layers import Dense, Conv2D , MaxPool2D , Flatten , Dropout , BatchNormalization +from keras.preprocessing.image import ImageDataGenerator +from sklearn.model_selection import train_test_split +from sklearn.metrics import classification_report,confusion_matrix +from keras.callbacks import ReduceLROnPlateau +import cv2 +import os + +labels = ['PNEUMONIA', 'NORMAL'] +img_size = 150 +def get_training_data(data_dir): + data = [] + for label in labels: + path = os.path.join(data_dir, label) + class_num = labels.index(label) + for img in os.listdir(path): + try: + img_arr = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE) + resized_arr = cv2.resize(img_arr, (img_size, img_size)) # Reshaping images to preferred size + data.append([resized_arr, class_num]) + except Exception as e: + print(e) + return np.array(data) + +train = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/train') +test = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/test') +val = get_training_data('/content/drive/MyDrive/chest-xray-pneumonia/chest_xray/val') + +l = [] +for i in train: + if(i[1] == 0): + l.append("Pneumonia") + else: + l.append("Normal") +sns.set_style('darkgrid') +sns.countplot(l) + +plt.figure(figsize = (5,5)) +plt.imshow(train[0][0], cmap='gray') +plt.title(labels[train[0][1]]) + +plt.figure(figsize = (5,5)) +plt.imshow(train[-1][0], cmap='gray') +plt.title(labels[train[-1][1]]) + +x_train = [] +y_train = [] + +x_val = [] +y_val = [] + +x_test = [] +y_test = [] + +for feature, label in train: + x_train.append(feature) + y_train.append(label) + +for feature, label in test: + x_test.append(feature) + y_test.append(label) + +for feature, label in val: + x_val.append(feature) + y_val.append(label) + +x_train = np.array(x_train) / 255 +x_val = np.array(x_val) / 255 +x_test = np.array(x_test) / 255 + +x_train = x_train.reshape(-1, img_size, img_size, 1) +y_train = np.array(y_train) + +x_val = x_val.reshape(-1, img_size, img_size, 1) +y_val = np.array(y_val) + +x_test = x_test.reshape(-1, img_size, img_size, 1) +y_test = np.array(y_test) + +datagen = ImageDataGenerator( + featurewise_center=False, + samplewise_center=False, + featurewise_std_normalization=False, + samplewise_std_normalization=False, + zca_whitening=False, + rotation_range = 30, + zoom_range = 0.2, + width_shift_range=0.1, + height_shift_range=0.1, + horizontal_flip = True, + vertical_flip=False) + + +datagen.fit(x_train) + +model = Sequential() +model.add(Conv2D(32 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu' , input_shape = (150,150,1))) +model.add(BatchNormalization()) +model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same')) +model.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu')) +model.add(Dropout(0.1)) +model.add(BatchNormalization()) +model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same')) +model.add(Conv2D(64 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu')) +model.add(BatchNormalization()) +model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same')) +model.add(Conv2D(128 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu')) +model.add(Dropout(0.2)) +model.add(BatchNormalization()) +model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same')) +model.add(Conv2D(256 , (3,3) , strides = 1 , padding = 'same' , activation = 'relu')) +model.add(Dropout(0.2)) +model.add(BatchNormalization()) +model.add(MaxPool2D((2,2) , strides = 2 , padding = 'same')) +model.add(Flatten()) +model.add(Dense(units = 128 , activation = 'relu')) +model.add(Dropout(0.2)) +model.add(Dense(units = 1 , activation = 'sigmoid')) +model.compile(optimizer = "rmsprop" , loss = 'binary_crossentropy' , metrics = ['accuracy']) +model.summary() + +learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience = 2, verbose=1,factor=0.3, min_lr=0.000001) + +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]) + +print("Loss of the model is - " , model.evaluate(x_test,y_test)[0]) +print("Accuracy of the model is - " , model.evaluate(x_test,y_test)[1]*100 , "%") + +epochs = [i for i in range(12)] +fig , ax = plt.subplots(1,2) +train_acc = history.history['accuracy'] +train_loss = history.history['loss'] +val_acc = history.history['val_accuracy'] +val_loss = history.history['val_loss'] +fig.set_size_inches(20,10) + +ax[0].plot(epochs , train_acc , 'go-' , label = 'Training Accuracy') +ax[0].plot(epochs , val_acc , 'ro-' , label = 'Validation Accuracy') +ax[0].set_title('Training & Validation Accuracy') +ax[0].legend() +ax[0].set_xlabel("Epochs") +ax[0].set_ylabel("Accuracy") + +ax[1].plot(epochs , train_loss , 'g-o' , label = 'Training Loss') +ax[1].plot(epochs , val_loss , 'r-o' , label = 'Validation Loss') +ax[1].set_title('Testing Accuracy & Loss') +ax[1].legend() +ax[1].set_xlabel("Epochs") +ax[1].set_ylabel("Training & Validation Loss") +plt.show() + +predictions = model.predict(x_test) +predictions = predictions.reshape(1,-1)[0] +y_pred = np.where(predictions > 0.5,1,0) +predictions[:15] + +print(classification_report(y_test, y_pred, target_names = ['Pneumonia (Class 0)','Normal (Class 1)'])) + +cm = confusion_matrix(y_test,y_pred) +cm + +cm = pd.DataFrame(cm , index = ['0','1'] , columns = ['0','1']) + +correct = np.nonzero(predictions == y_test)[0] +incorrect = np.nonzero(predictions != y_test)[0] + +i = 0 +for c in correct[:6]: + plt.subplot(3,2,i+1) + plt.xticks([]) + plt.yticks([]) + plt.imshow(x_test[c].reshape(150,150), cmap="gray", interpolation='none') + plt.title("Predicted Class {},Actual Class {}".format(predictions[c], y_test[c])) + plt.tight_layout() + i += 1 + +i = 0 +for c in incorrect[:6]: + plt.subplot(3,2,i+1) + plt.xticks([]) + plt.yticks([]) + plt.imshow(x_test[c].reshape(150,150), cmap="gray", interpolation='none') + plt.title("Predicted Class {},Actual Class {}".format(predictions[c], y_test[c])) + plt.tight_layout() + i += 1 diff --git a/MachineLearning Projects/Lung Cancer Detection using CNN/output1.png b/MachineLearning Projects/Lung Cancer Detection using CNN/output1.png new file mode 100644 index 00000000..689ff6e9 Binary files /dev/null and b/MachineLearning Projects/Lung Cancer Detection using CNN/output1.png differ diff --git a/MachineLearning Projects/Lung Cancer Detection using CNN/output2.png b/MachineLearning Projects/Lung Cancer Detection using CNN/output2.png new file mode 100644 index 00000000..ca843cec Binary files /dev/null and b/MachineLearning Projects/Lung Cancer Detection using CNN/output2.png differ diff --git a/MachineLearning Projects/Lung Cancer Detection using CNN/readme.md b/MachineLearning Projects/Lung Cancer Detection using CNN/readme.md new file mode 100644 index 00000000..3c9a881d --- /dev/null +++ b/MachineLearning Projects/Lung Cancer Detection using CNN/readme.md @@ -0,0 +1,13 @@ +# Detecting face from photo or camera +___ +### Setup +`pip install -r requirements.txt` + +___ +### Usage +`python3 main.py` Detection of lung cancer using CNN + +___ +Here the data is taken from the kaggle.com + +Dataset Link:https://www.kaggle.com/code/tarunm561/lung-cancer-detection-using-cnn/input \ No newline at end of file diff --git a/MachineLearning Projects/Lung Cancer Detection using CNN/requirements.txt b/MachineLearning Projects/Lung Cancer Detection using CNN/requirements.txt new file mode 100644 index 00000000..94897dbc --- /dev/null +++ b/MachineLearning Projects/Lung Cancer Detection using CNN/requirements.txt @@ -0,0 +1,4 @@ +pandas +sea-born +keras +matplotlib \ No newline at end of file