|
|
|
import numpy as np
|
|
import torch
|
|
|
|
from ..utils import ext_loader
|
|
|
|
ext_module = ext_loader.load_ext('_ext', ['contour_expand'])
|
|
|
|
|
|
def contour_expand(kernel_mask, internal_kernel_label, min_kernel_area,
|
|
kernel_num):
|
|
"""Expand kernel contours so that foreground pixels are assigned into
|
|
instances.
|
|
|
|
Arguments:
|
|
kernel_mask (np.array or Tensor): The instance kernel mask with
|
|
size hxw.
|
|
internal_kernel_label (np.array or Tensor): The instance internal
|
|
kernel label with size hxw.
|
|
min_kernel_area (int): The minimum kernel area.
|
|
kernel_num (int): The instance kernel number.
|
|
|
|
Returns:
|
|
label (list): The instance index map with size hxw.
|
|
"""
|
|
assert isinstance(kernel_mask, (torch.Tensor, np.ndarray))
|
|
assert isinstance(internal_kernel_label, (torch.Tensor, np.ndarray))
|
|
assert isinstance(min_kernel_area, int)
|
|
assert isinstance(kernel_num, int)
|
|
|
|
if isinstance(kernel_mask, np.ndarray):
|
|
kernel_mask = torch.from_numpy(kernel_mask)
|
|
if isinstance(internal_kernel_label, np.ndarray):
|
|
internal_kernel_label = torch.from_numpy(internal_kernel_label)
|
|
|
|
if torch.__version__ == 'parrots':
|
|
if kernel_mask.shape[0] == 0 or internal_kernel_label.shape[0] == 0:
|
|
label = []
|
|
else:
|
|
label = ext_module.contour_expand(
|
|
kernel_mask,
|
|
internal_kernel_label,
|
|
min_kernel_area=min_kernel_area,
|
|
kernel_num=kernel_num)
|
|
label = label.tolist()
|
|
else:
|
|
label = ext_module.contour_expand(kernel_mask, internal_kernel_label,
|
|
min_kernel_area, kernel_num)
|
|
return label
|
|
|