예제 #1
0
    def infer_shape(self, max_data_shape=None, max_label_shape=None):
        """ Return maximum data and label shape for single gpu """
        if max_data_shape is None:
            max_data_shape = []
        if max_label_shape is None:
            max_label_shape = []
        max_shapes = dict(max_data_shape + max_label_shape)
        input_batch_size = max_shapes['data'][0]
        dummy_boxes = np.zeros((0, 5))
        dummy_info = [ [max_shapes['data'][2], max_shapes['data'][3], 1.0] ]
        dummy_label = {'gt_boxes' : dummy_boxes}

        # infer shape
        feat_shape_list = []
        for i in range(len(self.feat_stride)):
            _, feat_shape, _ = self.feat_sym[i].infer_shape(**max_shapes)
            feat_shape = [int(i) for i in feat_shape[0]]
            feat_shape_list.append(feat_shape)

        label_dict = {}
        if config.HEAD_BOX:
          head_label_dict = assign_anchor_fpn(feat_shape_list, dummy_label, dummy_info, False, prefix='head')
          label_dict.update(head_label_dict)

        if config.FACE_LANDMARK:
          dummy_landmarks = np.zeros( (0,11) )
          dummy_label['gt_landmarks'] = dummy_landmarks
        face_label_dict = assign_anchor_fpn(feat_shape_list, dummy_label, dummy_info, config.FACE_LANDMARK, prefix='face')
        label_dict.update(face_label_dict)

        label_list = []
        for k in self.label_name:
          label_list.append(label_dict[k])
        label_shape = [(k, tuple([input_batch_size] + list(v.shape[1:]))) for k, v in zip(self.label_name, label_list)]
        return max_data_shape, label_shape
예제 #2
0
    def get_batch(self):
        deq = self.q_out.get()
        print('q_out got')
        data_list, label_list = deq

        for data, label in zip(data_list, label_list):
            data_shape = {k: v.shape for k, v in data.items()}
            del data_shape['im_info']
            feat_shape_list = []
            for s in range(len(self.feat_stride)):
                _, feat_shape, _ = self.feat_sym[s].infer_shape(**data_shape)
                feat_shape = [int(i) for i in feat_shape[0]]
                feat_shape_list.append(feat_shape)
            #for k in self.label_name:
            #  label[k] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            im_info = data['im_info']
            gt_boxes = label['gt_boxes']
            gt_label = {'gt_boxes': gt_boxes}
            label_dict = {}
            head_label_dict = assign_anchor_fpn(feat_shape_list,
                                                gt_label,
                                                im_info,
                                                False,
                                                prefix='head')
            label_dict.update(head_label_dict)
            if config.FACE_LANDMARK:
                gt_landmarks = label['gt_landmarks']
                gt_label['gt_landmarks'] = gt_landmarks
            face_label_dict = assign_anchor_fpn(feat_shape_list,
                                                gt_label,
                                                im_info,
                                                config.FACE_LANDMARK,
                                                prefix='face')
            label_dict.update(face_label_dict)
            #print('im_info', im_info.shape)
            #print(gt_boxes.shape)
            for k in self.label_name:
                label[k] = label_dict[k]

        all_data = dict()
        for key in self.data_name:
            all_data[key] = tensor_vstack([batch[key] for batch in data_list])

        all_label = dict()
        for key in self.label_name:
            pad = 0 if key.startswith('bbox_') else -1
            #print('label vstack', key, pad, len(label_list), file=sys.stderr)
            all_label[key] = tensor_vstack(
                [batch[key] for batch in label_list], pad=pad)
        self.data = [mx.nd.array(all_data[key]) for key in self.data_name]
        self.label = [mx.nd.array(all_label[key]) for key in self.label_name]
