Этапы реализации:
Код: Выделить всё
B = batch
C = Channel
S = number of views
D = depth
H = height
W = width
3 = x,y,z
2 = x,y
и у меня есть образец панорамного изображения с размером [B,S,C,H] ,W]
На первом этапе я спроецировал воксельные точки (облако точек) на каждое изображение, используя внешние и внутренние. Затем я отфильтровал точки, находящиеся за пределами изображений.
В результате я получил valid_points = [B,S,H,W,2]
я нормализовал свои баллы из valid_points и создал сетки размером [B,S,H,W,2]. Обратите внимание, что W — это количество действительных баллов, а H = 1
затем я применил билинейную выборку, как показано в коде:
Код: Выделить всё
valid_points = cur_coords[:, on_img[1]]
######### Normalize Valid Points Between [-1, 1] ########
normalized_points = torch.zeros_like(valid_points)
normalized_points[:,:, 0] = 2.0 * (valid_points[:, :, 0] / (H_img - 1)) - 1.0 # Normalize y-coordinates
normalized_points[:,:, 1] = 2.0 * (valid_points[:, :, 1] / (W_img - 1)) - 1.0 # [N, M',2]
grid = normalized_points.unsqueeze(1).cuda() # Shape [S, H_out, W_out, 2]
sampled_features_with_location_list = []
for i in range(0,N):
img_s =camera_view_tensor[i].unsqueeze(0).permute(0, 3, 1, 2) #[B, C, H_in, W_in]
grid_s = grid[i].unsqueeze(0)
sampled_points = F.grid_sample(img_s, grid_s,mode='bilinear',
align_corners=None) # (B,N,C,H_out,W_out)
sampled_features_list.append(sampled_pointson)
sampled_points = torch.stack(sampled_features_list, dim=1) #[B = 1,S = 6,C= 3,H= 1,W =22965]
Подробнее здесь: https://stackoverflow.com/questions/790 ... voxel-back