| import gradio as gr | |
| import numpy as np | |
| import random | |
| with gr.Blocks() as demo: | |
| section_labels = [ | |
| "apple", | |
| "banana", | |
| "carrot", | |
| "donut", | |
| "eggplant", | |
| "fish", | |
| "grapes", | |
| "hamburger", | |
| "ice cream", | |
| "juice", | |
| ] | |
| with gr.Row(): | |
| num_boxes = gr.Slider(0, 5, 2, step=1, label="Number of boxes") | |
| num_segments = gr.Slider(0, 5, 1, step=1, label="Number of segments") | |
| with gr.Row(): | |
| img_input = gr.Image() | |
| img_output = gr.AnnotatedImage( | |
| color_map={"banana": "#a89a00", "carrot": "#ffae00"} | |
| ) | |
| section_btn = gr.Button("Identify Sections") | |
| selected_section = gr.Textbox(label="Selected Section") | |
| def section(img, num_boxes, num_segments): | |
| sections = [] | |
| for a in range(num_boxes): | |
| x = random.randint(0, img.shape[1]) | |
| y = random.randint(0, img.shape[0]) | |
| w = random.randint(0, img.shape[1] - x) | |
| h = random.randint(0, img.shape[0] - y) | |
| sections.append(((x, y, x + w, y + h), section_labels[a])) | |
| for b in range(num_segments): | |
| x = random.randint(0, img.shape[1]) | |
| y = random.randint(0, img.shape[0]) | |
| r = random.randint(0, min(x, y, img.shape[1] - x, img.shape[0] - y)) | |
| mask = np.zeros(img.shape[:2]) | |
| for i in range(img.shape[0]): | |
| for j in range(img.shape[1]): | |
| dist_square = (i - y) ** 2 + (j - x) ** 2 | |
| if dist_square < r**2: | |
| mask[i, j] = round((r**2 - dist_square) / r**2 * 4) / 4 | |
| sections.append((mask, section_labels[b + num_boxes])) | |
| return (img, sections) | |
| section_btn.click(section, [img_input, num_boxes, num_segments], img_output) | |
| def select_section(evt: gr.SelectData): | |
| return section_labels[evt.index] | |
| img_output.select(select_section, None, selected_section) | |
| if __name__ == "__main__": | |
| demo.launch() | |