minasora's picture
Upload app2.py
f28255b
raw
history blame
2.48 kB
import cv2
import gradio as gr
import numpy as np
import onnxruntime
from scipy.ndimage.filters import gaussian_filter
from skimage.color import rgb2gray
def xdog(im, gamma=0.98, phi=200, eps=-0.1, k=1.6, sigma=1):
# Source : https://github.com/CemalUnal/XDoG-Filter
# Reference : XDoG: An eXtended difference-of-Gaussians compendium including advanced image stylization
# Link : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.365.151&rep=rep1&type=pdf
if im.shape[2] == 3:
im = rgb2gray(im)
imf1 = gaussian_filter(im, sigma)
imf2 = gaussian_filter(im, sigma * k)
imdiff = imf1 - gamma * imf2
imdiff = (imdiff < eps) * 1.0 + (imdiff >= eps) * (1.0 + np.tanh(phi * imdiff))
imdiff -= imdiff.min()
imdiff /= imdiff.max()
imdiff *= 255.0
imdiff = imdiff.astype('uint8')
imdiff = cv2.cvtColor(imdiff, cv2.COLOR_GRAY2BGR)
return (imdiff / 255.0).astype('float32')
def swin_model(img):
h, w = img.shape[0], img.shape[1]
factor = max(h / 512, w / 512)
if factor > 1:
img = cv2.resize(img, (int(h / factor), int(w / factor)))
img = np.transpose(img[:, :, [2, 1, 0]], (2, 0, 1)) / 255.0
img = img[None, ...].astype(np.float32)
mod_pad_h, mod_pad_w = 0, 0
window_size = 8
if h % window_size != 0:
mod_pad_h = window_size - h % window_size
if w % window_size != 0:
mod_pad_w = window_size - w % window_size
img = np.pad(img, (mod_pad_w, mod_pad_h), 'reflect')
ort_session = onnxruntime.InferenceSession('model.onnx', providers=['CPUExecutionProvider'])
ort_inputs = {ort_session.get_inputs()[0].name: img}
output = ort_session.run(None, ort_inputs)[0]
_, _, a, b = output.shape
output = output[:, :, 0:a - mod_pad_h, 0:b - mod_pad_w]
output = np.squeeze(output).clip(0, 1)
if factor > 1:
output = cv2.resize(output, h, w)
return output
demo = gr.Blocks()
with demo:
gr.Markdown(
"""
# Hello,World!
This is an sketch extraction using in anime art by swin_transformer, you can see the difference between X-dog and learning-based algorithm.
""")
input_image = gr.Image()
output_xdog = gr.Image()
output_deep = gr.Image()
b_xdog = gr.Button("X_dog")
b_learning_based = gr.Button("learning based")
b_xdog.click(xdog, inputs=input_image, outputs=output_xdog)
b_learning_based.click(swin_model, inputs=input_image, outputs=output_deep)
demo.launch()