球采样(query_ball_point)逻辑错误
XiShuFan opened this issue · 5 comments
XiShuFan commented
球采样应该是在半径范围内,选择距离当前点最近的点。贴出修改后的方法:
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
lzh1998-jansen commented
确定是这样吗?
XiShuFan commented
确定是这样吗?
我对这段代码进行了可视化分析,这样修改后是符合我的预期的,如有不对请多指正!
ypqlvkxx commented
确定是这样吗?
我对这段代码进行了可视化分析,这样修改后是符合我的预期的,如有不对请多指正!
训练效果如何吗?
haozhi1817 commented
fps_idx 和 new_xyz不就是同一个东西吗?你的这个写法和作者的写法差别在哪儿呢?或者说作者的写法为什么不满足你说的“球采样应该是在半径范围内,选择距离当前点最近的点。”?
LuoWalker commented
@haozhi1817 原版代码里的排序不是按照index吗?并不是按照距离。
我认为的源代码中的逻辑是:先过滤符合距离条件的点,然后选了前nsample个索引号较小的点。
如有不对,请多指正,谢谢。