|
|
from typing import Optional
|
|
|
|
|
|
import numpy as np
|
|
|
from PIL import Image
|
|
|
|
|
|
|
|
|
def show_masks(
|
|
|
image: np.ndarray,
|
|
|
masks: np.ndarray,
|
|
|
scores: Optional[np.ndarray],
|
|
|
alpha: Optional[float] = 0.5,
|
|
|
display_image: Optional[bool] = False,
|
|
|
only_best: Optional[bool] = True,
|
|
|
autogenerated_mask: Optional[bool] = False,
|
|
|
) -> Image.Image:
|
|
|
if scores is not None:
|
|
|
|
|
|
sorted_ind = np.argsort(scores)[::-1]
|
|
|
masks = masks[sorted_ind]
|
|
|
|
|
|
if autogenerated_mask:
|
|
|
masks = sorted(masks, key=(lambda x: x["area"]), reverse=True)
|
|
|
else:
|
|
|
|
|
|
h, w = masks.shape[-2:]
|
|
|
|
|
|
if display_image:
|
|
|
output_image = Image.fromarray(image)
|
|
|
else:
|
|
|
|
|
|
if autogenerated_mask:
|
|
|
output_image = Image.new(
|
|
|
mode="RGBA",
|
|
|
size=(
|
|
|
masks[0]["segmentation"].shape[1],
|
|
|
masks[0]["segmentation"].shape[0],
|
|
|
),
|
|
|
color=(0, 0, 0),
|
|
|
)
|
|
|
else:
|
|
|
output_image = Image.new(mode="RGBA", size=(w, h), color=(0, 0, 0))
|
|
|
|
|
|
for i, mask in enumerate(masks):
|
|
|
if not autogenerated_mask:
|
|
|
if mask.ndim > 2:
|
|
|
mask = mask.squeeze()
|
|
|
else:
|
|
|
mask = mask["segmentation"]
|
|
|
|
|
|
color = np.concatenate(
|
|
|
(np.random.randint(0, 256, size=3), [int(alpha * 255)]), axis=0
|
|
|
)
|
|
|
|
|
|
|
|
|
mask_image = Image.fromarray((mask * 255).astype(np.uint8)).convert("L")
|
|
|
mask_colored = Image.new("RGBA", mask_image.size, tuple(color))
|
|
|
mask_image = Image.composite(
|
|
|
mask_colored, Image.new("RGBA", mask_image.size), mask_image
|
|
|
)
|
|
|
|
|
|
|
|
|
output_image = Image.alpha_composite(output_image, mask_image)
|
|
|
|
|
|
|
|
|
if only_best:
|
|
|
break
|
|
|
|
|
|
return output_image
|
|
|
|