|
import cv2 |
|
import numpy as np |
|
import PIL.Image |
|
import torch |
|
from controlnet_aux.util import HWC3, ade_palette |
|
from transformers import AutoImageProcessor, UperNetForSemanticSegmentation |
|
|
|
from cv_utils import resize_image |
|
|
|
|
|
class ImageSegmentor: |
|
def __init__(self): |
|
self.image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small") |
|
self.image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small") |
|
|
|
@torch.no_grad() |
|
def __call__(self, image: np.ndarray, **kwargs) -> PIL.Image.Image: |
|
detect_resolution = kwargs.pop("detect_resolution", 512) |
|
image_resolution = kwargs.pop("image_resolution", 512) |
|
image = HWC3(image) |
|
image = resize_image(image, resolution=detect_resolution) |
|
image = PIL.Image.fromarray(image) |
|
|
|
pixel_values = self.image_processor(image, return_tensors="pt").pixel_values |
|
outputs = self.image_segmentor(pixel_values) |
|
seg = self.image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image.size[::-1]])[0] |
|
color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) |
|
for label, color in enumerate(ade_palette()): |
|
color_seg[seg == label, :] = color |
|
color_seg = color_seg.astype(np.uint8) |
|
|
|
color_seg = resize_image(color_seg, resolution=image_resolution, interpolation=cv2.INTER_NEAREST) |
|
return PIL.Image.fromarray(color_seg) |
|
|