# import gradio as gr # from transformers import AutoImageProcessor, AutoModelForImageClassification # from PIL import Image # import torch # # Model you selected # MODEL_NAME = "google/vit-base-patch16-224" # print("🔄 Loading model...") # processor = AutoImageProcessor.from_pretrained(MODEL_NAME) # model = AutoModelForImageClassification.from_pretrained(MODEL_NAME) # print("✅ Model loaded successfully!") # def classify_image(image): # try: # img = Image.fromarray(image).convert("RGB") # inputs = processor(images=img, return_tensors="pt") # with torch.no_grad(): # outputs = model(**inputs) # logits = outputs.logits # pred_id = logits.argmax(-1).item() # label = model.config.id2label[pred_id] # return {label: float(logits.softmax(-1)[0][pred_id])} # except Exception as e: # return {"error": str(e)} # # UI # interface = gr.Interface( # fn=classify_image, # inputs=gr.Image(type="numpy"), # outputs=gr.Label(num_top_classes=5), # title="🌿 KrishiSetu — Crop Disease Classifier", # description="Upload leaf images. The model uses `google/vit-base-patch16-224` to classify plant diseases.", # ) # if __name__ == "__main__": # interface.launch() # import gradio as gr # from transformers import ( # AutoImageProcessor, # AutoModelForImageClassification, # pipeline # ) # from PIL import Image # import torch # MODEL_NAME = "google/vit-base-patch16-224" # processor = AutoImageProcessor.from_pretrained(MODEL_NAME) # model = AutoModelForImageClassification.from_pretrained(MODEL_NAME) # validator = pipeline( # "zero-shot-image-classification", # model="openai/clip-vit-base-patch32" # ) # def is_valid_leaf_image(img): # candidate_labels = [ # "a plant leaf", # "a plant", # "tree leaves", # "crop leaf", # "person", # "animal", # "vehicle", # "food", # "object" # ] # result = validator(img, candidate_labels=candidate_labels) # top_label = result[0]["label"] # top_score = result[0]["score"] # valid_labels = ["a plant leaf", "a plant", "tree leaves", "crop leaf"] # return top_label in valid_labels and top_score >= 0.30 # def classify_image(image): # try: # img = Image.fromarray(image).convert("RGB") # # Step 1: Validation # if not is_valid_leaf_image(img): # return "❌ Invalid input, please send image containing plant and leaf", None # # Step 2: Prediction # inputs = processor(images=img, return_tensors="pt") # with torch.no_grad(): # outputs = model(**inputs) # probs = torch.nn.functional.softmax(outputs.logits, dim=-1)[0] # top_k = torch.topk(probs, k=5) # results = {} # for score, idx in zip(top_k.values, top_k.indices): # label = model.config.id2label[idx.item()] # results[label] = float(score) # return "✅ Valid leaf image", results # except Exception as e: # return f"Error: {str(e)}", None # interface = gr.Interface( # fn=classify_image, # inputs=gr.Image(type="numpy"), # outputs=[ # gr.Textbox(label="Status"), # gr.Label(num_top_classes=5, label="Prediction") # ], # title="🌿 KrishiSetu — Crop Disease Classifier", # description="Upload leaf images. Invalid images will be rejected.", # ) # if __name__ == "__main__": # interface.launch() import gradio as gr from transformers import AutoImageProcessor, CLIPForImageClassification, pipeline from PIL import Image import torch MODEL_NAME = "VaigandlaHemanth/leaf-disease-clip-vit" print("Loading disease model...") processor = AutoImageProcessor.from_pretrained(MODEL_NAME) model = CLIPForImageClassification.from_pretrained(MODEL_NAME) model.eval() print("Disease model loaded successfully!") print("Loading validator model...") validator = pipeline( "zero-shot-image-classification", model="openai/clip-vit-base-patch32" ) print("Validator model loaded successfully!") def is_valid_leaf_image(img): candidate_labels = [ "a plant leaf", "a crop leaf", "a diseased leaf", "a healthy leaf", "a plant", "tree leaves", "person", "animal", "vehicle", "food", "building", "random object" ] result = validator(img, candidate_labels=candidate_labels) top_label = result[0]["label"] top_score = result[0]["score"] valid_labels = [ "a plant leaf", "a crop leaf", "a diseased leaf", "a healthy leaf", "a plant", "tree leaves" ] return top_label in valid_labels and top_score >= 0.30, top_label, top_score def clean_label(label): return label.replace("___", " - ").replace("_", " ") def get_confidence_status(confidence): if confidence >= 0.70: return "High confidence" elif confidence >= 0.40: return "Medium confidence" else: return "Low confidence" def classify_image(image): try: if image is None: return "Please upload an image." img = Image.fromarray(image).convert("RGB") is_valid, detected_type, validation_score = is_valid_leaf_image(img) if not is_valid: return ( "Invalid input, please send image containing plant and leaf\n\n" f"Detected image type: {detected_type}\n" f"Validation confidence: {validation_score * 100:.2f}%" ) inputs = processor(images=img, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) probs = torch.nn.functional.softmax(outputs.logits, dim=-1)[0] top_k = torch.topk(probs, k=5) predictions = [] for score, idx in zip(top_k.values, top_k.indices): raw_label = model.config.id2label[idx.item()] label = clean_label(raw_label) confidence = float(score) predictions.append((label, confidence)) top_label, top_confidence = predictions[0] confidence_status = get_confidence_status(top_confidence) response = "" response += "Image validation: Valid plant/leaf image\n" response += f"Validator detected: {detected_type} ({validation_score * 100:.2f}%)\n\n" if top_confidence < 0.30: response += "Final result: Disease/health prediction is uncertain\n" response += ( "Reason: The image is a valid plant/leaf image, but model confidence is low. " "Please upload a clear close-up image of a single leaf with plain background.\n\n" ) elif "healthy" in top_label.lower(): response += f"Final result: Healthy plant ({top_confidence * 100:.2f}%)\n" response += f"Confidence level: {confidence_status}\n\n" else: response += "Final result: Disease detected\n" response += f"Disease name: {top_label}\n" response += f"Confidence: {top_confidence * 100:.2f}%\n" response += f"Confidence level: {confidence_status}\n\n" response += "Top 5 predictions:\n" for i, (label, confidence) in enumerate(predictions, start=1): response += f"{i}. {label}: {confidence * 100:.2f}%\n" return response except Exception as e: return f"Error: {str(e)}" interface = gr.Interface( fn=classify_image, inputs=gr.Image(type="numpy"), outputs=gr.Textbox(label="Result", lines=12), title="KrishiSetu — Crop Disease Classifier", description=( "Upload plant/leaf image. Invalid images will be rejected. " "Valid images will show disease/healthy result with top predictions." ) ) if __name__ == "__main__": interface.launch()