(self, x, mask=None)
| 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() |
no test coverage detected