in PyTorchClassification/data_loader.py [0:0]
def process_image(self, img, is_train, multi_crop = False, bboxes = None, no_crop=False):
'''
Pre-processing of the images
Arguments:
img: single input image (PIL)
is_train: True for training mode, false for validation/testing mode
multi_crop (optional): If True, uses 12 crops in validation
bboxes (optional): Bounding boxes of the foreground object
no_crop (optional): If True, skips cropping in in both training and validation
'''
if bboxes is None:
bboxes = []
# In training, random scaling, flipping, and color augmentation
if is_train:
if no_crop:
img = self.resize(img)
else:
img = self.scale_aug(img)
img = self.flip_aug(img)
img = self.color_aug(img)
img = self.tensor_aug(img)
img = self.norm_aug(img)
return img
# In validation
else:
# We will collect all crops of the image in *imgs*
if no_crop:
imgs = [self.resize(img)]
else:
min_size = min(img.size)
scale_ratio = min(self.im_size) / min_size * 1.3
resized_img = F.resize(img, (int(img.size[1]*scale_ratio), int(img.size[0]*scale_ratio)))
imgs = [self.center_crop(resized_img)]
# Add all bboxes and their flip
for bbox in bboxes:
bbox_shape = np.array([bbox[2] - bbox[0], bbox[3] - bbox[1]])
padding = bbox_shape.max() * 0.1
# Add offset to the shorter side to crop a square patch
offset = (bbox_shape - np.min(bbox_shape))[::-1] // 2
bbox_crop = img.crop((bbox[1] - padding - offset[1],
bbox[0] - padding - offset[0],
bbox[3] + padding + offset[1],
bbox[2] + padding + offset[0])) # (w - crop_w, h - crop_h, w, h))
#img.save('crop{}.jpg'.format(np.random.randint(0,10)))
bbox_crop = self.resize(bbox_crop)
imgs.append(bbox_crop)
imgs.append(self.flip(bbox_crop))
# Add all crops
if multi_crop:
imgs.append(self.flip(self.center_crop(resized_img)))
imgs.extend(self.multi_crop(self.resize_for_crop(img)))
# Convert everything to normalized tensor
tensor_imgs = []
for img in imgs:
img = self.tensor_aug(img)
img = self.norm_aug(img)
tensor_imgs.append(img)
return tensor_imgs