gjpeg / app.py
zw89's picture
Update app.py
fbc9380 verified
import gradio as gr
import torch
import numpy as np
import cv2
from PIL import Image
from spandrel import ModelLoader
import requests
import os
# 1. Загрузка модели в стиле "сохранение на диск"
MODEL_PATH = "realesrgan_x2.pth"
def load_model():
if not os.path.exists(MODEL_PATH):
d = "github.com"
p = "xinntao/Real-ESRGAN/releases/download/v0.2.1/RealESRGAN_x2plus.pth"
url = f"https://{d}/{p}"
response = requests.get(url)
with open(MODEL_PATH, "wb") as f:
f.write(response.content)
loader = ModelLoader()
model_instance = loader.load_from_file(MODEL_PATH)
model_instance.eval()
return model_instance
model = load_model()
def recover(img, h_val, gamma_val, sharp_val):
if img is None: return None
img_np = np.array(img.convert("RGB"))
img_bgr = cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR)
# 1. ЧИСТКА: используем ползунок h_val
img_clean = cv2.fastNlMeansDenoisingColored(img_bgr, None, h_val, h_val, 7, 21)
# ИИ часть
img_rgb_ai = cv2.cvtColor(img_clean, cv2.COLOR_BGR2RGB)
input_tensor = torch.from_numpy(img_rgb_ai).permute(2, 0, 1).float().divide(255).unsqueeze(0)
with torch.no_grad():
output_tensor = model(input_tensor)
out_np = output_tensor.squeeze(0).permute(1, 2, 0).clamp(0, 1).numpy()
out_np = (out_np * 255).astype(np.uint8)
res_bgr = cv2.cvtColor(out_np, cv2.COLOR_RGB2BGR)
# 2. ЗАСВЕТКА: используем ползунок gamma_val
invGamma = 1.0 / gamma_val
table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
res_bgr = cv2.LUT(res_bgr, table)
# 3. РЕЗКОСТЬ: используем ползунок sharp_val
blurred = cv2.GaussianBlur(res_bgr, (0, 0), 3)
# Вычисляем коэффициенты на основе слайдера
final_bgr = cv2.addWeighted(res_bgr, sharp_val, blurred, 1.0 - sharp_val, 0)
final_bgr = np.clip(final_bgr, 0, 255).astype(np.uint8)
# Финал
final_rgb = cv2.cvtColor(final_bgr, cv2.COLOR_BGR2RGB)
result_image = Image.fromarray(final_rgb)
output_path = "result.png"
result_image.save(output_path, "PNG")
return result_image, output_path
# НАСТРОЙКА ИНТЕРФЕЙСА С ПОЛЗУНКАМИ
demo = gr.Interface(
fn=recover,
inputs=[
gr.Image(type="pil", label="Загрузить фото"),
gr.Slider(minimum=1, maximum=15, value=5, step=1, label="Сила чистки (убирает зерно)"),
gr.Slider(minimum=0.5, maximum=2.0, value=1.2, step=0.1, label="Гамма (против засветки)"),
gr.Slider(minimum=1.0, maximum=2.5, value=1.4, step=0.1, label="Резкость линий")
],
outputs=[
gr.Image(type="pil", label="Результат"),
gr.File(label="Скачать PNG")
],
title="Artifact Remover PRO: Ручная настройка",
description="Подкручивай ползунки, чтобы найти идеальный баланс между текстурой и четкостью."
)
if __name__ == "__main__":
demo.launch()