HM3D-OVON NodeSet
The HM3D-OVON NodeSet (EnvOvonNodeSet, workspace/nodesets/env/env_ovon/) wraps habitat-lab 0.2.4 for HM3D-OVON (24.09, IROS 2024, Yokoyama et al.) — open-vocabulary object-goal navigation. Where ObjectNav draws goals from a fixed 6-category set, OVON names the goal as free-form text at test time, and three val splits grade generalisation: val_seen (categories seen in training), val_seen_synonyms (same objects, unseen synonyms), val_unseen (categories never seen) — 36 scenes × 3,000 episodes each, 79 / 50 / 49 distinct goal categories.
Port-compatible sibling of ObjectNav: the node surface mirrors env_objnav verb-for-verb, so a graph binds to either env by swapping the node_type prefix. It shares the ac-objnav conda env ($OVON_PYTHON overrides) and the already-staged 36 semantically-annotated HM3D val scenes — no new scene download, no new compat symlinks.
1. Canvas nodes
Seven nodes on the gym contract, identical port shapes to ObjectNav's table — reset / step_discrete / step_pose / observe_egocentric / observe_camera_pose / observe_panorama / evaluate, prefixed env_ovon__. The differences are semantic, not structural:
- Goal is free text.
reset.object_categorycarries the open-vocabulary goal phrase, not a category id. - No
objectgoal_sensor. habitat's sensor demandscategory_to_task_category_id, a fixed category→int table an open vocabulary does not have; leaving it in aborts task construction.gps/compassare kept. success_distance= 0.25 m, HM3D-OVON's official threshold — not habitat's stock 0.1 m. The stock value is smaller than the 0.25 m step size, so success becomes a coin flip on sparse-viewpoint goals (oracle at 0.1: SR 0.50 with every failure 0.106–0.179 m out; at 0.25: SR 1.00). ObjectNav's dense furniture viewpoints mask the bug; OVON's small-object tail (e.g. clothes, 9 viewpoints) exposed it. Upstream OVON makes the same override. This is the one place env_ovon is deliberately not comparable to a stock ObjectNav run.
2. Data staging
| Path | Contents |
|---|---|
data/datasets/ovon/hm3d/{train, val_seen, val_seen_synonyms, val_unseen}/ | Episodes from HuggingFace nyokoyama/hm3d_ovon (hm3d.tar.gz, 158 MB) |
data/scene_datasets/hm3d/val/ | Scenes shared with ObjectNav (scene_id prefix hm3d/val/, same as objectnav v1) |
Two staging traps, both handled in the module: (a) split dir ≠ filename — val_seen_synonyms/ contains val_unseen_easy.json.gz and val_unseen/ contains val_unseen_hard.json.gz, so the usual {split}/{split}.json.gz template resolves to a missing file for two of three splits (explicit _SPLIT_FILES mapping); (b) the tarball ships 266 AppleDouble ._* files that habitat reads as scenes and dies BadGzipFile — deleted at staging, and they come back on re-extract.
Vendored dataset class: habitat-lab 0.2.4 registers no OVON dataset, so upstream's OVON-v1 class is vendored verbatim as env_ovon/_ovon_dataset.py. Deviation: upstream pins habitat-lab 0.2.3 + py3.7; we run 0.2.4 + py3.9 — all three splits load and step, but this is the first suspect if numbers ever disagree with the paper. train is deliberately not offered (its 145 scenes come from the unstaged HM3D train download).
3. Verification evidence
All rows 2026-07-21, bare python on ac-objnav (PR #55).
| Check | Evidence | Result |
|---|---|---|
| Manager surface | 27 manager-level assertions | 0 failures — gym-verb surface, RGB-D 480×640 + pose + intrinsics + gps/compass, pure-read invariants for observe/panorama, all 6 discrete actions, step_pose never dispatching STOP, both panorama modes, set_episode_by_index |
| Dataset shape | all three val splits via the vendored OVON-v1 | 3,000 episodes each; 79 / 50 / 49 distinct goal categories — matches the paper's counts |
| Scoring sanity | shortest-path oracle vs random, 12 val_seen eps, official 0.25 threshold | oracle SR 1.000 / SPL 0.980; random SR 0.000 — SPL ≈0.98 also confirms geodesic distance / path length / SPL denominator |
| Registry discovery | backend scan_all() | nodeset discovered — category env, requires_server, 7 tools |
4. Not yet verified / open decisions
- No method yet. No graph drives this env, so no SR number from this stack is meaningful — the oracle/random rows above are environment self-checks.
- Server-mode load, env-panel bridge, probe graph, Canvas Play, multi-worker — none run yet (manager-level verification only).
- Embodiment alignment (open decision). The official benchmark agent is Stretch-like: RGB 360×640 portrait, hfov 42, camera 1.31 m, no stock depth in the published DAgRL weights' config (
OVONSim-v0, goal viaclip_objectgoal_sensor). env_ovon currently uses the ObjectNav paper-standard cylinder (640×480 RGB-D, hfov 79, camera 0.88 m) — so no published number is comparable until the env is re-pointed at the Stretch geometry (plus a py3.7 / habitat-0.2.3 build for the published weights). Depth itself is on-standard — modular zero-shot baselines (VLFM, DAgRL+OD) use it. - Oracle on the other two splits (
val_seen_synonyms/val_unseen) and a metric-blind oracle re-run.