How to Pass a Single Image file for prediction to a Model which uses flow_from_directory() - Model will be used in a Flask App

16 Views Asked by At

Below is my model which uses flow_from_directory() for training. Once the training is done I want to save the model and use it in such a way that, I can use the Model in a Flask App to predict the output of a Single Xray image that user uploads. How can i call the model with a Single Image?

Import necessary modules

#import
import numpy as np
import pandas as pd
import os 
import random
import matplotlib.pyplot as plt
from PIL import Image
import cv2
import tensorflow as tf
from tensorflow.keras import layers, models, optimizers
from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Input, Dense, Flatten, GlobalAveragePooling2D
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

data_dir = '/home/Data/train'

data = ImageDataGenerator(validation_split = 0.20,rotation_range=20,)

train_ds = data.flow_from_directory(data_dir,class_mode = "categorical",
                                    target_size = (229, 229),
                                    batch_size = 32,
                                    shuffle = True,subset='training',seed = 42)

Found 4116 images belonging to 3 classes.

Training dataset created

validation = data.flow_from_directory(data_dir,class_mode = "categorical",target_size = (229, 229),batch_size = 32,shuffle = True,subset='validation',seed = 42)

Found 1028 images belonging to 3 classes.

Validation dataset created

Create pretrained Efficient Net Model

IMG_SIZE=(229,229)
base_model = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(*IMG_SIZE, 3))

# Freeze the pre-trained layers
base_model.trainable = False

# Build your custom model on top of the pre-trained base model
model = models.Sequential()
model.add(base_model)
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(3, activation='softmax'))  # 3 output classes

# Compile the model
model.compile(optimizer=optimizers.Adam(learning_rate=0.001),
              loss='categorical_crossentropy',  # Use 'sparse_categorical_crossentropy' if your labels are integers
              metrics=['accuracy'])

# Display the model summary
model.summary()

# Define an EarlyStopping callback instance with optimized parameters:
early_stopping = EarlyStopping(
    monitor='val_loss',  # Track validation loss (or accuracy if preferred)
    patience=3,         # Wait for 5 epochs without improvement
    restore_best_weights=True,  # Restore best weights found so far
    min_delta=0.001,   # Consider improvement only if greater than 0.1%
    verbose=1          # Log messages during training
)


# Train the model with the EarlyStopping callback:
history = model.fit(
    train_ds,
    epochs=20,
    verbose=1,
    validation_data=validation,
    callbacks=[early_stopping]
)


test_folder_path = "/home/vipinainvijayan4286/Data/test"
datagen = ImageDataGenerator()
test_generator = datagen.flow_from_directory(test_folder_path,target_size=(299, 299),batch_size=32,shuffle=False,)

Found 1288 images belonging to 3 classes.

Test dataset created

# Predict Test data
predictions=model.predict(test_generator)

Prediction


from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
import matplotlib.pyplot as plt


# Get true labels
true_labels = test_generator.classes

# Use the model to predict the classes
predicted_labels = np.argmax(model.predict(test_generator), axis=1)

# Generate confusion matrix
cm = confusion_matrix(true_labels, predicted_labels)

# Display confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=test_generator.class_indices.keys(), yticklabels=test_generator.class_indices.keys())
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

# Display classification report
print("Classification Report:\n", classification_report(true_labels, predicted_labels, target_names=test_generator.class_indices.keys()))
0

There are 0 best solutions below