CS454 / app.py
keremoktay1's picture
Update app.py
97eac4c verified
import gradio as gr
import pickle
import numpy as np
from tensorflow.keras.models import load_model
from PIL import Image
# Update the path to the directory where your models are stored
model_directory = '/Users/keremoktay/Desktop/Gradio/'
# Load the decision tree and KNN models
dt_models = {
"2": pickle.load(open('dt2.pkl', 'rb')),
"3": pickle.load(open('dt3.pkl', 'rb')),
"5": pickle.load(open('dt5.pkl', 'rb'))
}
knn_models = {
"1": pickle.load(open('knn1.pkl', 'rb')),
"3": pickle.load(open('knn3.pkl', 'rb')),
"5": pickle.load(open('knn5.pkl', 'rb'))
}
# Load the neural network models
nn_models = {
"1": load_model('cnn_1layer.h5'),
"2": load_model('cnn_2layer.h5'),
"3": load_model('cnn_3layer.h5')
}
def preprocess_image_for_ml(image_path):
try:
# For traditional ML models, just flatten the image without resizing
image = Image.open(image_path)
image_array = np.asarray(image).flatten().reshape(1, -1)
return image_array
except Exception as e:
print(f"Error in preprocess_image_for_ml: {e}")
raise e
def preprocess_image_for_cnn(image_path, target_size=(128, 128)):
try:
# For CNN models, convert to RGB, resize to 128x128, normalize, and add a batch dimension
image = Image.open(image_path).convert('RGB')
image = image.resize(target_size)
image_array = np.asarray(image) / 255.0
image_array = np.expand_dims(image_array, axis=0)
return image_array
except Exception as e:
print(f"Error in preprocess_image_for_cnn: {e}")
raise e
class_names = {
0: "Angular Leaf Spot",
1: "Bean Rust",
2: "Healthy"
}
def classify_image_with_decision_tree(image, depth):
try:
image_array = preprocess_image_for_ml(image)
model = dt_models.get(depth)
prediction = model.predict(image_array)
# Sayısal tahmini hastalık ismine dönüştür
return class_names[int(prediction)]
except Exception as e:
print(f"Error in classify_image_with_decision_tree: {e}")
raise e
def classify_image_with_knn(image, k):
try:
image_array = preprocess_image_for_ml(image)
model = knn_models.get(k)
prediction = model.predict(image_array)
# Sayısal tahmini hastalık ismine dönüştür
return class_names[int(prediction)]
except Exception as e:
print(f"Error in classify_image_with_knn: {e}")
raise e
def classify_image_with_neural_network(image, layers):
try:
image_array = preprocess_image_for_cnn(image)
model = nn_models.get(layers)
prediction = model.predict(image_array)
# En yüksek tahmin değerine sahip indeksi bul ve hastalık ismine dönüştür
return class_names[np.argmax(prediction, axis=1)[0]]
except Exception as e:
print(f"Error in classify_image_with_neural_network: {e}")
raise e
# Create Gradio interface
with gr.Blocks() as demo:
gr.Markdown("Image Classification using Different Models")
with gr.Tab("Decision Tree"):
with gr.Row():
image_input_dt = gr.Image(type="filepath")
dropdown_depth = gr.Dropdown(label="Select Depth", choices=["2", "3", "5"])
output_dt = gr.Textbox(label="Decision Tree Output")
classify_button_dt = gr.Button("Classify with Decision Tree")
classify_button_dt.click(classify_image_with_decision_tree, inputs=[image_input_dt, dropdown_depth], outputs=output_dt)
with gr.Tab("K-Nearest Neighbors (KNN)"):
with gr.Row():
image_input_knn = gr.Image(type="filepath")
dropdown_k = gr.Dropdown(label="Select Number of Neighbors (k)", choices=["1", "3", "5"])
output_knn = gr.Textbox(label="KNN Output")
classify_button_knn = gr.Button("Classify with KNN")
classify_button_knn.click(classify_image_with_knn, inputs=[image_input_knn, dropdown_k], outputs=output_knn)
with gr.Tab("Neural Network"):
with gr.Row():
image_input_nn = gr.Image(type="filepath")
dropdown_layers = gr.Dropdown(label="Select Number of Layers", choices=["1", "2", "3"])
output_nn = gr.Textbox(label="Neural Network Output")
classify_button_nn = gr.Button("Classify with Neural Network")
classify_button_nn.click(classify_image_with_neural_network, inputs=[image_input_nn, dropdown_layers], outputs=output_nn)
demo.launch()