Ejemplo n.º 1
0
def get_wider_eval_dataflow(shard=0, num_shards=1, augment=False):
    """
    Args:
        shard, num_shards: to get subset of evaluation data
    """
    roidbs_test = load_many(cfg.WIDER.BASEDIR, 'test', augment)
    roidbs = roidbs_test
    # for key in roidbs[4].keys():
    #     print(key)
    num_imgs = len(roidbs)
    img_per_shard = num_imgs // num_shards
    img_range = (shard * img_per_shard, (shard + 1) *
                 img_per_shard if shard + 1 < num_shards else num_imgs)

    # no filter for training
    ds = DataFromListOfDict(roidbs[img_range[0]:img_range[1]], [
        'img', 'bbox', 'id', 'male', 'longhair', 'sunglass', 'hat', 'tshirt',
        'longsleeve', 'formal', 'shorts', 'jeans', 'skirt', 'facemask', 'logo',
        'stripe', 'longpants'
    ])

    def f(fname):
        im = cv2.imread(fname, cv2.IMREAD_COLOR)
        assert im is not None, fname
        return im

    ds = MapDataComponent(ds, f, 0)
    # Evaluation itself may be multi-threaded, therefore don't add prefetch here.
    return roidbs, ds
Ejemplo n.º 2
0
def get_attributes_dataflow(augment=False, two_cls=False):
    """
    Return a training dataflow. Each datapoint consists of the following:

    An image: (h, w, 3),

    1 or more pairs of (anchor_labels, anchor_boxes):
    anchor_labels: (h', w', NA)
    anchor_boxes: (h', w', NA, 4)

    gt_boxes: (N, 4)
    gt_labels: (N,)

    If MODE_MASK, gt_masks: (N, h, w)
    """
    # roidbs = load_many(cfg.DATA.BASEDIR, cfg.DATA.TRAIN)
    logger.info("loading wider attributes dataset...")
    roidbs_train = load_many('/root/datasets/WiderAttribute', 'train', augment,
                             two_cls)
    roidbs_val = load_many('/root/datasets/WiderAttribute', 'val', augment,
                           two_cls)
    roidbs_wider = roidbs_train + roidbs_val

    def attr_augment(names, multiple):
        datalist = []
        for name in names:
            datalist += [
                roidb for roidb in roidbs_wider if np.sum(roidb[name] == 1) > 0
            ]
        return datalist * multiple

    attr_names = ['sunglass', 'stripe', 'facemask', 'jeans']
    roidbs_wider += attr_augment(attr_names, 2)

    logger.info("load finished!")
    """
    To train on your own data, change this to your loader.
    Produce "roidbs" as a list of dict, in the dict the following keys are needed for training:
    height, width: integer
    file_name: str, full path to the image
    boxes: numpy array of kx4 floats
    attrs: numpy array of k integers ,-1->negtive   0->ignorce   1->positive
    """

    # Valid training images should have at least one fg box.
    # But this filter shall not be applied for testing.
    # num = len(roidbs)
    # roidbs = list(filter(lambda img: len(img['boxes'][img['is_crowd'] == 0]) > 0, roidbs))
    # logger.info("Filtered {} images which contain no non-crowd groudtruth boxes. Total #images for training: {}".format(
    #    num - len(roidbs), len(roidbs)))

    ds = DataFromList(roidbs_wider, shuffle=True)

    aug = imgaug.AugmentorList([
        CustomResize(cfg.PREPROC.TRAIN_SHORT_EDGE_SIZE, cfg.PREPROC.MAX_SIZE),
        imgaug.Flip(horiz=True)
    ])

    def preprocess(roidb):
        fname = roidb['img']
        boxes = roidb['bbox']
        male = roidb['male']
        longhair = roidb['longhair']
        sunglass = roidb['sunglass']
        hat = roidb['hat']
        tshirt = roidb['tshirt']
        longsleeve = roidb['longsleeve']
        formal = roidb['formal']
        shorts = roidb['shorts']
        jeans = roidb['jeans']
        longpants = roidb['longpants']
        skirt = roidb['skirt']
        facemask = roidb['facemask']
        logo = roidb['logo']
        stripe = roidb['stripe']

        boxes = np.copy(boxes)
        im = cv2.imread(fname, cv2.IMREAD_COLOR)
        assert im is not None, fname
        im = im.astype('float32')
        # assume floatbox as input
        assert boxes.dtype == np.float32, "Loader has to return floating point boxes!"

        # augmentation:
        im, params = aug.augment_return_params(im)
        points = box_to_point8(boxes)
        points = aug.augment_coords(points, params)
        boxes = point8_to_box(points)
        # assert np.min(np_area(boxes)) > 0, "Some boxes have zero area!"

        ret = {
            'image':
            im,
            'gt_boxes':
            boxes,
            'male':
            male,
            'longhair':
            longhair,
            'sunglass':
            sunglass,
            'hat':
            hat,
            'tshirt':
            tshirt,
            'longsleeve':
            longsleeve,
            'formal':
            formal,
            'shorts':
            shorts,
            'jeans':
            jeans,
            'longpants':
            longpants,
            'skirt':
            skirt,
            'facemask':
            facemask,
            'logo':
            logo,
            'stripe':
            stripe,
            'anchor_labels':
            get_rpn_anchor_input(im, boxes, np.zeros(len(boxes),
                                                     dtype=int))[0],
            'anchor_boxes':
            get_rpn_anchor_input(im, boxes, np.zeros(len(boxes), dtype=int))[1]
        }
        return ret

    if cfg.TRAINER == 'horovod':
        ds = MultiThreadMapData(ds, 5, preprocess)
        # MPI does not like fork()
    else:
        ds = MultiProcessMapDataZMQ(ds, 10, preprocess)
    return ds
