├── 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 |
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
--------------------------------------------------------------------------------