[docs]classDenormalize:"""Denormalize Torch Tensor into np image format."""def__init__(self,mean:Optional[List[float]]=None,std:Optional[List[float]]=None):"""Denormalize Torch Tensor into np image format. Args: mean: Mean std: Standard deviation. """# If no mean and std provided, assign ImageNet values.ifmeanisNone:mean=[0.485,0.456,0.406]ifstdisNone:std=[0.229,0.224,0.225]self.mean=Tensor(mean)self.std=Tensor(std)
[docs]def__call__(self,tensor:Tensor)->np.ndarray:"""Denormalize the input. Args: tensor (Tensor): Input tensor image (C, H, W) Returns: Denormalized numpy array (H, W, C). """iftensor.dim()==4:iftensor.size(0):tensor=tensor.squeeze(0)else:raiseValueError(f"Tensor has batch size of {tensor.size(0)}. Only single batch is supported.")fortnsr,mean,stdinzip(tensor,self.mean,self.std):tnsr.mul_(std).add_(mean)array=(tensor*255).permute(1,2,0).cpu().numpy().astype(np.uint8)returnarray
[docs]classToNumpy:"""Convert Tensor into Numpy Array."""
[docs]def__call__(self,tensor:Tensor,dims:Optional[Tuple[int,...]]=None)->np.ndarray:"""Convert Tensor into Numpy Array. Args: tensor (Tensor): Tensor to convert. Input tensor in range 0-1. dims (Optional[Tuple[int, ...]], optional): Convert dimensions from torch to numpy format. Tuple corresponding to axis permutation from torch tensor to numpy array. Defaults to None. Returns: Converted numpy ndarray. """# Default support is (C, H, W) or (N, C, H, W)ifdimsisNone:dims=(0,2,3,1)iflen(tensor.shape)==4else(1,2,0)array=(tensor*255).permute(dims).cpu().numpy().astype(np.uint8)ifarray.shape[0]==1:array=array.squeeze(0)ifarray.shape[-1]==1:array=array.squeeze(-1)returnarray