It seems that the images are first resized to a specific resolution (256) in abstract_dataset.py and then IsotropicResize is used. However, IsotropicResize is skipped when the resolutions match.
def load_rgb(self, file_path):
"""
Load an RGB image from a file path and resize it to a specified resolution.
Args:
file_path: A string indicating the path to the image file.
Returns:
An Image object containing the loaded and resized image.
Raises:
ValueError: If the loaded image is None.
"""
size = self.config['resolution']
assert os.path.exists(file_path), f"{file_path} does not exist"
img = cv2.imread(file_path)
if img is None:
raise ValueError('Loaded image is None: {}'.format(file_path))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (size, size), interpolation=cv2.INTER_CUBIC)
return Image.fromarray(np.array(img, dtype=np.uint8))
def init_data_aug_method(self):
trans = A.Compose([
A.HorizontalFlip(p=self.config['data_aug']['flip_prob']),
A.Rotate(limit=self.config['data_aug']['rotate_limit'], p=self.config['data_aug']['rotate_prob']),
A.GaussianBlur(blur_limit=self.config['data_aug']['blur_limit'], p=self.config['data_aug']['blur_prob']),
A.OneOf([
IsotropicResize(max_side=self.config['resolution'], interpolation_down=cv2.INTER_AREA, interpolation_up=cv2.INTER_CUBIC),
IsotropicResize(max_side=self.config['resolution'], interpolation_down=cv2.INTER_AREA, interpolation_up=cv2.INTER_LINEAR),
IsotropicResize(max_side=self.config['resolution'], interpolation_down=cv2.INTER_LINEAR, interpolation_up=cv2.INTER_LINEAR),
], p=1),
A.OneOf([
A.RandomBrightnessContrast(brightness_limit=self.config['data_aug']['brightness_limit'], contrast_limit=self.config['data_aug']['contrast_limit']),
A.FancyPCA(),
A.HueSaturationValue()
], p=0.5),
A.ImageCompression(quality_lower=self.config['data_aug']['quality_lower'], quality_upper=self.config['data_aug']['quality_upper'], p=0.5)
],
keypoint_params=A.KeypointParams(format='xy') if self.config['with_landmark'] else None
)
return trans
def isotropically_resize_image(img, size, interpolation_down=cv2.INTER_AREA, interpolation_up=cv2.INTER_CUBIC):
h, w = img.shape[:2]
if max(w, h) == size:
return img
if w > h:
scale = size / w
h = h * scale
w = size
else:
scale = size / h
w = w * scale
h = size
interpolation = interpolation_up if scale > 1 else interpolation_down
resized = cv2.resize(img, (int(w), int(h)), interpolation=interpolation)
return resized
class IsotropicResize(DualTransform):
def __init__(self, max_side, interpolation_down=cv2.INTER_AREA, interpolation_up=cv2.INTER_CUBIC,
always_apply=False, p=1):
super(IsotropicResize, self).__init__(always_apply, p)
self.max_side = max_side
self.interpolation_down = interpolation_down
self.interpolation_up = interpolation_up
def apply(self, img, interpolation_down=cv2.INTER_AREA, interpolation_up=cv2.INTER_CUBIC, **params):
return isotropically_resize_image(img, size=self.max_side, interpolation_down=interpolation_down,
interpolation_up=interpolation_up)
def apply_to_mask(self, img, **params):
return self.apply(img, interpolation_down=cv2.INTER_NEAREST, interpolation_up=cv2.INTER_NEAREST, **params)
def get_transform_init_args_names(self):
return ("max_side", "interpolation_down", "interpolation_up")
It seems that the images are first resized to a specific resolution (256) in abstract_dataset.py and then IsotropicResize is used. However, IsotropicResize is skipped when the resolutions match.