Spaces:
Runtime error
Runtime error
"""Preprocessors that do not need to run a torch model.""" | |
import cv2 | |
import numpy as np | |
from ..supported_preprocessor import Preprocessor, PreprocessorParameter | |
from ..utils import resize_image_with_pad | |
from annotator.util import HWC3 | |
class PreprocessorNone(Preprocessor): | |
def __init__(self): | |
super().__init__(name="none") | |
self.sorting_priority = 10 | |
self.tags = ["InstructP2P"] | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
input_mask=None, | |
**kwargs | |
): | |
return input_image | |
class PreprocessorCanny(Preprocessor): | |
def __init__(self): | |
super().__init__(name="canny") | |
self.tags = ["Canny"] | |
self.slider_1 = PreprocessorParameter( | |
minimum=1, | |
maximum=255, | |
step=1, | |
value=100, | |
label="Low Threshold", | |
) | |
self.slider_2 = PreprocessorParameter( | |
minimum=1, | |
maximum=255, | |
step=1, | |
value=200, | |
label="High Threshold", | |
) | |
self.sorting_priority = 100 | |
self.use_soft_projection_in_hr_fix = True | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
**kwargs | |
): | |
input_image, remove_pad = resize_image_with_pad(input_image, resolution) | |
canny_image = cv2.cvtColor( | |
cv2.Canny(input_image, int(slider_1), int(slider_2)), cv2.COLOR_GRAY2RGB | |
) | |
return remove_pad(canny_image) | |
class PreprocessorInvert(Preprocessor): | |
def __init__(self): | |
super().__init__(name="invert") | |
self._label = "invert (from white bg & black line)" | |
self.tags = [ | |
"Canny", | |
"Lineart", | |
"Scribble", | |
"MLSD", | |
] | |
self.slider_resolution = PreprocessorParameter(visible=False) | |
self.sorting_priority = 20 | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
**kwargs | |
): | |
return 255 - HWC3(input_image) | |
class PreprocessorBlurGaussian(Preprocessor): | |
def __init__(self): | |
super().__init__(name="blur_gaussian") | |
self.slider_1 = PreprocessorParameter( | |
label="Sigma", minimum=64, maximum=2048, value=512 | |
) | |
self.tags = ["Tile"] | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
input_mask=None, | |
**kwargs | |
): | |
img, remove_pad = resize_image_with_pad(input_image, resolution) | |
img = remove_pad(img) | |
result = cv2.GaussianBlur(img, (0, 0), float(slider_1)) | |
return result | |
class PreprocessorScribbleXdog(Preprocessor): | |
def __init__(self): | |
super().__init__(name="scribble_xdog") | |
self.slider_1 = PreprocessorParameter( | |
label="XDoG Threshold", minimum=1, maximum=64, value=32 | |
) | |
self.tags = [ | |
"Scribble", | |
"SparseCtrl", | |
] | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
input_mask=None, | |
**kwargs | |
): | |
img, remove_pad = resize_image_with_pad(input_image, resolution) | |
g1 = cv2.GaussianBlur(img.astype(np.float32), (0, 0), 0.5) | |
g2 = cv2.GaussianBlur(img.astype(np.float32), (0, 0), 5.0) | |
dog = (255 - np.min(g2 - g1, axis=2)).clip(0, 255).astype(np.uint8) | |
result = np.zeros_like(img, dtype=np.uint8) | |
result[2 * (255 - dog) > slider_1] = 255 | |
return remove_pad(result) | |
class PreprocessorShuffle(Preprocessor): | |
def __init__(self): | |
super().__init__(name="shuffle") | |
self.tags = ["Shuffle"] | |
self.model_shuffle = None | |
# Fix res to 512. | |
self.slider_resolution = PreprocessorParameter(value=512, visible=False) | |
def cached_call(self, *args, **kwargs): | |
"""No cache for shuffle, as each call depends on different numpy seed.""" | |
return self(*args, **kwargs) | |
def __call__( | |
self, | |
input_image, | |
resolution, | |
slider_1=None, | |
slider_2=None, | |
slider_3=None, | |
input_mask=None, | |
**kwargs | |
): | |
img, remove_pad = resize_image_with_pad(input_image, resolution) | |
img = remove_pad(img) | |
if self.model_shuffle is None: | |
from annotator.shuffle import ContentShuffleDetector | |
self.model_shuffle = ContentShuffleDetector() | |
result = self.model_shuffle(img) | |
return result | |
Preprocessor.add_supported_preprocessor(PreprocessorNone()) | |
Preprocessor.add_supported_preprocessor(PreprocessorCanny()) | |
Preprocessor.add_supported_preprocessor(PreprocessorInvert()) | |
Preprocessor.add_supported_preprocessor(PreprocessorBlurGaussian()) | |
Preprocessor.add_supported_preprocessor(PreprocessorScribbleXdog()) | |
Preprocessor.add_supported_preprocessor(PreprocessorShuffle()) | |