in training/model/sam2.py [0:0]
def _prepare_backbone_features_per_frame(self, img_batch, img_ids):
"""Compute the image backbone features on the fly for the given img_ids."""
# Only forward backbone on unique image ids to avoid repetitive computation
# (if `img_ids` has only one element, it's already unique so we skip this step).
if img_ids.numel() > 1:
unique_img_ids, inv_ids = torch.unique(img_ids, return_inverse=True)
else:
unique_img_ids, inv_ids = img_ids, None
# Compute the image features on those unique image ids
image = img_batch[unique_img_ids]
backbone_out = self.forward_image(image)
(
_,
vision_feats,
vision_pos_embeds,
feat_sizes,
) = self._prepare_backbone_features(backbone_out)
# Inverse-map image features for `unique_img_ids` to the final image features
# for the original input `img_ids`.
if inv_ids is not None:
image = image[inv_ids]
vision_feats = [x[:, inv_ids] for x in vision_feats]
vision_pos_embeds = [x[:, inv_ids] for x in vision_pos_embeds]
return image, vision_feats, vision_pos_embeds, feat_sizes