有没有一种快速的方法来使用缓存的 KD-tree 在 python 中加速 ICP

数据挖掘 Python 优化 线性代数
2022-02-23 10:10:18

我目前正在使用 ICP 来匹配 2 个点云。这些点云随时间演化,所以我不得不多次重复这个过程。我正在使用来自 scipy 的标准 KD 树进行最近邻查找。每个点云大约有 500 个点。我正在考虑使用缓存的 KD 树,但我不确定如何将 KD 树转换为缓存的 KD 树。Scipy中有实现吗?目前,python 中的 SVD 似乎足以满足我的需求,但我也愿意接受任何已知的更快的 SVD 求解器。我当前的 ICP 代码是:

>tree=spatial.KDTree(TimeStep1)
>qHat=TimeStep2
> for i in range(10):
>         Phat=tree.query(qHat,eps=.15,distance_upper_bound=2)
>         H = np.dot(qHat.T, TimeStep1[Phat[1]-1,:])
>         U, S, Vt = np.linalg.svd(H)
>         R = np.dot(Vt.T, U.T)
>         if np.linalg.det(R) < 0:
>             Vt[2,:] *= -1
>             R = np.dot(Vt.T, U.T)
>             Yes.append(1)
>         Eu=rotationMatrixToEulerAngles(R)
>         T=TimeStep1[Phat[1]-1,:].T-np.dot(R,qHat.T)
>         T=TimeStep1[Phat[1]-1,:]-qHat
>         T=T.mean(axis=0)
>         qHat=np.dot(R,TimeStep2.T).T+T
>         qHat=TimeStep2+T.shape
1个回答

尝试使用 spatial.cKDTree,在我的 ICP 实现中,从 KDTree 切换到 cKDTree 30 次迭代从 ~160 秒变为 ~50 秒