def get_prediction(self, conv_feat, im_info, proposal): p = self.p bbox_mean = p.regress_target.mean bbox_std = p.regress_target.std batch_image = p.batch_image num_class = p.num_class class_agnostic = p.regress_target.class_agnostic num_reg_class = 2 if class_agnostic else num_class cls_logit, bbox_delta = self.get_output(conv_feat) bbox_delta = X.reshape(bbox_delta, shape=(batch_image, -1, 4 * num_reg_class), name='bbox_delta_reshape') bbox_xyxy = X.decode_bbox(rois=proposal, bbox_pred=bbox_delta, im_info=im_info, name='decode_bbox', bbox_mean=bbox_mean, bbox_std=bbox_std, class_agnostic=class_agnostic) cls_score = X.softmax(cls_logit, axis=-1, name='bbox_cls_score') cls_score = X.reshape(cls_score, shape=(batch_image, -1, num_class), name='bbox_cls_score_reshape') return cls_score, bbox_xyxy
def get_all_proposal_with_filter(self, conv_feat, im_info, valid_ranges): if self._proposal is not None: return self._proposal p = self.p rpn_stride = p.anchor_generate.stride anchor_scale = p.anchor_generate.scale anchor_ratio = p.anchor_generate.ratio pre_nms_top_n = p.proposal.pre_nms_top_n post_nms_top_n = p.proposal.post_nms_top_n nms_thr = p.proposal.nms_thr min_bbox_side = p.proposal.min_bbox_side cls_logit, bbox_delta = self.get_output(conv_feat) # TODO: remove this reshape hell cls_logit_reshape = X.reshape( cls_logit, shape=(0, -4, 2, -1, 0, 0), # (N,C,H,W) -> (N,2,C/2,H,W) name="rpn_cls_logit_reshape_" ) cls_score = X.softmax( cls_logit_reshape, axis=1, name='rpn_cls_score' ) cls_logit_reshape = X.reshape( cls_score, shape=(0, -3, 0, 0), name='rpn_cls_score_reshape' ) proposal = mx.sym.contrib.Proposal_v2( cls_prob=cls_logit_reshape, bbox_pred=bbox_delta, im_info=im_info, valid_ranges=valid_ranges, name='proposal', feature_stride=rpn_stride, scales=tuple(anchor_scale), ratios=tuple(anchor_ratio), rpn_pre_nms_top_n=pre_nms_top_n, rpn_post_nms_top_n=post_nms_top_n, threshold=nms_thr, rpn_min_size=min_bbox_side, iou_loss=False, filter_scales=True, output_score=True ) self._proposal = proposal return proposal
def get_prediction(self, rois, roi_feat, fpn_conv_feats, im_info, play=False): ''' Args: rois: [batch_image, image_roi, 4] roi_feat: [batch_image * image_roi, 256, roi_size, roi_size] fpn_conv_feats: dict of FPN features, each [batch_image, in_channels, fh, fw] im_info: ... Returns: cls_score: [batch_image, image_roi, num_class] bbox_xyxy: [batch_image, image_roi, num_class*4] ''' p = self.p assert not p.regress_target.class_agnostic bbox_mean = p.regress_target.mean bbox_std = p.regress_target.std batch_image = p.batch_image num_class = p.num_class class_agnostic = p.regress_target.class_agnostic num_reg_class = num_class assert batch_image == 1 cls_logit, bbox_delta, tsd_cls_logit, tsd_bbox_delta, delta_c, delta_r = self.get_output( fpn_conv_feats, roi_feat, rois, is_train=False) rois_r = self._get_delta_r_box(delta_r, rois) bbox_xyxy = X.decode_bbox( rois=rois_r, bbox_pred=X.reshape(tsd_bbox_delta, (batch_image, -1, 4 * num_reg_class)), im_info=im_info, name='decode_bbox', bbox_mean=bbox_mean, bbox_std=bbox_std, class_agnostic=False) cls_score = X.reshape(X.softmax(tsd_cls_logit, axis=-1, name='bbox_cls_score'), shape=(batch_image, -1, num_class), name='bbox_cls_score_reshape') if not play: return cls_score, bbox_xyxy else: return cls_score, bbox_xyxy, rois, rois_r
def get_all_proposal(self, conv_feat, im_info): if self._proposal is not None: return self._proposal p = self.p rpn_stride = p.anchor_generate.stride anchor_scale = p.anchor_generate.scale anchor_ratio = p.anchor_generate.ratio pre_nms_top_n = p.proposal.pre_nms_top_n post_nms_top_n = p.proposal.post_nms_top_n nms_thr = p.proposal.nms_thr min_bbox_side = p.proposal.min_bbox_side cls_logit, bbox_delta = self.get_output(conv_feat) # TODO: remove this reshape hell cls_logit_reshape = X.reshape( cls_logit, shape=(0, -4, 2, -1, 0, 0), # (N,C,H,W) -> (N,2,C/2,H,W) name="rpn_cls_logit_reshape_") cls_score = X.softmax(cls_logit_reshape, axis=1, name='rpn_cls_score') cls_logit_reshape = X.reshape(cls_score, shape=(0, -3, 0, 0), name='rpn_cls_score_reshape') # TODO: ask all to add is_train filed in RPNParam proposal = X.proposal(cls_prob=cls_logit_reshape, bbox_pred=bbox_delta, im_info=im_info, name='proposal', feature_stride=rpn_stride, scales=tuple(anchor_scale), ratios=tuple(anchor_ratio), rpn_pre_nms_top_n=pre_nms_top_n, rpn_post_nms_top_n=post_nms_top_n, threshold=nms_thr, rpn_min_size=min_bbox_side, iou_loss=False) self._proposal = proposal return proposal
def get_all_proposal(self, conv_feat, im_info): if self._proposal is not None: return self._proposal p = self.p rpn_stride = p.anchor_generate.stride anchor_scale = p.anchor_generate.scale anchor_ratio = p.anchor_generate.ratio pre_nms_top_n = p.proposal.pre_nms_top_n post_nms_top_n = p.proposal.post_nms_top_n nms_thr = p.proposal.nms_thr min_bbox_side = p.proposal.min_bbox_side cls_logit, bbox_delta = self.get_output(conv_feat) # TODO: remove this reshape hell cls_logit_reshape = X.reshape( cls_logit, shape=(0, -4, 2, -1, 0, 0), # (N,C,H,W) -> (N,2,C/2,H,W) name="rpn_cls_logit_reshape_") cls_score = X.softmax(cls_logit_reshape, axis=1, name='rpn_cls_score') cls_logit_reshape = X.reshape(cls_score, shape=(0, -3, 0, 0), name='rpn_cls_score_reshape') # TODO: ask all to add is_train filed in RPNParam proposal = X.proposal(cls_prob=cls_logit_reshape, bbox_pred=bbox_delta, im_info=im_info, name='proposal', feature_stride=rpn_stride, scales=tuple(anchor_scale), ratios=tuple(anchor_ratio), rpn_pre_nms_top_n=pre_nms_top_n, rpn_post_nms_top_n=post_nms_top_n, threshold=nms_thr, rpn_min_size=min_bbox_side, iou_loss=False, output_score=True) if p.use_symbolic_proposal is not None: batch_size = p.batch_image max_side = p.anchor_generate.max_side assert max_side is not None, "symbolic proposal requires max_side of image" from mxnext.tvm.proposal import proposal as Proposal proposal = Proposal(cls_prob=cls_logit_reshape, bbox_pred=bbox_delta, im_info=im_info, name='proposal', feature_stride=rpn_stride, scales=tuple(anchor_scale), ratios=tuple(anchor_ratio), rpn_pre_nms_top_n=pre_nms_top_n, rpn_post_nms_top_n=post_nms_top_n, threshold=nms_thr, batch_size=batch_size, max_side=max_side, output_score=True, variant="simpledet") self._proposal = proposal return proposal
def get_prediction(self, conv_feat, im_info, proposal): p = self.p bbox_mean = p.regress_target.mean bbox_std = p.regress_target.std batch_image = p.batch_image num_class = p.num_class class_agnostic = p.regress_target.class_agnostic num_reg_class = 2 if class_agnostic else num_class cls_logit, bbox_delta, cls_sec_logit, bbox_sec_delta, roi_feature = self.get_output( conv_feat) if p.refine_mode: refine_cls_logit, refine_bbox_delta, refine_cls_sec_logit, refine_bbox_sec_delta = \ self.get_refine_output(roi_feature, cls_logit, bbox_delta, cls_sec_logit, bbox_sec_delta) bbox_delta = refine_bbox_delta bbox_sec_delta = refine_bbox_sec_delta cls_logit = refine_cls_logit cls_sec_logit = refine_cls_sec_logit bbox_delta = X.reshape(bbox_delta, shape=(batch_image, -1, 4 * num_reg_class), name='bbox_delta_reshape') bbox_sec_delta = X.reshape( bbox_sec_delta, shape=(batch_image, -1, 4 * num_reg_class), name='bbox_sec_delta_reshape', ) bbox_xyxy = X.decode_bbox(rois=proposal, bbox_pred=bbox_delta, im_info=im_info, name='decode_bbox', bbox_mean=bbox_mean, bbox_std=bbox_std, class_agnostic=class_agnostic) bbox_sec_xyxy = X.decode_bbox( rois=proposal, bbox_pred=bbox_sec_delta, im_info=im_info, name='decode_bbox_sec', bbox_mean=bbox_mean, bbox_std=bbox_std, class_agnostic=class_agnostic, ) # NOTE: avoid name conflicts(potential bug from X.decode_bbox?) bbox_sec_xyxy = bbox_sec_xyxy * mx.sym.ones_like(bbox_sec_xyxy) cls_score = X.softmax(cls_logit, axis=-1, name='bbox_cls_score') cls_score = X.reshape(cls_score, shape=(batch_image, -1, num_class), name='bbox_cls_score_reshape') cls_sec_score = X.softmax( cls_sec_logit, axis=-1, name='bbox_cls_sec_score', ) cls_sec_score = X.reshape(cls_sec_score, shape=(batch_image, -1, num_class), name='bbox_cls_sec_score_reshape') return cls_score, bbox_xyxy, cls_sec_score, bbox_sec_xyxy