Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| from meta_segment_anything import SegmentAnything | |
| from PIL import Image, ImageDraw | |
| def check_location(image, enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5, area): | |
| if image is None: | |
| yield None | |
| return | |
| if not enable1 and not enable2 and not enable3 and not enable4 and not enable5: | |
| yield None | |
| return | |
| points = [] | |
| if enable1: | |
| points.append([left1, top1]) | |
| if enable2: | |
| points.append([left2, top2]) | |
| if enable3: | |
| points.append([left3, top3]) | |
| if enable4: | |
| points.append([left4, top4]) | |
| if enable5: | |
| points.append([left5, top5]) | |
| for point in points: | |
| left, top = point | |
| draw = ImageDraw.Draw(image) | |
| draw.ellipse([(left - 2, top - 2), (left + 3, top + 3)], fill=(255, 0, 0)) | |
| yield image | |
| def process_image(image, enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5, area): | |
| if image is None: | |
| yield None | |
| return | |
| if not enable1 and not enable2 and not enable3 and not enable4 and not enable5: | |
| yield None | |
| return | |
| predictor = SegmentAnything() | |
| points = [] | |
| if enable1: | |
| points.append([left1, top1]) | |
| if enable2: | |
| points.append([left2, top2]) | |
| if enable3: | |
| points.append([left3, top3]) | |
| if enable4: | |
| points.append([left4, top4]) | |
| if enable5: | |
| points.append([left5, top5]) | |
| newImage = Image.new('RGBA', image.size) | |
| for point in points: | |
| point_coords = np.array([[0, 0], point]) | |
| point_labels = np.array([0, 1]) | |
| masks, _, _ = predictor.predict(image, point_coords, point_labels) | |
| if area == 'small': | |
| mask = masks[0] | |
| elif area == 'medium': | |
| mask = masks[1] | |
| else: | |
| mask = masks[-1] | |
| maskimage = SegmentAnything.makeMaskImage(mask.T, (0xff, 0xff, 0xff, 0xff)) | |
| maskNewImage = SegmentAnything.makeNewImage(image, maskimage) | |
| newImage.paste(maskNewImage, (0, 0), maskNewImage) | |
| yield newImage | |
| def tab_select(evt: gr.SelectData, state): | |
| state['active'] = evt.index | |
| print('select {}'.format(evt.index)) | |
| return state | |
| def image_select(evt: gr.SelectData, state, enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5): | |
| if state['active'] == 4: | |
| return [enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, True, evt.index[0], evt.index[1]] | |
| if state['active'] == 3: | |
| return [enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, True, evt.index[0], evt.index[1], enable5, left5, top5] | |
| if state['active'] == 2: | |
| return [enable1, left1, top1, enable2, left2, top2, True, evt.index[0], evt.index[1], enable4, left4, top4, enable5, left5, top5] | |
| elif state['active'] == 1: | |
| return [enable1, left1, top1, True, evt.index[0], evt.index[1], enable3, left3, top3, enable4, left4, top4, enable5, left5, top5] | |
| return [True, evt.index[0], evt.index[1], enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5] | |
| with gr.Blocks(title='clip-image') as app: | |
| state = gr.State({ 'active': 0 }) | |
| gr.Markdown(''' | |
| # Clip Image | |
| clip an image from given points | |
| ''') | |
| with gr.Row(): | |
| with gr.Column(): | |
| image = gr.Image(type='pil') | |
| gr.Markdown('click on the image to position') | |
| with gr.Tab('point1') as tab1: | |
| enable1 = gr.Checkbox(label='enable', value=True) | |
| left1 = gr.Slider(maximum=4000, step=1, label='left') | |
| top1 = gr.Slider(maximum=4000, step=1, label='top') | |
| with gr.Tab('point2') as tab2: | |
| enable2 = gr.Checkbox(label='enable') | |
| left2 = gr.Slider(maximum=4000, step=1, label='left') | |
| top2 = gr.Slider(maximum=4000, step=1, label='top') | |
| with gr.Tab('point3') as tab3: | |
| enable3 = gr.Checkbox(label='enable') | |
| left3 = gr.Slider(maximum=4000, step=1, label='left') | |
| top3 = gr.Slider(maximum=4000, step=1, label='top') | |
| with gr.Tab('point4') as tab4: | |
| enable4 = gr.Checkbox(label='enable') | |
| left4 = gr.Slider(maximum=4000, step=1, label='left') | |
| top4 = gr.Slider(maximum=4000, step=1, label='top') | |
| with gr.Tab('point5') as tab5: | |
| enable5 = gr.Checkbox(label='enable') | |
| left5 = gr.Slider(maximum=4000, step=1, label='left') | |
| top5 = gr.Slider(maximum=4000, step=1, label='top') | |
| btnloc = gr.Button(value='check location') | |
| area = gr.Dropdown(label='target area', choices=['large', 'medium', 'small'], value='large') | |
| with gr.Row(): | |
| with gr.Column(min_width=160): | |
| clearBtn = gr.ClearButton() | |
| with gr.Column(min_width=160): | |
| btn = gr.Button(value='Submit') | |
| inputs = [image, enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5, area] | |
| with gr.Column(): | |
| outputs = [gr.Image(label='segmentation', type='pil')] | |
| tab1.select(tab_select, inputs=state, outputs=state) | |
| tab2.select(tab_select, inputs=state, outputs=state) | |
| tab3.select(tab_select, inputs=state, outputs=state) | |
| tab4.select(tab_select, inputs=state, outputs=state) | |
| tab5.select(tab_select, inputs=state, outputs=state) | |
| image.select(image_select, inputs=[state, enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5], outputs=[enable1, left1, top1, enable2, left2, top2, enable3, left3, top3, enable4, left4, top4, enable5, left5, top5]) | |
| btnloc.click(check_location, inputs=inputs, outputs=outputs) | |
| clearBtn.add(inputs + outputs) | |
| btn.click(process_image, inputs=inputs, outputs=outputs, concurrency_limit=20) | |
| gr.Examples( | |
| [['examples/example1.jpg', True, 200, 250, True, 340, 250, False, 0, 0, False, 0, 0, False, 0, 0, 'large'], ['examples/example2.jpg', True, 256, 256, False, 0, 0, False, 0, 0, False, 0, 0, False, 0, 0, 'large']], | |
| inputs, | |
| outputs, | |
| process_image, | |
| cache_examples=True, | |
| ) | |
| app.launch() | |