(self, samples, track_instances: Instances)
| 485 | for a, b in zip(outputs_class[:-1], outputs_coord[:-1])] |
| 486 | |
| 487 | def _forward_single_image(self, samples, track_instances: Instances): |
| 488 | features, pos = self.backbone(samples) |
| 489 | src, mask = features[-1].decompose() |
| 490 | assert mask is not None |
| 491 | |
| 492 | srcs = [] |
| 493 | masks = [] |
| 494 | for l, feat in enumerate(features): |
| 495 | src, mask = feat.decompose() |
| 496 | srcs.append(self.input_proj[l](src)) |
| 497 | masks.append(mask) |
| 498 | assert mask is not None |
| 499 | |
| 500 | if self.num_feature_levels > len(srcs): |
| 501 | _len_srcs = len(srcs) |
| 502 | for l in range(_len_srcs, self.num_feature_levels): |
| 503 | if l == _len_srcs: |
| 504 | src = self.input_proj[l](features[-1].tensors) |
| 505 | else: |
| 506 | src = self.input_proj[l](srcs[-1]) |
| 507 | m = samples.mask |
| 508 | mask = F.interpolate(m[None].float(), size=src.shape[-2:]).to(torch.bool)[0] |
| 509 | pos_l = self.backbone[1](NestedTensor(src, mask)).to(src.dtype) |
| 510 | srcs.append(src) |
| 511 | masks.append(mask) |
| 512 | pos.append(pos_l) |
| 513 | |
| 514 | hs, init_reference, inter_references, enc_outputs_class, enc_outputs_coord_unact = self.transformer(srcs, masks, pos, track_instances.query_pos, ref_pts=track_instances.ref_pts) |
| 515 | |
| 516 | outputs_classes = [] |
| 517 | outputs_coords = [] |
| 518 | for lvl in range(hs.shape[0]): |
| 519 | if lvl == 0: |
| 520 | reference = init_reference |
| 521 | else: |
| 522 | reference = inter_references[lvl - 1] |
| 523 | reference = inverse_sigmoid(reference) |
| 524 | outputs_class = self.class_embed[lvl](hs[lvl]) |
| 525 | tmp = self.bbox_embed[lvl](hs[lvl]) |
| 526 | if reference.shape[-1] == 4: |
| 527 | tmp += reference |
| 528 | else: |
| 529 | assert reference.shape[-1] == 2 |
| 530 | tmp[..., :2] += reference |
| 531 | outputs_coord = tmp.sigmoid() |
| 532 | outputs_classes.append(outputs_class) |
| 533 | outputs_coords.append(outputs_coord) |
| 534 | outputs_class = torch.stack(outputs_classes) |
| 535 | outputs_coord = torch.stack(outputs_coords) |
| 536 | |
| 537 | ref_pts_all = torch.cat([init_reference[None], inter_references[:, :, :, :2]], dim=0) |
| 538 | out = {'pred_logits': outputs_class[-1], 'pred_boxes': outputs_coord[-1], 'ref_pts': ref_pts_all[5]} |
| 539 | if self.aux_loss: |
| 540 | out['aux_outputs'] = self._set_aux_loss(outputs_class, outputs_coord) |
| 541 | |
| 542 | with torch.no_grad(): |
| 543 | if self.training: |
| 544 | track_scores = outputs_class[-1, 0, :].sigmoid().max(dim=-1).values |
no test coverage detected