点云目标跟踪 & Open3D可视化
本文是基于AB3DMOT进行的改编及应用,楼主在参加创新工场Deecamp时使用该方法使基于Det3D的目标检测效果smooth and visualized.
论文名称:《A Baseline for 3D Multi-Object Tracking》(AB3DMOT)
论文地址:https://arxiv.org/pdf/1907.03961.pdf
论文Github项目地址:https://github.com/xinshuoweng/AB3DMOT
本文Github项目地址:Deecamp_AB3DMOT
数据读取
Deecamp所使用的是Momenta的128线激光雷达数据集,目标检测输出的数据结构为:
label | 3d bbox | angle | score |
---|---|---|---|
Pedestrian/Car/Cyclist/Truck/Tricar | x,y,z,l,w,h | alpha_y | score |
由于输出结果每一帧为一个独立文件,因此数据读取修改如下:
dets = seq_dets[:,1:8]
ori_array = seq_dets[:,-1].reshape((-1, 1))
other_array = seq_dets[:,0:6]
additional_info = np.concatenate((ori_array, other_array), axis=1)
dets_all = {'dets': dets, 'info': additional_info}
(由于所用数据与原文数据只有2D信息的差别,数据接口改变较为容易,后续会将tracking加入到eval中进行实时输入与输出(loading))
Open3D
此次尝试选用的是Open3D进行可视化操作
安装和具体函数使用可见文档 http://www.open3d.org/docs/release/
Open3D python版本安装
部分blog会建议使用
pip install open3d-python
但是!!!!!!!
open3d-python版本最新只有到0.7.0,部分module无效,建议使用:
pip install open3d==0.10.0(版本号)
or
conda install -c open3d-admin open3d
Open3D可视化
先定义window以及visualizer等
vis = o3d.visualization.Visualizer()
vis.create_window()
opt = vis.get_render_option()
opt.background_color = np.asarray([0, 0, 0])
opt.point_size = 1
opt.show_coordinate_frame = True
读取显示点云
file_name = seq_name + ".bin"
v_f = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"/path/to/pointcloud", file_name)
pcs = load_pc_from_file(v_f)
pcs = np.array(pcs[:, :3])
pcobj = o3d.geometry.PointCloud()
pcobj.points = o3d.utility.Vector3dVector(pcs)
vis.add_geometry(pcobj)
循环进入跟踪后结果进行输出
for d in trackers:
xyz = np.array([d[: 3]])
hwl = np.array([d[3: 6]])
r_y = [d[6]]
pts3d = compute_3d_box_lidar_coords(xyz, hwl, angles=r_y, origin=(0.5, 0.5, 0.5), axis=2)
lines = [[0, 1], [1, 2], [2, 3], [3, 0],
[4, 5], [5, 6], [6, 7], [7, 4],
[0, 4], [1, 5], [2, 6], [3, 7]]
colors = [[1, 0, 1] for i in range(len(lines))]
line_set = o3d.geometry.LineSet()
line_set.points = o3d.utility.Vector3dVector(pts3d[0])
line_set.lines = o3d.utility.Vector2iVector(lines)
line_set.colors = o3d.utility.Vector3dVector(colors)
vis.add_geometry(line_set)
若连续可视化需要清除内容
vis.clear_geometries()
可视化效果如下所示
Edit
使用
vis.add_geometries()
之后由于当前ubuntu16限制,没有办法将open3d提升至0.10.0版本,无法进行视角变化,因此使用下列方法将视角变为自由模式,可以通过拖动和滚轮调整视角。
通过判断当前line_set的值进行update
if line_set[index].has_lines():
line_set[index].points = o3d.utility.Vector3dVector(pts3d[0])
line_set[index].lines = o3d.utility.Vector2iVector(lines)
line_set[index].colors = o3d.utility.Vector3dVector(line_colors)
vis.update_geometry(line_set[index])
else:
line_set[index].points = o3d.utility.Vector3dVector(pts3d[0])
line_set[index].lines = o3d.utility.Vector2iVector(lines)
line_set[index].colors = o3d.utility.Vector3dVector(line_colors)
vis.add_geometry(line_set[index])
点云也是一样
if pcobj.is_empty():
pcobj.points = o3d.utility.Vector3dVector(pcs[:, 0:3])
vis.add_geometry(pcobj)
else:
pcobj.points = o3d.utility.Vector3dVector(pcs[:, 0:3])
vis.update_geometry(pcobj)
最终可以得到下面的效果:
【无人驾驶】3D目标识别效果
可视化效果还不够好,欢迎沟通~