itzbhav's picture
Upload 8 files
3fde58f verified
import os
import glob
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from keras_preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Conv2D, MaxPooling2D, Flatten
from keras.applications import ResNet50
from keras.applications.resnet50 import preprocess_input
from sklearn.metrics import classification_report
import zipfile
import os
# Define the file name
zip_file = 'dataset.zip'
# Unzip it to a folder (you can choose your own target directory)
with zipfile.ZipFile(zip_file, 'r') as zip_ref:
zip_ref.extractall('blood_group_dataset') # Extract to this folder
# Walk through the directory
for root, dirs, files in os.walk('blood_group_dataset'):
print(root)
for file in dirs:
print(' ', file)
import os
import glob
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Walk through the directory and collect file paths and labels
filepaths = []
labels = []
for root, dirs, files in os.walk('blood_group_dataset'):
for dir in dirs: # Iterate through subdirectories (blood group types)
for file in glob.glob(os.path.join(root, dir, '*')): # Get all files in the subdirectory
filepaths.append(file)
labels.append(dir) # Use the subdirectory name as the label
# Create a DataFrame with file paths and labels
filepath = pd.Series(filepaths, name='Filepath').astype(str)
Labels = pd.Series(labels, name='Label')
data = pd.concat([filepath, Labels], axis=1)
data = data.sample(frac=1).reset_index(drop=True)
# Filter out the 'dataset' label
filtered_data = data[data['Label'] != 'dataset'] # Remove rows with 'dataset' label
# Visualize class distribution using sns.barplot
counts = filtered_data.Label.value_counts()
sns.barplot(x=counts.index, y=counts)
plt.xlabel('Blood Group Type') # Changed x-axis label
plt.ylabel('Number of Images') # Added y-axis label
plt.xticks(rotation=90)
plt.title('Class Distribution in Blood Group Dataset') # Added title
plt.show()
# Split data into training and testing sets
train, test = train_test_split(data, test_size=0.20, random_state=42)
# Visualize some images from the dataset
fig, axes = plt.subplots(nrows=5, ncols=3, figsize=(10, 8), subplot_kw={'xticks': [], 'yticks': []})
for i, ax in enumerate(axes.flat):
ax.imshow(plt.imread(data.Filepath[i]))
ax.set_title(data.Label[i])
plt.tight_layout()
plt.show()
# Set up ImageDataGenerator for training and validation data
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
train_gen = train_datagen.flow_from_dataframe(
dataframe=train,
x_col='Filepath',
y_col='Label',
target_size=(224, 224), # Adjusted to match ResNet50 input size
class_mode='categorical',
batch_size=32,
shuffle=True,
seed=42
)
valid_gen = test_datagen.flow_from_dataframe(
dataframe=test,
x_col='Filepath',
y_col='Label',
target_size=(224, 224), # Adjusted to match ResNet50 input size
class_mode='categorical',
batch_size=32,
shuffle=False,
seed=42
)
# Define the LeNet model
model = Sequential([
Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(224, 224, 3)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(16, kernel_size=(5, 5), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(120, activation='relu'),
Dense(84, activation='relu'),
Dense(8, activation='softmax')
])
model.compile(
optimizer="adam",
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Train the model
history = model.fit(
train_gen,
validation_data=valid_gen,
epochs=20
)
# Plot training history: accuracy
pd.DataFrame(history.history)[['accuracy', 'val_accuracy']].plot()
plt.title("Accuracy")
plt.show()
# Plot training history: loss
pd.DataFrame(history.history)[['loss', 'val_loss']].plot()
plt.title("Loss")
plt.show()
# Evaluate the model on test data
results = model.evaluate(valid_gen, verbose=0)
print(f"Test Loss: {results[0]:.5f}")
print(f"Test Accuracy: {results[1]*100:.2f}%")
# Predict labels for test data
pred = model.predict(valid_gen)
pred = np.argmax(pred, axis=1)
# Map predicted labels
labels = train_gen.class_indices
labels = dict((v, k) for k, v in labels.items())
pred = [labels[k] for k in pred]
# Compare predicted labels with true labels and print classification report
# Get the true labels from the test DataFrame, ensuring they match the predictions in length
y_test = list(test.Label)
# Adjust y_test to match pred length
y_test = y_test[:len(pred)] # Truncate y_test to match pred length
print(classification_report(y_test, pred))
model.save("model_blood_group_detection_lenet.keras")
import numpy as np
import matplotlib.pyplot as plt
from keras.models import load_model
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input
# Load the pre-t rained model
model = load_model('model_blood_group_detection_lenet.keras')
# Define the class labels
labels = {'A+': 0, 'A-': 1, 'AB+': 2, 'AB-': 3, 'B+': 4, 'B-': 5, 'O+': 6, 'O-': 7}
labels = dict((v, k) for k, v in labels.items())
# Example of loading a single image and making a prediction
img_path = 'augmented_cluster_4_3505.BMP'
# Preprocess the image accordingly (check the model's expected input dimensions)
img = image.load_img(img_path, target_size=(224, 224)) # Example target size for AlexNet (224x224)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x) # Ensure this matches the model's preprocessing function
# Make prediction
result = model.predict(x)
predicted_class = np.argmax(result) # Get the predicted class index
# Map the predicted class to the label
predicted_label = labels[predicted_class]
confidence = result[0][predicted_class] * 100 # Confidence level
# Display the image
plt.imshow(image.array_to_img(image.img_to_array(img) / 255.0))
plt.axis('off') # Hide axes
# Display the prediction and confidence below the image
plt.title(f"Prediction: {predicted_label} with confidence {confidence:.2f}%")
plt.show()