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