'generate random padding boxes according to parameters
if satifactory padding generated, apply to ground-truth as well
Parameters:
label : numpy.array (n x 5 matrix)
ground-truths
Returns:
list of (crop_box, label) tuples, if failed, return empty list []'

def sample(self, label):

    samples = []
    count = 0
    for trial in range(self.max_trials):
        if (count >= self.max_sample):
            return samples
        scale = np.random.uniform(self.min_scale, self.max_scale)
        min_ratio = max(self.min_aspect_ratio, (scale * scale))
        max_ratio = min(self.max_aspect_ratio, ((1.0 / scale) / scale))
        ratio = math.sqrt(np.random.uniform(min_ratio, max_ratio))
        width = (scale * ratio)
        if (width < 1):
            continue
        height = (scale / ratio)
        if (height < 1):
            continue
        left = np.random.uniform(0.0, (1 - width))
        top = np.random.uniform(0.0, (1 - height))
        right = (left + width)
        bot = (top + height)
        rand_box = (left, top, right, bot)
        valid_mask = np.where((label[:, 0] > (-1)))[0]
        gt = label[valid_mask, :]
        new_gt_boxes = []
        for i in range(gt.shape[0]):
            xmin = ((gt[(i, 1)] - left) / width)
            ymin = ((gt[(i, 2)] - top) / height)
            xmax = ((gt[(i, 3)] - left) / width)
            ymax = ((gt[(i, 4)] - top) / height)
            new_size = min((xmax - xmin), (ymax - ymin))
            if (new_size < self.min_gt_scale):
                new_gt_boxes = []
                break
            new_gt_boxes.append([gt[(i, 0)], xmin, ymin, xmax, ymax])
        if (not new_gt_boxes):
            continue
        new_gt_boxes = np.array(new_gt_boxes)
        label = np.lib.pad(new_gt_boxes, ((0, (label.shape[0] - new_gt_boxes.shape[0])), (0, 0)), 'constant', constant_values=((-1), (-1)))
        samples.append((rand_box, label))
        count += 1
    return samples
