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()