File size: 4,727 Bytes
2780331 1f18b3b 2780331 ebf18af 2780331 1b1ee27 2780331 1b1ee27 1f18b3b 2780331 ebf18af 2780331 ebf18af 2780331 ebf18af 2780331 ebf18af 2780331 ebf18af 2780331 ebf18af 2780331 622eb6a ebf18af 2780331 1b1ee27 2780331 ebf18af 2780331 1b1ee27 2780331 ebf18af 2780331 622eb6a 2780331 1b1ee27 2780331 1b1ee27 ebf18af 1b1ee27 2780331 5822588 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
import os
import sys
from torchvision.transforms import functional
sys.modules["torchvision.transforms.functional_tensor"] = functional
import spaces
from basicsr.archs.srvgg_arch import SRVGGNetCompact
from gfpgan.utils import GFPGANer
from realesrgan.utils import RealESRGANer
import torch
import cv2
import gradio as gr
from gradio_imageslider import ImageSlider # ์ฌ๋ผ์ด๋ ์ปดํฌ๋ํธ ์ถ๊ฐ
from PIL import Image # PIL์ ์ฌ์ฉํ์ฌ numpy ์ด๋ฏธ์ง๋ฅผ PIL ์ด๋ฏธ์ง๋ก ๋ณํ
# ํ์ ๋ชจ๋ธ ๋ค์ด๋ก๋
if not os.path.exists('realesr-general-x4v3.pth'):
os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .")
if not os.path.exists('GFPGANv1.2.pth'):
os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.2.pth -P .")
if not os.path.exists('GFPGANv1.3.pth'):
os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P .")
if not os.path.exists('GFPGANv1.4.pth'):
os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .")
if not os.path.exists('RestoreFormer.pth'):
os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.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)
# ์ด๋ฏธ์ง ์ ์ฅ ๋๋ ํ ๋ฆฌ ์์ฑ (ํ์์ ์ฃผ์ ํด์ )
# os.makedirs('output', exist_ok=True)
@spaces.GPU(duration=120)
def upscaler(img, version, scale):
try:
# ์
๋ ฅ๋ img๋ ํ์ผ ๊ฒฝ๋ก์
image_array = cv2.imread(img, cv2.IMREAD_UNCHANGED)
if image_array is None:
print("์ด๋ฏธ์ง ๋ก๋ ์คํจ")
return None, None
if len(image_array.shape) == 3 and image_array.shape[2] == 4:
img_mode = 'RGBA'
elif len(image_array.shape) == 2:
img_mode = None
image_array = cv2.cvtColor(image_array, cv2.COLOR_GRAY2BGR)
else:
img_mode = None
h, w = image_array.shape[0:2]
if h < 300:
image_array = cv2.resize(image_array, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4)
# ๋ณ๊ฒฝ ์ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ RGB (๋๋ RGBA)๋ก ๋ณํ
if img_mode == 'RGBA':
original_rgb = cv2.cvtColor(image_array, cv2.COLOR_BGRA2RGBA)
else:
original_rgb = cv2.cvtColor(image_array, cv2.COLOR_BGR2RGB)
face_enhancer = GFPGANer(
model_path=f'{version}.pth',
upscale=2,
arch='RestoreFormer' if version=='RestoreFormer' else 'clean',
channel_multiplier=2,
bg_upsampler=upsampler
)
try:
_, _, output = face_enhancer.enhance(image_array, has_aligned=False, only_center_face=False, paste_back=True)
except RuntimeError as error:
print('์ค๋ฅ', error)
return None, None
try:
if scale != 2:
interpolation = cv2.INTER_AREA if scale < 2 else cv2.INTER_LANCZOS4
h, w = image_array.shape[0:2]
output = cv2.resize(output, (int(w * scale / 2), int(h * scale / 2)), interpolation=interpolation)
except Exception as error:
print('์๋ชป๋ ์ฌ์ค์ผ์ผ๋ง ์
๋ ฅ.', error)
output_rgb = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
# numpy ์ด๋ฏธ์ง๋ฅผ PIL ์ด๋ฏธ์ง๋ก ๋ณํ (์ฌ๋ผ์ด๋์์ type="pil" ์ฌ์ฉ)
original_pil = Image.fromarray(original_rgb)
output_pil = Image.fromarray(output_rgb)
# ๋ณ๊ฒฝ ์ /ํ ์ด๋ฏธ์ง๋ฅผ ํํ๋ก ๋ฐํํ์ฌ ์ฌ๋ผ์ด๋์ ํ์
return original_pil, output_pil
except Exception as error:
print('์ ์ญ ์์ธ', error)
return None, None
if __name__ == "__main__":
title = "์ด๋ฏธ์ง ์
์ค์ผ์ผ ๋ฐ ๋ณต์ [GFPGAN ์๊ณ ๋ฆฌ์ฆ]"
demo = gr.Interface(
upscaler, [
gr.Image(type="filepath", label="์
๋ ฅ"),
gr.Radio(['GFPGANv1.2', 'GFPGANv1.3', 'GFPGANv1.4', 'RestoreFormer'], type="value", label="๋ฒ์ ", value="GFPGANv1.4", visible=False),
gr.Number(label="์ฌ์ค์ผ์ผ๋ง ๊ณ์", value=0, visible=False),
], [
ImageSlider(label="์ถ๋ ฅ", type="pil")
],
title=title,
examples=[["์์ .png", "GFPGANv1.4", 0]],
allow_flagging="never"
)
demo.queue()
demo.launch()
|