def process_sample_data(nuscenes, map_data, sample_data, lidar, config): # Render static road geometry masks map_masks = nusc_utils.get_map_masks(nuscenes, map_data, sample_data, config.map_extents, config.map_resolution) # Render dynamic object masks obj_masks = nusc_utils.get_object_masks(nuscenes, sample_data, config.map_extents, config.map_resolution) masks = np.concatenate([map_masks, obj_masks], axis=0) # Ignore regions of the BEV which are outside the image sensor = nuscenes.get('calibrated_sensor', sample_data['calibrated_sensor_token']) intrinsics = np.array(sensor['camera_intrinsic']) masks[-1] |= ~get_visible_mask(intrinsics, sample_data['width'], config.map_extents, config.map_resolution) # Transform lidar points into camera coordinates cam_transform = nusc_utils.get_sensor_transform(nuscenes, sample_data) cam_points = transform(np.linalg.inv(cam_transform), lidar) masks[-1] |= get_occlusion_mask(cam_points, config.map_extents, config.map_resolution) # Encode masks as integer bitmask labels = encode_binary_labels(masks) # Save outputs to disk output_path = os.path.join(os.path.expandvars(config.label_root), sample_data['token'] + '.png') Image.fromarray(labels.astype(np.int32), mode='I').save(output_path)
def process_sample(nuscenes, map_data, sample, config): # Load the lidar point cloud associated with this sample lidar_data = nuscenes.get('sample_data', sample['data']['LIDAR_TOP']) lidar_pcl = nusc_utils.load_point_cloud(nuscenes, lidar_data) # Transform points into world coordinate system lidar_transform = nusc_utils.get_sensor_transform(nuscenes, lidar_data) lidar_pcl = transform(lidar_transform, lidar_pcl) # Iterate over sample data for camera in nusc_utils.CAMERA_NAMES: sample_data = nuscenes.get('sample_data', sample['data'][camera]) process_sample_data(nuscenes, map_data, sample_data, lidar_pcl, config)