Spaces:
Runtime error
Runtime error
import gradio as gr | |
import openai | |
import numpy as np | |
import tensorflow as tf | |
import keras | |
from PIL import Image | |
import requests | |
import json | |
from json import JSONEncoder | |
from datetime import datetime | |
import requests | |
from os import listdir | |
import json | |
import os | |
import cv2 | |
import joblib | |
from json import JSONEncoder | |
from keras.optimizers import Adam | |
from keras.preprocessing import image | |
from keras.preprocessing.image import img_to_array | |
from sklearn.preprocessing import MultiLabelBinarizer | |
from sklearn.model_selection import train_test_split | |
from datetime import datetime | |
from fastapi import FastAPI, Request, Response | |
from sklearn.metrics import precision_score, recall_score, f1_score | |
import prometheus_client as prom | |
# Load your trained model | |
app = FastAPI() | |
DEFAULT_IMAGE_SIZE = tuple((256, 256)) | |
N_IMAGES = 100 | |
# Define the model and its parameters | |
#model = joblib.load(filename="plant_leaf_diseases_model.keras", 'utf-8') | |
model = tf.keras.models.load_model('cnn_model_v3.h5') | |
myControls = { | |
"ResultControl":None, | |
"Feedback":None, | |
"AdditionalInfo":None | |
} | |
dataToSend = { | |
"FileContent":None, | |
"PlantName":None, | |
"Comments":None | |
} | |
imageData = [] | |
class NumpyEncoder(JSONEncoder): | |
def default(self, obj): | |
if isinstance(obj, np.ndarray) : | |
return obj.tolist() | |
return JSONEncoder.default(self,obj) | |
def uploadFile() : | |
global dataToSend | |
npArray = np.asarray(imageData) | |
fileContent = json.dumps(npArray, cls=NumpyEncoder) | |
dataToSend["FileContent"] = fileContent | |
payload = json.dumps(dataToSend) | |
r = requests.post("http://54.89.245.21:5005/todb", data=payload) | |
return r | |
def saveStats(predictionStatus) : | |
d = { | |
'Time': str(datetime.now()), | |
'PredictionStatus':None | |
} | |
if predictionStatus == 'Satisfied' : | |
d['PredictionStatus'] = 1 | |
else : | |
d['PredictionStatus'] = 0 | |
r = requests.post("http://54.89.245.21:5005/predictionstats", data=json.dumps(d)) | |
return r | |
def predict(imageToProcess): | |
global imageData | |
imagelist = [] | |
if imageToProcess == None : | |
gr.Error("No image is given to process") | |
return [None, None] | |
imageToProcess.save("./temp/test.jpg") | |
image_array = convert_image_to_array("./temp/test.jpg") | |
imagelist.append(image_array) | |
np_image = np.array(image_array, dtype=np.float16) / 225.0 | |
print(np_image.shape) | |
prediction = model.predict(np_image.reshape(1,256, 256, 3)) | |
leaf_class_category_mappings = {0:"Apple Apple scab", 1:"Apple Black rot", 2:"Apple Cedar apple rust",3:"Apple healthy", 4:"Background without leaves", 5:"Blueberry healthy", 6:"Cherry Powdery mildew", 7:"Cherry healthy",8:"Corn Cercospora leaf spotGray 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 mitesTwo-spotted spider mite",35:"Tomato Target Spot", 36:"Tomato Tomato Yellow Leaf Curl Virus", 37:"Tomato Tomato mosaic virus", 38:"Tomato healthy"} | |
print(prediction) | |
#return ["leaf_class_category_mappings[np.argmax(prediction)]" | |
#return [leaf_class_category_mappings[np.argmax(prediction)], "none"] | |
predicteddisease = leaf_class_category_mappings[np.argmax(prediction)] | |
reply = "Nothing to display" | |
try : | |
key1="sk" | |
key2="-ico1dAjc3rZL3" | |
key3="ssVVc4LT3BlbkFJwKTdY4IeCkMtZehqRpSU" | |
openai.api_key = key1+key2+key3 | |
message = "What is "+predicteddisease+" and how to treat the disease" | |
if message: | |
messages = [] | |
messages.append( | |
{"role": "user", "content": message}, | |
) | |
chat = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", messages=messages | |
) | |
reply = chat.choices[0].message.content | |
except Exception as ex : | |
print(ex) | |
imageData = imageToProcess | |
return [predicteddisease, reply] | |
def submitFeedback(correctOrWrong, plantName, userData): | |
global dataToSend | |
print(correctOrWrong) | |
if correctOrWrong == "Not Satisfied" : | |
dataToSend["PlantName"] = plantName | |
dataToSend["Comments"] = userData | |
dataToSend["FileContent"] = json.dumps(np.asarray(imageData).tolist()) | |
r = uploadFile() | |
if r != None : | |
res = json.loads(r.text) | |
gr.Warning("Data Submitted for learning :" + res["Status"]) | |
else : | |
gr.Error("Failed to upload the file for learning") | |
saveStats(correctOrWrong) | |
with gr.Blocks() as gradioapp : | |
gr.Markdown( | |
""" | |
# AI based plant Disease Detection Application | |
""" | |
) | |
myControls["ImageInput"] = gr.Image(type="pil") | |
controls = [] | |
myControls["ResultControl"] = gr.Textbox(label='Possible Disease could be ') | |
myControls["AdditionalInfo"] = gr.TextArea(label='Additional Info') | |
controls.append(myControls["ResultControl"]) | |
controls.append(myControls["AdditionalInfo"]) | |
predictBtn = gr.Button(value='Predict') | |
predictBtn.click(predict, inputs=[myControls["ImageInput"]], outputs=controls) | |
gr.Markdown() | |
myControls["PredictionSelection"] = gr.Radio(["Satisfied", "Not Satisfied"], label="Feedback", info="Are you satisfied with the prediction?") | |
#myControls["Feedback"] = gr.Checkbox(label="Is prediction wrong? If so, please provide the proper classification") | |
myControls["PlantName"] = gr.Textbox(label='Specify the name of the plant') | |
myControls["UserInput"] = gr.Textbox(label='What is the correct classification?') | |
feedbackBtn = gr.Button(value='Submit Feedback') | |
feedbackBtn.click(submitFeedback, inputs =[myControls["PredictionSelection"], myControls["PlantName"], myControls["UserInput"]]) | |
#app.queue().launch() | |
gradioapp = gr.mount_gradio_app(app, gradioapp, path="/") | |
if __name__ == "__main__": | |
# Use this for debugging purposes only | |
import uvicorn | |
uvicorn.run(app, host="0.0.0.0", port=8001) # Ref: https://www.gradio.app/docs/interface |