├── LICENSE ├── README.md ├── Supplementary.pdf ├── data_statistics ├── 360_Distribution │ ├── bev_dirstibution.py │ └── bev_dist.png ├── Domains_v2 │ ├── domain_year.py │ └── publish_trend.pdf ├── Object_Distances │ ├── Obj_Distance_distribution.png │ └── Obj_distance_plot.py ├── Objects_per_frame │ ├── Obj_per_frame.pdf │ └── Obj_per_frame_plot.py ├── sensor_dist │ ├── sensor_dist.pdf │ └── sensor_dist.py └── world_dist │ ├── world_dist.pdf │ └── world_dist.py └── figures ├── bev_dist.png ├── chronological_overview.png ├── comparison.png ├── fig14_frame.png ├── fig15_distance.png ├── figure9_ad_task_overview.png ├── perception_datasets.png ├── prediction_planning_control_datasets.png ├── vlm_ad_datasets.png └── world_dist.png /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 MIngyu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Survey on Autonomous Driving Datasets: Statistics, Annotation Quality, and a Future Outlook 2 |
3 | arXiv Badge 4 | Stars Badge 5 | Forks Badge 6 | Pull Requests Badge 7 | License Badge 8 |
9 | 10 | This repository stores datasets mentioned in the paper __A Survey on Autonomous Driving Datasets: Statistics, Annotation Quality, and a Future Outlook__, and also provides related codes. The repo maintained by [TUM-AIR](https://www.ce.cit.tum.de/air/home/) will be continuously updated to track the latest work in the community. 11 | 12 | If there are any questions or suggestions, please feel free to reach out to mingyu.liu@tum.de). 13 | 14 | **Keywords: Dataset, Autonomous driving, Impact score, Annotation, Data analysis** 15 |

16 | 17 |

18 | 19 |

20 | 21 |

22 | 23 | ## ✅ News 24 | - [29.April.2024] Our paper has been accepted by [IEEE Transactions on Intelligent Vehicles](https://ieeexplore.ieee.org/document/10509812). 25 | 26 | ## 🤝   Citation 27 | Please visit [A Survey on Autonomous Driving Datasets: Data Statistic, Annotation, and Outlook](https://ieeexplore.ieee.org/document/10509812) for more details and comprehensive information. If you find our paper and repo helpful, please consider citing it as follows: 28 | 29 | ```BibTeX 30 | @ARTICLE{10509812, 31 | author={Liu, Mingyu and Yurtsever, Ekim and Fossaert, Jonathan and Zhou, Xingcheng and Zimmer, Walter and Cui, Yuning and Zagar, Bare Luka and Knoll, Alois C.}, 32 | journal={IEEE Transactions on Intelligent Vehicles}, 33 | title={A Survey on Autonomous Driving Datasets: Statistics, Annotation Quality, and a Future Outlook}, 34 | year={2024}, 35 | volume={}, 36 | number={}, 37 | pages={1-29}, 38 | keywords={Autonomous vehicles;Surveys;Annotations;Task analysis;Measurement;Sensors;Robot sensing systems;Dataset;impact score;data analysis;annotation quality;autonomous driving}, 39 | doi={10.1109/TIV.2024.3394735}} 40 | ``` 41 | 42 | ## Dataset tables 43 | ### Dataset tables in main paper 44 |

45 | 46 |

47 | 48 |

49 | 50 |

51 | 52 |

53 | 54 |

55 | 56 | ### Dataset tables in supplementary 57 | The additional datasets are collected in the [supplementary material](https://github.com/MingyuLiu1/autonomous_driving_datasets/blob/main/Supplementary.pdf). 58 | 59 | ## Statistics 60 | We provide [codes](https://github.com/MingyuLiu1/autonomous_driving_datasets/tree/main/data_statistics) that we used to conduct statistics in our paper. You can download the neccessary .csv files by [Google Driver](https://drive.google.com/drive/folders/17LL2FEnyIYi3qJsuObDmRqB8b8yyioyk?usp=sharing). 61 |

62 | 63 | 64 |

65 |

66 | 67 | 68 |

69 | 70 | ## License 71 | This repository is released under the [MIT license](https://github.com/MingyuLiu1/autonomous_driving_datasets/LICENSE). 72 | -------------------------------------------------------------------------------- /Supplementary.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/Supplementary.pdf -------------------------------------------------------------------------------- /data_statistics/360_Distribution/bev_dirstibution.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | from matplotlib.colors import LogNorm # matplotlib >= 3.4.0 6 | 7 | 8 | path = "./dataset_survey/data_statistics/All_Datasets_Data/360_Distribution/" 9 | 10 | names = ["Argoverse2", "KITTI", "Waymo", "nuScenes", "ONCE", "ZOD"] 11 | coords_list = [] 12 | if_argo = True 13 | 14 | # figure out max value 15 | global_max = None 16 | for name in names: 17 | filepath = path+name+"_xy_coord.json" 18 | with open(filepath, "r") as f: 19 | xy_coords = json.load(f) 20 | # if if_argo == True: 21 | # x_values = [coord[1] for coord in xy_coords] 22 | # y_values = [coord[0] for coord in xy_coords] 23 | # if_argo = False 24 | # else: 25 | x_values = [coord[0] for coord in xy_coords] 26 | y_values = [coord[1] for coord in xy_coords] 27 | hist, _, _ = np.histogram2d(x_values, y_values, bins=100) 28 | local_max = np.max(hist) 29 | local_max = 250000 30 | global_max = local_max if global_max is None else max(global_max, local_max) 31 | coords_list.append(xy_coords) 32 | 33 | # Create a 2x3 grid of subplots 34 | fig, axes = plt.subplots(2, 3, figsize=(22, 12)) 35 | if_argo = True 36 | # Loop through the coordinates lists and create plots in the grid 37 | for i, (coords, ax) in enumerate(zip(coords_list, axes.flatten())): 38 | if if_argo == True: 39 | x_values = [coord[1] for coord in coords] 40 | y_values = [coord[0] for coord in coords] 41 | if_argo = False 42 | else: 43 | x_values = [coord[0] for coord in coords] 44 | y_values = [coord[1] for coord in coords] 45 | 46 | x_bins = np.linspace(-100, 100, 100) 47 | y_bins = np.linspace(-100, 100, 100) 48 | 49 | hist = ax.hist2d(x_values, y_values, bins=[x_bins, y_bins], cmap='viridis', norm=LogNorm(vmin=1, vmax=global_max)) 50 | 51 | ax.set_title(names[i], fontsize='40', fontname="Times New Roman Bold") 52 | # if i >=3: 53 | # ax.set_xlabel('X Coordinates', fontsize=25) 54 | # if i % 3 == 0: 55 | # ax.set_ylabel('Y Coordinates', fontsize=25) 56 | # ax.set_xlabel('X Coordinates', fontsize='25') 57 | # ax.set_ylabel('Y Coordinates', fontsize='25') 58 | ax.set_xlim(-100, 100) 59 | ax.set_ylim(-100, 100) 60 | ax.set_aspect('equal', adjustable='box') 61 | ax.tick_params(axis='x', labelsize='30') 62 | ax.tick_params(axis='y', labelsize='30') 63 | ax.set_xticks([-100, -50, 0, 50, 100]) # fontsize=40 64 | ax.set_yticks([-100, -50, 0, 50, 100]) 65 | 66 | fig.supxlabel('Y Coordinates', fontsize=40, ha='center', fontname="Times New Roman Bold") 67 | fig.supylabel('X Coordinates', fontsize=40, va='center', fontname="Times New Roman Bold") 68 | 69 | # Use the hist values of the first subplot to create a common colorbar 70 | cbar_ax = fig.add_axes([0.9, 0.1, 0.02, 0.8]) # Adjust the position and size of the colorbar 71 | # cbar = fig.colorbar(hist[3], cax=cbar_ax, label='Number of objects (log)') 72 | cbar = fig.colorbar(hist[3], cax=cbar_ax) 73 | cbar.set_label("Number of obejcts (log)", size=40) 74 | cbar.ax.tick_params(axis='both', labelsize=40) 75 | # Adjust layout and show plots 76 | plt.tight_layout(rect=[0, 0, 0.9, 1]) # Adjust the rectangle in which to constrain the tight_layout 77 | plt.savefig("bev_dist.png", dpi=500) 78 | -------------------------------------------------------------------------------- /data_statistics/360_Distribution/bev_dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/360_Distribution/bev_dist.png -------------------------------------------------------------------------------- /data_statistics/Domains_v2/domain_year.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | import seaborn as sns 5 | 6 | 7 | # Read the CSV file into a pandas DataFrame 8 | csv_file = 'BT_Domain_Year.csv' # Replace with the actual file path 9 | csv = pd.read_csv(csv_file, header=None) # No header in the CSV 10 | 11 | # print(csv) 12 | 13 | # Create a histogram plot for each attribute over the years 14 | plt.figure(figsize=(12, 8)) 15 | ax = plt.gca() 16 | 17 | # Get unique attributes 18 | # attributes = csv[2].unique() 19 | attributes = ['Onboard', 'V2X/V2V/V2I', 'Drone', 'Others'] 20 | # attributes = ['V2X' if attribute == 'V2X/V2V/V2I' else attribute for attribute in attributes] 21 | 22 | # handles_labels = [] 23 | 24 | # Define colors for the lines 25 | colors = ['green', 'blue', 'orange', 'purple'] 26 | 27 | # Define markers for each attribute 28 | markers = ['o', 'x', 's', '^'] 29 | 30 | # manually add the dataset number for 2023 and 2024 31 | manual_counts_2023 = { 32 | 'Onboard': 21, 33 | 'V2X': 7, 34 | 'Drone': 2, 35 | 'Others': 2 36 | } 37 | 38 | manual_counts_2024 = { 39 | 'Onboard': 5, 40 | 'V2X': 3, 41 | 'Drone': 0, 42 | 'Others': 0 43 | } 44 | 45 | 46 | # Loop through each unique attribute, color, and marker 47 | for i, (attribute, color, marker) in enumerate(zip(attributes, colors, markers)): 48 | subset_df = csv[csv[2] == attribute] 49 | year_counts = subset_df[1].value_counts().sort_index() 50 | if attribute == 'V2X/V2V/V2I': 51 | attribute = 'V2X' 52 | year_counts.loc[2023] = manual_counts_2023[attribute] 53 | year_counts.loc[2024] = manual_counts_2024[attribute] 54 | plt.plot(year_counts.index, year_counts.values, label=attribute, color=color, marker=marker, linestyle='-') 55 | 56 | # Draw cumulative counts 57 | # cumulative_counts = year_counts.cumsum() 58 | # line, = plt.plot(cumulative_counts.index, cumulative_counts.values, label=attribute, color=color, marker=marker, linestyle='-') 59 | # handles_labels.append(line) 60 | 61 | # Add labels and legend 62 | plt.xlabel('Year', fontsize='24') 63 | plt.ylabel('Publishing Datasts Number', fontsize='24') 64 | plt.title('Number of Datasets Over the Years', fontsize='24') 65 | plt.legend(fontsize='24') 66 | # print(handles_labels) 67 | # plt.legend(handles=handles_labels, fontsize='xx-large') 68 | 69 | # Refine figure 70 | ax.spines['top'].set_visible(False) 71 | ax.spines['right'].set_visible(False) 72 | ax.grid(False) 73 | # ax.xaxis.grid(False) 74 | # ax.yaxis.grid(True) 75 | plt.tick_params(axis='x', labelsize='20') 76 | plt.tick_params(axis='y', labelsize='20') 77 | xticks = list(range(2008, 2025, 1)) + [2024] 78 | xtickslabel = [str(year) for year in range(2008, 2025, 1)] + ['2024.02'] 79 | plt.xticks(xticks, xtickslabel, rotation=45) 80 | 81 | # Show the plot 82 | plt.tight_layout() 83 | # plt.show() 84 | plt.savefig("sensing_domain.pdf", dpi=300, bbox_inches='tight') 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /data_statistics/Domains_v2/publish_trend.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/Domains_v2/publish_trend.pdf -------------------------------------------------------------------------------- /data_statistics/Object_Distances/Obj_Distance_distribution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/Object_Distances/Obj_Distance_distribution.png -------------------------------------------------------------------------------- /data_statistics/Object_Distances/Obj_distance_plot.py: -------------------------------------------------------------------------------- 1 | import json 2 | import seaborn as sns 3 | import matplotlib.pyplot as plt 4 | import pandas as pd 5 | import numpy as np 6 | 7 | 8 | # max_argo = max(argoverse2_distances) 9 | # max_kitti = max(kitti_distances) 10 | # max_nuscenes = max(nuScenes_distances) 11 | # max_waymo = max(Waymo_distances) 12 | # max_once = max(ONCE_distances) 13 | # max_zod = max(ZOD_distances) 14 | 15 | # print("Max distances:") 16 | # print(max_argo) 17 | # print(max_kitti) 18 | # print(max_nuscenes) 19 | # print(max_waymo) 20 | # print(max_once) 21 | # print(max_zod) 22 | 23 | datasets = [ 24 | ("Argoverse2", "Argoverse2_Obj_Distances.json"), 25 | ("KITTI", "KITTI_Obj_Distances.json"), 26 | ("nuScenes", "nuScenes_Obj_Distances.json"), 27 | ("ONCE", "ONCE_Obj_distances.json"), 28 | ("Waymo", "Waymo_Obj_Distances.json"), 29 | ("ZOD", "ZOD_Obj_Distances_<250.json") 30 | ] 31 | 32 | all_distances = [] 33 | list_names = [] 34 | 35 | for dataset_name, file_name in datasets: 36 | distances = [] 37 | with open(file_name, "r") as f: 38 | distances = json.load(f) 39 | print(f"{dataset_name} load complete with {len(distances)} objects") 40 | all_distances.extend(distances) 41 | list_names.extend([dataset_name] * len(distances)) 42 | 43 | # Create a dataframe from the merged list 44 | df = pd.DataFrame({'Distance in meters': all_distances, 'List': list_names}) 45 | 46 | # Set a custom color palette for the lists 47 | custom_palette = ["blue", "red", "green", "orange", "purple", "lightblue"] 48 | # custom_palette = ["red", "green", "orange"] 49 | 50 | # Initialize the figure 51 | plt.figure(figsize=(12, 8)) 52 | ax = plt.gca() 53 | 54 | # Plot the histogram with a bin size of one meter for each list 55 | ax = sns.histplot(data=df, x='Distance in meters', hue='List', bins=int(max(all_distances) - min(all_distances)) + 1, kde=True, element='step', palette=custom_palette) 56 | 57 | # Set x-axis limit to 250 meters 58 | ax.set_xlim(0, 250) 59 | 60 | # Manually create the legend with custom labels and colors 61 | legend_handles = [plt.Line2D([0], [0], color=custom_palette[i], lw=2, label=dataset_name) for i, (dataset_name, _) in enumerate(datasets)] 62 | ax.legend(handles=legend_handles, fontsize='24') 63 | plt.xticks(fontsize="20") 64 | plt.yticks(fontsize="20") 65 | 66 | ax.spines['top'].set_visible(False) 67 | ax.spines['right'].set_visible(False) 68 | 69 | plt.xlabel('Distance in meters', fontsize='24') 70 | plt.ylabel('Number of Objects', fontsize='24') 71 | 72 | plt.subplots_adjust(left=0.13, right=0.96, top=0.95, bottom=0.1) 73 | 74 | # plt.show() 75 | 76 | plt.savefig("Obj_Distance_distribution.png", dpi=500) 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 | -------------------------------------------------------------------------------- /data_statistics/Objects_per_frame/Obj_per_frame.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/Objects_per_frame/Obj_per_frame.pdf -------------------------------------------------------------------------------- /data_statistics/Objects_per_frame/Obj_per_frame_plot.py: -------------------------------------------------------------------------------- 1 | import json 2 | import seaborn as sns 3 | import matplotlib.pyplot as plt 4 | import pandas as pd 5 | import numpy as np 6 | import math 7 | 8 | """ 9 | # Load in all the different dataset data 10 | 11 | #Argovers2 12 | argoverse2_OPF = [] 13 | with open("Argoverse2_Obj_per_frame.json", "r") as f: 14 | argoverse2_data= json.load(f) 15 | argoverse2_OPF = list(argoverse2_data.values()) 16 | 17 | print("Argoverse 2 load complete") 18 | 19 | #KITTI 20 | kitti_OPF = [] 21 | with open("KITTI_Obj_per_frame.json", "r") as f: 22 | kitti_OPF = json.load(f) 23 | print("KITTI load complete") 24 | 25 | #nuScenes 26 | nuscenes_OPF = [] 27 | with open("nuScenes_Obj_per_frame_2.json", "r") as f: 28 | nuscenes_OPF = json.load(f) 29 | print("nuScenes load complete") 30 | 31 | #ONCE 32 | once_OPF = [] 33 | with open("ONCE_Obj_per_frame.json", "r") as f: 34 | once_OPF = json.load(f) 35 | print("ONCE load complete") 36 | 37 | #Waymo 38 | waymo_OPF = [] 39 | with open("Waymo_Obj_per_frame.json", "r") as f: 40 | waymo_OPF = json.load(f) 41 | print("Waymo load complete") 42 | 43 | #ZOD 44 | zod_OPF = [] 45 | with open("ZOD_Obj_per_frames.json", "r") as f: 46 | zod_OPF = json.load(f) 47 | print("ZOD load complete") 48 | 49 | """ 50 | 51 | 52 | 53 | # List of data file names 54 | data_files = ["Argoverse2_Obj_per_frame.json", 'KITTI_Obj_per_frame.json', 'nuScenes_Obj_per_frame_2.json', 'ONCE_Obj_per_frame.json', 'Waymo_Obj_per_frame.json', 'ZOD_Obj_per_frames.json'] 55 | 56 | color_palette = ["blue", "red", "green", "orange", "purple", "lightblue"] 57 | 58 | label_names=["Argoverse2", "KITTI", "nuScenes", "ONCE", "Waymo", "ZOD"] 59 | 60 | 61 | # Initialize the figure 62 | plt.figure(figsize=(12, 8)) 63 | ax = plt.gca() 64 | 65 | index = 0 66 | # Loop through each data file 67 | for data_file in data_files: 68 | # Load data from the JSON file 69 | if data_file == "Argoverse2_Obj_per_frame.json": 70 | with open(data_file, 'r') as f: 71 | data = json.load(f) 72 | numbers = list(data.values()) 73 | else: 74 | with open(data_file, 'r') as f: 75 | numbers = json.load(f) 76 | 77 | 78 | 79 | # Convert the values to floats 80 | numbers = [float(x) for x in numbers] 81 | 82 | # Create a histogram to get the count of frames for each number of objects 83 | hist, bins = np.histogram(numbers, bins=np.arange(min(numbers), max(numbers) + 1.5)) 84 | 85 | # # Smooth the histogram line using a moving average 86 | # window = 3 # Adjust the window size as needed 87 | # smoothed_hist = np.convolve(hist, np.ones(window)/window, mode='same') 88 | 89 | # Plot the smoothed histogram line 90 | plt.plot(bins[:-1], hist, label=label_names[index], color=color_palette[index]) # Remove '.json' from label 91 | 92 | # Fill the area under the line 93 | plt.fill_between(bins[:-1], hist, alpha=0.3, color=color_palette[index]) 94 | 95 | index+=1 96 | 97 | # Set plot labels and title 98 | plt.xlabel('Number of Objects per Frame', fontsize='24') 99 | plt.ylabel('Count of Frames', fontsize='24') 100 | 101 | 102 | # Set x and y axis limits to start at 0 103 | plt.xlim(0,250) 104 | plt.ylim(0) 105 | 106 | # Show a legend 107 | plt.legend(fontsize="24") 108 | plt.rcParams.update({"font.size":40}) 109 | # plt.tick_params(axis='x', labelsize='x-large') 110 | # plt.tick_params(axis='y', labelsize='x-large') 111 | # Adjust the spacing around the plot 112 | # plt.subplots_adjust(left=0.08, right=0.95, bottom=0.08, top=0.95) 113 | 114 | plt.tick_params(axis="x", labelsize='20') 115 | plt.tick_params(axis="y", labelsize='20') 116 | 117 | ax.spines['top'].set_visible(False) 118 | ax.spines['right'].set_visible(False) 119 | 120 | plt.subplots_adjust(left=0.1, right=0.96, top=0.95, bottom=0.1) 121 | # Display the plot 122 | plt.show() 123 | plt.savefig("Obj_per_frame.png", dpi=500) 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /data_statistics/sensor_dist/sensor_dist.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/sensor_dist/sensor_dist.pdf -------------------------------------------------------------------------------- /data_statistics/sensor_dist/sensor_dist.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import matplotlib.cm as cm 3 | import numpy as np 4 | 5 | countries = ['RGB Camera', 'LiDAR', 'Stereo Camera', 'Radar', 'Thermal Camera', 'Event Camera', 'Fisheye Camera'] 6 | numbers = [189, 93, 29, 19, 12, 10, 6] 7 | alpha = 0.8 8 | colors = cm.twilight(np.linspace(0, 1, 9)) # twilight Pastel1 9 | colors_with_alpha = [(r, g, b, alpha) for r, g, b, _ in colors] 10 | 11 | total = sum(numbers) 12 | 13 | fig, ax = plt.subplots(figsize=(13, 11)) 14 | # wedges, texts, autotexts = ax.pie(numbers, textprops=dict(color="w"), autopct="") 15 | wedges, texts, autotexts = ax.pie(numbers, textprops=dict(color="w"), autopct="", colors=colors_with_alpha, radius=0.9) 16 | 17 | # Show number on each slice 18 | for i, (p, num) in enumerate(zip(wedges, numbers)): 19 | ang = (p.theta2 - p.theta1)/2. + p.theta1 20 | y = np.sin(np.deg2rad(ang)) 21 | x = np.cos(np.deg2rad(ang)) 22 | ax.text(x*0.7, y*0.7, str(num), ha="center", va="center", color="black", fontsize='26') 23 | 24 | # Add a white edge for each country 25 | for wedge in wedges: 26 | wedge.set_edgecolor('black') 27 | 28 | for i, (country, num, p) in enumerate(zip(countries, numbers, wedges)): 29 | ang = (p.theta2 - p.theta1) / 2. + p.theta1 30 | y = np.sin(np.deg2rad(ang)) 31 | x = np.cos(np.deg2rad(ang)) 32 | horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))] 33 | connectionstyle = f"angle,angleA=0,angleB={ang}" 34 | percent = round(num / total * 100, 2) 35 | 36 | if country == 'RGB Camera': 37 | xytext = (0.5 * np.sign(x), y * 1.1) 38 | connectionstyle += ",rad=0.0" 39 | xy=(x*0.9, y*0.9) 40 | elif country == 'LiDAR': 41 | xytext = (0.7 * np.sign(x), y * 1.1) 42 | connectionstyle += ",rad=0.0" 43 | xy=(x*0.9, y*0.9) 44 | elif country == 'Stereo Camera': 45 | xytext = (0.9 * np.sign(x), y*1.2) 46 | connectionstyle += ",rad=0.5" 47 | xy=(x*0.9, y*0.9) 48 | elif country == 'Radar': 49 | xytext = (1.4 * np.sign(x), y * 1.3) 50 | connectionstyle += ",rad=0.5" 51 | xy=(x*0.9, y*0.9) 52 | elif country == 'Thermal Camera': 53 | xytext = (1.1 * np.sign(x), y*1.5) 54 | connectionstyle += ",rad=0.5" 55 | xy=(x*1.1-0.2, y) 56 | elif country == 'Fisheye Camera': 57 | xytext = (1.1 * np.sign(x), y*1.7) 58 | connectionstyle += ",rad=0.5" 59 | xy=(x*0.9, y*0.9) 60 | elif country == 'Event Camera': 61 | xytext = (1.1 * np.sign(x), y-0.1) 62 | connectionstyle += ",rad=0.0" 63 | horizontalalignment='left' 64 | xy = (x*0.9, y) 65 | else: 66 | xytext = (1.1 * np.sign(x), y * 1.5) 67 | connectionstyle += ",rad=0.5" 68 | 69 | ax.annotate(f"{country} {percent}%", xy=xy, xytext=xytext, 70 | horizontalalignment=horizontalalignment, verticalalignment='center', fontsize='35', 71 | arrowprops=dict(arrowstyle="-", connectionstyle=connectionstyle)) 72 | 73 | 74 | plt.subplots_adjust(top=0.98, bottom=0.02, left=0.02, right=0.98) 75 | plt.show() 76 | 77 | plt.savefig("sensor_dist.pdf", dpi=200, bbox_inches='tight') 78 | -------------------------------------------------------------------------------- /data_statistics/world_dist/world_dist.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/data_statistics/world_dist/world_dist.pdf -------------------------------------------------------------------------------- /data_statistics/world_dist/world_dist.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import matplotlib.cm as cm 3 | import numpy as np 4 | 5 | countries = ['USA', 'Synthetic', 'Germany', 'Europe', 'China', 'Worldwide', 'Canada', 'Korea', 'UK', 'Japan', 6 | 'Australia', 'Singapore', 'Others'] 7 | numbers = [40, 35, 24, 24, 16, 14, 8, 7, 5, 4, 3, 2, 9] 8 | alpha = 0.8 9 | colors = cm.twilight(np.linspace(0, 1, len(numbers))) # twilight Pastel1 10 | colors_with_alpha = [(r, g, b, alpha) for r, g, b, _ in colors] 11 | 12 | total = sum(numbers) 13 | 14 | fig, ax = plt.subplots(figsize=(13, 11)) 15 | # wedges, texts, autotexts = ax.pie(numbers, textprops=dict(color="w"), autopct="") 16 | wedges, texts, autotexts = ax.pie(numbers, textprops=dict(color="w"), autopct="", colors=colors_with_alpha, radius=0.9) 17 | 18 | 19 | for i, (p, num) in enumerate(zip(wedges, numbers)): 20 | ang = (p.theta2 - p.theta1)/2. + p.theta1 21 | y = np.sin(np.deg2rad(ang)) 22 | x = np.cos(np.deg2rad(ang)) 23 | ax.text(x*0.7, y*0.7, str(num), ha="center", va="center", color="black", fontsize='22') 24 | 25 | 26 | for wedge in wedges: 27 | wedge.set_edgecolor('black') 28 | 29 | 30 | for i, (country, num, p) in enumerate(zip(countries, numbers, wedges)): 31 | ang = (p.theta2 - p.theta1) / 2. + p.theta1 32 | y = np.sin(np.deg2rad(ang)) 33 | x = np.cos(np.deg2rad(ang)) 34 | horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))] 35 | verticalalignment = "center" 36 | connectionstyle = f"angle,angleA=0,angleB={ang},rad=0.5" 37 | percent = int(num / total * 100) 38 | 39 | if country == 'Europe(except Germany)': 40 | country = "Europe\n(except Germany)" 41 | xytext = (0.9 * np.sign(x), y * 0.9 if y >= 0 else y * 0.9) 42 | verticalalignment = 'center' 43 | else: 44 | xytext = (1.1 * np.sign(x), y * 1.1) 45 | 46 | percent = round(num / total * 100, 2) 47 | 48 | ax.annotate(f"{country} {percent}%", xy=(x*0.9, y*0.9), xytext=xytext, 49 | horizontalalignment=horizontalalignment, verticalalignment=verticalalignment, fontsize='25', 50 | arrowprops=dict(arrowstyle="-", connectionstyle=connectionstyle)) 51 | 52 | plt.subplots_adjust(top=0.9, bottom=0.1, left=0.05, right=0.95) 53 | plt.show() 54 | 55 | plt.savefig("world_dist.pdf", dpi=200, bbox_inches='tight') 56 | -------------------------------------------------------------------------------- /figures/bev_dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/bev_dist.png -------------------------------------------------------------------------------- /figures/chronological_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/chronological_overview.png -------------------------------------------------------------------------------- /figures/comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/comparison.png -------------------------------------------------------------------------------- /figures/fig14_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/fig14_frame.png -------------------------------------------------------------------------------- /figures/fig15_distance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/fig15_distance.png -------------------------------------------------------------------------------- /figures/figure9_ad_task_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/figure9_ad_task_overview.png -------------------------------------------------------------------------------- /figures/perception_datasets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/perception_datasets.png -------------------------------------------------------------------------------- /figures/prediction_planning_control_datasets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/prediction_planning_control_datasets.png -------------------------------------------------------------------------------- /figures/vlm_ad_datasets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/vlm_ad_datasets.png -------------------------------------------------------------------------------- /figures/world_dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MingyuLiu1/autonomous_driving_datasets/22ebcd1a8d0caec27c12cb0cb383482a9eefd45a/figures/world_dist.png --------------------------------------------------------------------------------