Spaces:
Runtime error
Runtime error
| import os | |
| os.system("wget https://huggingface.co/Carve/LaMa-ONNX/resolve/main/lama_fp32.onnx") | |
| os.system("pip install onnxruntime imageio") | |
| import cv2 | |
| import paddlehub as hub | |
| import gradio as gr | |
| import torch | |
| from PIL import Image, ImageOps | |
| import numpy as np | |
| import imageio | |
| os.mkdir("data") | |
| os.mkdir("dataout") | |
| model = hub.Module(name='U2Net') | |
| import cv2 | |
| import numpy as np | |
| import onnxruntime | |
| import torch | |
| from PIL import Image | |
| sess_options = onnxruntime.SessionOptions() | |
| rmodel = onnxruntime.InferenceSession('lama_fp32.onnx', sess_options=sess_options) | |
| # Source https://github.com/advimman/lama | |
| def get_image(image): | |
| if isinstance(image, Image.Image): | |
| img = np.array(image) | |
| elif isinstance(image, np.ndarray): | |
| img = image.copy() | |
| else: | |
| raise Exception("Input image should be either PIL Image or numpy array!") | |
| if img.ndim == 3: | |
| img = np.transpose(img, (2, 0, 1)) # chw | |
| elif img.ndim == 2: | |
| img = img[np.newaxis, ...] | |
| assert img.ndim == 3 | |
| img = img.astype(np.float32) / 255 | |
| return img | |
| def ceil_modulo(x, mod): | |
| if x % mod == 0: | |
| return x | |
| return (x // mod + 1) * mod | |
| def scale_image(img, factor, interpolation=cv2.INTER_AREA): | |
| if img.shape[0] == 1: | |
| img = img[0] | |
| else: | |
| img = np.transpose(img, (1, 2, 0)) | |
| img = cv2.resize(img, dsize=None, fx=factor, fy=factor, interpolation=interpolation) | |
| if img.ndim == 2: | |
| img = img[None, ...] | |
| else: | |
| img = np.transpose(img, (2, 0, 1)) | |
| return img | |
| def pad_img_to_modulo(img, mod): | |
| channels, height, width = img.shape | |
| out_height = ceil_modulo(height, mod) | |
| out_width = ceil_modulo(width, mod) | |
| return np.pad( | |
| img, | |
| ((0, 0), (0, out_height - height), (0, out_width - width)), | |
| mode="symmetric", | |
| ) | |
| def prepare_img_and_mask(image, mask, device, pad_out_to_modulo=8, scale_factor=None): | |
| out_image = get_image(image) | |
| out_mask = get_image(mask) | |
| if scale_factor is not None: | |
| out_image = scale_image(out_image, scale_factor) | |
| out_mask = scale_image(out_mask, scale_factor, interpolation=cv2.INTER_NEAREST) | |
| if pad_out_to_modulo is not None and pad_out_to_modulo > 1: | |
| out_image = pad_img_to_modulo(out_image, pad_out_to_modulo) | |
| out_mask = pad_img_to_modulo(out_mask, pad_out_to_modulo) | |
| out_image = torch.from_numpy(out_image).unsqueeze(0).to(device) | |
| out_mask = torch.from_numpy(out_mask).unsqueeze(0).to(device) | |
| out_mask = (out_mask > 0) * 1 | |
| return out_image, out_mask | |
| def predict(jpg, msk): | |
| imagex = Image.open(jpg) | |
| mask = Image.open(msk).convert("L") | |
| image, mask = prepare_img_and_mask(imagex.resize((512, 512)), mask.resize((512, 512)), 'cpu') | |
| # Run the model | |
| outputs = rmodel.run(None, {'image': image.numpy().astype(np.float32), 'mask': mask.numpy().astype(np.float32)}) | |
| output = outputs[0][0] | |
| # Postprocess the outputs | |
| output = output.transpose(1, 2, 0) | |
| output = output.astype(np.uint8) | |
| output = Image.fromarray(output) | |
| output = output.resize(imagex.size) | |
| output.save("/home/user/app/dataout/data_mask.png") | |
| def infer(img,option): | |
| imageio.imwrite("./data/data.png", img) | |
| if option == "automatic": | |
| result = model.Segmentation( | |
| images=[cv2.cvtColor(img, cv2.COLOR_RGB2BGR)], | |
| paths=None, | |
| batch_size=1, | |
| input_size=320, | |
| output_dir='output', | |
| visualization=True) | |
| im = Image.fromarray(result[0]['mask']) | |
| im.save("./data/data_mask.png") | |
| else: | |
| imageio.imwrite("./data/data_mask.png", img["mask"]) | |
| predict("./data/data.png", "./data/data_mask.png") | |
| return "./dataout/data_mask.png","./data/data_mask.png" | |
| iface = gr.Interface( | |
| fn=infer, | |
| inputs=[ | |
| gr.Image(label="Input Image", type="numpy"), | |
| gr.Radio(choices=["automatic", ], | |
| type="value", label="Masking Option") | |
| ], | |
| outputs=[ | |
| gr.Image(type="filepath", label="Inpainted Image"), | |
| gr.Image(type="filepath", label="Generated Mask") | |
| ], | |
| title="LaMa Image Inpainting", | |
| description="Image inpainting with LaMa and U^2-Net. Upload your image and choose automatic.", | |
| ) | |
| iface.launch() |