{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Notebook setup\n\n1. accelerator type set to `GPU`\n1. mount `kaggle-l5kit-110` data volume\n1. turn off internet because it is required if you want to submission the notebook (also all dependencies are within the data valume)"},{"metadata":{},"cell_type":"markdown","source":"## Install `l5kit`"},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install --no-index -q --use-feature=2020-resolver -f ../input/kaggle-l5kit-110 l5kit ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Note that if you just do `pip install torch` with Internet (i.e. install from pypi index), it'll by default install the cuda 10.2 version which isn't compatible with cuda 10.1 version that comes with Kaggle GPU docker image. Here the dataset `kaggle-l5kit-110` has been setup to download cuda 10.1 version so you can proceed with no issues.\n\nWe can see the GPU and cuda version works correctly now."},{"metadata":{"trusted":true},"cell_type":"code","source":"!nvcc --version","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import l5kit\nimport torch\nimport torchvision\nl5kit.__version__, torch.__version__, torchvision.__version__, torch.cuda.is_available()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Package imports and setups"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport l5kit\nimport torch\nimport zarr\nimport pandas as pd\nimport numpy as np\nfrom l5kit.data import LocalDataManager, ChunkedDataset\nfrom l5kit.dataset import AgentDataset, EgoDataset","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### set env variable for data and initialize DataManager"},{"metadata":{"trusted":true},"cell_type":"code","source":"os.environ[\"L5KIT_DATA_FOLDER\"] = \"../input/lyft-motion-prediction-autonomous-vehicles\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dm = LocalDataManager()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Datasets\n\nAnd print a brief summary for all of them"},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nsample_dataset = ChunkedDataset(dm.require('scenes/sample.zarr'))\nsample_dataset.open()\nprint(sample_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntrain_dataset = ChunkedDataset(dm.require('scenes/train.zarr'))\ntrain_dataset.open()\nprint(train_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nval_dataset = ChunkedDataset(dm.require('scenes/validate.zarr'))\nval_dataset.open()\nprint(val_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntest_dataset = ChunkedDataset(dm.require('scenes/test.zarr'))\ntest_dataset.open()\nprint(test_dataset)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"It seems that the average scene time is different (10.0s in test versus 24.8s in sample, train, and validate)"},{"metadata":{"trusted":true},"cell_type":"code","source":"del train_dataset\ndel val_dataset","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Explore sample dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_dataset.scenes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_dataset.frames","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_dataset.tl_faces","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_dataset.agents","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Agent labels"},{"metadata":{"trusted":true},"cell_type":"code","source":"agents_df = pd.DataFrame.from_records(sample_dataset.agents, columns = ['centroid', 'extent', 'yaw', 'velocity', 'track_id', 'label_probabilities'])\nagents_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"What are their track ids?"},{"metadata":{"trusted":true},"cell_type":"code","source":"agents_df.track_id.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Classifications?"},{"metadata":{"trusted":true},"cell_type":"code","source":"from l5kit.data import PERCEPTION_LABELS\n\nagents_df['label_probabilities'].map(np.argmax).map(lambda i: PERCEPTION_LABELS[i]).value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"And softmax distributions?"},{"metadata":{"trusted":true},"cell_type":"code","source":"agents_df['label_probabilities'].map(np.max).map(lambda p: int(p * 10) / 10.).value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Scenes"},{"metadata":{"trusted":true},"cell_type":"code","source":"scene_df = pd.DataFrame.from_records(sample_dataset.scenes, columns=('frame_index_interval', 'host', 'start_time', 'end_time'))\nscene_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Scene hosts?"},{"metadata":{"trusted":true},"cell_type":"code","source":"scene_df['host'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Frames"},{"metadata":{"trusted":true},"cell_type":"code","source":"frames_df = pd.DataFrame.from_records(sample_dataset.frames, columns = ['timestamp', 'agent_index_interval', 'traffic_light_faces_index_interval', 'ego_translation', 'ego_rotation'])\nframes_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tl_faces_df = pd.DataFrame.from_records(sample_dataset.tl_faces, columns = ['face_id', 'traffic_light_id', 'traffic_light_face_status'])\ntl_faces_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del sample_dataset","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Explore Test Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset.scenes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset.frames","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset.agents","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset.tl_faces","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Test Scenes"},{"metadata":{"trusted":true},"cell_type":"code","source":"scene_df = pd.DataFrame.from_records(test_dataset.scenes, columns=('frame_index_interval', 'host', 'start_time', 'end_time'))\nscene_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Test Agents (sample 50000)"},{"metadata":{"trusted":true},"cell_type":"code","source":"agents_df = pd.DataFrame.from_records(zarr.array(test_dataset.agents[:50000]), \n                                      columns = ['centroid', 'extent', 'yaw', 'velocity', 'track_id', 'label_probabilities'])\nagents_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"And their tracks"},{"metadata":{"trusted":true},"cell_type":"code","source":"agents_df.track_id.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Test Frames (sample 10000)"},{"metadata":{"trusted":true},"cell_type":"code","source":"frames_df = pd.DataFrame.from_records(zarr.array(test_dataset.frames[:10000]), columns = ['timestamp', 'agent_index_interval', 'traffic_light_faces_index_interval', 'ego_translation', 'ego_rotation'])\nframes_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## AgentDataSet"},{"metadata":{"trusted":true},"cell_type":"code","source":"CONFIG_DATA = {\n    \"format_version\": 4,\n    \"model_params\": {\n        \"model_architecture\": \"resnet50\",\n        # max is 99, but set to 101 never the less\n        \"history_num_frames\": 101,\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\": [256, 256],\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        \"disable_traffic_light_faces\": False,\n    },\n    \"test_dataloader\": {\n        \"key\": \"scenes/test.zarr\",\n        \"batch_size\": 16,\n        \"shuffle\": False,\n        \"num_workers\": 4,\n    },\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_mask = np.load(f\"../input/lyft-motion-prediction-autonomous-vehicles/scenes/mask.npz\")[\"arr_0\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from l5kit.rasterization import build_rasterizer\n\nrast = build_rasterizer(CONFIG_DATA, dm)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"agent_dataset = AgentDataset(\n    CONFIG_DATA, test_dataset, rast, agents_mask=test_mask\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(agent_dataset)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tqdm.notebook import tqdm\nfrom itertools import islice\n\nitems = []\ntrack_ids = []\nfor i in tqdm(islice(agent_dataset, 20)):\n    track_ids.append(i['track_id'])\n    items.append(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(track_ids), len(set(track_ids))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"items[0].keys()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"items[0]['track_id']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"[len(item['history_availabilities']) for item in items]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**notice how the tailing 2 items (101 - 99) are empty**"},{"metadata":{"trusted":true},"cell_type":"code","source":"items[0]['history_positions']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"items[0]['history_yaws']","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}