Spaces:
Build error
Build error
| import gradio as gr | |
| import numpy as np | |
| import pandas as pd | |
| from PIL import Image, ImageDraw, ImageFont | |
| from ultralytics import YOLO | |
| # Load YOLO model | |
| model = YOLO('trash_detection.pt') | |
| def predict(image): | |
| """ | |
| Function to make predictions using YOLO model. | |
| Args: | |
| image (PIL.Image): Input image. | |
| Returns: | |
| Tuple: Processed image with bounding boxes and a list of predictions with labels, confidence, and bounding boxes. | |
| """ | |
| # Convert PIL image to numpy array | |
| img = np.array(image) | |
| results = model(img) # Run the model on the image | |
| if isinstance(results, list): | |
| results = results[0] # Take the first result if it's a list | |
| # Access the bounding boxes and other relevant information | |
| boxes = results[0].boxes # Get the boxes from the first result | |
| # Convert the boxes to a Pandas DataFrame | |
| df = pd.DataFrame(boxes.xyxy.cpu().numpy(), columns=['x1', 'y1', 'x2', 'y2']) | |
| df['confidence'] = boxes.conf.cpu().numpy() | |
| df['class'] = boxes.cls.cpu().numpy() | |
| # Get the class names | |
| class_names = results.names # Class names dictionary | |
| df['label'] = df['class'].apply(lambda x: class_names[int(x)]) | |
| # Select the necessary columns for the output | |
| df_output = df[['label', 'confidence', 'x1', 'y1', 'x2', 'y2']] | |
| # Convert DataFrame to list of lists | |
| output = df_output.values.tolist() | |
| # Draw bounding boxes on the image | |
| pil_img = Image.fromarray(img) # Convert numpy array back to PIL image | |
| draw = ImageDraw.Draw(pil_img) | |
| # Load a font with a larger size | |
| try: | |
| font = ImageFont.truetype("/Library/Fonts/Arial.ttf", 24) # Adjust the font size as needed | |
| except IOError: | |
| font = ImageFont.load_default() # Use default font if the specified one is not found | |
| for _, row in df.iterrows(): | |
| x1, y1, x2, y2 = row['x1'], row['y1'], row['x2'], row['y2'] | |
| label = row['label'] | |
| confidence = row['confidence'] | |
| # Draw bounding box | |
| draw.rectangle([x1, y1, x2, y2], outline="red", width=3) | |
| # Draw label and confidence with larger font | |
| text = f"{label} ({confidence:.2f})" | |
| draw.text((x1, y1 - 30), text, font=font, fill="red") | |
| # Return the image with bounding boxes and the prediction results | |
| return pil_img, output | |
| # Create Gradio interface | |
| iface = gr.Interface( | |
| fn=predict, | |
| inputs=gr.Image(type="pil"), # Input image as PIL | |
| outputs=[gr.Image(type="pil"), # Output image with bounding boxes | |
| gr.Dataframe( | |
| headers=["Label", "Confidence", "Xmin", "Ymin", "Xmax", "Ymax"], | |
| label="Predictions" | |
| )], | |
| title="Garbage Detection", | |
| description="Upload an image to detect objects." | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| iface.launch(share=True) | |