yanx27/Pointnet_Pointnet2_pytorch

球采样(query_ball_point)逻辑错误

XiShuFan opened this issue · 5 comments

球采样应该是在半径范围内,选择距离当前点最近的点。贴出修改后的方法:

def query_ball_point(radius, nsample, xyz, new_xyz, fps_idx):
    """
    Input:
        radius: local region radius
        nsample: max sample number in local region
        xyz: all points, [B, N, 3]
        new_xyz: query points, [B, S, 3]
        fps_idx: farthest point sampling
    Return:
        group_idx: grouped points index, [B, S, nsample]
    """
    device = xyz.device
    B, N, C = xyz.shape
    _, S, _ = new_xyz.shape
    sqrdists = square_distance(new_xyz, xyz)

    # 按照距离升序排序
    sqrdists, sqrdists_idx = sqrdists.sort(dim=-1)
    sqrdists = sqrdists[:, :, :nsample]
    sqrdists_idx = sqrdists_idx[:, :, :nsample]
    query_self = fps_idx.view(B, S, 1).repeat([1, 1, nsample])
    mask = sqrdists > radius ** 2
    sqrdists_idx[mask] = query_self[mask]

    return sqrdists_idx

确定是这样吗?

确定是这样吗?

我对这段代码进行了可视化分析,这样修改后是符合我的预期的,如有不对请多指正!

确定是这样吗?

我对这段代码进行了可视化分析,这样修改后是符合我的预期的,如有不对请多指正!

训练效果如何吗?

fps_idx 和 new_xyz不就是同一个东西吗?你的这个写法和作者的写法差别在哪儿呢?或者说作者的写法为什么不满足你说的“球采样应该是在半径范围内,选择距离当前点最近的点。”?

@haozhi1817 原版代码里的排序不是按照index吗?并不是按照距离。
我认为的源代码中的逻辑是:先过滤符合距离条件的点,然后选了前nsample个索引号较小的点。
如有不对,请多指正,谢谢。