Created
July 17, 2019 00:01
-
-
Save Hanrui-Wang/d299ad13cd99f4cdf69380c156e85133 to your computer and use it in GitHub Desktop.
transform_pytorch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class Rescale(object): | |
| """Rescale the image in a sample to a given size. | |
| Args: | |
| output_size (tuple or int): Desired output size. If tuple, output is | |
| matched to output_size. If int, smaller of image edges is matched | |
| to output_size keeping aspect ratio the same. | |
| """ | |
| def __init__(self, output_size): | |
| assert isinstance(output_size, (int, tuple)) | |
| self.output_size = output_size | |
| def __call__(self, sample): | |
| image, landmarks = sample['image'], sample['landmarks'] | |
| h, w = image.shape[:2] | |
| if isinstance(self.output_size, int): | |
| if h > w: | |
| new_h, new_w = self.output_size * h / w, self.output_size | |
| else: | |
| new_h, new_w = self.output_size, self.output_size * w / h | |
| else: | |
| new_h, new_w = self.output_size | |
| new_h, new_w = int(new_h), int(new_w) | |
| img = transform.resize(image, (new_h, new_w)) | |
| # h and w are swapped for landmarks because for images, | |
| # x and y axes are axis 1 and 0 respectively | |
| landmarks = landmarks * [new_w / w, new_h / h] | |
| return {'image': img, 'landmarks': landmarks} | |
| class RandomCrop(object): | |
| """Crop randomly the image in a sample. | |
| Args: | |
| output_size (tuple or int): Desired output size. If int, square crop | |
| is made. | |
| """ | |
| def __init__(self, output_size): | |
| assert isinstance(output_size, (int, tuple)) | |
| if isinstance(output_size, int): | |
| self.output_size = (output_size, output_size) | |
| else: | |
| assert len(output_size) == 2 | |
| self.output_size = output_size | |
| def __call__(self, sample): | |
| image, landmarks = sample['image'], sample['landmarks'] | |
| h, w = image.shape[:2] | |
| new_h, new_w = self.output_size | |
| top = np.random.randint(0, h - new_h) | |
| left = np.random.randint(0, w - new_w) | |
| image = image[top: top + new_h, | |
| left: left + new_w] | |
| landmarks = landmarks - [left, top] | |
| return {'image': image, 'landmarks': landmarks} | |
| class ToTensor(object): | |
| """Convert ndarrays in sample to Tensors.""" | |
| def __call__(self, sample): | |
| image, landmarks = sample['image'], sample['landmarks'] | |
| # swap color axis because | |
| # numpy image: H x W x C | |
| # torch image: C X H X W | |
| image = image.transpose((2, 0, 1)) | |
| return {'image': torch.from_numpy(image), | |
| 'landmarks': torch.from_numpy(landmarks)} | |
| scale = Rescale(256) | |
| crop = RandomCrop(128) | |
| composed = transforms.Compose([Rescale(256), | |
| RandomCrop(224)]) | |
| # Apply each of the above transforms on sample. | |
| fig = plt.figure() | |
| sample = face_dataset[65] | |
| for i, tsfrm in enumerate([scale, crop, composed]): | |
| transformed_sample = tsfrm(sample) | |
| ax = plt.subplot(1, 3, i + 1) | |
| plt.tight_layout() | |
| ax.set_title(type(tsfrm).__name__) | |
| show_landmarks(**transformed_sample) | |
| plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment