def distance_based_proposal(self, scores, proposals, order): """ propose rois in two area based on the distance :param scores: (N) :param proposals: (N, 7) :param order: (N) """ nms_range_list = [0, 40, 80.0] pre_tot_top_n = cfg[self.mode].RPN_PRE_NMS_TOP_N pre_top_n_list = [0, int(pre_tot_top_n * 0.7), pre_tot_top_n - int(pre_tot_top_n * 0.7)] post_tot_top_n = cfg[self.mode].RPN_POST_NMS_TOP_N post_top_n_list = [0, int(post_tot_top_n * 0.7), post_tot_top_n - int(post_tot_top_n * 0.7)] scores_single_list, proposals_single_list = [], [] # sort by score scores_ordered = scores[order] proposals_ordered = proposals[order] #print(np.shape(proposals)) # z coordinate #print(proposals_ordered[:, 2]) np_proposals_ordered = proposals_ordered.detach().cpu().numpy() dist = np.apply_along_axis(LA.norm, 1, np_proposals_ordered) #print(dist) mask1 = (dist > nms_range_list[0]) & (dist <= nms_range_list[1]) first_mask = mask1 * 1.0 for i in range(1, len(nms_range_list)): # get proposal distance mask mask2 = ((dist > nms_range_list[i - 1]) & (dist <= nms_range_list[i])) dist_mask = mask2 * 1 if dist_mask.sum() != 0: # this area has points # reduce by mask cur_scores = scores_ordered[dist_mask] cur_proposals = proposals_ordered[dist_mask] # fetch pre nms top K cur_scores = cur_scores[:pre_top_n_list[i]] cur_proposals = cur_proposals[:pre_top_n_list[i]] else: assert i == 2, '%d' % i # this area doesn't have any points, so use rois of first area cur_scores = scores_ordered[first_mask] cur_proposals = proposals_ordered[first_mask] # print(cur_proposals) # fetch top K of first area cur_scores = cur_scores[pre_top_n_list[i - 1]:][:pre_top_n_list[i]] cur_proposals = cur_proposals[pre_top_n_list[i - 1]:][:pre_top_n_list[i]] # oriented nms boxes_bev = kitti_utils.boxes3d_to_bev_torch(cur_proposals) if cfg.RPN.NMS_TYPE == 'rotate': keep_idx = iou3d_utils.nms_gpu(boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) elif cfg.RPN.NMS_TYPE == 'normal': keep_idx = iou3d_utils.nms_normal_gpu(boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) else: raise NotImplementedError # Fetch post nms top k keep_idx = keep_idx[:post_top_n_list[i]] cur_scores = cur_scores[keep_idx] cur_proposals = cur_proposals[keep_idx] # print(cur_scores) # print(cur_proposals[cur_scores != 0]) scores_single_list.append(cur_scores) proposals_single_list.append(cur_proposals) scores_single = torch.cat(scores_single_list, dim=0) proposals_single = torch.cat(proposals_single_list, dim=0) #print(proposals_single) return scores_single, proposals_single
def distance_based_proposal(self, scores, proposals, order): """ propose rois in two area based on the distance The bbox proposals are groupe into two regions far and near. out of the total number of bboxes we are going to predict we give 70 precent to the near region, and 30 precent to the far. e.g if we are going to select 100 bboxes we select the top 70 boxes from the near (accordign to the scores), and top 30from far :param scores: (N) :param proposals: (N, 9) the bbox features :param order: (N) """ nms_range_list = [0, 40.0, 80.0] pre_tot_top_n = cfg[self.mode].RPN_PRE_NMS_TOP_N # 100 pre_top_n_list = [ 0, int(pre_tot_top_n * 0.7), pre_tot_top_n - int(pre_tot_top_n * 0.7) ] # [0,70,30] post_tot_top_n = cfg[self.mode].RPN_POST_NMS_TOP_N post_top_n_list = [ 0, int(post_tot_top_n * 0.7), post_tot_top_n - int(post_tot_top_n * 0.7) ] scores_single_list, proposals_single_list = [], [] # sort by score scores_ordered = scores[order] proposals_ordered = proposals[order] # distance is the z of the predicted bbox centers dist = proposals_ordered[:, 2] first_mask = (dist > nms_range_list[0]) & (dist <= nms_range_list[1] ) # 0 < distance < 40 for i in range(1, len(nms_range_list)): # get proposal distance mask dist_mask = ((dist > nms_range_list[i - 1]) & (dist <= nms_range_list[i])) if dist_mask.sum() != 0: # this area has points # reduce by mask cur_scores = scores_ordered[dist_mask] cur_proposals = proposals_ordered[dist_mask] # fetch pre nms top K # but how do we know we will have 70 points ? cur_scores = cur_scores[:pre_top_n_list[i]] cur_proposals = cur_proposals[:pre_top_n_list[i]] else: assert i == 2, '%d' % i # this area doesn't have any points, so use rois of first area cur_scores = scores_ordered[first_mask] cur_proposals = proposals_ordered[first_mask] # fetch top K of first area # choose the 30 bboxes from the first region But the 30 that come after the first top 70. cur_scores = cur_scores[pre_top_n_list[i - 1]:][:pre_top_n_list[i]] cur_proposals = cur_proposals[ pre_top_n_list[i - 1]:][:pre_top_n_list[i]] # oriented nms boxes_bev = kitti_utils.boxes3d_to_bev_torch(cur_proposals) if cfg.RPN.NMS_TYPE == 'rotate': keep_idx = iou3d_utils.nms_gpu(boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) elif cfg.RPN.NMS_TYPE == 'normal': keep_idx = iou3d_utils.nms_normal_gpu( boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) else: raise NotImplementedError # Fetch post nms top k keep_idx = keep_idx[:post_top_n_list[i]] scores_single_list.append(cur_scores[keep_idx]) proposals_single_list.append(cur_proposals[keep_idx]) scores_single = torch.cat(scores_single_list, dim=0) proposals_single = torch.cat(proposals_single_list, dim=0) return scores_single, proposals_single
def distance_based_proposal(self, scores, proposals, order): """ propose rois in two area based on the distance :param scores: (N) :param proposals: (N, 7) :param order: (N) """ #nms_range_list = [-60.0, -40.0, 0.0,40.0, 60.0] nms_range_list = [-60.0, 0.0, 60.0] pre_tot_top_n = cfg[self.mode].RPN_PRE_NMS_TOP_N pre_top_n_list = [ 0, int(pre_tot_top_n * 0.7), pre_tot_top_n - int(pre_tot_top_n * 0.7) ] post_tot_top_n = cfg[self.mode].RPN_POST_NMS_TOP_N post_top_n_list = [ 0, int(post_tot_top_n * 0.7), post_tot_top_n - int(post_tot_top_n * 0.7) ] scores_single_list, proposals_single_list = [], [] # sort by score scores_ordered = scores[order] proposals_ordered = proposals[order] dist = proposals_ordered[:, 2] first_mask = (dist > nms_range_list[0]) & (dist <= nms_range_list[1]) for i in range(1, len(nms_range_list)): # get proposal distance mask dist_mask = ((dist > nms_range_list[i - 1]) & (dist <= nms_range_list[i])) if dist_mask.sum() != 0: # this area has points # reduce by mask cur_scores = scores_ordered[dist_mask] cur_proposals = proposals_ordered[dist_mask] # fetch pre nms top K cur_scores = cur_scores[:pre_top_n_list[i]] cur_proposals = cur_proposals[:pre_top_n_list[i]] else: assert i == 2, '%d' % i # this area doesn't have any points, so use rois of first area cur_scores = scores_ordered[first_mask] cur_proposals = proposals_ordered[first_mask] # fetch top K of first area cur_scores = cur_scores[pre_top_n_list[i - 1]:][:pre_top_n_list[i]] cur_proposals = cur_proposals[ pre_top_n_list[i - 1]:][:pre_top_n_list[i]] # oriented nms boxes_bev = kitti_utils.boxes3d_to_bev_torch(cur_proposals) if cfg.RPN.NMS_TYPE == 'rotate': keep_idx = iou3d_utils.nms_gpu(boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) elif cfg.RPN.NMS_TYPE == 'normal': keep_idx = iou3d_utils.nms_normal_gpu( boxes_bev, cur_scores, cfg[self.mode].RPN_NMS_THRESH) else: raise NotImplementedError # Fetch post nms top k keep_idx = keep_idx[:post_top_n_list[i]] scores_single_list.append(cur_scores[keep_idx]) proposals_single_list.append(cur_proposals[keep_idx]) scores_single = torch.cat(scores_single_list, dim=0) proposals_single = torch.cat(proposals_single_list, dim=0) return scores_single, proposals_single