|
import tensorflow as tf |
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator |
|
from tensorflow.keras.models import Sequential |
|
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout |
|
import matplotlib.pyplot as plt |
|
from tensorflow.keras.applications import MobileNetV2 |
|
from tensorflow.keras.models import Sequential |
|
from tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D |
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator |
|
from sklearn.metrics import classification_report, roc_auc_score, roc_curve, auc |
|
from sklearn.utils.class_weight import compute_class_weight |
|
from sklearn.metrics import roc_auc_score |
|
from tensorflow.keras.callbacks import EarlyStopping |
|
from tensorflow.keras import regularizers |
|
from tensorflow.keras.preprocessing import image |
|
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input |
|
import numpy as np |
|
import cv2 |
|
|
|
|
|
def predict_pneumonia(img_path, model, class_labels): |
|
|
|
img = image.load_img(img_path, target_size=(224, 224)) |
|
img_array = image.img_to_array(img) |
|
img_array = np.expand_dims(img_array, axis=0) |
|
img_array = img_array / 255.0 |
|
|
|
|
|
predictions = model.predict(img_array) |
|
predicted_class_idx = np.argmax(predictions, axis=1)[0] |
|
predicted_class = class_labels[predicted_class_idx] |
|
print(f"Prediction: {predicted_class} (Confidence: {predictions[0][predicted_class_idx]:.2f})") |
|
return predicted_class |
|
|
|
|
|
class_labels = {0: 'Normal', 1: 'Pneumonia'} |
|
|
|
import os |
|
|
|
base_path = "/kaggle/input/chest-xray-pneumonia/chest_xray" |
|
print(os.listdir(base_path)) |
|
|
|
train_dir = "/kaggle/input/chest-xray-pneumonia/chest_xray/train" |
|
val_dir = "/kaggle/input/chest-xray-pneumonia/chest_xray/val" |
|
test_dir = "/kaggle/input/chest-xray-pneumonia/chest_xray/test" |
|
|
|
train_datagen = ImageDataGenerator(rescale=1.0/255, rotation_range=20, zoom_range=0.2, horizontal_flip=True,shear_range=0.2 |
|
) |
|
val_datagen = ImageDataGenerator(rescale=1.0/255) |
|
test_datagen = ImageDataGenerator(rescale=1.0/255) |
|
|
|
train_generator = train_datagen.flow_from_directory( |
|
train_dir, target_size=(224, 224), batch_size=32, class_mode='binary' |
|
) |
|
val_generator = val_datagen.flow_from_directory( |
|
val_dir, target_size=(224, 224), batch_size=32, class_mode='binary' |
|
) |
|
test_generator = test_datagen.flow_from_directory( |
|
test_dir, target_size=(224, 224), batch_size=32, class_mode='binary' |
|
) |
|
|
|
from tensorflow.keras.applications import MobileNetV2 |
|
|
|
|
|
base_model = MobileNetV2(weights='/kaggle/input/mobile-v2-1-0-224/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5', |
|
include_top=False, input_shape=(224, 224, 3)) |
|
base_model.trainable = False |
|
|
|
from tensorflow.keras.models import Sequential |
|
from tensorflow.keras.layers import Flatten, Dense, Dropout |
|
|
|
|
|
model = Sequential([ |
|
base_model, |
|
Flatten(), |
|
Dense(128, activation='relu'), |
|
Dropout(0.5), |
|
Dense(1, activation='sigmoid') |
|
]) |
|
|
|
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) |
|
|
|
import os |
|
|
|
|
|
print("Train directory content:", os.listdir(train_dir)) |
|
print("Validation directory content:", os.listdir(val_dir)) |
|
print("Test directory content:", os.listdir(test_dir)) |
|
|
|
class_weights = compute_class_weight( |
|
class_weight='balanced', |
|
classes=np.unique(train_generator.classes), |
|
y=train_generator.classes |
|
) |
|
|
|
|
|
class_weights = {i: weight for i, weight in enumerate(class_weights)} |
|
|
|
|
|
if 1 in class_weights: |
|
class_weights[1] = class_weights[1] * 2 |
|
|
|
|
|
history = model.fit( |
|
train_generator, |
|
steps_per_epoch=train_generator.samples // train_generator.batch_size, |
|
validation_data=val_generator, |
|
validation_steps=val_generator.samples // val_generator.batch_size, |
|
epochs=10, |
|
class_weight=class_weights |
|
) |
|
|
|
test_loss, test_acc = model.evaluate(test_generator) |
|
print(f"Test Accuracy: {test_acc:.2f}") |
|
|
|
plt.figure(figsize=(10, 5)) |
|
plt.subplot(1, 2, 1) |
|
plt.plot(history.history['accuracy'], label='Train Accuracy') |
|
plt.plot(history.history['val_accuracy'], label='Validation Accuracy') |
|
plt.legend() |
|
plt.title('Accuracy') |
|
|
|
plt.subplot(1, 2, 2) |
|
plt.plot(history.history['loss'], label='Train Loss') |
|
plt.plot(history.history['val_loss'], label='Validation Loss') |
|
plt.legend() |
|
plt.title('Loss') |
|
|
|
plt.show() |
|
|
|
true_labels = test_generator.classes |
|
predicted_probs = model.predict(test_generator, steps=test_generator.samples // test_generator.batch_size + 1) |
|
predicted_labels = np.argmax(predicted_probs, axis=1) |
|
|
|
import numpy as np |
|
from sklearn.metrics import classification_report |
|
|
|
|
|
test_generator.reset() |
|
predictions = model.predict(test_generator, steps=test_generator.samples // test_generator.batch_size + 1) |
|
|
|
|
|
predicted_labels = (predictions > 0.5).astype(int) |
|
|
|
|
|
true_labels = test_generator.classes |
|
|
|
|
|
report = classification_report(true_labels, predicted_labels, target_names=['Normal', 'Pneumonia']) |
|
|
|
print("Classification Report:") |
|
print(report) |
|
|
|
true_labels = test_generator.classes |
|
|
|
|
|
predicted_probs = model.predict(test_generator) |
|
|
|
|
|
roc_auc = roc_auc_score(true_labels, predicted_probs) |
|
print(f"ROC-AUC Score: {roc_auc:.2f}") |
|
|
|
true_labels = test_generator.classes |
|
|
|
|
|
predicted_probs = model.predict(test_generator) |
|
|
|
|
|
|
|
fpr, tpr, _ = roc_curve(true_labels, predicted_probs) |
|
|
|
|
|
roc_auc = auc(fpr, tpr) |
|
|
|
|
|
plt.figure() |
|
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f"ROC curve (area = {roc_auc:.2f})") |
|
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') |
|
plt.xlabel('False Positive Rate') |
|
plt.ylabel('True Positive Rate') |
|
plt.title('Receiver Operating Characteristic') |
|
plt.legend(loc="lower right") |
|
plt.show() |
|
|
|
img_path = '/kaggle/input/chest-xray-pneumonia/chest_xray/val/PNEUMONIA/person1951_bacteria_4882.jpeg' |
|
predicted_class = predict_pneumonia(img_path, model, class_labels) |
|
print(f"The X-ray image is classified as: {predicted_class}") |
|
|
|
|
|
|