pneumonia2 / app.py
Abeeha007's picture
Update app.py
8123124 verified
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
import os
from sklearn.model_selection import train_test_split
from sklearn.model_selection import train_test_split
from datasets import load_dataset
dataset = load_dataset("Abeeha007/chest-x-rays")
print(dataset)
def predict_pneumonia(img_path, model, class_labels):
# Preprocess the image
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
# Make a prediction
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'}
from sklearn.model_selection import train_test_split
from datasets import load_dataset
from sklearn.model_selection import train_test_split
# Load dataset from Hugging Face
dataset = load_dataset("Abeeha007/chest-x-rays")
# Access the 'train' split
train_data = dataset['train']
# Convert dataset to a list of examples
train_data_list = [example for example in train_data]
# Now you can use train_test_split
train_data_split, test_data_split = train_test_split(train_data_list, test_size=0.2)
# Now you have train_data_split, test_data_split
print(f"Train size: {len(train_data_split)}")
print(f"Test size: {len(test_data_split)}")
# Extract image paths and labels
image_paths = [example['image_path'] for example in train_data_list]
labels = [example['label'] for example in train_data_list]
# Split the data
image_paths_train, image_paths_test, labels_train, labels_test = train_test_split(image_paths, labels, test_size=0.2)
# Now you have train and test data (paths and labels)
# Access the 'train' split
train_data = dataset['train']
# Manually create a test split (e.g., 80% train, 20% test)
train_data_split, test_data_split = train_test_split(train_data, test_size=0.2)
# Now you have train_data_split, test_data_split
print(f"Train size: {len(train_data_split)}")
print(f"Test size: {len(test_data_split)}")
# Access the train and test splits
train_data = dataset['train']
test_data = dataset['test']
# Split the train data into a new train/validation split (e.g., 80/20 split)
train_data_split, val_data_split = train_test_split(train_data, test_size=0.2)
# Now you have train_data_split, val_data_split, and test_data
# Access the train, validation, and test splits
train_data = dataset['train']
val_data = dataset['validation']
test_data = dataset['test']
# Convert the Hugging Face dataset to a list of images and labels (or process accordingly)
train_images = [example['image'] for example in train_data] # Assuming dataset has 'image' field
train_labels = [example['label'] for example in train_data] # Assuming dataset has 'label' field
val_images = [example['image'] for example in val_data]
val_labels = [example['label'] for example in val_data]
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
# Step 3: Classification report
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' # Path to the X-ray image
predicted_class = predict_pneumonia(img_path, model, class_labels)
print(f"The X-ray image is classified as: {predicted_class}")