GraspNet 数据集文件说明
本文档说明根目录下各个数据集文件的用途。这些文件用于训练 GraspNet 大模型,GraspNet 是一个用于通用物体抓取的大规模基准数据集(GraspNet-1Billion)。
数据集文件概览
根据 GraspNet 数据集网站 和 GraspNet Baseline 仓库 的说明,根目录下的文件分类如下:
1. 训练图像文件(Train Images)
- train_1.zip [20 GB]
- train_2.zip [20 GB]
- train_3.zip [20 GB]
- train_4.zip [6.3 GB]
用途:这些压缩包包含所有场景的 RGB-D 图像数据(共190个场景,包括训练集和测试集)。总共约 66.3 GB 的图像数据,涵盖了不同场景、不同物体的多视角图像,用于训练和评估 GraspNet 模型学习物体的抓取姿态。
注意 :虽然文件名包含"train",但这些压缩包实际上包含了所有190个场景(scene_0000 到 scene_0189),包括训练场景和测试场景。解压后应统一放在 scenes/ 目录下。
目录结构 :每个训练图像压缩包解压后的场景结构如下(解压后应直接放在 scenes/ 目录下):
text
scene_XXXX/
├── object_id_list.txt # 场景中物体的ID列表(0索引)
├── rs_wrt_kn.npy # RealSense相机相对于Kinect相机的变换矩阵,shape: 256x(4x4)
├── realsense/ # RealSense D435相机数据
│ ├── camera_poses.npy # 256个相机位姿(相对于第一帧),shape: 256x(4x4)
│ ├── camK.npy # 相机内参矩阵,shape: 3x3
│ ├── cam0_wrt_table.npy # 第一帧相机相对于桌子的位姿,shape: 4x4
│ ├── rgb/ # RGB彩色图像(PNG格式)
│ │ ├── 0000.png # 256张RGB图像(0000-0255)
│ │ ├── 0001.png
│ │ └── ...
│ ├── depth/ # 深度图像(PNG格式,16位)
│ │ ├── 0000.png # 256张深度图像(0000-0255)
│ │ ├── 0001.png
│ │ └── ...
│ ├── label/ # 语义分割标签(PNG格式)
│ │ ├── 0000.png # 256张标签图像(0000-0255)
│ │ ├── 0001.png # 0=背景,1-88=物体ID(1索引)
│ │ └── ...
│ ├── annotations/ # 物体6D姿态标注(XML格式)
│ │ ├── 0000.xml # 256个XML标注文件(0000-0255)
│ │ ├── 0001.xml
│ │ └── ...
│ ├── meta/ # 物体6D姿态标注(MAT格式,与YCB-Video格式相同)
│ │ ├── 0000.mat # 256个MAT标注文件(0000-0255)
│ │ ├── 0001.mat
│ │ └── ...
│ └── rect/ # 2D平面抓取标签
│ ├── 0000.npy # 256个2D平面抓取标签(0000-0255)
│ ├── 0001.npy
│ └── ...
└── kinect/ # Kinect Azure相机数据(结构与realsense完全相同)
├── camera_poses.npy
├── camK.npy
├── cam0_wrt_table.npy
├── rgb/
├── depth/
├── label/
├── annotations/
├── meta/
└── rect/
关键说明:
- 每个场景(scene_XXXX)包含 256个视角的图像(0000-0255)
- 每个场景都有两种相机的数据:RealSense D435 和 Kinect Azure
- RGB图像:彩色图像(PNG格式),用于视觉特征提取
- Depth图像:深度图(PNG格式,16位),单位为毫米,用于3D点云重建
- Label图像:语义分割标签(PNG格式),0表示背景,1-88表示物体ID(1索引,对应物体000-087)
- Annotations(XML) :物体6D姿态标注,
pos_in_world和ori_in_world表示物体在世界坐标系中的位置和方向 - Meta(MAT):物体6D姿态标注的MAT格式版本,与YCB-Video数据集格式相同,便于使用
- Rect(NPY):2D平面抓取标签,用于2D抓取检测任务
- camera_poses.npy :NumPy数组,shape为
(256, 4, 4),包含256个视角的相机位姿(相对于第一帧) - camK.npy :相机内参矩阵,shape为
(3, 3),包含焦距和主点坐标 - cam0_wrt_table.npy :第一帧相机相对于桌子的位姿,shape为
(4, 4) - object_id_list.txt:文本文件,列出该场景中出现的所有物体ID(0索引)
- rs_wrt_kn.npy :RealSense相机坐标系相对于Kinect相机坐标系的变换矩阵,shape为
(256, 4, 4)
2. 6自由度抓取标签(6 DoF Grasp Labels)
- grasp_label.zip [1.9 GB]
用途:包含 6 自由度(6 DoF)的抓取姿态标签。这些标签定义了每个物体在场景中的有效抓取姿态,包括:
- 抓取点的位置(3D坐标)
- 抓取方向(旋转角度)
- 抓取宽度等参数
这些标签是训练模型的核心监督信号,模型需要学习预测类似的抓取姿态。
目录结构:解压后的结构如下:
text
grasp_label/
├── 000_labels.npz # 物体ID为000的抓取标签
├── 001_labels.npz # 物体ID为001的抓取标签
├── 002_labels.npz
└── ...
关键说明:
- 共包含 88个物体的抓取标签(000_labels.npz 到 087_labels.npz)
- 每个
.npz文件是一个NumPy压缩文件,包含该物体的所有有效抓取姿态 - 每个抓取姿态包含:
- 抓取点位置(3D坐标)
- 抓取方向(旋转矩阵或四元数)
- 抓取宽度(gripper width)
- 抓取质量分数等参数
- 这些标签与训练图像中的物体ID对应(object_id_list.txt中的ID)
- 每个物体可能有数千到数万个候选抓取姿态
3. 碰撞标签(Collision Labels)
- collision_label.zip [0.4 GB]
用途:包含碰撞检测相关的标签。这些标签用于标识哪些抓取姿态会与场景中的其他物体或环境发生碰撞。在训练和推理过程中,碰撞检测用于过滤掉不可行的抓取姿态,提高抓取成功率。
目录结构:解压后的结构如下:
text
collision_label/
├── scene_0000/
│ └── collision_labels.npz # 场景0000的碰撞标签
├── scene_0001/
│ └── collision_labels.npz
├── scene_0005/
│ └── collision_labels.npz
└── ...
关键说明:
- 按场景组织,每个场景对应一个
collision_labels.npz文件 - 碰撞标签标识了在该场景中,哪些抓取姿态会发生碰撞(与场景中的其他物体或环境碰撞)
- 用于后处理阶段过滤不可行的抓取姿态,提高抓取成功率
- 不是所有训练场景都有碰撞标签,只有部分场景包含
- 碰撞检测考虑了机器人手部模型和场景几何
4. 物体3D模型(3D Object Models)
- models.zip [4.3 GB]
用途:包含所有88个物体的3D模型文件。这些模型用于:
- 可视化物体和抓取姿态
- 碰撞检测计算
- 生成合成数据
- 物体识别和姿态估计
目录结构:解压后的结构如下:
text
models/
├── 000/ # 物体ID为000的3D模型
│ ├── textured.obj # 带纹理的OBJ格式3D模型
│ ├── textured.obj.mtl # OBJ模型的材质文件
│ ├── textured.jpg # 纹理贴图(或texture_map.png)
│ ├── textured.sdf # SDF(Signed Distance Field)格式文件
│ ├── nontextured.ply # 不带纹理的PLY格式点云模型
│ └── nontextured_simplified.ply # 简化版PLY模型(用于快速渲染)
├── 001/
│ └── ...
├── ...
└── 087/ # 共88个物体(000-087)
关键说明:
- 共包含 88个物体的3D模型(000 到 087)
- 每个物体目录包含多种格式的模型文件:
- textured.obj:带纹理的3D网格模型(OBJ格式)
- nontextured.ply:不带纹理的点云模型(PLY格式)
- nontextured_simplified.ply:简化版PLY模型,用于快速渲染和碰撞检测
- textured.sdf:有符号距离场(SDF)格式,用于精确的几何计算
- textured.jpg/png:纹理贴图文件
- 这些模型与场景中出现的物体ID对应
- 模型文件可用于可视化、碰撞检测和评估
5. DexNet模型(DexNet Models,可选但强烈推荐)
- dex_models.zip [8.9 GB]
用途:包含用于加速评估的DexNet模型文件。这些模型是预计算的抓取质量评估模型,用于:
- 加速评估过程:在评估阶段快速计算抓取质量分数
- 提高评估效率:避免实时计算抓取质量
- 与GraspNet评估流程兼容
目录结构:解压后的结构如下:
text
dex_models/
├── 000.pkl # 物体ID为000的DexNet模型
├── 001.pkl # 物体ID为001的DexNet模型
├── 002.pkl
├── ...
└── 087.pkl # 共88个物体(000-087)
关键说明:
- 共包含 88个物体的DexNet模型文件(000.pkl 到 087.pkl)
- 每个
.pkl文件是一个Python pickle格式的预计算模型 - 强烈推荐下载:虽然可选,但可以显著加速评估过程
- 这些模型与物体3D模型(models/)和抓取标签(grasp_label/)对应
- 在评估脚本中会自动使用这些模型(如果存在)
6. 容差标签(Tolerance Labels)
- tolerance.tar [5.7 GB]
用途:容差标签用于评估抓取姿态的容差范围。根据 GraspNet Baseline 的 README 说明,容差标签并不包含在原始数据集中,需要额外生成。这些标签用于:
- 评估抓取姿态的鲁棒性
- 确定抓取姿态在不同扰动下的有效性范围
- 在评估阶段计算 AP(Average Precision)指标
注意 :如果 tolerance.tar 文件已存在,可以直接解压使用。否则,需要使用 dataset/generate_tolerance_label.py 脚本生成。
目录结构:解压后的结构通常按场景组织,类似于碰撞标签的结构。
关键说明:
- 容差标签用于评估抓取姿态的鲁棒性,即抓取姿态在受到小扰动时是否仍然有效
- 在评估阶段,容差标签用于计算不同容差阈值下的AP(Average Precision)指标
- 如果文件不存在,可以使用
dataset/generate_tolerance_label.py脚本从原始数据生成
数据集组织方式
官方推荐的数据集目录结构
根据 GraspNet 官方文档,下载并解压所有文件后,必须按照以下结构组织数据集:
text
graspnet/ # 数据集根目录(必须命名为graspnet)
├── scenes/ # 所有场景目录(训练+测试,共190个场景)
│ ├── scene_0000/
│ ├── scene_0001/
│ ├── ...
│ └── scene_0189/
│
├── models/ # 物体3D模型目录(从models.zip解压)
│ ├── 000/ # 物体ID为000的3D模型
│ │ ├── textured.obj
│ │ ├── nontextured.ply
│ │ ├── textured.sdf
│ │ └── ...
│ ├── 001/
│ ├── ...
│ └── 087/ # 共88个物体(000-087)
│
├── dex_models/ # DexNet模型(从dex_models.zip解压,可选但强烈推荐)
│ ├── 000.pkl # 物体ID为000的DexNet模型
│ ├── 001.pkl
│ ├── ...
│ └── 087.pkl # 共88个物体(000-087)
│
├── grasp_label/ # 6自由度抓取标签(从grasp_label.zip解压)
│ ├── 000_labels.npz
│ ├── 001_labels.npz
│ ├── ...
│ └── 087_labels.npz
│
└── collision_label/ # 碰撞标签(从collision_label.zip解压)
├── scene_0000/
├── scene_0001/
├── ...
└── scene_0189/
每个场景的详细目录结构
每个场景(scene_XXXX)的完整结构如下:
text
scenes/
└── scene_0000/
├── object_id_list.txt # 场景中出现的物体ID列表(0索引)
├── rs_wrt_kn.npy # RealSense相机相对于Kinect的位姿,shape: 256x(4x4)
│
├── kinect/ # Kinect Azure相机数据
│ ├── rgb/ # RGB彩色图像
│ │ ├── 0000.png # 256张RGB图像(0000-0255)
│ │ ├── 0001.png
│ │ ├── ...
│ │ └── 0255.png
│ │
│ ├── depth/ # 深度图像
│ │ ├── 0000.png # 256张深度图像(0000-0255)
│ │ ├── 0001.png
│ │ ├── ...
│ │ └── 0255.png
│ │
│ ├── label/ # 物体掩码图像
│ │ ├── 0000.png # 256张标签图像(0000-0255)
│ │ ├── 0001.png # 0=背景,1-88=物体ID(1索引)
│ │ ├── ... # 格式与YCB-Video数据集相同
│ │ └── 0255.png
│ │
│ ├── annotations/ # 物体6D姿态标注(XML格式)
│ │ ├── 0000.xml # 256个XML标注文件(0000-0255)
│ │ ├── 0001.xml # 'pos_in_world'和'ori_in_world'表示
│ │ ├── ... # 物体在世界坐标系中的位置和方向
│ │ └── 0255.xml
│ │
│ ├── meta/ # 物体6D姿态标注(MAT格式)
│ │ ├── 0000.mat # 256个MAT标注文件(0000-0255)
│ │ ├── 0001.mat # 与YCB-Video数据集格式相同,便于使用
│ │ ├── ...
│ │ └── 0255.mat
│ │
│ ├── rect/ # 2D平面抓取标签
│ │ ├── 0000.npy # 256个2D平面抓取标签(0000-0255)
│ │ ├── 0001.npy
│ │ ├── ...
│ │ └── 0255.npy
│ │
│ ├── camK.npy # 相机内参矩阵,shape: 3x3
│ │ # [[f_x, 0, c_x],
│ │ # [0, f_y, c_y],
│ │ # [0, 0, 1]]
│ │
│ ├── camera_poses.npy # 256个相机位姿(相对于第一帧),shape: 256x(4x4)
│ │
│ └── cam0_wrt_table.npy # 第一帧相机相对于桌子的位姿,shape: 4x4
│
└── realsense/ # RealSense D435相机数据(结构与kinect相同)
├── rgb/
├── depth/
├── label/
├── annotations/
├── meta/
├── rect/
├── camK.npy
├── camera_poses.npy
└── cam0_wrt_table.npy
数据组织步骤
-
创建数据集根目录
bashmkdir -p graspnet cd graspnet -
解压训练图像(所有场景)
bash# 将所有train_*.zip解压到scenes目录,它们会自动合并所有场景 mkdir -p scenes cd scenes unzip /path/to/train_1.zip unzip /path/to/train_2.zip unzip /path/to/train_3.zip unzip /path/to/train_4.zip cd ..注意 :解压后应该直接在
scenes/目录下看到 scene_0000, scene_0001 等目录,而不是嵌套在其他目录中。 -
解压标签文件
bash# 解压抓取标签(直接在graspnet根目录下) unzip /path/to/grasp_label.zip # 解压碰撞标签(直接在graspnet根目录下) unzip /path/to/collision_label.zip -
解压模型文件
bash# 解压物体3D模型(直接在graspnet根目录下) unzip /path/to/models.zip # 解压DexNet模型(可选,但强烈推荐,直接在graspnet根目录下) unzip /path/to/dex_models.zip -
解压容差标签(如果需要)
bash# 解压容差标签 mkdir -p tolerance tar -xvf /path/to/tolerance.tar -C tolerance/ -
验证数据结构
- 检查
scenes/下是否有190个场景目录(scene_0000 到 scene_0189) - 检查
grasp_label/下是否有88个XXX_labels.npz文件(000-087) - 检查
collision_label/下是否有场景目录 - 检查
models/下是否有88个物体目录(000-087),每个目录包含模型文件 - 检查
dex_models/下是否有88个.pkl文件(000.pkl 到 087.pkl,如果已解压) - 检查每个场景目录下是否有
kinect/和realsense/子目录 - 检查每个相机目录下是否有
rgb/,depth/,label/,annotations/,meta/,rect/等目录
- 检查
在训练代码中使用
在训练脚本中,需要指定数据集根目录:
bash
# 示例:在command_train.sh中设置
--dataset_root /path/to/graspnet # 指向graspnet根目录
--camera realsense # 或 kinect
代码会自动在以下路径查找数据:
- 场景数据:
{dataset_root}/scenes/scene_XXXX/{camera}/ - 抓取标签:
{dataset_root}/grasp_label/ - 碰撞标签:
{dataset_root}/collision_label/scene_XXXX/
数据集使用流程
- 创建数据集根目录 :创建名为
graspnet的根目录 - 解压训练图像 :将所有 train_*.zip 解压到
graspnet/scenes/目录(会自动合并所有190个场景) - 解压标签文件 :分别解压 grasp_label.zip 和 collision_label.zip 到
graspnet/根目录 - 解压模型文件 :解压 models.zip 和 dex_models.zip 到
graspnet/根目录(dex_models可选但推荐) - 处理容差标签:解压 tolerance.tar 或运行生成脚本(如果需要)
- 验证目录结构:确保目录结构符合官方要求
- 训练模型 :使用这些数据训练 GraspNet 模型,设置
--dataset_root指向graspnet目录 - 评估模型:使用测试集和标签评估模型性能
数据文件格式说明
图像文件格式
- RGB图像:PNG格式,24位彩色图像,分辨率通常为1280x720或640x480
- Depth图像:PNG格式,16位深度图,单位为毫米(mm),需要除以1000转换为米
- Label图像:PNG格式,每个像素值对应物体ID,0表示背景,1-88表示物体ID(1索引,对应物体000-087)
标注文件格式
- Annotations(XML) :包含物体的6D姿态信息,
pos_in_world和ori_in_world表示物体在世界坐标系中的位置和方向 - Meta(MAT):与YCB-Video数据集格式相同的6D姿态标注,便于直接使用
- Rect(NPY):2D平面抓取标签,NumPy数组格式
- camera_poses.npy :NumPy数组,形状为
(256, 4, 4),256个视角的相机位姿(相对于第一帧) - camK.npy :相机内参矩阵,形状为
(3, 3),包含焦距和主点坐标 - cam0_wrt_table.npy :第一帧相机相对于桌子的位姿,形状为
(4, 4) - rs_wrt_kn.npy :RealSense相对于Kinect的变换矩阵,形状为
(256, 4, 4) - grasp_label/*.npz:NumPy压缩文件,包含抓取姿态数组,每个抓取姿态包含位置、旋转、宽度等信息
- collision_labels.npz:NumPy压缩文件,布尔数组,标识哪些抓取姿态会发生碰撞
数据关联关系
- 场景中的物体ID(object_id_list.txt,0索引)对应抓取标签文件名(XXX_labels.npz,000-087)
- Label图像中的物体ID是1索引(1-88),对应物体000-087
- 每个场景有256个视角(0000-0255),对应RGB、Depth、Label、Annotations、Meta、Rect等文件
- 碰撞标签按场景组织,与
scenes/目录下的场景目录对应 - 所有场景(训练+测试)共190个(scene_0000 到 scene_0189),都放在
scenes/目录下
数据集规模
- 训练图像:约 66.4 GB(4个压缩包:train_1.zip 20GB, train_2.zip 20GB, train_3.zip 20GB, train_4.zip 6.4GB)
- 抓取标签:2.0 GB(88个物体的抓取姿态)
- 碰撞标签:0.4 GB(部分场景的碰撞检测结果)
- 物体3D模型:4.3 GB(88个物体的3D模型文件)
- DexNet模型:8.9 GB(88个物体的预计算模型,可选但推荐)
- 容差标签:5.7 GB(用于评估,可选)
总大小:约 88.7 GB(包含所有必需文件),约 103.3 GB(包含所有可选文件)
相关资源
- 数据集网站 :https://graspnet.net/datasets.html
- Baseline 代码仓库 :https://github.com/graspnet/graspnet-baseline
- 论文:GraspNet-1Billion: A Large-Scale Benchmark for General Object Grasping (CVPR 2020)
许可证
所有数据、标签、代码和模型属于 graspnet 团队、MVIG、SJTU,采用 Creative Commons Attribution 4.0 Non Commercial License (BY-NC-SA) 许可。可免费用于非商业用途,并可在相同条件下重新分发。商业用途需要联系 fhaoshu@gmail.com 并抄送 lucewu@sjtu.edu.cn。
常用命令说明
查看压缩包内容
命令 :unzip -l dex_models.zip | head -30
命令分解:
unzip -l dex_models.zip:列出压缩包内容(不实际解压)unzip:解压工具-l:列出模式,只显示文件列表dex_models.zip:要查看的压缩包文件名
|:管道符,将前一个命令的输出传递给下一个命令head -30:显示前30行输出head:显示文件的前几行-30:指定显示前30行
作用:在不解压的情况下,快速查看压缩包中的前30个文件(或前30行信息)
输出示例:
text
Archive: dex_models.zip
Length Date Time Name
--------- ---------- ----- ----
0 2022-11-24 18:02 dex_models/
212422738 2022-11-24 17:54 dex_models/049.pkl
381349076 2022-11-24 18:01 dex_models/085.pkl
...
类似用法:
unzip -l train_1.zip | head -50:查看 train_1.zip 的前50个文件unzip -l models.zip | grep "\.obj$":查找 models.zip 中所有 .obj 文件unzip -l grasp_label.zip | wc -l:统计 grasp_label.zip 中的文件总数