import os import cv2 import default_paths as dp from upscaler.GPEN import GPEN from upscaler.GFPGAN import GFPGAN from upscaler.codeformer import CodeFormer from upscaler.restoreformer import RestoreFormer def gfpgan_runner(img, model): img = model.enhance(img) return img def codeformer_runner(img, model): img = model.enhance(img, w=0.9) return img def gpen_runner(img, model): img = model.enhance(img) return img def restoreformer_runner(img, model): img = model.enhance(img) return img supported_upscalers = { "CodeFormer": (dp.CODEFORMER_PATH, codeformer_runner), "GFPGANv1.4": (dp.GFPGAN_V14_PATH, gfpgan_runner), "GFPGANv1.3": (dp.GFPGAN_V13_PATH, gfpgan_runner), "GFPGANv1.2": (dp.GFPGAN_V12_PATH, gfpgan_runner), "GPEN-BFR-512": (dp.GPEN_BFR_512_PATH, gpen_runner), "GPEN-BFR-256": (dp.GPEN_BFR_256_PATH, gpen_runner), "RestoreFormer": (dp.RESTOREFORMER_PATH, gpen_runner), } cv2_upscalers = ["LANCZOS4", "CUBIC", "NEAREST"] def get_available_upscalers_names(): available = [] for name, data in supported_upscalers.items(): if os.path.exists(data[0]): available.append(name) return available def load_face_upscaler(name='GFPGAN', provider=["CPUExecutionProvider"], session_options=None): assert name in get_available_upscalers_names() + cv2_upscalers, f"Face upscaler {name} unavailable." if name in supported_upscalers.keys(): model_path, model_runner = supported_upscalers.get(name) if name == 'CodeFormer': model = CodeFormer(model_path=model_path, provider=provider, session_options=session_options) elif name.startswith('GFPGAN'): model = GFPGAN(model_path=model_path, provider=provider, session_options=session_options) elif name.startswith('GPEN'): model = GPEN(model_path=model_path, provider=provider, session_options=session_options) elif name == "RestoreFormer": model = RestoreFormer(model_path=model_path, provider=provider, session_options=session_options) elif name == 'LANCZOS4': model = None model_runner = lambda img, _: cv2.resize(img, (512,512), interpolation=cv2.INTER_LANCZOS4) elif name == 'CUBIC': model = None model_runner = lambda img, _: cv2.resize(img, (512,512), interpolation=cv2.INTER_CUBIC) elif name == 'NEAREST': model = None model_runner = lambda img, _: cv2.resize(img, (512,512), interpolation=cv2.INTER_NEAREST) else: model = None return (model, model_runner)