Spaces:
Running
on
Zero
Running
on
Zero
from typing_extensions import Literal, TypeAlias | |
import warnings | |
with warnings.catch_warnings(): | |
warnings.simplefilter("ignore") | |
from controlnet_aux.processor import ( | |
CannyDetector, MidasDetector, HEDdetector, LineartDetector, LineartAnimeDetector, OpenposeDetector | |
) | |
Processor_id: TypeAlias = Literal[ | |
"canny", "depth", "softedge", "lineart", "lineart_anime", "openpose", "tile" | |
] | |
class Annotator: | |
def __init__(self, processor_id: Processor_id, model_path="models/Annotators", detect_resolution=None, device='cuda'): | |
if processor_id == "canny": | |
self.processor = CannyDetector() | |
elif processor_id == "depth": | |
self.processor = MidasDetector.from_pretrained(model_path).to(device) | |
elif processor_id == "softedge": | |
self.processor = HEDdetector.from_pretrained(model_path).to(device) | |
elif processor_id == "lineart": | |
self.processor = LineartDetector.from_pretrained(model_path).to(device) | |
elif processor_id == "lineart_anime": | |
self.processor = LineartAnimeDetector.from_pretrained(model_path).to(device) | |
elif processor_id == "openpose": | |
self.processor = OpenposeDetector.from_pretrained(model_path).to(device) | |
elif processor_id == "tile": | |
self.processor = None | |
else: | |
raise ValueError(f"Unsupported processor_id: {processor_id}") | |
self.processor_id = processor_id | |
self.detect_resolution = detect_resolution | |
def __call__(self, image): | |
width, height = image.size | |
if self.processor_id == "openpose": | |
kwargs = { | |
"include_body": True, | |
"include_hand": True, | |
"include_face": True | |
} | |
else: | |
kwargs = {} | |
if self.processor is not None: | |
detect_resolution = self.detect_resolution if self.detect_resolution is not None else min(width, height) | |
image = self.processor(image, detect_resolution=detect_resolution, image_resolution=min(width, height), **kwargs) | |
image = image.resize((width, height)) | |
return image | |