【发布时间】:2021-03-22 16:02:09
【问题描述】:
有没有办法加快下面的代码sn-p?这是一个接受激光雷达点并将其转换为范围视图图像的功能任何建议将不胜感激。我尝试使用 numba,但没有得到太大改善。
def lidar_rv_projection(points, proj_H=32, proj_W=2048, proj_fov_up=10, proj_fov_down=-30.0):
v_fov_up = proj_fov_up / 180.0 * np.pi
v_fov_down = proj_fov_down / 180.0 * np.pi
v_fov_total = abs(v_fov_down) + abs(v_fov_up)
depth = np.linalg.norm(points[:, :3], 2, axis=1)
x_points = points[:, 0]
y_points = points[:, 1]
z_points = points[:, 2]
x_img = np.arctan2(y_points, x_points) * -1
y_img = np.arcsin(z_points / depth)
proj_x = 0.5 * (x_img / np.pi + 1.0)
proj_y = 1.0 + (y_img + abs(v_fov_down)) * -1 / v_fov_total
proj_x *= proj_W
proj_y *= proj_H
proj_x = np.floor(proj_x)
proj_x = np.minimum(proj_W - 1, proj_x)
proj_x = np.maximum(0, proj_x).astype(np.int32) # in [0,W-1]
proj_y = np.floor(proj_y)
proj_y = np.minimum(proj_H - 1, proj_y)
proj_y = np.maximum(0, proj_y).astype(np.int32) # in [0,H-1]
order = np.argsort(depth)[::-1]
depth = depth[order]
points = points[order]
proj_y = proj_y[order]
proj_x = proj_x[order]
proj_rv_img = np.full((4, proj_H, proj_W), -1,dtype=np.float64)
proj_rv_img[0, proj_y, proj_x] = depth # range
proj_rv_img[1, proj_y, proj_x] = points[:, 2] # height z
proj_rv_img[2, proj_y, proj_x] = points[:, 3] # intensity r
proj_rv_img[3, proj_y, proj_x] = 1 # binary mask
return proj_rv_img, proj_x, proj_y, points
【问题讨论】:
-
你能提供一个有效输入的例子吗?您能否还指定您的数据有多大?
-
如果你提供一个可复现的工作案例有可能准确地识别每段代码的性能,从而看看它是全部慢还是只有几行代码受到影响
-
输入“点”的形状为 (4, 50000)。此函数在整个数据集的 for 循环中调用。
-
好的,
(4, 50000)很小,这个函数应该很快。并行化包含 for 循环而不是这个函数可能是一个好主意。 -
我明白了。有关如何并行化 for 循环的任何建议?
标签: python performance numpy time numba