如何将Waymo数据集中的TFRecord文件提取为可正常读取的JPEG图片
问题根因
你当前的代码直接将TFRecord中序列化的全量Frame数据写入文件,未解析出其中独立的JPEG图像字段,导出的文件并非合法JPEG格式,自然无法正常打开。
修正方案
依赖准备
先安装与你的TensorFlow版本匹配的Waymo数据集解析包,比如对应TF2.15版本可执行pip install waymo-open-dataset-tf-2-15-0,版本号后缀可根据你的实际TF版本调整。
修正后代码
import tensorflow as tf from waymo_open_dataset import dataset_pb2 as open_dataset FILENAME = 'D:\\waymo3\\waymo_open_dataset_v_1_2_0_individual_files\\training\\segment-15832924468527961_1564_160_1584_160_with_camera_labels.tfrecord' SAVE_DIR = 'C:\\Users\\my_user\\Desktop\\extracted_pic\\' dataset = tf.data.TFRecordDataset(FILENAME, compression_type='') frame_idx = 0 # 相机名映射,方便命名文件 camera_name_map = { 0: 'unknown', 1: 'front', 2: 'front_left', 3: 'front_right', 4: 'side_left', 5: 'side_right' } for serialized_data in dataset: # 反序列化为Frame对象 frame = open_dataset.Frame() frame.ParseFromString(bytearray(serialized_data.numpy())) # 遍历该帧下所有相机的图像 for camera_image in frame.images: camera_name = camera_name_map[camera_image.name] save_path = f"{SAVE_DIR}{frame_idx}_{camera_name}.jpeg" # 直接写入JPEG二进制数据 with open(save_path, 'wb') as f: f.write(camera_image.image) frame_idx += 1 # 可选:添加进度打印 if frame_idx % 10 == 0: print(f"已处理{frame_idx}帧")
补充说明
- Waymo的每帧TFRecord数据包含5个不同方位相机的图像,上述代码会分别导出同一帧下的所有相机图片,命名规则为
帧序号_相机方位.jpeg - 如果不想安装完整的Waymo解析包,也可以自行构造
tf.train.Example的特征解析字典,直接定位到JPEG数据的字节字段,不过使用官方提供的Proto解析类稳定性更高,也能同时获取其他标注字段。 - Windows环境下路径不需要额外调整,确保保存目录已提前创建即可,代码不会自动创建不存在的目录。
内容的提问来源于stack exchange,提问作者material bug
相关产品推荐
相关产品推荐

