def regress_by_class_rbbox(self, rois, label, bbox_pred, img_meta): """Regress the bbox for the predicted class. Used in Cascade R-CNN. Args: rois (Tensor): shape (n, 5) or (n, 6) label (Tensor): shape (n, ) bbox_pred (Tensor): shape (n, 5*(#class+1)) or (n, 5) img_meta (dict): Image meta info. Returns: Tensor: Regressed bboxes, the same shape as input rois. """ # import pdb # pdb.set_trace() assert rois.size(1) == 5 or rois.size(1) == 6 if not self.reg_class_agnostic: label = label * 5 inds = torch.stack( (label, label + 1, label + 2, label + 3, label + 4), 1) bbox_pred = torch.gather(bbox_pred, 1, inds) assert bbox_pred.size(1) == 5 if rois.size(1) == 5: if self.with_module: # # 原先版本 # new_rois = delta2dbbox(rois, bbox_pred, self.target_means, # self.target_stds, img_meta['img_shape']) # 替换为第二阶段相应的解码方案 new_rois = delta2dbbox_v2(rois, bbox_pred, self.target_means, self.target_stds, img_meta['img_shape']) else: new_rois = delta2dbbox_v3(rois, bbox_pred, self.target_means, self.target_stds, img_meta['img_shape']) # choose best Rroi new_rois = choose_best_Rroi_batch(new_rois) else: if self.with_module: # bboxes = delta2dbbox(rois[:, 1:], bbox_pred, self.target_means, # self.target_stds, img_meta['img_shape']) # 替换为第二阶段相应的解码方案 bboxes = delta2dbbox_v2(rois[:, 1:], bbox_pred, self.target_means, self.target_stds, img_meta['img_shape']) else: bboxes = delta2dbbox_v3(rois[:, 1:], bbox_pred, self.target_means, self.target_stds, img_meta['img_shape']) bboxes = choose_best_Rroi_batch(bboxes) new_rois = torch.cat((rois[:, [0]], bboxes), dim=1) return new_rois
def get_det_rbboxes(self, rrois, cls_score, rbbox_pred, img_shape, scale_factor, rescale=False, cfg=None): if isinstance(cls_score, list): cls_score = sum(cls_score) / float(len(cls_score)) scores = F.softmax(cls_score, dim=1) if cls_score is not None else None if rbbox_pred is not None: # bboxes = delta2dbbox(rois[:, 1:], bbox_pred, self.target_means, # self.target_stds, img_shape) dbboxes = delta2dbbox_v2(rrois[:, 1:], rbbox_pred, self.target_means, self.target_stds, img_shape) else: # bboxes = rois[:, 1:] dbboxes = rrois[:, 1:] # TODO: add clip here if rescale: # bboxes /= scale_factor # dbboxes[:, :4] /= scale_factor dbboxes[:, 0::5] /= scale_factor dbboxes[:, 1::5] /= scale_factor dbboxes[:, 2::5] /= scale_factor dbboxes[:, 3::5] /= scale_factor # ########################################################### from mmdet.MARK import PRINT_RBBOX_HEAD_RS_LOSS if PRINT_RBBOX_HEAD_RS_LOSS: # pos_inds = pos_inds[0:min(len(pos_inds), 10)] pred_score = scores pred_score, pred_label = torch.max(pred_score, dim=1) # 前景标签 pred_f_indices = pred_label != 0 if torch.sum(pred_f_indices) > 0: print('#' * 80) print('for pred score: ', pred_score[pred_f_indices]) print('#' * 80) # ########################################################### if cfg is None: return dbboxes, scores else: c_device = dbboxes.device det_bboxes, det_labels = multiclass_nms_rbbox(dbboxes, scores, cfg.score_thr, cfg.nms, cfg.max_per_img) # det_bboxes = torch.from_numpy(det_bboxes).to(c_device) # det_labels = torch.from_numpy(det_labels).to(c_device) return det_bboxes, det_labels
def get_ori_rbboxes(self, rois, delta_rbboxes, img_shape, v2=False): if v2: ori_rbboxes = delta2dbbox_v2(rois[:, 1:], delta_rbboxes, self.target_means, self.target_stds, img_shape) else: ori_rbboxes = delta2dbbox_v3(rois[:, 1:], delta_rbboxes, self.target_means, self.target_stds, img_shape) return ori_rbboxes
def get_det_rbboxes(self, rrois, cls_score, rbbox_pred, img_shape, scale_factor, rescale=False, cfg=None): if isinstance(cls_score, list): cls_score = sum(cls_score) / float(len(cls_score)) scores = F.softmax(cls_score, dim=1) if cls_score is not None else None if rbbox_pred is not None: # bboxes = delta2dbbox(rois[:, 1:], bbox_pred, self.target_means, # self.target_stds, img_shape) dbboxes = delta2dbbox_v2(rrois[:, 1:], rbbox_pred, self.target_means, self.target_stds, img_shape) else: # bboxes = rois[:, 1:] dbboxes = rrois[:, 1:] # TODO: add clip here # dbboxes[:, 4::5] = np.pi / 2 if rescale: # bboxes /= scale_factor # dbboxes[:, :4] /= scale_factor dbboxes[:, 0::5] /= scale_factor dbboxes[:, 1::5] /= scale_factor dbboxes[:, 2::5] /= scale_factor dbboxes[:, 3::5] /= scale_factor if cfg is None: return dbboxes, scores else: c_device = dbboxes.device det_bboxes, det_labels = multiclass_nms_rbbox( dbboxes, scores, cfg.score_thr, cfg.nms, cfg.max_per_img) # det_bboxes = torch.from_numpy(det_bboxes).to(c_device) # det_labels = torch.from_numpy(det_labels).to(c_device) return det_bboxes, det_labels