mist-fucker / app.py
wtf741's picture
change the inspiration source due toillyasviel deleted the repo
50097ce
import os
import random
import textwrap
import cv2
import gradio as gr
import numpy as np
from PIL import Image
from cv2.ximgproc import guidedFilter
from imgutils.data import load_image
from imgutils.restore import restore_with_nafnet, restore_with_scunet
def dynamic_clean_adverse(
input_image: Image.Image,
diameter_min: int = 4,
diameter_max: int = 6,
sigma_color_min: float = 6.0,
sigma_color_max: float = 10.0,
sigma_space_min: float = 6.0,
sigma_space_max: float = 10.0,
radius_min: int = 3,
radius_max: int = 6,
eps_min: float = 16.0,
eps_max: float = 24.0,
b_iters: int = 64,
g_iters: int = 8,
):
img = np.array(input_image).astype(np.float32)
y = img.copy()
for _ in range(b_iters):
diameter = random.randint(diameter_min, diameter_max)
sigma_color = random.random() * (sigma_color_max - sigma_color_min) + sigma_color_min
sigma_space = random.random() * (sigma_space_max - sigma_space_min) + sigma_space_min
y = cv2.bilateralFilter(y, diameter, sigma_color, sigma_space)
for _ in range(g_iters):
radius = random.randint(radius_min, radius_max)
eps = random.random() * (eps_max - eps_min) + eps_min
y = guidedFilter(img, y, radius, eps)
output_image = Image.fromarray(y.clip(0, 255).astype(np.uint8))
return output_image
def clean(
image: Image.Image,
diameter_min: int = 4,
diameter_max: int = 6,
sigma_color_min: float = 6.0,
sigma_color_max: float = 10.0,
sigma_space_min: float = 6.0,
sigma_space_max: float = 10.0,
radius_min: int = 3,
radius_max: int = 6,
eps_min: float = 16.0,
eps_max: float = 24.0,
b_iters: int = 64,
g_iters: int = 8,
use_scunet_clean: bool = False,
use_nafnet_clean: bool = False
) -> Image.Image:
image = load_image(image)
image = dynamic_clean_adverse(
image,
diameter_min, diameter_max,
sigma_color_min, sigma_color_max,
sigma_space_min, sigma_space_max,
radius_min, radius_max,
eps_min, eps_max,
b_iters, g_iters
)
if use_scunet_clean:
image = restore_with_scunet(image)
if use_nafnet_clean:
image = restore_with_nafnet(image)
return image
if __name__ == '__main__':
with gr.Blocks() as demo:
with gr.Row():
gr_markdown = gr.Markdown(textwrap.dedent("""
Cleaner for [MIST](https://github.com/mist-project/mist-v2)(**M**IST **I**s **S**tupid **T**rash) noises.
Inspired by https://huggingface.co/spaces/p1atdev/AdverseCleaner
* **Update 2023.12.18**, allow random dynamic adversarial clean and iterate steps.
""").strip())
with gr.Row():
with gr.Column():
gr_input_image = gr.Image(label='Input Image', type="pil")
gr_submit = gr.Button(value='MIST = MIST is Stupid Trash', variant='primary')
with gr.Accordion("Advanced Config", open=False):
with gr.Row():
gr_diameter_min = gr.Slider(
minimum=1, maximum=30, step=1, value=4,
label="Diameter Min (default = 4)", interactive=True,
)
gr_diameter_max = gr.Slider(
minimum=1, maximum=30, step=1, value=6,
label="Diameter Max (default = 6)", interactive=True,
)
with gr.Row():
gr_sigma_color_min = gr.Slider(
minimum=1, maximum=30, step=1, value=6,
label="SigmaColor Min (default = 6)", interactive=True,
)
gr_sigma_color_max = gr.Slider(
minimum=1, maximum=30, step=1, value=10,
label="SigmaColor Max (default = 10)", interactive=True,
)
with gr.Row():
gr_sigma_space_min = gr.Slider(
minimum=1, maximum=30, step=1, value=6,
label="SigmaSpace Min (default = 6)", interactive=True,
)
gr_sigma_space_max = gr.Slider(
minimum=1, maximum=30, step=1, value=10,
label="SigmaSpace Max (default = 10)", interactive=True,
)
with gr.Row():
gr_radius_min = gr.Slider(
minimum=1, maximum=30, step=1, value=3,
label="Radius Min (default = 3)", interactive=True,
)
gr_radius_max = gr.Slider(
minimum=1, maximum=30, step=1, value=6,
label="Radius Max (default = 6)", interactive=True,
)
with gr.Row():
gr_eps_min = gr.Slider(
minimum=1, maximum=30, step=1, value=16,
label="Accuracy Min (default = 16)", interactive=True,
)
gr_eps_max = gr.Slider(
minimum=1, maximum=30, step=1, value=24,
label="Accuracy Max (default = 24)", interactive=True,
)
with gr.Row():
gr_b_iters = gr.Slider(
minimum=1, maximum=256, step=1, value=64,
label="Bilateral Filter Iters (default = 64)", interactive=True,
)
gr_g_iters = gr.Slider(
minimum=1, maximum=32, step=1, value=8,
label="Guided Filter Iters (default = 8)", interactive=True,
)
with gr.Accordion("Extra Restoration", open=False):
with gr.Row():
gr_scunet = gr.Checkbox(label='Use SCUNET', value=False)
gr_nafnet = gr.Checkbox(label='Use NAFNET', value=False)
with gr.Column():
gr_output_image = gr.Image(label='Output Image', type="pil")
gr_submit.click(
fn=clean,
inputs=[
gr_input_image,
gr_diameter_min,
gr_diameter_max,
gr_sigma_color_min,
gr_sigma_color_max,
gr_sigma_space_min,
gr_sigma_space_max,
gr_radius_min,
gr_radius_max,
gr_eps_min,
gr_eps_max,
gr_b_iters,
gr_g_iters,
gr_scunet,
gr_nafnet,
],
outputs=[gr_output_image],
)
demo.queue(os.cpu_count()).launch()