lama.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. import cv2
  3. import numpy as np
  4. import torch
  5. from sorawm.iopaint.helper import (
  6. download_model,
  7. get_cache_path_by_url,
  8. load_jit_model,
  9. norm_img,
  10. )
  11. from sorawm.iopaint.schema import InpaintRequest
  12. from .base import InpaintModel
  13. LAMA_MODEL_URL = os.environ.get(
  14. "LAMA_MODEL_URL",
  15. "https://github.com/Sanster/models/releases/download/add_big_lama/big-lama.pt",
  16. )
  17. LAMA_MODEL_MD5 = os.environ.get("LAMA_MODEL_MD5", "e3aa4aaa15225a33ec84f9f4bc47e500")
  18. ANIME_LAMA_MODEL_URL = os.environ.get(
  19. "ANIME_LAMA_MODEL_URL",
  20. "https://github.com/Sanster/models/releases/download/AnimeMangaInpainting/anime-manga-big-lama.pt",
  21. )
  22. ANIME_LAMA_MODEL_MD5 = os.environ.get(
  23. "ANIME_LAMA_MODEL_MD5", "29f284f36a0a510bcacf39ecf4c4d54f"
  24. )
  25. class LaMa(InpaintModel):
  26. name = "lama"
  27. pad_mod = 8
  28. is_erase_model = True
  29. @staticmethod
  30. def download():
  31. download_model(LAMA_MODEL_URL, LAMA_MODEL_MD5)
  32. def init_model(self, device, **kwargs):
  33. self.model = load_jit_model(LAMA_MODEL_URL, device, LAMA_MODEL_MD5).eval()
  34. @staticmethod
  35. def is_downloaded() -> bool:
  36. return os.path.exists(get_cache_path_by_url(LAMA_MODEL_URL))
  37. def forward(self, image, mask, config: InpaintRequest):
  38. """Input image and output image have same size
  39. image: [H, W, C] RGB
  40. mask: [H, W]
  41. return: BGR IMAGE
  42. """
  43. image = norm_img(image)
  44. mask = norm_img(mask)
  45. mask = (mask > 0) * 1
  46. image = torch.from_numpy(image).unsqueeze(0).to(self.device)
  47. mask = torch.from_numpy(mask).unsqueeze(0).to(self.device)
  48. inpainted_image = self.model(image, mask)
  49. cur_res = inpainted_image[0].permute(1, 2, 0).detach().cpu().numpy()
  50. cur_res = np.clip(cur_res * 255, 0, 255).astype("uint8")
  51. cur_res = cv2.cvtColor(cur_res, cv2.COLOR_RGB2BGR)
  52. return cur_res
  53. class AnimeLaMa(LaMa):
  54. name = "anime-lama"
  55. @staticmethod
  56. def download():
  57. download_model(ANIME_LAMA_MODEL_URL, ANIME_LAMA_MODEL_MD5)
  58. def init_model(self, device, **kwargs):
  59. self.model = load_jit_model(
  60. ANIME_LAMA_MODEL_URL, device, ANIME_LAMA_MODEL_MD5
  61. ).eval()
  62. @staticmethod
  63. def is_downloaded() -> bool:
  64. return os.path.exists(get_cache_path_by_url(ANIME_LAMA_MODEL_URL))