def CollectAndDistributeFpnRpnProposals(self): k_max = cfg.FPN.RPN_MAX_LEVEL k_min = cfg.FPN.RPN_MIN_LEVEL # Prepare input blobs rois_names = ['rpn_rois_fpn' + str(l) for l in range(k_min, k_max + 1)] score_names = [ 'rpn_roi_probs_fpn' + str(l) for l in range(k_min, k_max + 1) ] blobs_in = rois_names + score_names if self.train: blobs_in += ['roidb', 'im_info'] blobs_in = [core.ScopedBlobReference(b) for b in blobs_in] name = 'CollectAndDistributeFpnRpnProposalsOp:' + ','.join( [str(b) for b in blobs_in]) # Prepare output blobs blobs_out = fast_rcnn_roi_data.get_fast_rcnn_blob_names( is_training=self.train) blobs_out = [core.ScopedBlobReference(b) for b in blobs_out] outputs = self.net.Python( CollectAndDistributeFpnRpnProposalsOp(self.train).forward)( blobs_in, blobs_out, name=name) return outputs
def CollectAndDistributeFpnRpnProposals(self): """Merge RPN proposals generated at multiple FPN levels and then distribute those proposals to their appropriate FPN levels. An anchor at one FPN level may predict an RoI that will map to another level, hence the need to redistribute the proposals. This function assumes standard blob names for input and output blobs. Input blobs: [rpn_rois_fpn<min>, ..., rpn_rois_fpn<max>, rpn_roi_probs_fpn<min>, ..., rpn_roi_probs_fpn<max>] - rpn_rois_fpn<i> are the RPN proposals for FPN level i; see rpn_rois documentation from GenerateProposals. - rpn_roi_probs_fpn<i> are the RPN objectness probabilities for FPN level i; see rpn_roi_probs documentation from GenerateProposals. If used during training, then the input blobs will also include: [roidb, im_info] (see GenerateProposalLabels). Output blobs: [rois_fpn<min>, ..., rois_rpn<max>, rois, rois_idx_restore] - rois_fpn<i> are the RPN proposals for FPN level i - rois_idx_restore is a permutation on the concatenation of all rois_fpn<i>, i=min...max, such that when applied the RPN RoIs are restored to their original order in the input blobs. If used during training, then the output blobs will also include: [labels, bbox_targets, bbox_inside_weights, bbox_outside_weights]. """ k_max = cfg.FPN.RPN_MAX_LEVEL k_min = cfg.FPN.RPN_MIN_LEVEL # Prepare input blobs rois_names = ['rpn_rois_fpn' + str(l) for l in range(k_min, k_max + 1)] score_names = [ 'rpn_roi_probs_fpn' + str(l) for l in range(k_min, k_max + 1) ] blobs_in = rois_names + score_names if self.train: blobs_in += ['roidb', 'im_info'] # blobs_in += ['roidb'] # blobs_in += ['im_info'] # if use rois_hg blobs_in = [core.ScopedBlobReference(b) for b in blobs_in] name = 'CollectAndDistributeFpnRpnProposalsOp:' + ','.join( [str(b) for b in blobs_in]) # Prepare output blobs blobs_out = fast_rcnn_roi_data.get_fast_rcnn_blob_names( is_training=self.train) blobs_out = [core.ScopedBlobReference(b) for b in blobs_out] outputs = self.net.Python( CollectAndDistributeFpnRpnProposalsOp(self.train).forward)( blobs_in, blobs_out, name=name) return outputs
def CollectAndDistributeFpnRpnProposals(self): """Merge RPN proposals generated at multiple FPN levels and then distribute those proposals to their appropriate FPN levels. An anchor at one FPN level may predict an RoI that will map to another level, hence the need to redistribute the proposals. 从fpn的不同层合并proposals,然后将其分配到合适的FPN层。一个anchor预测的 RoI可能会映射到另外的FPN层,所以需要重新分配。 This function assumes standard blob names for input and output blobs. Input blobs: [rpn_rois_fpn<min>, ..., rpn_rois_fpn<max>, rpn_roi_probs_fpn<min>, ..., rpn_roi_probs_fpn<max>] - rpn_rois_fpn<i> are the RPN proposals for FPN level i; see rpn_rois documentation from GenerateProposals. - rpn_roi_probs_fpn<i> are the RPN objectness probabilities for FPN level i; see rpn_roi_probs documentation from GenerateProposals. If used during training, then the input blobs will also include: [roidb, im_info] (see GenerateProposalLabels). Output blobs: [rois_fpn<min>, ..., rois_rpn<max>, rois, rois_idx_restore] - rois_fpn<i> are the RPN proposals for FPN level i - rois_idx_restore is a permutation on the concatenation of all rois_fpn<i>, i=min...max, such that when applied the RPN RoIs are restored to their original order in the input blobs. 对于所有rois,依次获取属于每一层的fpn的roi的索引,将这些索引连接起来,就是 这个数组的意义 If used during training, then the output blobs will also include: [labels, bbox_targets, bbox_inside_weights, bbox_outside_weights]. """ # 6, 2 k_max = cfg.FPN.RPN_MAX_LEVEL k_min = cfg.FPN.RPN_MIN_LEVEL # Prepare input blobs # [u'rpn_rois_fpn2', u'rpn_rois_fpn3', u'rpn_rois_fpn4', # u'rpn_rois_fpn5', u'rpn_rois_fpn6'] rois_names = ['rpn_rois_fpn' + str(l) for l in range(k_min, k_max + 1)] # [u'rpn_roi_probs_fpn2', u'rpn_roi_probs_fpn3', u'rpn_roi_probs_fpn4', # u'rpn_roi_probs_fpn5', u'rpn_roi_probs_fpn6'] score_names = [ 'rpn_roi_probs_fpn' + str(l) for l in range(k_min, k_max + 1) ] blobs_in = rois_names + score_names # 训练需要额外的输入 if self.train: blobs_in += ['roidb', 'im_info'] # 转化为BlobReference blobs_in = [core.ScopedBlobReference(b) for b in blobs_in] name = 'CollectAndDistributeFpnRpnProposalsOp:' + ','.join( [str(b) for b in blobs_in]) # Prepare output blobs # [u'rois', u'labels_int32', u'bbox_targets', u'bbox_inside_weights', # u'bbox_outside_weights', u'rois_fpn2', u'rois_fpn3', u'rois_fpn4', # u'rois_fpn5', u'rois_idx_restore_int32'] blobs_out = fast_rcnn_roi_data.get_fast_rcnn_blob_names( is_training=self.train) blobs_out = [core.ScopedBlobReference(b) for b in blobs_out] outputs = self.net.Python( CollectAndDistributeFpnRpnProposalsOp(self.train).forward)( blobs_in, blobs_out, name=name) return outputs