navsim_ours / navsim /planning /script /valid_score_ensemble.py
lkllkl's picture
Upload folder using huggingface_hub
da2e2ac verified
raw
history blame
4.49 kB
import logging
import os
import pickle
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Tuple
import hydra
import numpy as np
import pandas as pd
from hydra.utils import instantiate
from nuplan.planning.script.builders.logging_builder import build_logger
from nuplan.planning.utils.multithreading.worker_utils import worker_map
from omegaconf import DictConfig
from nuplan.planning.simulation.trajectory.trajectory_sampling import TrajectorySampling
from torch import Tensor
from navsim.agents.abstract_agent import AbstractAgent
from navsim.agents.vadv2.vadv2_agent import Vadv2Agent
from navsim.common.dataclasses import Trajectory
from navsim.common.dataloader import SceneLoader
from navsim.planning.script.builders.worker_pool_builder import build_worker
from navsim.planning.script.run_pdm_score_gpu import run_pdm_score
logger = logging.getLogger(__name__)
CONFIG_PATH = "config/pdm_scoring"
CONFIG_NAME = "run_pdm_score_ddp"
"""
pkl -> valid score
"""
@hydra.main(config_path=CONFIG_PATH, config_name=CONFIG_NAME)
def main(cfg: DictConfig) -> None:
pkl_path_vov = cfg.pkl_path_vov
pkl_path_moe = cfg.pkl_path_moe
merged_predictions_vov = pickle.load(open(pkl_path_vov, 'rb'))
merged_predictions_moe = pickle.load(open(pkl_path_moe, 'rb'))
traj_vocab = np.load(f'{os.getenv("NAVSIM_DEVKIT_ROOT")}/traj_final/test_8192_kmeans.npy')
for k, v_vov in merged_predictions_vov.items():
v_moe = merged_predictions_moe[k]
score = (
0.1 * v_vov['imi'] +
0.25 * v_vov['noc'] +
2.0 * v_vov['da'] +
2.25 * (
3.0 * v_vov['ttc'] +
5.0 * v_vov['progress'] +
1.0 * v_vov['comfort']
) + 0.2 * (
0.139 * v_moe['imi'] +
0.25 * v_moe['noc'] +
0.9 * v_moe['da'] +
2.5 * (
3.0 * v_moe['ttc'] +
4.0 * v_moe['progress'] +
1.0 * v_moe['comfort']
)
)
).argmax(0)
traj = traj_vocab[score]
merged_predictions_vov[k]['trajectory'] = Trajectory(traj,
TrajectorySampling(
time_horizon=4,
interval_length=0.1)
)
build_logger(cfg)
scene_filter = instantiate(cfg.scene_filter)
scene_loader = SceneLoader(
sensor_blobs_path=Path(cfg.sensor_blobs_path),
data_path=Path(cfg.navsim_log_path),
scene_filter=scene_filter,
)
data_points = [
{
"cfg": cfg,
"log_file": log_file,
"tokens": tokens_list,
"model_trajectory": merged_predictions_vov
}
for log_file, tokens_list in scene_loader.get_tokens_list_per_log().items()
]
total_token_cnt = sum([len(t["tokens"]) for t in data_points])
assert len(merged_predictions_vov) == total_token_cnt, (f'merged: {len(merged_predictions_vov)},'
f'total: {total_token_cnt}')
worker = build_worker(cfg)
score_rows: List[Tuple[Dict[str, Any], int, int]] = worker_map(worker, run_pdm_score, data_points)
pdm_score_df = pd.DataFrame(score_rows)
num_sucessful_scenarios = pdm_score_df["valid"].sum()
num_failed_scenarios = len(pdm_score_df) - num_sucessful_scenarios
average_row = pdm_score_df.drop(columns=["token", "valid"]).mean(skipna=True)
average_row["token"] = "average"
average_row["valid"] = pdm_score_df["valid"].all()
pdm_score_df.loc[len(pdm_score_df)] = average_row
save_path = Path(cfg.csv_path)
pdm_score_df.to_csv(save_path)
logger.info(f"""
Finished running evaluation.
Number of successful scenarios: {num_sucessful_scenarios}.
Number of failed scenarios: {num_failed_scenarios}.
Final average score of valid results: {pdm_score_df['score'].mean()}.
Results are stored in: {save_path}.
""")
if __name__ == "__main__":
main()