def predict(data): try: image_input = data.get('image', None) if not image_input: return json.dumps({"error": "No image provided."}) print(f"Received image input: {image_input}") # Check if the input is a PIL Image type if isinstance(image_input, Image.Image): print(f"Image is already loaded as PIL Image: {image_input}") else: # Check if the input contains a base64-encoded string or URL if image_input.startswith("http"): # URL case try: response = requests.get(image_input) image = Image.open(BytesIO(response.content)) print(f"Fetched image from URL: {image}") except Exception as e: print(f"Error fetching image from URL: {e}") return json.dumps({"error": f"Error fetching image from URL: {e}"}) else: # Assuming it is base64-encoded image data try: image_data = base64.b64decode(image_input) image = Image.open(BytesIO(image_data)) print(f"Decoded base64 image: {image}") except Exception as e: print(f"Error decoding base64 image: {e}") return json.dumps({"error": f"Error decoding base64 image: {e}"}) # Apply transformations image = transform(image).unsqueeze(0) print(f"Transformed image tensor: {image.shape}") image = image.to(torch.device("cuda" if torch.cuda.is_available() else "cpu")) with torch.no_grad(): outputs = model(image) predicted_class = torch.argmax(outputs, dim=1).item() print(f"Prediction output: {outputs}, Predicted class: {predicted_class}") if predicted_class == 0: return json.dumps({"result": "The photo you've sent is of fall army worm with problem ID 126."}) elif predicted_class == 1: return json.dumps({"result": "The photo you've sent is of a healthy maize image."}) else: return json.dumps({"error": "Unexpected class prediction."}) except Exception as e: print(f"Error processing image: {e}") return json.dumps({"error": f"Error processing image: {e}"}) # Create the Gradio interface iface = gr.Interface( fn=predict, inputs=gr.JSON(label="Input JSON"), outputs=gr.Textbox(label="Prediction Result"), live=True, title="Maize Anomaly Detection", description="Upload an image of maize to detect anomalies like disease or pest infestation. You can provide local paths, URLs, or base64-encoded images." ) # Launch the Gradio interface iface.launch(share=True, show_error=True)