Ejemplo n.º 3
0
def get_wider_dataflow(augment=False):
    """
    Return a training dataflow. Each datapoint consists of the following:

    An image: (h, w, 3),

    1 or more pairs of (anchor_labels, anchor_boxes):
    anchor_labels: (h', w', NA)
    anchor_boxes: (h', w', NA, 4)

    gt_boxes: (N, 4)
    gt_labels: (N,)

    If MODE_MASK, gt_masks: (N, h, w)
    """

    logger.info("loading wider attributes dataset...")
    roidbs_train = load_many(cfg.WIDER.BASEDIR, 'train', augment)
    roidbs_test = load_many(cfg.WIDER.BASEDIR, 'test', augment)
    roidbs = roidbs_train + roidbs_test

    logger.info("load finished!")
    """
    To train on your own data, change this to your loader.
    Produce "roidbs" as a list of dict, in the dict the following keys are needed for training:
    height, width: integer
    file_name: str, full path to the image
    boxes: numpy array of kx4 floats
    class: numpy array of k integers
    is_crowd: k booleans. Use k False if you don't know what it means.

    """

    # Valid training images should have at least one fg box.
    # But this filter shall not be applied for testing.
    num = len(roidbs)
    roidbs = list(filter(lambda img: len(img['bbox']) > 0, roidbs))
    logger.info(
        "Filtered {} images which contain no non-crowd groudtruth boxes. Total #images for training: {}"
        .format(num - len(roidbs), len(roidbs)))

    ds = DataFromList(roidbs, shuffle=True)

    aug = imgaug.AugmentorList([
        CustomResize(cfg.PREPROC.TRAIN_SHORT_EDGE_SIZE, cfg.PREPROC.MAX_SIZE),
        imgaug.Flip(horiz=True)
    ])

    def preprocess(roidb):
        fname = roidb['img']
        x1, y1, w, h = np.split(roidb['bbox'], 4, axis=1)
        boxes = np.concatenate([x1, y1, x1 + w, y1 + h], axis=1)

        klass = np.ones(len(roidb['bbox']), dtype=np.int32)

        male = roidb['male']
        longhair = roidb['longhair']
        sunglass = roidb['sunglass']
        hat = roidb['hat']
        tshirt = roidb['tshirt']
        longsleeve = roidb['longsleeve']
        formal = roidb['formal']
        shorts = roidb['shorts']
        jeans = roidb['jeans']
        longpants = roidb['longpants']
        skirt = roidb['skirt']
        facemask = roidb['facemask']
        logo = roidb['logo']
        stripe = roidb['stripe']

        boxes = np.copy(boxes)
        im = cv2.imread(fname, cv2.IMREAD_COLOR)
        assert im is not None, fname
        im = im.astype('float32')
        # assume floatbox as input
        assert boxes.dtype == np.float32, "Loader has to return floating point boxes!"

        # augmentation:
        im, params = aug.augment_return_params(im)
        points = box_to_point8(boxes)
        points = aug.augment_coords(points, params)
        boxes = point8_to_box(points)
        assert np.min(np_area(boxes)) > 0, "Some boxes have zero area!"

        ret = {'image': im}
        # rpn anchor:
        try:

            # anchor_labels, anchor_boxes
            ret['anchor_labels'], ret['anchor_boxes'] = get_rpn_anchor_input(
                im, boxes, np.zeros(len(boxes), dtype=int))
            ret['gt_boxes'] = boxes
            ret['gt_labels'] = klass

            ret['male'] = male
            ret['longhair'] = longhair
            ret['sunglass'] = sunglass
            ret['hat'] = hat
            ret['tshirt'] = tshirt
            ret['longsleeve'] = longsleeve
            ret['formal'] = formal
            ret['shorts'] = shorts
            ret['jeans'] = jeans
            ret['longpants'] = longpants
            ret['skirt'] = skirt
            ret['facemask'] = facemask
            ret['logo'] = logo
            ret['stripe'] = stripe

            if not len(boxes):
                raise MalformedData("No valid gt_boxes!")
        except MalformedData as e:
            log_once(
                "Input {} is filtered for training: {}".format(fname, str(e)),
                'warn')
            return None
        return ret

    if cfg.TRAINER == 'horovod':
        ds = MultiThreadMapData(ds, 5, preprocess)
        # MPI does not like fork()
    else:
        ds = MultiProcessMapDataZMQ(ds, 10, preprocess)
    return ds
Ejemplo n.º 4
0
        skirt_predict = []
        skirt_label = []

        facemask_predict = []
        facemask_label = []

        logo_predict = []
        logo_label = []

        stripe_predict = []
        stripe_label = []

        longpants_predict = []
        longpants_label = []

        roidbs_val = load_many('/root/datasets/wider attribute', 'val')
        for val in roidbs_val:
            img = cv2.imread(val['img'])
            results = pred(img, val['male'], val['bbox'])

            male_predict = np.append(male_predict, results[0])
            male_label = np.append(male_label, val['male'])
            longhair_predict = np.append(longhair_predict, results[1])
            longhair_label = np.append(longhair_label, val['longhair'])
            sunglass_predict = np.append(sunglass_predict, results[2])
            sunglass_label = np.append(sunglass_label, val['sunglass'])
            hat_predict = np.append(hat_predict, results[3])
            hat_label = np.append(hat_label, val['hat'])
            tshirt_predict = np.append(tshirt_predict, results[4])
            tshirt_label = np.append(tshirt_label, val['tshirt'])
            longsleeve_predict = np.append(longsleeve_predict, results[5])