AgentCanvas / Pages / Developer Guide / Nodesets / Env / HM3D-OVON
2026-08-14 18:00

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:


2. Data staging

PathContents
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 ≠ filenameval_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).

CheckEvidenceResult
Manager surface27 manager-level assertions0 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 shapeall three val splits via the vendored OVON-v13,000 episodes each; 79 / 50 / 49 distinct goal categories — matches the paper's counts
Scoring sanityshortest-path oracle vs random, 12 val_seen eps, official 0.25 thresholdoracle SR 1.000 / SPL 0.980; random SR 0.000 — SPL ≈0.98 also confirms geodesic distance / path length / SPL denominator
Registry discoverybackend scan_all()nodeset discovered — category env, requires_server, 7 tools

4. Not yet verified / open decisions

AgentCanvas docs