| | 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 |
| |
|