|
from functools import partial |
|
|
|
import numpy as np |
|
import torch |
|
from six.moves import map, zip |
|
|
|
from ..mask.structures import BitmapMasks, PolygonMasks |
|
|
|
|
|
def multi_apply(func, *args, **kwargs): |
|
"""Apply function to a list of arguments. |
|
|
|
Note: |
|
This function applies the ``func`` to multiple inputs and |
|
map the multiple outputs of the ``func`` into different |
|
list. Each list contains the same type of outputs corresponding |
|
to different inputs. |
|
|
|
Args: |
|
func (Function): A function that will be applied to a list of |
|
arguments |
|
|
|
Returns: |
|
tuple(list): A tuple containing multiple list, each list contains \ |
|
a kind of returned results by the function |
|
""" |
|
pfunc = partial(func, **kwargs) if kwargs else func |
|
map_results = map(pfunc, *args) |
|
return tuple(map(list, zip(*map_results))) |
|
|
|
|
|
def unmap(data, count, inds, fill=0): |
|
"""Unmap a subset of item (data) back to the original set of items (of size |
|
count)""" |
|
if data.dim() == 1: |
|
ret = data.new_full((count, ), fill) |
|
ret[inds.type(torch.bool)] = data |
|
else: |
|
new_size = (count, ) + data.size()[1:] |
|
ret = data.new_full(new_size, fill) |
|
ret[inds.type(torch.bool), :] = data |
|
return ret |
|
|
|
|
|
def mask2ndarray(mask): |
|
"""Convert Mask to ndarray.. |
|
|
|
Args: |
|
mask (:obj:`BitmapMasks` or :obj:`PolygonMasks` or |
|
torch.Tensor or np.ndarray): The mask to be converted. |
|
|
|
Returns: |
|
np.ndarray: Ndarray mask of shape (n, h, w) that has been converted |
|
""" |
|
if isinstance(mask, (BitmapMasks, PolygonMasks)): |
|
mask = mask.to_ndarray() |
|
elif isinstance(mask, torch.Tensor): |
|
mask = mask.detach().cpu().numpy() |
|
elif not isinstance(mask, np.ndarray): |
|
raise TypeError(f'Unsupported {type(mask)} data type') |
|
return mask |
|
|