Pneumonia-XRay-Classifier / load_and_display_xray_images.py
RaniyaK's picture
Upload 6 files
612c03b verified
raw
history blame
3.63 kB
import os
import numpy as np
import cv2
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.callbacks import ModelCheckpoint
# Function to load images from specified folders
def load_images_from_folders(folders):
images = []
for folder in folders:
for filename in os.listdir(folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')): # Check for valid image extensions
img = cv2.imread(os.path.join(folder, filename), cv2.IMREAD_GRAYSCALE) # Read image as grayscale
if img is not None:
img = cv2.resize(img, (224, 224)) # Resize to 224x224 pixels
img = img.astype(np.float32) # Ensure the image is in float32 format
img /= 255.0 # Normalize to [0, 1]
images.append(img)
else:
print(f"Failed to load image: {filename}")
return np.array(images)
# Load normal and pneumonia images
normal_folders = [
os.path.join('chest-xray-pneumonia', 'chest_xray', 'test', 'NORMAL'),
os.path.join('chest-xray-pneumonia', 'chest_xray', 'train', 'NORMAL'),
os.path.join('chest-xray-pneumonia', 'chest_xray', 'val', 'NORMAL'),
]
pneumonia_folders = [
os.path.join('chest-xray-pneumonia', 'chest_xray', 'test', 'PNEUMONIA'),
os.path.join('chest-xray-pneumonia', 'chest_xray', 'train', 'PNEUMONIA'),
os.path.join('chest-xray-pneumonia', 'chest_xray', 'val', 'PNEUMONIA'),
]
normal_images = load_images_from_folders(normal_folders)
pneumonia_images = load_images_from_folders(pneumonia_folders)
# Print the number of images loaded for each category
print(f"Loaded {len(normal_images)} normal images.")
print(f"Loaded {len(pneumonia_images)} pneumonia images.")
# Prepare dataset for machine learning
images = np.concatenate([normal_images, pneumonia_images]) # Combine normal and pneumonia images
labels = np.array([0] * len(normal_images) + [1] * len(pneumonia_images)) # Create labels
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=42)
# Convert to RGB format
X_train_rgb = np.stack([cv2.cvtColor((img * 255).astype(np.uint8), cv2.COLOR_GRAY2RGB) for img in X_train])
X_test_rgb = np.stack([cv2.cvtColor((img * 255).astype(np.uint8), cv2.COLOR_GRAY2RGB) for img in X_test])
print(f'Training data shape: {X_train_rgb.shape}, Training labels shape: {y_train.shape}')
print(f'Testing data shape: {X_test_rgb.shape}, Testing labels shape: {y_test.shape}')
# Build a simple CNN model
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dense(1, activation='sigmoid') # Binary classification
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Set up model checkpointing with the new file extension
checkpoint = ModelCheckpoint('pneumonia_model.keras', save_best_only=True, monitor='val_loss', mode='min')
# Train the model
model.fit(X_train_rgb, y_train, validation_data=(X_test_rgb, y_test), epochs=10, callbacks=[checkpoint])
# Save the model in the new format
model.save('pneumonia_model_final.keras')
print("Model saved as 'pneumonia_model_final.keras'")