defcreate_waymo_infos(dataset_cfg,class_names,data_path,save_path,raw_data_tag='raw_data',processed_data_tag='waymo_processed_data',workers=min(16,multiprocessing.cpu_count()),update_info_only=False):dataset=WaymoDataset(dataset_cfg=dataset_cfg,class_names=class_names,root_path=data_path,training=False,logger=common_utils.create_logger())train_split,val_split='train','val'train_filename=save_path/('%s_infos_%s.pkl'%(processed_data_tag,train_split))val_filename=save_path/('%s_infos_%s.pkl'%(processed_data_tag,val_split))os.environ["CUDA_VISIBLE_DEVICES"]="-1"print('---------------Start to generate data infos---------------')dataset.set_split(train_split)waymo_infos_train=dataset.get_infos(raw_data_path=data_path/raw_data_tag,save_path=save_path/processed_data_tag,num_workers=workers,has_label=True,sampled_interval=1,update_info_only=update_info_only)
defget_infos(self,raw_data_path,save_path,num_workers=multiprocessing.cpu_count(),has_label=True,sampled_interval=1,update_info_only=False):from.importwaymo_utilsprint('---------------The waymo sample interval is %d, total sequecnes is %d-----------------'%(sampled_interval,len(self.sample_sequence_list)))process_single_sequence=partial(waymo_utils.process_single_sequence,save_path=save_path,sampled_interval=sampled_interval,has_label=has_label,update_info_only=update_info_only)sample_sequence_file_list=[self.check_sequence_name_with_all_version(raw_data_path/sequence_file)forsequence_fileinself.sample_sequence_list]# process_single_sequence(sample_sequence_file_list[0])withmultiprocessing.Pool(num_workers)asp:sequence_infos=list(tqdm(p.imap(process_single_sequence,sample_sequence_file_list),total=len(sample_sequence_file_list)))all_sequences_infos=[itemforinfosinsequence_infosforitemininfos]returnall_sequences_infos
ifhas_label:annotations=generate_labels(frame,pose=pose)info['annos']=annotationsifupdate_info_onlyandsequence_infos_oldisnotNone:assertinfo['frame_id']==sequence_infos_old[cnt]['frame_id']num_points_of_each_lidar=sequence_infos_old[cnt]['num_points_of_each_lidar']else:num_points_of_each_lidar=save_lidar_points(frame,cur_save_dir/('%04d.npy'%cnt),use_two_returns=use_two_returns)info['num_points_of_each_lidar']=num_points_of_each_lidarsequence_infos.append(info)withopen(pkl_file,'wb')asf:pickle.dump(sequence_infos,f)print('Infos are saved to (sampled_interval=%d): %s'%(sampled_interval,pkl_file))returnsequence_infos
标注框信息记录在 annos 字段中,点云数据通过 save_lidar_points 保存,保存路径可以通过序列号和帧序号确定,因此训练时先通过 point_cloud(或 frame_id) 字段定位保存的点云帧,然后读取点云数据。所以,下一步要检查的是 save_lidar_points 里面到底是怎么 save 的。相关代码片段如下:
defsave_lidar_points(frame,cur_save_path,use_two_returns=True):ret_outputs=frame_utils.parse_range_image_and_camera_projection(frame)iflen(ret_outputs)==4:range_images,camera_projections,seg_labels,range_image_top_pose=ret_outputselse:assertlen(ret_outputs)==3range_images,camera_projections,range_image_top_pose=ret_outputspoints,cp_points,points_in_NLZ_flag,points_intensity,points_elongation=convert_range_image_to_point_cloud(frame,range_images,camera_projections,range_image_top_pose,ri_index=(0,1)ifuse_two_returnselse(0,))# 3d points in vehicle frame.points_all=np.concatenate(points,axis=0)