optimum/amd/ryzenai/pipelines/image_segmentation.py (32 lines of code) (raw):
import numpy as np
from PIL import Image
from transformers import Pipeline
from transformers.image_utils import load_image
class ImageSegmentationPipeline(Pipeline):
def _sanitize_parameters(self, **kwargs):
preprocess_kwargs = {}
postprocess_kwargs = {}
if "timeout" in kwargs:
preprocess_kwargs["timeout"] = kwargs["timeout"]
return preprocess_kwargs, {}, postprocess_kwargs
def preprocess(self, image, timeout=None):
image = load_image(image, timeout=timeout)
inputs = self.image_processor(images=[image], return_tensors="pt")
return inputs
def _forward(self, model_inputs):
target_sizes = model_inputs.pop("target_sizes")
model_outputs = self.model(**model_inputs)
model_outputs["target_sizes"] = target_sizes
return model_outputs
def postprocess(self, model_outputs):
outputs = self.image_processor.post_process_semantic_segmentation(
model_outputs, target_sizes=model_outputs["target_sizes"]
)[0]
annotation = []
segmentation = outputs.numpy()
labels = np.unique(segmentation)
for label in labels:
mask = (segmentation == label) * 255
mask = Image.fromarray(mask.astype(np.uint8), mode="L")
annotation.append({"score": None, "label": label, "mask": mask})
return annotation