|
import gradio as gr |
|
import tensorflow as tf |
|
import cv2 |
|
import matplotlib.pyplot as plt |
|
import numpy as np |
|
|
|
|
|
model = tf.keras.models.load_model('plant_model_v5-beta.h5') |
|
|
|
|
|
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) |
|
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): |
|
|
|
img_array = tf.image.resize(image, [256, 256]) |
|
img_array = tf.expand_dims(img_array, 0) / 255.0 |
|
|
|
|
|
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() |
|
|