Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import csv | |
| from io import StringIO | |
| from PIL import Image | |
| import numpy as np | |
| import base64 | |
| # Define the annotation types | |
| ANNOTATION_TYPES = ['rect', 'circle'] | |
| # Define the Annotation class | |
| class Annotation: | |
| def __init__(self, x, y, width, height, annotation_type): | |
| self.x = x | |
| self.y = y | |
| self.width = width | |
| self.height = height | |
| self.type = annotation_type | |
| # Define the Gradio interface | |
| def annotate_images(images): | |
| # Define the canvas size | |
| canvas_size = (600, 600) | |
| # Define the initial state | |
| state = { | |
| 'image': None, | |
| 'annotations': [], | |
| 'annotation_type': ANNOTATION_TYPES[0], | |
| 'start_point': None | |
| } | |
| # Define the canvas drawing function | |
| def draw_canvas(canvas, image_data, annotations): | |
| # Convert the image data to a PIL Image object | |
| image = Image.fromarray(image_data) | |
| # Resize the image to fit the canvas | |
| image = image.resize(canvas_size) | |
| # Draw the image on the canvas | |
| canvas.draw_image(image, (canvas_size[0]/2, canvas_size[1]/2)) | |
| # Draw the annotations on the canvas | |
| for annotation in annotations: | |
| x, y, width, height = annotation.x, annotation.y, annotation.width, annotation.height | |
| if annotation.type == 'rect': | |
| canvas.draw_rect(x, y, width, height, stroke_color='red') | |
| elif annotation.type == 'circle': | |
| radius = np.sqrt(np.power(width, 2) + np.power(height, 2)) / 2 | |
| center_x, center_y = x + width / 2, y + height / 2 | |
| canvas.draw_circle(center_x, center_y, radius, stroke_color='red') | |
| # Define the canvas mousedown event handler | |
| def canvas_mousedown(canvas, x, y): | |
| state['start_point'] = (x, y) | |
| # Define the canvas mousemove event handler | |
| def canvas_mousemove(canvas, x, y): | |
| if state['start_point'] is not None: | |
| start_x, start_y = state['start_point'] | |
| end_x, end_y = x, y | |
| annotation_type = state['annotation_type'] | |
| draw_annotation(canvas, start_x, start_y, end_x, end_y, annotation_type) | |
| # Define the canvas mouseup event handler | |
| def canvas_mouseup(canvas, x, y): | |
| if state['start_point'] is not None: | |
| start_x, start_y = state['start_point'] | |
| end_x, end_y = x, y | |
| annotation_type = state['annotation_type'] | |
| add_annotation(start_x, start_y, end_x, end_y, annotation_type) | |
| state['start_point'] = None | |
| # Define the add annotation function | |
| def add_annotation(start_x, start_y, end_x, end_y, annotation_type): | |
| # Calculate the width and height of the annotation | |
| width = np.abs(start_x - end_x) | |
| height = np.abs(start_y - end_y) | |
| # Create the annotation object | |
| annotation = Annotation(start_x, start_y, width, height, annotation_type) | |
| # Add the annotation to the array | |
| state['annotations'].append(annotation) | |
| # Redraw the canvas | |
| draw_canvas(canvas, state['image'], state['annotations']) | |
| # | |