Spaces:
Runtime error
Runtime error
# ------------------------------------------------------------------------ | |
# Copyright (c) 2021 megvii-model. All Rights Reserved. | |
# ------------------------------------------------------------------------ | |
import math | |
import torch | |
def pos2posemb2d(pos, num_pos_feats=128, temperature=10000): | |
scale = 2 * math.pi | |
pos = pos * scale | |
dim_t = torch.arange(num_pos_feats, dtype=torch.float32, device=pos.device) | |
dim_t = temperature ** ( | |
2 * torch.div(dim_t, 2, rounding_mode="floor") / num_pos_feats | |
) | |
pos_x = pos[..., 0, None] / dim_t | |
pos_y = pos[..., 1, None] / dim_t | |
pos_x = torch.stack((pos_x[..., 0::2].sin(), pos_x[..., 1::2].cos()), dim=-1).flatten(-2) | |
pos_y = torch.stack((pos_y[..., 0::2].sin(), pos_y[..., 1::2].cos()), dim=-1).flatten(-2) | |
posemb = torch.cat((pos_y, pos_x), dim=-1) | |
return posemb | |
def pos2posemb1d(pos, num_pos_feats=256, temperature=10000): | |
scale = 2 * math.pi | |
pos = pos * scale | |
dim_t = torch.arange(num_pos_feats, dtype=torch.float32, device=pos.device) | |
dim_t = temperature ** ( | |
2 * torch.div(dim_t, 2, rounding_mode="floor") / num_pos_feats | |
) | |
pos_x = pos[..., None] / dim_t | |
posemb = torch.stack((pos_x[..., 0::2].sin(), pos_x[..., 1::2].cos()), dim=-1).flatten(-2) | |
return posemb | |
def mask2pos(mask): | |
not_mask = ~mask | |
y_embed = not_mask[:, :, 0].cumsum(1, dtype=torch.float32) | |
x_embed = not_mask[:, 0, :].cumsum(1, dtype=torch.float32) | |
y_embed = (y_embed - 0.5) / y_embed[:, -1:] | |
x_embed = (x_embed - 0.5) / x_embed[:, -1:] | |
return y_embed, x_embed | |