in seamseg/algos/fpn.py [0:0]
def inference(self, head, x, proposals, valid_size, img_size):
x = x[self.min_level:self.min_level + self.levels]
try:
if proposals.all_none:
raise Empty
# Run head on the given proposals
proposals, proposals_idx = proposals.contiguous
cls_logits, bbx_logits, _ = self._head(head, x, proposals, proposals_idx, img_size, True, False)
# Shift the proposals according to the logits
bbx_reg_weights = x[0].new(self.bbx_reg_weights)
boxes = shift_boxes(proposals.unsqueeze(1), bbx_logits / bbx_reg_weights)
scores = torch.softmax(cls_logits, dim=1)
# Split boxes and scores by image, clip to valid size
boxes, scores = self._split_and_clip(boxes, scores, proposals_idx, valid_size)
# Do nms to find final predictions
bbx_pred, cls_pred, obj_pred = self.bbx_prediction_generator(boxes, scores)
if bbx_pred.all_none:
raise Empty
# Run head again on the finalized boxes to compute instance masks
proposals, proposals_idx = bbx_pred.contiguous
_, _, msk_logits = self._head(head, x, proposals, proposals_idx, img_size, False, True)
# Finalize instance mask computation
msk_pred = self.msk_prediction_generator(cls_pred, msk_logits)
except Empty:
bbx_pred = PackedSequence([None for _ in range(x[0].size(0))])
cls_pred = PackedSequence([None for _ in range(x[0].size(0))])
obj_pred = PackedSequence([None for _ in range(x[0].size(0))])
msk_pred = PackedSequence([None for _ in range(x[0].size(0))])
return bbx_pred, cls_pred, obj_pred, msk_pred