|
""" |
|
Enhance Utils |
|
------------- |
|
Utility functions untuk meningkatkan kualitas gambar dengan menggunakan model AI: |
|
- Real-ESRGAN untuk upscaling gambar umum |
|
- GFPGAN untuk enhancement wajah (face restoration) |
|
|
|
Created by _drat | 2025 |
|
""" |
|
|
|
import os |
|
import torch |
|
import cv2 |
|
import numpy as np |
|
import subprocess |
|
|
|
from PIL import Image |
|
from gfpgan.utils import GFPGANer |
|
from basicsr.archs.srvgg_arch import SRVGGNetCompact |
|
from realesrgan.utils import RealESRGANer |
|
|
|
|
|
def runcmd(cmd, verbose = False, *args, **kwargs): |
|
process = subprocess.Popen( |
|
cmd, |
|
stdout = subprocess.PIPE, |
|
stderr = subprocess.PIPE, |
|
text = True, |
|
shell = True |
|
) |
|
std_out, std_err = process.communicate() |
|
if verbose: |
|
print(std_out.strip(), std_err) |
|
pass |
|
|
|
|
|
runcmd("pip freeze") |
|
|
|
|
|
if not os.path.exists('GFPGANv1.4.pth'): |
|
runcmd("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .") |
|
|
|
|
|
if not os.path.exists('realesr-general-x4v3.pth'): |
|
runcmd("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .") |
|
|
|
|
|
model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu') |
|
model_path = 'realesr-general-x4v3.pth' |
|
half = True if torch.cuda.is_available() else False |
|
upsampler = RealESRGANer( |
|
scale=4, |
|
model_path=model_path, |
|
model=model, |
|
tile=0, |
|
tile_pad=10, |
|
pre_pad=0, |
|
half=half |
|
) |
|
|
|
|
|
face_enhancer = GFPGANer( |
|
model_path='GFPGANv1.4.pth', |
|
upscale=1, |
|
arch='clean', |
|
channel_multiplier=2 |
|
) |
|
|
|
|
|
def enhance_image( |
|
pil_image: Image, |
|
enhance_face: bool = False, |
|
): |
|
|
|
img = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) |
|
|
|
h, w = img.shape[0:2] |
|
|
|
if h < 300: |
|
img = cv2.resize(img, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4) |
|
|
|
|
|
if enhance_face: |
|
|
|
_, _, output = face_enhancer.enhance( |
|
img, has_aligned=False, only_center_face=True, paste_back=True |
|
) |
|
else: |
|
|
|
output, _ = upsampler.enhance(img, outscale=2) |
|
|
|
|
|
pil_output = Image.fromarray(cv2.cvtColor(output, cv2.COLOR_BGR2RGB)) |
|
|
|
return pil_output |
|
|