Spaces:
Sleeping
Sleeping
File size: 4,742 Bytes
5769ee4 |
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# Lloyd algorithm while estimating average cost?
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
from pytest import param
from pytorch_lightning.utilities.seed import seed_everything
import torch
from risk_biased.scene_dataset.loaders import SceneDataLoaders
from risk_biased.scene_dataset.scene import RandomScene, RandomSceneParams
from matplotlib.patches import Ellipse
from risk_biased.utils.callbacks import get_fast_slow_scenes, DrawCallbackParams
from risk_biased.utils.config_argparse import config_argparse
from risk_biased.utils.load_model import load_from_config
def draw_latent_biased(
model: torch.nn.Module,
device,
scene: RandomScene,
n_samples: int,
params: DrawCallbackParams,
):
ped_trajs = scene.get_pedestrians_trajectories()
n_scenes, n_agents, n_steps, features = ped_trajs.shape
ego_traj = scene.get_ego_ref_trajectory([t * params.dt for t in range(n_steps)])
ego_past, ego_future = torch.split(
torch.from_numpy(ego_traj.astype("float32")),
[params.num_steps, params.num_steps_future],
dim=2,
)
ego_past = ego_past.repeat(n_scenes, n_samples, 1, 1).view(
-1, 1, params.num_steps, features
)
ego_future = ego_future.repeat(n_scenes, n_samples, 1, 1).view(
-1, 1, params.num_steps_future, features
)
input_traj = ped_trajs[:, :, : params.num_steps]
normalized_input, offset = SceneDataLoaders.normalize_trajectory(
torch.from_numpy(input_traj.astype("float32")).contiguous().to(device)
)
normalized_input = (
normalized_input.view(n_scenes, 1, n_agents, params.num_steps, features)
.repeat(1, n_samples, 1, 1, 1)
.view(-1, n_agents, params.num_steps, features)
)
mask_input = torch.ones_like(normalized_input[..., 0])
map = torch.empty(n_scenes, 0, 0, features, device=device)
mask_map = torch.empty(n_scenes, 0, 0)
offset = (
offset.view(n_scenes, 1, n_agents, features)
.repeat(1, n_samples, 1, 1)
.view(-1, n_agents, features)
)
n_scenes = ped_trajs.shape[0]
risk_level = (
torch.linspace(0, 1, n_samples)
.view(1, n_samples, 1)
.repeat(n_scenes, 1, n_agents)
)
y_samples, biased_mu, biased_log_std = model(
normalized_input,
mask_input,
map,
mask_map,
offset=offset,
x_ego=ego_past,
y_ego=ego_future,
risk_level=risk_level.view(-1, n_agents),
)
biased_mu = (
biased_mu.reshape(n_scenes, n_samples, n_agents, 2)
.permute(0, 2, 1, 3)
.mean(0)
.cpu()
.detach()
.numpy()
)
biased_std = (
(
2
* biased_log_std.reshape(n_scenes, n_samples, n_agents, 2).permute(
0, 2, 1, 3
)
)
.exp()
.mean(0)
.sqrt()
.cpu()
.detach()
.numpy()
)
risk_level = risk_level.permute(0, 2, 1).mean(0).cpu().detach().numpy()
fig, ax = plt.subplots()
cmap = plt.get_cmap("RdBu_r")
for a in range(n_agents):
for j in range(n_samples):
ellipse = Ellipse(
(biased_mu[a, j, 0], biased_mu[a, j, 1]),
width=biased_std[a, j, 0] * 2,
height=biased_std[a, j, 1] * 2,
facecolor=cmap(risk_level[a, j]),
alpha=0.1,
)
ax.add_patch(ellipse)
norm = mpl.colors.Normalize(vmin=0, vmax=1, clip=True)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm, label="Risk level")
plt.axis([-3, 3, -3, 3])
plt.show()
if __name__ == "__main__":
# Draws the biased distributions in latent space for different risk levels in two scenarios: safer_fast and safer_slow.
working_dir = os.path.dirname(os.path.realpath(__file__))
config_path = os.path.join(
working_dir, "..", "..", "risk_biased", "config", "learning_config.py"
)
cfg = config_argparse(config_path)
model, loaders, cfg = load_from_config(cfg)
assert (
cfg.latent_dim == 2
and "The latent dimension of the model must be exactly 2 to be plotted (no dimensionality reduction capabilities)"
)
scene_params = RandomSceneParams.from_config(cfg)
safer_fast_scene, safer_slow_scene = get_fast_slow_scenes(scene_params, 128)
draw_params = DrawCallbackParams.from_config(cfg)
if cfg.seed is not None:
seed_everything(cfg.seed)
n_samples = 64
draw_latent_biased(
model.model, model.device, safer_fast_scene, n_samples, draw_params
)
draw_latent_biased(
model.model, model.device, safer_slow_scene, n_samples, draw_params
)
|