-
B, N, D, H, W, _ = coor.shape
:获取输入坐标的形状。 -
num_points = B * N * D * H * W
:计算总点数。 -
ranks_depth = torch.arange(0, num_points, dtype=torch.int, device=coor.device)
:创建一个与总点数相同长度的整数序列,表示每个点在深度空间中的索引。 -
ranks_feat = torch.arange(0, num_points // D, dtype=torch.int, device=coor.device)
:创建一个与点数除以D相同长度的整数序列,表示每个点在特征空间中的索引。 -
ranks_feat = ranks_feat.reshape(B, N, 1, H, W)
和ranks_feat = ranks_feat.expand(B, N, D, H, W).flatten()
:将特征空间中的索引调整为与坐标相同的形状。 -
coor = ((coor - (self.bx - self.dx / 2.0)) / self.dx).long()
:将坐标转换为体素空间。 -
coor = coor.view(num_points, 3)
和batch_idx = torch.arange(0, B).reshape(B, 1).expand(B, num_points // B).reshape(num_points, 1).to(coor)
和coor = torch.cat((coor, batch_idx), 1)
:将坐标和批次索引整合在一起。 -
kept = (coor[:, 0] >= 0) & ...
:创建一个布尔数组,用于判断哪些点在体素范围内。 -
coor, ranks_depth, ranks_feat = coor[kept], ranks_depth[kept], ranks_feat[kept]
:只保留在体素范围内的点。 -
ranks_bev = coor[:, 3] * (self.nx[2] * self.nx[1] * self.nx[0])
到ranks_bev += coor[:, 1] * self.nx[0] + coor[:, 0]
和order = ranks_bev.argsort()
和ranks_bev, ranks_depth, ranks_feat = ranks_bev[order], ranks_depth[order], ranks_feat[order]
:计算每个点在鸟瞰图中的索引,并根据这些索引对点进行排序。 -
kept = torch.ones(ranks_bev.shape[0], device=ranks_bev.device, dtype=torch.bool)
和kept[1:] = ranks_bev[1:] != ranks_bev[:-1]
和interval_starts = torch.where(kept)[0].int()
:找出鸟瞰图中的每个体素的起始点。 -
interval_lengths = torch.zeros_like(interval_starts)
到interval_lengths[-1] = ranks_bev.shape[0] - interval_starts[-1]
:计算每个体素中的点数。 -
return ranks_bev.int().contiguous(), ranks_depth.int().contiguous(), ranks_feat.int().contiguous(), interval_starts.int().contiguous(), interval_lengths.int().contiguous()
:返回所有计算出的索引和长度。
bevpoolv2
最新推荐文章于 2024-07-21 23:25:11 发布