Spaces:
Runtime error
Runtime error
import gradio as gr | |
import tensorflow as tf | |
import cv2 | |
import matplotlib.pyplot as plt | |
import numpy as np | |
# Load the model | |
model = tf.keras.models.load_model('plant_model_v5-beta.h5') | |
# Define the class names | |
class_names = { | |
0: 'Apple___Apple_scab', | |
1: 'Apple___Black_rot', | |
2: 'Apple___Cedar_apple_rust', | |
3: 'Apple___healthy', | |
4: 'Not a plant', | |
5: 'Blueberry___healthy', | |
6: 'Cherry___Powdery_mildew', | |
7: 'Cherry___healthy', | |
8: 'Corn___Cercospora_leaf_spot Gray_leaf_spot', | |
9: 'Corn___Common_rust', | |
10: 'Corn___Northern_Leaf_Blight', | |
11: 'Corn___healthy', | |
12: 'Grape___Black_rot', | |
13: 'Grape___Esca_(Black_Measles)', | |
14: 'Grape___Leaf_blight_(Isariopsis_Leaf_Spot)', | |
15: 'Grape___healthy', | |
16: 'Orange___Haunglongbing_(Citrus_greening)', | |
17: 'Peach___Bacterial_spot', | |
18: 'Peach___healthy', | |
19: 'Pepper,_bell___Bacterial_spot', | |
20: 'Pepper,_bell___healthy', | |
21: 'Potato___Early_blight', | |
22: 'Potato___Late_blight', | |
23: 'Potato___healthy', | |
24: 'Raspberry___healthy', | |
25: 'Soybean___healthy', | |
26: 'Squash___Powdery_mildew', | |
27: 'Strawberry___Leaf_scorch', | |
28: 'Strawberry___healthy', | |
29: 'Tomato___Bacterial_spot', | |
30: 'Tomato___Early_blight', | |
31: 'Tomato___Late_blight', | |
32: 'Tomato___Leaf_Mold', | |
33: 'Tomato___Septoria_leaf_spot', | |
34: 'Tomato___Spider_mites Two-spotted_spider_mite', | |
35: 'Tomato___Target_Spot', | |
36: 'Tomato___Tomato_Yellow_Leaf_Curl_Virus', | |
37: 'Tomato___Tomato_mosaic_virus', | |
38: 'Tomato___healthy' | |
} | |
def edge_and_cut(img, threshold1, threshold2): | |
emb_img = img.copy() | |
edges = cv2.Canny(img, threshold1, threshold2) | |
edge_coors = [] | |
for i in range(edges.shape[0]): | |
for j in range(edges.shape[1]): | |
if edges[i][j] != 0: | |
edge_coors.append((i, j)) | |
if len(edge_coors) == 0: | |
return emb_img | |
row_min = edge_coors[np.argsort([coor[0] for coor in edge_coors])[0]][0] | |
row_max = edge_coors[np.argsort([coor[0] for coor in edge_coors])[-1]][0] | |
col_min = edge_coors[np.argsort([coor[1] for coor in edge_coors])[0]][1] | |
col_max = edge_coors[np.argsort([coor[1] for coor in edge_coors])[-1]][1] | |
new_img = img[row_min:row_max, col_min:col_max] | |
emb_color = np.array([255], dtype=np.uint8) # Grayscale version of [255, 0, 0] | |
emb_img[row_min-10:row_min+10, col_min:col_max] = emb_color | |
emb_img[row_max-10:row_max+10, col_min:col_max] = emb_color | |
emb_img[row_min:row_max, col_min-10:col_min+10] = emb_color | |
emb_img[row_min:row_max, col_max-10:col_max+10] = emb_color | |
return emb_img | |
def classify_and_visualize(image): | |
# Preprocess the image | |
img_array = tf.image.resize(image, [256, 256]) | |
img_array = tf.expand_dims(img_array, 0) / 255.0 | |
# Make a prediction | |
prediction = model.predict(img_array) | |
predicted_class = tf.argmax(prediction[0], axis=-1) | |
confidence = np.max(prediction[0]) | |
if confidence < 0.60: | |
class_name = "The image you uploaded might not be in the dataset. Try making your leaf background white." | |
bounded_image = image | |
else: | |
class_name = class_names[predicted_class.numpy()] | |
bounded_image = edge_and_cut(image, 200, 400) | |
return class_name, confidence, bounded_image | |
iface = gr.Interface( | |
fn=classify_and_visualize, | |
inputs="image", | |
outputs=["text", "number", "image"], | |
interpretation="default", | |
examples=[ | |
['examples/grot.jpg'], | |
['examples/corn.jpg'], | |
]) | |
iface.launch() | |