in detic/modeling/roi_heads/detic_roi_heads.py [0:0]
def _forward_box(self, features, proposals, targets=None,
ann_type='box', classifier_info=(None,None,None)):
"""
Add mult proposal scores at testing
Add ann_type
"""
if (not self.training) and self.mult_proposal_score:
if len(proposals) > 0 and proposals[0].has('scores'):
proposal_scores = [p.get('scores') for p in proposals]
else:
proposal_scores = [p.get('objectness_logits') for p in proposals]
features = [features[f] for f in self.box_in_features]
head_outputs = [] # (predictor, predictions, proposals)
prev_pred_boxes = None
image_sizes = [x.image_size for x in proposals]
for k in range(self.num_cascade_stages):
if k > 0:
proposals = self._create_proposals_from_boxes(
prev_pred_boxes, image_sizes,
logits=[p.objectness_logits for p in proposals])
if self.training and ann_type in ['box']:
proposals = self._match_and_label_boxes(
proposals, k, targets)
predictions = self._run_stage(features, proposals, k,
classifier_info=classifier_info)
prev_pred_boxes = self.box_predictor[k].predict_boxes(
(predictions[0], predictions[1]), proposals)
head_outputs.append((self.box_predictor[k], predictions, proposals))
if self.training:
losses = {}
storage = get_event_storage()
for stage, (predictor, predictions, proposals) in enumerate(head_outputs):
with storage.name_scope("stage{}".format(stage)):
if ann_type != 'box':
stage_losses = {}
if ann_type in ['image', 'caption', 'captiontag']:
image_labels = [x._pos_category_ids for x in targets]
weak_losses = predictor.image_label_losses(
predictions, proposals, image_labels,
classifier_info=classifier_info,
ann_type=ann_type)
stage_losses.update(weak_losses)
else: # supervised
stage_losses = predictor.losses(
(predictions[0], predictions[1]), proposals,
classifier_info=classifier_info)
if self.with_image_labels:
stage_losses['image_loss'] = \
predictions[0].new_zeros([1])[0]
losses.update({k + "_stage{}".format(stage): v \
for k, v in stage_losses.items()})
return losses
else:
# Each is a list[Tensor] of length #image. Each tensor is Ri x (K+1)
scores_per_stage = [h[0].predict_probs(h[1], h[2]) for h in head_outputs]
scores = [
sum(list(scores_per_image)) * (1.0 / self.num_cascade_stages)
for scores_per_image in zip(*scores_per_stage)
]
if self.mult_proposal_score:
scores = [(s * ps[:, None]) ** 0.5 \
for s, ps in zip(scores, proposal_scores)]
if self.one_class_per_proposal:
scores = [s * (s == s[:, :-1].max(dim=1)[0][:, None]).float() for s in scores]
predictor, predictions, proposals = head_outputs[-1]
boxes = predictor.predict_boxes(
(predictions[0], predictions[1]), proposals)
pred_instances, _ = fast_rcnn_inference(
boxes,
scores,
image_sizes,
predictor.test_score_thresh,
predictor.test_nms_thresh,
predictor.test_topk_per_image,
)
return pred_instances