MCPcopy Create free account
hub / github.com/OpenGVLab/HumanBench / forward_features

Method forward_features

PATH/core/models/backbones/vitdet.py:427–519  ·  view source on GitHub ↗
(self, x, mask=None)

Source from the content-addressed store, hash-verified

425 return len(self.blocks)
426
427 def forward_features(self, x, mask=None):
428 B, C, H, W = x.shape
429 x, (Hp, Wp), mask = self.patch_embed(x, mask)
430 batch_size, seq_len, _ = x.size()
431
432 if self.use_cls_token:
433 cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks
434 x = torch.cat((cls_tokens, x), dim=1)
435
436 if self.test_pos_mode is False:
437 if x.size(1) == self.pos_embed.size(1):
438 x = x + self.pos_embed # BxHWxC
439 else: # take top-left if pos_embed > x's dimension
440 x = x + self.pos_embed.reshape(1, self.patch_embed.patch_shape[0],
441 self.patch_embed.patch_shape[1],
442 self.pos_embed.size(2))[:,:Hp, :Wp, :].reshape(1, x.size(1),
443 self.pos_embed.size(2))
444 elif self.test_pos_mode == 'learnable_interpolate':
445 patch_shape = (Hp, Wp)
446 orig_size = (14, 14)
447
448 # as in original scale
449 pos_embed = self.pos_embed
450
451 # as in finetuning scale
452 pos_embed = pos_embed.reshape(-1, orig_size[0], orig_size[1], self.pos_embed.shape[-1]).permute(0, 3, 1, 2)
453 pos_embed = torch.nn.functional.interpolate(pos_embed, size=patch_shape, mode='bicubic', align_corners=False)
454 pos_embed = pos_embed.permute(0, 2, 3, 1).flatten(1, 2)
455
456 x = x + pos_embed
457
458 elif self.test_pos_mode == 'regenerate':
459 pos_embed = get_2d_sincos_pos_embed(self.pos_embed.shape[-1], (Hp, Wp), cls_token=False)
460 x = x + torch.from_numpy(pos_embed).float().unscqueeze(0).cuda()
461 elif self.test_pos_mode == 'scaled_regenerate':
462 patch_shape = (Hp, Wp)
463 orig_size = (math.ceil(Hp/20)*7, math.ceil(Wp/20)*7)
464
465 # as in original scale
466 pos_embed = get_2d_sincos_pos_embed(self.pos_embed.shape[-1], orig_size, cls_token=False)
467 pos_embed = torch.from_numpy(pos_embed).float().unsqueeze(0).cuda()
468
469 # as in finetuning scale
470 pos_embed = pos_embed.reshape(-1, orig_size[0], orig_size[1], self.pos_embed.shape[-1]).permute(0, 3, 1, 2)
471 pos_embed = torch.nn.functional.interpolate(pos_embed, size=(orig_size[0]//7*20, orig_size[1]//7*20),
472 mode='bicubic', align_corners=False)
473
474 # as in test image
475 pos_embed = pos_embed[:, :, :patch_shape[0], :patch_shape[1]].permute(0, 2, 3, 1).flatten(1, 2)
476
477 x = x + pos_embed
478 elif self.test_pos_mode == 'simple_interpolate':
479 patch_shape = (Hp, Wp)
480 orig_size = (14, 14)
481
482 # as in original scale
483 pos_embed = get_2d_sincos_pos_embed(self.pos_embed.shape[-1], orig_size, cls_token=False)
484 pos_embed = torch.from_numpy(pos_embed).float().unsqueeze(0).cuda()

Callers 1

forwardMethod · 0.95

Calls 6

sizeMethod · 0.80
permuteMethod · 0.80
get_2d_sincos_pos_embedFunction · 0.70
get_abs_posFunction · 0.70
catMethod · 0.45
cudaMethod · 0.45

Tested by

no test coverage detected