{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Constant prediction baseline\nSince I observed that the mean target_positions is about (5, 0), we try to see the score corresponding to this mean positions."},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"from typing import Dict\n\nfrom tempfile import gettempdir\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport torch\nfrom torch import nn, optim\nfrom torch.utils.data import DataLoader\nimport torchvision\nfrom torchvision.models.resnet import resnet50, resnet18, resnet34, resnet101\nfrom tqdm import tqdm\n\nimport l5kit\nfrom l5kit.configs import load_config_data\nfrom l5kit.data import LocalDataManager, ChunkedDataset\nfrom l5kit.dataset import AgentDataset, EgoDataset\nfrom l5kit.rasterization import build_rasterizer\nfrom l5kit.evaluation import write_pred_csv, compute_metrics_csv, read_gt_csv, create_chopped_dataset\nfrom l5kit.evaluation.chop_dataset import MIN_FUTURE_STEPS\nfrom l5kit.evaluation.metrics import neg_multi_log_likelihood, time_displace\nfrom l5kit.geometry import transform_points\nfrom l5kit.visualization import PREDICTED_POINTS_COLOR, TARGET_POINTS_COLOR, draw_trajectory\nfrom prettytable import PrettyTable\nfrom pathlib import Path\n\nimport matplotlib.pyplot as plt\n\nimport os\nimport random\nimport time\n\nfrom IPython.display import display\nfrom tqdm import tqdm_notebook\nimport gc, psutil\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nl5kit.__version__","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Memory measurement\ndef memory(verbose=True):\n    mem = psutil.virtual_memory()\n    gb = 1024*1024*1024\n    if verbose:\n        print('Physical memory:',\n              '%.2f GB (used),'%((mem.total - mem.available) / gb),\n              '%.2f GB (available)'%((mem.available) / gb), '/',\n              '%.2f GB'%(mem.total / gb))\n    return (mem.total - mem.available) / gb\n\ndef gc_memory(verbose=True):\n    m = gc.collect()\n    if verbose:\n        print('GC:', m, end=' | ')\n        memory()\n\nmemory();","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# folder = '..' \nfolder = '/kaggle'\ntest_run = False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# --- Lyft configs ---\ncfg = {\n    'format_version': 4,\n    'data_path': f'{folder}/input/lyft-motion-prediction-autonomous-vehicles',\n    'model_params': {\n        'history_num_frames': 10,\n        'history_step_size': 1,\n        'history_delta_time': 0.1,\n        'future_num_frames': 50,\n        'future_step_size': 1,\n        'future_delta_time': 0.1,\n    },\n    'raster_params': {\n        'raster_size': [2, 2],  # [224, 224],\n        'pixel_size': [0.5, 0.5],\n        'ego_center': [0.25, 0.5],\n        'map_type': 'py_semantic',\n        'satellite_map_key': 'aerial_map/aerial_map.png',\n        'semantic_map_key': 'semantic_map/semantic_map.pb',\n        'dataset_meta_key': 'meta.json',\n        'filter_agents_threshold': 0.5,\n    },\n    'train_data_loader': {\n        'key': 'scenes/train.zarr',\n        'batch_size': 512,  # 8192\n        'shuffle': False,\n        'num_workers': 4,  # 4\n    },    \n    'test_data_loader': {\n        'key': 'scenes/test.zarr',\n        'batch_size': 128,\n        'shuffle': False,\n        'num_workers': 4,  # 4\n    },\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n# set env variable for data\nDIR_INPUT = cfg[\"data_path\"]\nos.environ[\"L5KIT_DATA_FOLDER\"] = DIR_INPUT\ndm = LocalDataManager()\n# Build rasterizer\nrasterizer = build_rasterizer(cfg, dm)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n# Test dataset\ntest_cfg = cfg[\"test_data_loader\"]\ntest_zarr = ChunkedDataset(dm.require(test_cfg[\"key\"])).open(cached=False)  # try to turn off cache\ntest_mask = np.load(f\"{DIR_INPUT}/scenes/mask.npz\")[\"arr_0\"]\ntest_dataset = AgentDataset(cfg, test_zarr, rasterizer, agents_mask=test_mask)\ntest_dataloader = DataLoader(test_dataset, shuffle=test_cfg[\"shuffle\"],\n                             batch_size=test_cfg[\"batch_size\"], num_workers=test_cfg[\"num_workers\"])\nprint(test_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('test set size:', len(test_dataset))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Output constant predictions baseline"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Number of batches for predictoin:', int(np.ceil(len(test_dataset) / cfg['test_data_loader']['batch_size'])))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data['world_from_agent'].shape[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntorch.set_grad_enabled(False)\n\n# store information for evaluation\nfuture_coords_offsets_pd = []\ntimestamps = []\n# confidences_list = []\nagent_ids = []\nmemorys_pred = []\nt0 = time.time()\ntimes_pred = []\niterations_pred = []\ni_update = 5 if test_run else 50\n\n# Assume all the predictions are all constant\n# here the constants are average from first 512 of the the training data samples\npreds_zeros = torch.zeros(cfg['test_data_loader']['batch_size'], 3, cfg['model_params']['future_num_frames'], 2).double()\npreds_zeros[:, :, :, 0] = 2.7429526\npreds_zeros[:, :, :, 1] = -0.3545249\n\nfor i, data in enumerate(tqdm_notebook(test_dataloader, mininterval=5.)):\n    batch_size = data['world_from_agent'].shape[0]\n    preds = torch.einsum('bmti,bji->bmtj', preds_zeros[:batch_size], data[\"world_from_agent\"][:, :2, :2]).numpy()\n\n    future_coords_offsets_pd.append(preds.copy())\n    # confidences_list.append(confidences.cpu().numpy().copy())\n    timestamps.append(data[\"timestamp\"].numpy().copy())\n    agent_ids.append(data[\"track_id\"].numpy().copy()) \n\n    if i % i_update == 0:\n        t = ((time.time() - t0) / 60)\n        print('%4d'%i, '%6.2fmins'%t, end=' | ')\n        mem = memory()\n        iterations_pred.append(i)\n        memorys_pred.append(mem)\n        times_pred.append(t)\n        if test_run and i >= 10:\n            break\nprint('Total timespent: %6.2fmins'%((time.time() - t0) / 60))\nmemory()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# figure out n of test examples\ntimestamps_concat = np.concatenate(timestamps)\nn_examples = len(timestamps_concat)\n# dummy confidence\nconfidences_concat = np.zeros((n_examples, 3))\nconfidences_concat[:, 0] = 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n# create submission to submit to Kaggle\npred_path = 'submission.csv' if folder.endswith('kaggle') else f'{model_name}-submission.csv'\nwrite_pred_csv(\n    pred_path,\n    timestamps=timestamps_concat,\n    track_ids=np.concatenate(agent_ids),\n    coords=np.concatenate(future_coords_offsets_pd),\n    confs=confidences_concat,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_sub = pd.read_csv(pred_path)\ndisplay(df_sub)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}