def get_rpn_anchor_input(im, boxes, is_crowd): """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: The anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWxNA fm_boxes: fHxfWxNAx4 NA will be NUM_ANCHOR_SIZES x NUM_ANCHOR_RATIOS """ boxes = boxes.copy() all_anchors = np.copy(get_all_anchors()) # fHxfWxAx4 -> (-1, 4) featuremap_anchors_flatten = all_anchors.reshape((-1, 4)) # only use anchors inside the image inside_ind, inside_anchors = filter_boxes_inside_shape(featuremap_anchors_flatten, im.shape[:2]) # obtain anchor labels and their corresponding gt boxes anchor_labels, anchor_gt_boxes = get_anchor_labels(inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # Fill them back to original size: fHxfWx1, fHxfWx4 anchorH, anchorW = all_anchors.shape[:2] featuremap_labels = -np.ones((anchorH * anchorW * config.NUM_ANCHOR, ), dtype='int32') featuremap_labels[inside_ind] = anchor_labels featuremap_labels = featuremap_labels.reshape((anchorH, anchorW, config.NUM_ANCHOR)) featuremap_boxes = np.zeros((anchorH * anchorW * config.NUM_ANCHOR, 4), dtype='float32') featuremap_boxes[inside_ind, :] = anchor_gt_boxes featuremap_boxes = featuremap_boxes.reshape((anchorH, anchorW, config.NUM_ANCHOR, 4)) return featuremap_labels, featuremap_boxes
def get_rpn_anchor_input(self, im, boxes, is_crowd): """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: The anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWxNA fm_boxes: fHxfWxNAx4 NA will be NUM_ANCHOR_SIZES x NUM_ANCHOR_RATIOS """ boxes = boxes.copy() all_anchors = np.copy( get_all_anchors( stride=self.cfg.RPN.ANCHOR_STRIDE, sizes=self.cfg.RPN.ANCHOR_SIZES, ratios=self.cfg.RPN.ANCHOR_RATIOS, max_size=self.cfg.PREPROC.MAX_SIZE, )) # fHxfWxAx4 -> (-1, 4) featuremap_anchors_flatten = all_anchors.reshape((-1, 4)) # only use anchors inside the image inside_ind, inside_anchors = filter_boxes_inside_shape( featuremap_anchors_flatten, im.shape[:2]) # obtain anchor labels and their corresponding gt boxes anchor_labels, anchor_gt_boxes = self.get_anchor_labels( inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # Fill them back to original size: fHxfWx1, fHxfWx4 num_anchor = self.cfg.RPN.NUM_ANCHOR anchorH, anchorW = all_anchors.shape[:2] featuremap_labels = -np.ones( (anchorH * anchorW * num_anchor, ), dtype="int32") featuremap_labels[inside_ind] = anchor_labels featuremap_labels = featuremap_labels.reshape( (anchorH, anchorW, num_anchor)) featuremap_boxes = np.zeros((anchorH * anchorW * num_anchor, 4), dtype="float32") featuremap_boxes[inside_ind, :] = anchor_gt_boxes featuremap_boxes = featuremap_boxes.reshape( (anchorH, anchorW, num_anchor, 4)) return featuremap_labels, featuremap_boxes
def get_multilevel_rpn_anchor_input(im, boxes, is_crowd): """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: [(fm_labels, fm_boxes)]: Returns a tuple for each FPN level. Each tuple contains the anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWx NUM_ANCHOR_RATIOS fm_boxes: fHxfWx NUM_ANCHOR_RATIOS x4 """ boxes = boxes.copy() anchors_per_level = get_all_anchors_fpn() flatten_anchors_per_level = [k.reshape((-1, 4)) for k in anchors_per_level] all_anchors_flatten = np.concatenate(flatten_anchors_per_level, axis=0) inside_ind, inside_anchors = filter_boxes_inside_shape( all_anchors_flatten, im.shape[:2]) anchor_labels, anchor_gt_boxes = get_anchor_labels(inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # map back to all_anchors, then split to each level num_all_anchors = all_anchors_flatten.shape[0] all_labels = -np.ones((num_all_anchors, ), dtype='int32') all_labels[inside_ind] = anchor_labels all_boxes = np.zeros((num_all_anchors, 4), dtype='float32') all_boxes[inside_ind] = anchor_gt_boxes start = 0 multilevel_inputs = [] for level_anchor in anchors_per_level: assert level_anchor.shape[2] == len(config.ANCHOR_RATIOS) anchor_shape = level_anchor.shape[:3] # fHxfWxNUM_ANCHOR_RATIOS num_anchor_this_level = np.prod(anchor_shape) end = start + num_anchor_this_level multilevel_inputs.append( (all_labels[start:end].reshape(anchor_shape), all_boxes[start:end, :].reshape(anchor_shape + (4, )))) start = end assert end == num_all_anchors, "{} != {}".format(end, num_all_anchors) return multilevel_inputs
def get_rpn_anchor_input(im, boxes, is_crowd): cfg.RPN.NUM_ANCHOR = len(cfg.RPN.ANCHOR_SIZES) * len(cfg.RPN.ANCHOR_RATIOS) """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: The anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWxNA fm_boxes: fHxfWxNAx4 NA will be NUM_ANCHOR_SIZES x NUM_ANCHOR_RATIOS """ boxes = boxes.copy() all_anchors = np.copy(get_all_anchors()) # fHxfWxAx4 -> (-1, 4) featuremap_anchors_flatten = all_anchors.reshape((-1, 4)) # only use anchors inside the image inside_ind, inside_anchors = filter_boxes_inside_shape( featuremap_anchors_flatten, im.shape[:2]) # obtain anchor labels and their corresponding gt boxes # TODO error may occur here !! is_crowd = np.array(is_crowd) boxes = np.array(boxes) anchor_labels, anchor_gt_boxes = get_anchor_labels(inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # Fill them back to original size: fHxfWx1, fHxfWx4 anchorH, anchorW = all_anchors.shape[:2] cfg.RPN.NUM_ANCHOR = len(cfg.RPN.ANCHOR_SIZES) * len(cfg.RPN.ANCHOR_RATIOS) featuremap_labels = -np.ones( (anchorH * anchorW * cfg.RPN.NUM_ANCHOR, ), dtype='int32') featuremap_labels[inside_ind] = anchor_labels featuremap_labels = featuremap_labels.reshape( (anchorH, anchorW, cfg.RPN.NUM_ANCHOR)) featuremap_boxes = np.zeros((anchorH * anchorW * cfg.RPN.NUM_ANCHOR, 4), dtype='float32') featuremap_boxes[inside_ind, :] = anchor_gt_boxes featuremap_boxes = featuremap_boxes.reshape( (anchorH, anchorW, cfg.RPN.NUM_ANCHOR, 4)) return featuremap_labels, featuremap_boxes
def get_multilevel_rpn_anchor_input(im, boxes, is_crowd): """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: [(fm_labels, fm_boxes)]: Returns a tuple for each FPN level. Each tuple contains the anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWx NUM_ANCHOR_RATIOS fm_boxes: fHxfWx NUM_ANCHOR_RATIOS x4 """ boxes = boxes.copy() anchors_per_level = get_all_anchors_fpn() flatten_anchors_per_level = [k.reshape((-1, 4)) for k in anchors_per_level] all_anchors_flatten = np.concatenate(flatten_anchors_per_level, axis=0) inside_ind, inside_anchors = filter_boxes_inside_shape(all_anchors_flatten, im.shape[:2]) anchor_labels, anchor_gt_boxes = get_anchor_labels(inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # map back to all_anchors, then split to each level num_all_anchors = all_anchors_flatten.shape[0] all_labels = -np.ones((num_all_anchors, ), dtype='int32') all_labels[inside_ind] = anchor_labels all_boxes = np.zeros((num_all_anchors, 4), dtype='float32') all_boxes[inside_ind] = anchor_gt_boxes start = 0 multilevel_inputs = [] for level_anchor in anchors_per_level: assert level_anchor.shape[2] == len(config.ANCHOR_RATIOS) anchor_shape = level_anchor.shape[:3] # fHxfWxNUM_ANCHOR_RATIOS num_anchor_this_level = np.prod(anchor_shape) end = start + num_anchor_this_level multilevel_inputs.append( (all_labels[start: end].reshape(anchor_shape), all_boxes[start: end, :].reshape(anchor_shape + (4,)) )) start = end assert end == num_all_anchors, "{} != {}".format(end, num_all_anchors) return multilevel_inputs
def get_rpn_anchor_input(im, boxes, is_crowd): """ Args: im: an image boxes: nx4, floatbox, gt. shoudn't be changed is_crowd: n, Returns: The anchor labels and target boxes for each pixel in the featuremap. fm_labels: fHxfWxNA fm_boxes: fHxfWxNAx4 NA will be NUM_ANCHOR_SIZES x NUM_ANCHOR_RATIOS """ boxes = boxes.copy() all_anchors = np.copy(get_all_anchors()) # fHxfWxAx4 -> (-1, 4) featuremap_anchors_flatten = all_anchors.reshape((-1, 4)) # only use anchors inside the image inside_ind, inside_anchors = filter_boxes_inside_shape( featuremap_anchors_flatten, im.shape[:2]) # obtain anchor labels and their corresponding gt boxes anchor_labels, anchor_gt_boxes = get_anchor_labels(inside_anchors, boxes[is_crowd == 0], boxes[is_crowd == 1]) # Fill them back to original size: fHxfWx1, fHxfWx4 anchorH, anchorW = all_anchors.shape[:2] featuremap_labels = -np.ones( (anchorH * anchorW * cfg.RPN.NUM_ANCHOR, ), dtype='int32') featuremap_labels[inside_ind] = anchor_labels featuremap_labels = featuremap_labels.reshape( (anchorH, anchorW, cfg.RPN.NUM_ANCHOR)) featuremap_boxes = np.zeros((anchorH * anchorW * cfg.RPN.NUM_ANCHOR, 4), dtype='float32') # every anchor will get a set of parameterized bb vectors # but they are only meaningful to the positive boxes # only the regression loss from the positive boxes will be considered featuremap_boxes[inside_ind, :] = anchor_gt_boxes featuremap_boxes = featuremap_boxes.reshape( (anchorH, anchorW, cfg.RPN.NUM_ANCHOR, 4)) return featuremap_labels, featuremap_boxes