예제 #3
0
파일: loader.py 프로젝트: xbw4220/MaskRCNN
    def infer_shape(self, max_data_shape=None, max_label_shape=None):
        """ Return maximum data and label shape for single gpu """
        if max_data_shape is None:
            max_data_shape = []
        if max_label_shape is None:
            max_label_shape = []
        max_shapes = dict(max_data_shape + max_label_shape)
        input_batch_size = max_shapes['data'][0]
        dummy_boxes = np.zeros((0, 5))
        dummy_info = [max_shapes['data'][2], max_shapes['data'][3], 1.0]

        # infer shape
        feat_shape_list = []
        for i in range(len(self.feat_stride)):
            _, feat_shape, _ = self.feat_sym[i].infer_shape(**max_shapes)
            feat_shape = [int(i) for i in feat_shape[0]]
            feat_shape_list.append(feat_shape)

        label_dict = assign_anchor_fpn(feat_shape_list, dummy_boxes,
                                       dummy_info, self.feat_stride,
                                       self.anchor_scales, self.anchor_ratios,
                                       self.allowed_border)
        label_list = [
            label_dict['label'], label_dict['bbox_target'],
            label_dict['bbox_weight']
        ]
        label_shape = [(k, tuple([input_batch_size] + list(v.shape[1:])))
                       for k, v in zip(self.label_name, label_list)]
        return max_data_shape, label_shape
예제 #4
0
    def infer_shape(self, max_data_shape=None, max_label_shape=None):
        """ Return maximum data and label shape for single gpu """
        if max_data_shape is None:
            max_data_shape = []
        if max_label_shape is None:
            max_label_shape = []
        max_shapes = dict(max_data_shape + max_label_shape)
        input_batch_size = max_shapes['data'][0]
        dummy_boxes = np.zeros((0, 5))
        dummy_points = np.zeros((0, 11))
        dummy_info = [ [max_shapes['data'][2], max_shapes['data'][3], 1.0] ]

        # infer shape
        feat_shape_list = []
        for i in range(len(self.feat_stride)):
            _, feat_shape, _ = self.feat_sym[i].infer_shape(**max_shapes)
            feat_shape = [int(i) for i in feat_shape[0]]
            feat_shape_list.append(feat_shape)

        label_dict = assign_anchor_fpn(feat_shape_list, dummy_boxes, dummy_points, dummy_info)
        label_list = []
        for k in self.label_name:
          label_list.append(label_dict[k])
        label_shape = [(k, tuple([input_batch_size] + list(v.shape[1:]))) for k, v in zip(self.label_name, label_list)]
        return max_data_shape, label_shape
예제 #5
0
    def infer_shape(self, max_data_shape=None, max_label_shape=None):
        """ Return maximum data and label shape for single gpu """
        if max_data_shape is None:
            max_data_shape = []
        if max_label_shape is None:
            max_label_shape = []
        max_shapes = dict(max_data_shape + max_label_shape)
        input_batch_size = max_shapes['data'][0]
        dummy_boxes = np.zeros((0, 5))
        dummy_info = [max_shapes['data'][2], max_shapes['data'][3], 1.0]

        # infer shape
        feat_shape_list = []
        for i in range(len(self.feat_stride)):
            _, feat_shape, _ = self.feat_sym[i].infer_shape(**max_shapes)
            feat_shape = [int(i) for i in feat_shape[0]]
            feat_shape_list.append(feat_shape)

        label_dict = assign_anchor_fpn(feat_shape_list, dummy_boxes, dummy_info, self.feat_stride,
                                                   self.anchor_scales, self.anchor_ratios, self.allowed_border)
        label_list = [label_dict['label'], label_dict['bbox_target'], label_dict['bbox_weight']]
        label_shape = [(k, tuple([input_batch_size] + list(v.shape[1:]))) for k, v in zip(self.label_name, label_list)]
        return max_data_shape, label_shape
