Spaces:
Running
on
Zero
Running
on
Zero
import os | |
import cv2 | |
import numpy as np | |
import torch | |
from loguru import logger | |
from lama_cleaner.helper import pad_img_to_modulo, download_model, norm_img, get_cache_path_by_url | |
from lama_cleaner.model.base import InpaintModel | |
from lama_cleaner.schema import Config | |
LAMA_MODEL_URL = os.environ.get( | |
"LAMA_MODEL_URL", | |
"https://github.com/Sanster/models/releases/download/add_big_lama/big-lama.pt", | |
) | |
#"https://drive.google.com/file/d/1bMD06F9hkkS1oi8cEmb4cSjXz54Pxs6A/view?usp=sharing" #big-lama.pt file | |
class LaMa(InpaintModel): | |
pad_mod = 8 | |
def init_model(self, device, **kwargs): | |
if os.environ.get("LAMA_MODEL"): | |
model_path = os.environ.get("LAMA_MODEL") | |
if not os.path.exists(model_path): | |
raise FileNotFoundError( | |
f"lama torchscript model not found: {model_path}" | |
) | |
else: | |
model_path = download_model(LAMA_MODEL_URL) | |
logger.info(f"Load LaMa model from: {model_path}") | |
model = torch.jit.load(model_path, map_location="cpu") | |
model = model.to(device) | |
model.eval() | |
self.model = model | |
self.model_path = model_path | |
def is_downloaded() -> bool: | |
return os.path.exists(get_cache_path_by_url(LAMA_MODEL_URL)) | |
def forward(self, image, mask, config: Config): | |
"""Input image and output image have same size | |
image: [H, W, C] RGB | |
mask: [H, W] | |
return: BGR IMAGE | |
""" | |
image = norm_img(image) | |
mask = norm_img(mask) | |
mask = (mask > 0) * 1 | |
image = torch.from_numpy(image).unsqueeze(0).to(self.device) | |
mask = torch.from_numpy(mask).unsqueeze(0).to(self.device) | |
inpainted_image = self.model(image, mask) | |
cur_res = inpainted_image[0].permute(1, 2, 0).detach().cpu().numpy() | |
cur_res = np.clip(cur_res * 255, 0, 255).astype("uint8") | |
cur_res = cv2.cvtColor(cur_res, cv2.COLOR_RGB2BGR) | |
return cur_res | |