forked from TRI-ML/vidar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdisplay_sample.py
130 lines (107 loc) · 4.45 KB
/
display_sample.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# TRI-VIDAR - Copyright 2022 Toyota Research Institute. All rights reserved.
import json
import numpy as np
from camviz import BBox3D
from camviz import Camera as CameraCV
from camviz import Draw
from vidar.geometry.camera import Camera
from vidar.geometry.pose import Pose
from vidar.utils.data import make_batch, fold_batch, modrem
from vidar.utils.flip import flip_batch
from vidar.utils.viz import viz_depth, viz_optical_flow, viz_semantic
def change_key(dic, c, n):
steps = sorted(dic.keys())
return steps[(steps.index(c) + n) % len(steps)]
def display_sample(data, flip=False):
tasks = ['rgb', 'depth', 'fwd_optical_flow', 'bwd_optical_flow','semantic']
cam_colors = ['red', 'blu', 'gre', 'yel', 'mag', 'cya'] * 100
data = make_batch(data)
if flip:
data = flip_batch(data)
data = fold_batch(data)
rgb = data['rgb']
intrinsics = data['intrinsics']
depth = data['depth']
pose = data['pose']
pose = Pose.from_dict(pose, to_global=True)
cam = Camera.from_dict(intrinsics, rgb, pose)
num_cams = rgb[0].shape[0]
wh = rgb[0].shape[-2:][::-1]
keys = [key for key in tasks if key in data.keys()]
points = {}
for key, val in cam.items():
points[key] = cam[key].reconstruct_depth_map(
depth[key], to_world=True).reshape(num_cams, 3, -1).permute(0, 2, 1)
draw = Draw((wh[0] * 4, wh[1] * 3), width=2100)
draw.add2DimageGrid('cam', (0.0, 0.0, 0.5, 1.0), n=(3, 2), res=wh)
draw.add3Dworld('wld', (0.5, 0.0, 1.0, 1.0), pose=cam[0].Tcw.T[0])
draw.addTexture('cam', n=num_cams)
draw.addBuffer3f('lidar', 1000000, n=num_cams)
draw.addBuffer3f('color', 1000000, n=num_cams)
with_bbox3d = 'bbox3d' in data
if with_bbox3d:
bbox3d_corners = [[BBox3D(b) for b in bb] for bb in data['bbox3d']['corners']]
with_pointcache = 'pointcache' in data
if with_pointcache:
pointcache = np.concatenate([np.concatenate(pp, 0) for pp in data['pointcache']['points']], 0)
draw.addBufferf('pointcache', pointcache[:, :3])
camcv = []
for i in range(num_cams):
camcv.append({key: CameraCV.from_vidar(val, i) for key, val in cam.items()})
t, k = 0, 0
key = keys[k]
change = True
color = True
while draw.input():
if draw.SPACE:
color = not color
change = True
if draw.RIGHT:
change = True
k = (k + 1) % len(keys)
while t not in data[keys[k]].keys():
k = (k + 1) % len(keys)
key = keys[k]
if draw.LEFT:
change = True
k = (k - 1) % len(keys)
while t not in data[keys[k]].keys():
k = (k - 1) % len(keys)
key = keys[k]
if draw.UP:
change = True
t = change_key(data[key], t, 1)
while t not in data[keys[k]].keys():
t = change_key(data[key], t, 1)
if draw.DOWN:
change = True
t = change_key(data[key], t, -1)
while t not in data[keys[k]].keys():
t = change_key(data[key], t, -1)
if change:
change = False
for i in range(num_cams):
img = data[key][t][i]
if key == 'depth':
img = viz_depth(img, filter_zeros=True)
elif key in ['fwd_optical_flow', 'bwd_optical_flow']:
img = viz_optical_flow(img)
elif key == 'semantic':
ontology = json.load(open('vidar/datasets/ontologies/%s.json' % data['tag'][0]))
img = viz_semantic(img, ontology)
draw.updTexture('cam%d' % i, img)
draw.updBufferf('lidar%d' % i, points[t][i])
draw.updBufferf('color%d' % i, data['rgb'][t][i])
draw.clear()
for i in range(num_cams):
draw['cam%d%d' % modrem(i, 2)].image('cam%d' % i)
draw['wld'].size(1).color(cam_colors[i]).points('lidar%d' % i, ('color%d' % i) if color else None)
for cam_key, cam_val in camcv[i].items():
clr = cam_colors[i] if cam_key == t else 'gra'
tex = 'cam%d' % i if cam_key == t else None
draw['wld'].object(cam_val, color=clr, tex=tex)
if with_bbox3d:
[[draw['wld'].object(b) for b in bb] for bb in bbox3d_corners]
if with_pointcache:
draw['wld'].color('whi').points('pointcache')
draw.update(30)