Rishikesh22's picture
Update app.py
68e6eb9 verified
Raw History Blame Contribute Delete
2.07 kB
import gradio as gr
import numpy as np
import torch
from diffusers import StableDiffusionInpaintPipeline
from PIL import Image
from segment_anything import SamPredictor, sam_model_registry
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device)
predictor = SamPredictor(sam)
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-inpainting",
# torch_dtype = torch.float16
)
pipe = pipe.to(device)
selected_pixels = []
with gr.Blocks() as demo:
with gr.Row():
input_img = gr.Image(label="Input")
mask_img = gr.Image(label="Mask")
output_img = gr.Image(label="Output")
with gr.Blocks():
prompt_text = gr.Textbox(lines=1, label="Prompt")
with gr.Row():
submit =gr.Button("submit")
def inpaint(image, mask, prompt):
image = Image.fromarray(image)
mask = Image.fromarray(mask)
image = image.resize((512,512))
mask = mask.resize((512,512))
output = pipe(
prompt = prompt,
image= image,
mask_image = mask
).images[0]
return output
def generate_mask(image, evt:gr.SelectData):
selected_pixels.append(evt.index)
predictor.set_image(image)
input_points = np.array(selected_pixels)
input_labels = np.ones(input_points.shape[0])
mask, _, _ = predictor.predict(
point_coords=input_points,
point_labels=input_labels,
multimask_output=False
)
#(n,size,size)
# mask = np.logical_not(mask) # for selection of foregraound and background will change.
mask = Image.fromarray(mask[0, :, :])
return mask
input_img.select(generate_mask, [input_img],[mask_img])
submit.click(inpaint, inputs=[input_img,mask_img,prompt_text], outputs=[output_img])
if __name__ == "__main__":
demo.launch()