import gradio as gr
get_point_mask = """
async function getPointMask(image, points) {
console.log("getting point mask");
console.log(points)
const { maskURL } = await segmentPoints(
image,
points
);
if(points.length == 0){
return [ null ];
}
return [ maskURL ];
}
"""
def set_points(image, points_state, evt: gr.SelectData):
points_state.append([evt.index[0]/image.width, evt.index[1]/image.height, True])
return points_state, points_state
with gr.Blocks() as demo:
gr.Markdown("""## Segment Anything Model (SAM) with Gradio Lite
This demo uses [Gradio Lite](https://www.gradio.app/guides/gradio-lite) as UI for running the Segment Anything Model (SAM) with WASM build with [Candle](https://github.com/huggingface/candle).
**Note:** The model's first run may take a few seconds as it loads and caches the model in the browser, and then creates the image embeddings. Any subsequent clicks on points will be significantly faster.
""")
points_state = gr.State([])
with gr.Row():
with gr.Column():
image = gr.Image(label="Input Image", type="pil")
clear_points = gr.Button(value="Clear Points")
points = gr.JSON(label="Input Points", visible=False)
with gr.Column():
mask = gr.Image(label="Output Mask")
clear_points.click(lambda: ([], []), None, [points, points_state])
image.select(set_points, inputs=[image, points_state], outputs=[points, points_state])
points.change(None, inputs=[image, points], outputs=[mask], js=get_point_mask)
demo.launch(show_api=False)