|
import torch |
|
from PIL import Image |
|
from RealESRGAN import RealESRGAN |
|
import gradio as gr |
|
import os |
|
import spaces |
|
|
|
if torch.cuda.is_available(): |
|
print(f"CUDA is available. GPU: {torch.cuda.get_device_name(0)}") |
|
device = torch.device("cuda") |
|
else: |
|
print("CUDA is not available. Using CPU.") |
|
device = torch.device("cpu") |
|
|
|
class LazyRealESRGAN: |
|
def __init__(self, device, scale): |
|
self.device = device |
|
self.scale = scale |
|
self.model = None |
|
|
|
def load_model(self): |
|
if self.model is None: |
|
self.model = RealESRGAN(self.device, scale=self.scale) |
|
self.model.load_weights(f'weights/RealESRGAN_x{self.scale}.pth', download=True) |
|
|
|
def predict(self, img): |
|
self.load_model() |
|
return self.model.predict(img) |
|
|
|
model2 = LazyRealESRGAN(device, scale=2) |
|
model4 = LazyRealESRGAN(device, scale=4) |
|
model8 = LazyRealESRGAN(device, scale=8) |
|
|
|
@spaces.GPU |
|
def inference(image, size): |
|
if image is None: |
|
raise gr.Error("Image not uploaded") |
|
|
|
try: |
|
if torch.cuda.is_available(): |
|
torch.cuda.empty_cache() |
|
|
|
if size == '2x': |
|
result = model2.predict(image.convert('RGB')) |
|
elif size == '4x': |
|
result = model4.predict(image.convert('RGB')) |
|
else: |
|
width, height = image.size |
|
if width >= 5000 or height >= 5000: |
|
raise gr.Error("The image is too large.") |
|
result = model8.predict(image.convert('RGB')) |
|
|
|
print(f"Image size ({device}): {size} ... OK") |
|
return result |
|
except torch.cuda.OutOfMemoryError: |
|
raise gr.Error("GPU out of memory. Try a smaller image or lower upscaling factor.") |
|
except Exception as e: |
|
raise gr.Error(f"An error occurred: {str(e)}") |
|
|
|
title = "Face Real ESRGAN UpScale: 2x 4x 8x" |
|
description = "This is an unofficial demo for Real-ESRGAN. Scales the resolution of a photo. This model shows better results on faces compared to the original version." |
|
|
|
|
|
|
|
iface = gr.Interface( |
|
inference, |
|
[ |
|
gr.Image(type="pil"), |
|
gr.Radio(["2x", "4x", "8x"], type="value", value="2x", label="Resolution model") |
|
], |
|
gr.Image(type="pil", label="Output"), |
|
title=title, |
|
description=description, |
|
flagging_mode="never", |
|
cache_examples=True |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
iface.launch(debug=True, show_error=True) |