'generate random cropping boxes according to parameters
if satifactory crops 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)
        height = (scale / ratio)
        left = np.random.uniform(0.0, (1 - width))
        top = np.random.uniform(0.0, (1 - height))
        rand_box = (left, top, (left + width), (top + height))
        valid_mask = np.where((label[:, 0] > (-1)))[0]
        gt = label[valid_mask, :]
        ious = self._check_satisfy(rand_box, gt)
        if (ious is not None):
            (l, t, r, b) = rand_box
            new_gt_boxes = []
            new_width = (r - l)
            new_height = (b - t)
            for i in range(valid_mask.size):
                if (ious[i] > 0):
                    xmin = max(0.0, ((gt[(i, 1)] - l) / new_width))
                    ymin = max(0.0, ((gt[(i, 2)] - t) / new_height))
                    xmax = min(1.0, ((gt[(i, 3)] - l) / new_width))
                    ymax = min(1.0, ((gt[(i, 4)] - t) / new_height))
                    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
