File size: 12,213 Bytes
05008fd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | # DOWNLOAD_GUIDE — per-dataset acquisition + conversion
How to obtain each dataset we integrated and convert it into the unified contract
(`DATA_FORMAT.md`). For each dataset: **host/URL**, **access** (open vs gated),
**approx size**, **how to get it**, and the **coordinate conversion** to our
contract (condensed from the verified
`code/mv-sam3d-for-6d-v2/docs/dataset_convention_spec.md` — that file is the
authority if anything here is ambiguous).
Put everything under one root and point the config at it:
```bash
export MIGRATOR_DATA_ROOT=/path/to/datasets # each dataset in its own subdir
```
After downloading a dataset, build its canonical SS latents once (see
`DATA_FORMAT.md` §4) before training on it.
Legend for conversion status (from the spec): ✅ = empirically reprojection-IoU
verified; 🔵 = code/cross-check verified.
Notation: `R_oc,t_oc` = object(CAD)→cam OpenCV meters (`x_cam=R_oc·p_cad+t_oc`);
`p_cad` = mesh verts (m). Adapters return raw OpenCV meters — never pre-apply the
`D=diag(-1,-1,1)` flip or the canonical `M` (the base loader does that).
---
# TRAINING DATASETS
## DexYCB (reference; 20 YCB objects) — subdir `dexycb/`
- **Host**: https://dex-ycb.github.io/ (NVIDIA). Open, registration-free download
links on the project page ("Download").
- **Size**: ~1.4 TB full; the s0/s1 subset + models is enough to train the
reference config.
- **Get it**: download the tarballs from the project page and extract so the
layout matches `DATA_FORMAT.md` §6 (`calibration/`, `models/`,
`YYYYMMDD-subject-NN/<seq>/<serial>/...`). Meshes are the YCB
`textured_simple.obj` (already in the DexYCB `models/` release).
- **Conversion** 🔵: obj pose `pose_y` in `labels_XXXXXX.npz` is already obj→cam
OpenCV meters (no flip). depth `aligned_depth_to_color_*.png` uint16 mm →
`/1000`. K from `calibration/intrinsics/<serial>_640x480.yml`. extrinsics =
per-serial tag→cam from `calibration/extrinsics_*/extrinsics.yml`. mask =
`seg == ycb_id`. mesh `models/<obj>/textured_simple.obj` (m).
## YCB-V (train; 21 YCB objects) — subdir `ycbv/`
- **Host**: BOP — https://bop.felk.cvut.cz/datasets/ (dataset "YCB-V").
- **Access**: open. **Note**: the training split usually must be fetched from BOP
(`ycbv_train_real.zip`); only models + test may already be local.
- **Size**: base+models ~10 GB; `train_real` ~= 60 GB.
- **Get it** (BOP WebDAV / HTTPS):
```bash
cd $MIGRATOR_DATA_ROOT/ycbv
for f in ycbv_base ycbv_models ycbv_train_real ycbv_test_bop19; do
wget https://bop.felk.cvut.cz/media/data/bop_datasets/${f}.zip && unzip ${f}.zip
done
```
- **Conversion** 🔵 (BOP, native OpenCV, no flip): `R_oc=cam_R_m2c.reshape(3,3)`,
`t_oc=cam_t_m2c*1e-3`. mesh `models_eval/obj_{id:06d}.ply /1000`.
`depth=raw*depth_scale/1000`. K=`cam_K`. extrinsics `cam_R/t_w2c` (mm→m)
world→cam. masks `mask_visib/`.
## PACE (train; 238 non-YCB objects) — subdir `pace/`
- **Host**: PACE project / Hugging Face (search "PACE 6DoF pose", ~295 GB).
Use the **real** split (3× RealSense rig); PACE-Sim is single-view PBR and
yields no multi-view pairs.
- **Access**: open (HF). License mostly MIT.
- **Get it**: `huggingface-cli download <pace-repo> --repo-type dataset --local-dir $MIGRATOR_DATA_ROOT/pace`.
- **Conversion** ✅ (IoU 0.90–0.97, BOP-style): `R_oc=cam_R_m2c.reshape(3,3)`,
`t_oc=cam_t_m2c/1000`. mesh `models_eval/obj_XXXXXX.ply /1000`.
`depth=raw*depth_scale/1000` (real depth_scale=1.0; PBR /10000). K=`cam_K`.
⚠️ real split has NO `cam_R/t_w2c` — the 3-cam rig is stored as separate scene
folders, per-view poses are self-contained (static-scene regime).
⚠️ **FILTER ARTICULATED**: drop `obj_id 545..692` (AKB-48); keep `0..544`
rigid. masks `{imgid:06d}_{gtidx:06d}.png` (gtidx into `scene_gt`).
## GraspNet-1B (train + `test_novel` held-out; ~56 non-YCB of 88) — subdir `graspnet/`
- **Host**: https://graspnet.net/ (download page). **License CC BY-NC** (non-commercial).
- **Size**: ~170 GB.
- **Get it**: register/agree on the site, download the Kinect+RealSense scene
archives + `models/`, extract into `graspnet/`.
- **Conversion** ✅ (IoU 0.981): `R_oc=meta['poses'][:3,:3,i]`,
`t_oc=meta['poses'][:3,3,i]` (m). mesh `models/%03d/nontextured.ply` (m).
⚠️ **OBJECT-ID OFF-BY-ONE**: `cls_indexes` value `V` → mesh `models/(V-1)`.
`depth=raw/1000`. K=`camK.npy` (Kinect ≠ RealSense — read per-scene). per-view
poses already in cam frame (static-scene regime; no camera-pose file needed).
## HouseCat6D (TRAIN + held-out benchmark; 194 non-YCB) — subdir `housecat6d/extracted/`
- **Host**: https://sites.google.com/view/housecat6d (project). Open.
- **Size**: ~59 GB train (`.sqsh`/squashfs) + extracted test.
- **Get it**: download from the project page; mount/extract the squashfs so
`housecat6d/extracted/<scene>/...` exists.
- **Conversion** ✅ (IoU 0.854): `R_oc,t_oc` = label pkl `rotations[i]`,
`translations[i]` — ALREADY obj→cam OpenCV meters (identity conversion). mesh
`obj_models_small_size_final/<cat>/<model>.obj` (m, origin-centered;
`cat`=token before `-`). `depth /1000`. K=`intrinsics.txt`.
`camera_pose/NNNNNN.txt` is CAM→WORLD (invert for world→cam); train/val have NO
extrinsics — use the pkl poses directly. ⚠️ masks: bg=255, use `mask != 255`
(NOT `>0`). Index by `model_list`, not `class_ids`. Do NOT rescale by `scales`.
## HO-Cap (TRAIN-only pseudo-GT; 64 non-YCB) — subdir `hocap/`
- **Host**: HO-Cap project (Hugging Face / project page). License CC BY 4.0.
- **Size**: ~102 GB. GT is pseudo (FoundationPose+SDF); meshes BundleSDF-reconstructed.
- **Get it**: download the per-subject zips + the poses/labels zips (they ship
separately) and the `models/` zip; extract under `hocap/`.
- **Conversion** ✅ (IoU 0.77–0.87): per-frame `label_<frame>.npz['obj_poses']`
is already per-cam obj→cam (verified 1e-7) — use it directly. Otherwise
`T_oc(s)=rs_RTs_inv[s]@quat_to_mat(poses_o[o,f])` with `poses_o.npy`
`[qx,qy,qz,qw,tx,ty,tz]` (scipy xyzw, obj→world, world=tag_1). mesh
`models/<id>/textured_mesh.obj` (m). `depth /1000` with the COLOR K. ⚠️
seg ids are LOCAL 1..4 (objects) / 5 rh / 6 lh.
## HOGraspNet (train; 30 objects, 22 YCB + 8 new) — subdir `hograspnet/`
- **Host**: HOGraspNet project — **gated by a request form**. Annotations are
gated; the scanned meshes are downloadable.
- **Size**: ~large; ~375k states.
- **Get it**: fill the access form on the project page; you receive links to the
images/annotations. Meshes: `obj_scanned_models/`.
- **Conversion** 🔵: `object_mat` = 4×4 obj→world (world=mas cam);
`extrinsic` = (3,4) world→cam; `T_oc = M4(extrinsic) @ object_mat`;
`R_oc=T_oc[:3,:3]`, `t_oc=T_oc[:3,3]/100` (cm→m). mesh
`obj_scanned_models/<name>.obj` with `p_cad = (S*V_raw)/100`, `S` =
`_OBJECT_SCALE_FIXED[idx-1]` (⚠️ MANDATORY per-obj scale: wine_glass .830,
small_marker .1035, spatula .671, golf_ball .430, else 1.0). `depth /1000`.
K OpenCV (full-res 1920×1080; for the 640×480 crop shift `cx,cy` by the bbox).
⚠️ use the **scanned** meshes, NOT dexycb CAD (different frame). masks pseudo.
## H2O (train; 8 non-YCB objects) — subdir `h2o/`
- **Host**: https://taeinkwon.com/projects/h2o/ — **gated by registration**.
- **Size**: large (full H2O). We use the object-pose subset.
- **Get it**: register on the project site to obtain the download credentials/links.
- **Conversion** 🔵: `obj_pose_RT/{f}.txt` = class_id + 4×4 obj→cam OpenCV meters,
**USED AS-IS** (⚠️ NO inversion — the "cam_to_obj" note refers to a DIFFERENT
file). mesh `object/{class}.ply` (m). `depth /1000`. `cam_pose/` = cam→world
(invert for world→cam). K from `cam_intrinsics.txt` (`fx fy cx cy w h`; images
undistorted). Masks must be rendered from mesh+pose. Mesh folder names ≠ display names.
## DexH2R (TRAIN-only pseudo-GT; 56 non-YCB; depth on 6/18 views) — subdir `dexh2r/`
- **Host**: DexH2R project — distributed via **Google Drive** (subject to
Drive quota / "download quota exceeded" errors).
- **Access**: open but quota-limited. **Workaround**: use `rclone` with your own
Google account to copy the shared folder, which bypasses the anonymous
per-file quota:
```bash
rclone config # add a "gdrive" remote (your account, with the folder added to "My Drive" or shared)
rclone copy gdrive:DexH2R $MIGRATOR_DATA_ROOT/dexh2r --drive-shared-with-me -P
```
Meshes + per-trial `calibration/` are small and reliable; the frame archives
are the quota-blocked part.
- **Conversion** 🔵 (round-trip 2.4e-16): `obj_pose.pt [T,4,4]` = `T_world<-obj`
(world = hand_arm base). Kinect i: `T_oc = inv(cali0i) @ hand_arm_mesh_to_kinect_pcd_0 @ obj_pose[t]`.
RealSense i(0,1): time-varying via ShadowHand FK(`qpos.pt`) @
`inv(realsense_to_forearm_i)`. mesh `object_model/<name>.obj` (m).
`depth int16→uint16 /1000`. K per-cam (Kinect 8-param distort; images
undistorted). ⚠️ ONLY kinect0-3 + realsense0-1 have depth (drop 12 ZCAM). No
2D masks — project `real_obj_pcd` or threshold depth. Use per-trial `calibration/`.
## ContactPose (TRAIN-only static grasps; 25 non-YCB) — subdir `contactpose/`
- **Host**: https://contactpose.cc.gatech.edu/ (project + GitHub `facebookresearch/ContactPose`).
- **Size**: 2.5 TB full, but you only need a few frames per grasp (static).
- **Get it**: use the official `ContactPose` python downloader
(`python scripts/download_data.py ...`) to pull the RGB-D + `object_models/`.
- **Conversion** ✅ (IoU 0.979): `cTo = object_pose(cam,frame)` = obj→cam OpenCV
meters (`R_oc=cTo[:3,:3]`, `t_oc=cTo[:3,3]`). mesh `object_models/<obj>.ply
*1e-3` (PLY is mm). `depth /1000` (Kinect v2, ~30 mm systematic bias). ⚠️
projection needs the affine `A`: `pixels = A@K@x_cam` (`cp.P`); left/right cams
are PORTRAIT 540×960 while K is 960×540 landscape. extr `wTc` = cam→world
(invert → cTw). ⚠️ static: sample 1–few frames per (subject,obj,intent) — 2306
grasps, NOT 2.9 M frames. masks render from mesh+cTo.
---
# HELD-OUT / EVALUATION-ONLY DATASETS (never train on these)
These are reserved for evaluation. In `configs/train_integrated.yaml` they carry
`role: heldout` (whole-dataset OOD) or are listed in `configs/heldout.yaml`
(unseen-object reservation). See `mvsam3d/data/integrated.py` for the two
held-out semantics.
## HO-3D (held-out; 8 YCB objects) — subdir `ho3d_eval/`
- **Host**: https://www.tugraz.at/index.php/id/2604 / codalab. Open.
- **Conversion** 🔵: `R=Rodrigues(meta['objRot'])`, `t=meta['objTrans']` (m);
then `R=diag(1,-1,-1)@R`, `t=diag(1,-1,-1)@t` (OpenGL→OpenCV, both). mesh
dexycb `textured_simple.obj` (m). `depth=(R_ch+G_ch*256)*1.2499e-4`.
K=`meta['camMat']`. eval-split masks rendered. ⚠️ exclude SB1 (train leaks to eval).
## YCB-M (held-out; YCB objects) — subdir `ycbm/`
- **Host**: https://github.com/renaultjean/ycbm or the project mirror. Open.
- **Conversion** 🔵: `R = quat_xyzw→R` (no flip); `t = location*1e-2` (cm→m),
object in CAMERA frame. mesh `models_aligned/ycb_models_aligned_cm /100` (NOT
dexycb). `depth = raw/10000`. `camera_data` = world→cam (invert → cam→world).
⚠️ handedness taken as-is (translation validated; render-verify rotation
before any use).
## HOPE-Video (held-out bonus OOD; 28 non-YCB) — subdir `hope_video_repo/`
- **Host**: https://github.com/swtyree/hope-dataset (HOPE). Open.
- **Conversion** 🔵: `R=P[:3,:3]`, `t=P[:3,3]*1e-2` (cm→m). mesh
`meshes/eval/{class}.obj /100`. `depth raw*1e-3`. extrinsics raw-as-meters
world→cam (do NOT scale). K=`camera.intrinsics`. masks `masks_visib/`.
---
## Priority for expanding training beyond DexYCB
From our data survey, the highest-value additions (most NEW distinct objects, our
real bottleneck) are **HouseCat6D (194) + PACE (238) + GraspNet (~56)**, taking
the object count from 20 → ~520 and adding ~800k clean multi-view pairs. HO-Cap,
HOGraspNet, H2O, DexH2R, ContactPose add hands/interaction diversity but fewer
new rigid shapes and carry pseudo-GT or gating caveats noted above.
|