保姆级教程:用Python和nuscenes-devkit从零玩转nuScenes数据集(附完整代码)

张开发
2026/4/6 1:50:48 15 分钟阅读

分享文章

保姆级教程:用Python和nuscenes-devkit从零玩转nuScenes数据集(附完整代码)
从零玩转nuScenes数据集Python实战指南自动驾驶研究离不开高质量的数据集支持而nuScenes作为当前最全面的多模态自动驾驶数据集之一正成为学术界和工业界的热门选择。但对于刚接触这个数据集的新手来说面对复杂的文件夹结构和JSON元数据往往会感到无从下手。本文将手把手带你完成环境配置、数据加载、关键概念理解并通过完整的Python代码示例实现点云与图像的可视化、标注框渲染等核心操作。1. 环境准备与数据集获取在开始之前我们需要准备好Python环境和数据集。推荐使用Anaconda创建独立的虚拟环境避免依赖冲突conda create -n nuscenes python3.8 conda activate nuscenes pip install nuscenes-devkit matplotlib opencv-pythonnuScenes提供了完整版和mini版数据集。对于初学者建议先从v1.0-mini开始import os from nuscenes.nuscenes import NuScenes # 设置数据集路径 DATAROOT data/sets/nuscenes os.makedirs(DATAROOT, exist_okTrue) # 初始化数据集 (假设已下载并解压v1.0-mini) nusc NuScenes(versionv1.0-mini, datarootDATAROOT, verboseTrue)成功初始化后你会看到类似这样的输出Loading NuScenes tables for version v1.0-mini... 23 category, 8 attribute, 4 visibility, 911 instance, 12 sensor, 103 calibrated_sensor, ...2. 理解nuScenes核心概念2.1 数据结构层级关系nuScenes采用层级化的数据结构设计Scene场景一段连续的20秒驾驶记录包含完整的传感器数据Sample样本场景中的关键帧每0.5秒采集一次2HzSampleData单个传感器在特定时刻的原始数据SampleAnnotation标注的3D边界框及其属性这些元素通过唯一的token字符串相互关联。例如获取第一个场景及其第一个样本first_scene nusc.scene[0] first_sample_token first_scene[first_sample_token] first_sample nusc.get(sample, first_sample_token)2.2 传感器配置nuScenes包含丰富的传感器数据传感器类型数量位置数据格式摄像头6前/后/左前/右前/左后/右后JPEG激光雷达1车顶bin毫米波雷达5前/左前/右前/左后/右后binGPS/IMU1车内JSON查看某个样本的所有传感器数据for sensor, sensor_token in first_sample[data].items(): sensor_data nusc.get(sample_data, sensor_token) print(f{sensor}: {sensor_data[filename]})3. 数据可视化实战3.1 图像与标注可视化渲染相机图像及其3D标注框# 选择前摄像头数据 cam_front_data nusc.get(sample_data, first_sample[data][CAM_FRONT]) # 渲染图像 nusc.render_sample_data(cam_front_data[token])这会显示带有3D标注框的相机图像。标注框的颜色代表不同物体类别。3.2 点云可视化可视化激光雷达点云数据# 获取激光雷达数据 lidar_data nusc.get(sample_data, first_sample[data][LIDAR_TOP]) # 渲染点云 nusc.render_sample_data(lidar_data[token], nsweeps5, underlay_mapTrue)参数说明nsweeps5聚合5帧点云数据underlay_mapTrue在地图背景上显示3.3 多模态融合可视化将激光雷达点云投影到相机图像nusc.render_pointcloud_in_image( sample_tokenfirst_sample[token], pointsensor_channelLIDAR_TOP, camera_channelCAM_FRONT )4. 高级技巧与实用代码4.1 轨迹可视化追踪某个物体在整个场景中的运动轨迹def plot_instance_trajectory(instance_token): instance nusc.get(instance, instance_token) annotations [nusc.get(sample_annotation, token) for token in nusc.field2token(sample_annotation, instance_token, instance_token)] # 提取中心点坐标 translations np.array([ann[translation] for ann in annotations]) # 可视化 plt.figure(figsize(10, 6)) plt.plot(translations[:, 0], translations[:, 1], .-) plt.title(fTrajectory of {nusc.get(category, instance[category_token])[name]}) plt.xlabel(X (m)) plt.ylabel(Y (m)) plt.grid() plt.show() # 示例可视化第一个instance的轨迹 plot_instance_trajectory(nusc.instance[0][token])4.2 自定义渲染样式修改默认的渲染颜色和样式from nuscenes.utils.color_map import get_colormap # 自定义颜色映射 custom_colormap { vehicle.car: (255, 0, 0), # 红色 human.pedestrian: (0, 255, 0) # 绿色 } # 应用自定义样式渲染 nusc.render_sample_data( first_sample[data][CAM_FRONT], extra_infoTrue, box_vis_levelBoxVisibility.ANY, colorscustom_colormap )4.3 数据增强示例实现简单的点云数据增强def augment_pointcloud(sample_token, pointsensor_channelLIDAR_TOP): # 获取原始点云 pointsensor nusc.get(sample_data, first_sample[data][pointsensor_channel]) pcl_path os.path.join(nusc.dataroot, pointsensor[filename]) pc LidarPointCloud.from_file(pcl_path) # 添加随机噪声 noise np.random.normal(0, 0.1, pc.points.shape) augmented_pc pc.points noise # 可视化对比 fig, (ax1, ax2) plt.subplots(1, 2, figsize(15, 6)) pc.render_height(ax1, titleOriginal Point Cloud) LidarPointCloud(augmented_pc).render_height(ax2, titleAugmented Point Cloud) plt.show() augment_pointcloud(first_sample[token])5. 常见问题解决方案在实际使用nuScenes数据集时你可能会遇到以下典型问题问题1内存不足处理大型数据集解决方案使用生成器逐样本加载def sample_generator(nusc): for scene in nusc.scene: sample_token scene[first_sample_token] while sample_token: sample nusc.get(sample, sample_token) yield sample sample_token sample[next]问题2坐标转换复杂nuScenes涉及多个坐标系全局坐标系地图自车坐标系ego传感器坐标系转换示例from nuscenes.utils.geometry_utils import transform_matrix # 获取传感器校准信息 calibrated_sensor nusc.get(calibrated_sensor, lidar_data[calibrated_sensor_token]) sensor_to_ego transform_matrix(calibrated_sensor[translation], Quaternion(calibrated_sensor[rotation])) # 获取自车姿态 ego_pose nusc.get(ego_pose, lidar_data[ego_pose_token]) ego_to_global transform_matrix(ego_pose[translation], Quaternion(ego_pose[rotation]))问题3标注数据筛选按条件筛选特定类型的标注# 筛选所有车辆标注 vehicle_anns [ann for ann in nusc.sample_annotation if nusc.get(category, ann[category_token])[name].startswith(vehicle)] # 筛选可见性高的行人 visible_pedestrians [ann for ann in nusc.sample_annotation if (nusc.get(category, ann[category_token])[name].startswith(human) and ann[visibility_token] in [visibility_80-100, visibility_60-80])]掌握这些核心概念和实用技巧后你就可以基于nuScenes数据集开展各种自动驾驶相关的研究和开发工作了。建议从简单的可视化开始逐步深入到模型训练和算法开发。

更多文章