예제 #6
0
    def get_batch(self):
        # slice roidb
        cur_from = self.cur
        cur_to = min(cur_from + self.batch_size, self.size)
        roidb = [self.roidb[self.index[i]] for i in range(cur_from, cur_to)]

        # decide multi device slice
        work_load_list = self.work_load_list
        ctx = self.ctx
        if work_load_list is None:
            work_load_list = [1] * len(ctx)
        assert isinstance(work_load_list, list) and len(work_load_list) == len(ctx), \
            "Invalid settings for work load. "
        slices = _split_input_slice(self.batch_size, work_load_list)

        # get testing data for multigpu
        data_list = []
        label_list = []
        for islice in slices:
            iroidb = [roidb[i] for i in range(islice.start, islice.stop)]
            data, label = get_rpn_batch(iroidb)
            data_list.append(data)
            label_list.append(label)

        # pad data first and then assign anchor (read label)
        data_tensor = tensor_vstack([batch['data'] for batch in data_list])
        for i_card in range(len(data_list)):
            data_list[i_card]['data'] = data_tensor[
                                        i_card * config.TRAIN.BATCH_IMAGES:(1 + i_card) * config.TRAIN.BATCH_IMAGES]

        for data, label in zip(data_list, label_list):
            data_shape = {k: v.shape for k, v in data.items()}
            del data_shape['im_info']
            feat_shape_list = []
            for s in range(len(self.feat_stride)):
                _, feat_shape, _ = self.feat_sym[s].infer_shape(**data_shape)
                feat_shape = [int(i) for i in feat_shape[0]]
                feat_shape_list.append(feat_shape)
            label['label'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            label['bbox_target'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            label['bbox_weight'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]

            for im_i in range(config.TRAIN.BATCH_IMAGES):
                im_info = data['im_info'][im_i]
                gt_boxes = label['gt_boxes'][im_i][0]
                label_dict = \
                    assign_anchor_fpn(feat_shape_list, gt_boxes, im_info,
                                  self.feat_stride,
                                  self.anchor_scales,
                                  self.anchor_ratios,
                                  self.allowed_border)
                label['label'][im_i] = label_dict['label']
                label['bbox_target'][im_i] = label_dict['bbox_target']
                label['bbox_weight'][im_i] = label_dict['bbox_weight']
            label['label'] = np.vstack(label['label'])
            label['bbox_target'] = np.vstack(label['bbox_target'])
            label['bbox_weight'] = np.vstack(label['bbox_weight'])

        all_data = dict()
        for key in self.data_name:
            all_data[key] = tensor_vstack([batch[key] for batch in data_list])

        all_label = dict()
        for key in self.label_name:
            pad = 0 if key == 'weight' else -1
            all_label[key] = tensor_vstack([batch[key] for batch in label_list], pad=pad)
        self.data = [mx.nd.array(all_data[key]) for key in self.data_name]
        self.label = [mx.nd.array(all_label[key]) for key in self.label_name]
예제 #7
0
    def get_batch(self):
        # slice roidb
        cur_from = self.cur
        cur_to = min(cur_from + self.batch_size, self.size)
        roidb = [self.roidb[self.index[i]] for i in range(cur_from, cur_to)]

        # decide multi device slice
        work_load_list = self.work_load_list
        ctx = self.ctx
        if work_load_list is None:
            work_load_list = [1] * len(ctx)
        assert isinstance(work_load_list, list) and len(work_load_list) == len(ctx), \
            "Invalid settings for work load. "
        slices = _split_input_slice(self.batch_size, work_load_list)

        # get testing data for multigpu
        data_list = []
        label_list = []
        for islice in slices:
            iroidb = [roidb[i] for i in range(islice.start, islice.stop)]
            data, label = get_rpn_batch(iroidb)
            data_list.append(data)
            label_list.append(label)

        # pad data first and then assign anchor (read label)
        data_tensor = tensor_vstack([batch['data'] for batch in data_list])
        for i_card in range(len(data_list)):
            data_list[i_card]['data'] = data_tensor[
                                        i_card * config.TRAIN.BATCH_IMAGES:(1 + i_card) * config.TRAIN.BATCH_IMAGES]

        for data, label in zip(data_list, label_list):
            data_shape = {k: v.shape for k, v in data.items()}
            del data_shape['im_info']
            feat_shape_list = []
            for s in range(len(self.feat_stride)):
                _, feat_shape, _ = self.feat_sym[s].infer_shape(**data_shape)
                feat_shape = [int(i) for i in feat_shape[0]]
                feat_shape_list.append(feat_shape)
            label['label'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            label['bbox_target'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            label['bbox_weight'] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]

            for im_i in range(config.TRAIN.BATCH_IMAGES):
                im_info = data['im_info'][im_i]
                gt_boxes = label['gt_boxes'][im_i][0]
                label_dict = \
                    assign_anchor_fpn(feat_shape_list, gt_boxes, im_info,
                                  self.feat_stride,
                                  self.anchor_scales,
                                  self.anchor_ratios,
                                  self.allowed_border)
                label['label'][im_i] = label_dict['label']
                label['bbox_target'][im_i] = label_dict['bbox_target']
                label['bbox_weight'][im_i] = label_dict['bbox_weight']
            label['label'] = np.vstack(label['label'])
            label['bbox_target'] = np.vstack(label['bbox_target'])
            label['bbox_weight'] = np.vstack(label['bbox_weight'])

        all_data = dict()
        for key in self.data_name:
            all_data[key] = tensor_vstack([batch[key] for batch in data_list])

        all_label = dict()
        for key in self.label_name:
            pad = 0 if key == 'weight' else -1
            all_label[key] = tensor_vstack([batch[key] for batch in label_list], pad=pad)
        self.data = [mx.nd.array(all_data[key]) for key in self.data_name]
        self.label = [mx.nd.array(all_label[key]) for key in self.label_name]
예제 #8
0
    def get_batch(self):
        # slice roidb
        cur_from = self.cur
        cur_to = min(cur_from + self.batch_size, self.size)
        assert cur_to==cur_from+self.batch_size
        roidb = [self.roidb[self.index[i]] for i in range(cur_from, cur_to)]

        # decide multi device slice
        work_load_list = self.work_load_list
        ctx = self.ctx
        if work_load_list is None:
            work_load_list = [1] * len(ctx)
        assert isinstance(work_load_list, list) and len(work_load_list) == len(ctx), \
            "Invalid settings for work load. "
        slices = _split_input_slice(self.batch_size, work_load_list)

        # get testing data for multigpu
        data_list = []
        label_list = []
        for islice in slices:
            iroidb = [roidb[i] for i in range(islice.start, islice.stop)]
            data, label = get_crop_batch(iroidb)
            data_list += data
            label_list += label
            #data_list.append(data)
            #label_list.append(label)

        # pad data first and then assign anchor (read label)
        #data_tensor = tensor_vstack([batch['data'] for batch in data_list])
        #for i_card in range(len(data_list)):
        #    data_list[i_card]['data'] = data_tensor[
        #                                i_card * config.TRAIN.BATCH_IMAGES:(1 + i_card) * config.TRAIN.BATCH_IMAGES]

        for data, label in zip(data_list, label_list):
            data_shape = {k: v.shape for k, v in data.items()}
            del data_shape['im_info']
            feat_shape_list = []
            for s in range(len(self.feat_stride)):
                _, feat_shape, _ = self.feat_sym[s].infer_shape(**data_shape)
                feat_shape = [int(i) for i in feat_shape[0]]
                feat_shape_list.append(feat_shape)
            #for k in self.label_name:
            #  label[k] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]
            im_info = data['im_info']
            gt_boxes = label['gt_boxes']
            gt_points = label['gt_points']
            #print('im_info', im_info.shape)
            #print(gt_boxes.shape)
            label_dict = assign_anchor_fpn(feat_shape_list, gt_boxes, gt_points, im_info)
            for k in self.label_name:
              label[k] = label_dict[k]

        all_data = dict()
        for key in self.data_name:
            all_data[key] = tensor_vstack([batch[key] for batch in data_list])

        all_label = dict()
        for key in self.label_name:
            pad = 0 if key.startswith('bbox_') or key.startswith('kpoint_') else -1
            #print('label vstack', key, pad, len(label_list), file=sys.stderr)
            all_label[key] = tensor_vstack([batch[key] for batch in label_list], pad=pad)
        self.data = [mx.nd.array(all_data[key]) for key in self.data_name]
        self.label = [mx.nd.array(all_label[key]) for key in self.label_name]
예제 #9
0
    def get_batch(self):
        # slice roidb
        cur_from = self.cur
        cur_to = min(cur_from + self.batch_size, self.size)
        roidb = [self.roidb[self.index[i]] for i in range(cur_from, cur_to)]

        # decide multi device slice
        work_load_list = self.work_load_list
        ctx = self.ctx
        if work_load_list is None:
            work_load_list = [1] * len(ctx)
        assert isinstance(work_load_list, list) and len(work_load_list) == len(ctx), \
            "Invalid settings for work load. "
        slices = _split_input_slice(self.batch_size, work_load_list)

        # get testing data for multigpu
        data_list = []
        label_list = []
        for islice in slices:
            iroidb = [roidb[i] for i in range(islice.start, islice.stop)]
            data, label = get_rpn_batch(iroidb)
            data_list.append(data)
            label_list.append(label)

        # pad data first and then assign anchor (read label)
        data_tensor = tensor_vstack([batch['data'] for batch in data_list])
        for i_card in range(len(data_list)):
            data_list[i_card]['data'] = data_tensor[
                                        i_card * config.TRAIN.BATCH_IMAGES:(1 + i_card) * config.TRAIN.BATCH_IMAGES]


        for data, label in zip(data_list, label_list):
            data_shape = {k: v.shape for k, v in data.items()}
            del data_shape['im_info']
            feat_shape_list = []
            for s in range(len(self.feat_stride)):
                _, feat_shape, _ = self.feat_sym[s].infer_shape(**data_shape)
                feat_shape = [int(i) for i in feat_shape[0]]
                feat_shape_list.append(feat_shape)
            for k in self.label_name:
              label[k] = [0 for i in range(config.TRAIN.BATCH_IMAGES)]

            for im_i in range(config.TRAIN.BATCH_IMAGES):
                #im_info = data['im_info'][im_i]
                #gt_boxes = label['gt_boxes'][im_i][0]
                im_info = data['im_info']
                gt_boxes = label['gt_boxes']
                #print('im_info', im_info.shape)
                #print(gt_boxes.shape)
                vis=True if self.visid>=0 else False
                label_dict = assign_anchor_fpn(feat_shape_list, gt_boxes, im_info, vis)
                #do visualize for debug here
                if self.visid>=0 and self.visid<10:
                  for _roi in roidb:
                    print('image', _roi['image'], file=sys.stderr)
                  self.visid+=1
                  anchors = label_dict['anchors'].copy()
                  _im = data['data'].copy()
                  #print(label_dict['olabel'].shape)
                  _label = label_dict['olabel'].copy()
                  _gt_boxes = gt_boxes.copy().astype(np.int)
                  filename = './vis/A%d.png'%self.visid
                  _im = _im[0].transpose( (1,2,0) )
                  _im = _im[...,::-1] #bgr
                  for c in range(3):
                    _im[:,:,c] += config.PIXEL_MEANS[c]
                  _im = _im.astype(np.uint8).copy()
                  fg_inds = np.where(_label == 1)[0]
                  print(_im.shape, _label.shape, anchors.shape, len(fg_inds), _gt_boxes.shape, file=sys.stderr)
                  #draw FG anchors
                  _bc = 0
                  for a in range(anchors.shape[0]):
                    anchor = anchors[a].astype(np.int)
                    l = _label[a]
                    if l!=1:
                      continue
                    #print('drawing', _im.shape, anchor)
                    cv2.rectangle(_im, (anchor[0], anchor[1]), (anchor[2], anchor[3]), (255, 0, 0), 1)
                    _bc+=1
                  for a in range(_gt_boxes.shape[0]):
                    _box = _gt_boxes[a]
                    cv2.rectangle(_im, (_box[0], _box[1]), (_box[2], _box[3]), (0, 0, 255), 1)
                  print('draw to', filename, _bc, file=sys.stderr)
                  cv2.imwrite(filename, _im)


                for k in self.label_name:
                  #print('0in_loader', k, label_dict[k].shape, file=sys.stderr)
                  label[k][im_i] = label_dict[k]
            for k in self.label_name:
              label[k] = np.vstack(label[k])
              #print('in_loader', k, label[k].shape, file=sys.stderr)

        all_data = dict()
        for key in self.data_name:
            all_data[key] = tensor_vstack([batch[key] for batch in data_list])

        all_label = dict()
        for key in self.label_name:
            pad = 0 if key.startswith('bbox_') else -1
            #print('label vstack', key, pad, len(label_list), file=sys.stderr)
            all_label[key] = tensor_vstack([batch[key] for batch in label_list], pad=pad)
        self.data = [mx.nd.array(all_data[key]) for key in self.data_name]
        self.label = [mx.nd.array(all_label[key]) for key in self.label_name]