def bbox_parse(annotation, gt_bboxes, gt_labels, gt_bboxes_ignore, cat2label):
    """
    Parse ground-truth box in an annotation dict. There is no return in this
    function, because the `gt_bboxes`, `gt_labels`, `gt_bboxes_ignore` are
    lists, and if they have append element in this function, the change will
    be with them automatically, do not need to return.

    Args:
        annotation (dict): The annotation dict for an image.
        gt_bboxes (list): The list of ground truth boxes, each element
            in this list is a ground truth box `[x1, y1, x2, y2]`
        gt_labels (list): The list of ground truth boxes' labels, each element
            in this list is a numerical label for the specific gt-box.
        gt_bboxes_ignore (list): The list of crowded ground truth boxes, and
            we will ignore the crowded ground truth boxes. Each element in
            this list is a ignored ground truth box `[x1, y1, x2, y2]`
        cat2label (dict): The dict that save the matching between the category
            id in the dataset and the numerical label.
    """
    assert len(gt_bboxes) == len(gt_labels), \
        "The length of gt_bboxes and gt_labels must match."
    # if this annotation is marked as `ignore`, or `area <= 0`
    # we return `-1` and  pass this image. The loop continues
    if annotation.get('ignore', False):
        return False
    x1, y1, w, h = annotation['bbox']
    if annotation['area'] <= 0 or w < 1 or h < 1:
        return False

    # change `bbox` mode from `xywh` to `xyxy`
    bbox = [x1, y1, x1 + w - 1, y1 + h - 1]
    if annotation['iscrowd']:
        gt_bboxes_ignore.append(bbox)
    else:
        gt_bboxes.append(bbox)
        gt_labels.append(cat2label[annotation['category_id']])
    return True