diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9db3227f..a056c454 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,11 @@ jobs: - uses: astral-sh/setup-uv@v6 with: version: '0.9.2' - - run: uv sync --frozen --python 3.10 --extra dev + - run: uv sync --frozen --python 3.10 --extra dev --extra audit - run: uv run ruff check src tests scripts + - run: uv run --no-sync deptry src + - run: uv run --no-sync lint-imports --no-cache + - run: uv run --no-sync vulture - run: uv run pytest -q - run: uv run python scripts/verify_evidence.py - run: uv run python scripts/verify_paired_evidence.py diff --git a/README.md b/README.md index 8a167382..a15243b1 100644 --- a/README.md +++ b/README.md @@ -11,28 +11,24 @@ Dynamic robust mapping · Semantic mapping and localization English | [中文](README.zh-CN.md) -[Analysis](docs/STUDY.md) · [Results](docs/PAIRED_RESULTS.md) · [Hardware plan](docs/REAL_WORLD.md) +[Analysis](docs/STUDY.md) · [Evidence](docs/README.md) · [Setup](docs/REPRODUCE.md) -> **room2:** 28 cells executed; analysis pending. AI-only labels; H1 unverified. [Study](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md). - ![Measured author-map replay](docs/figures/replication_hero.gif) *Saved-map replay; GT only for evaluation/coloring. [Source](results/reference/reproduction-media-wsl/record.json).* -Four 2024 mapping cores using supplied poses. Trajectory estimation and navigation are outside these runs. - -## 1. Open research question +Four 2024 mapping works → pose-error controls → a candidate recovery hypothesis. **H1 remains unverified.** -At the same candidate cap, does reassociation improve target recovery after a late pose correction? +## SLAM and our two directions -## 2. How I arrived at this question +**SLAM — Simultaneous Localization and Mapping:** estimate sensor motion while building a map from its observations. -- **Dynamic SLAM:** preserve stable geometry when objects move. -- **Semantic mapping, visual localization and navigation:** connect objects to reliable coordinates. +- **Robust localization and SLAM in dynamic environments:** estimate motion and maintain a stable map despite moving objects. +- **Semantic mapping, visual localization and navigation:** describe objects and their locations, estimate pose from images, and reach a target. -SLAM jointly estimates motion and builds a map. +Five elements organize this process: ```text Sensor data → Front end → Back end (optimize) → Map build @@ -40,108 +36,130 @@ Sensor data → Front end → Back end (optimize) → Map build Loop detection ─────┘ ``` -| SLAM element | Dynamic robustness | Semantic grounding | -| --- | --- | --- | -| Sensor data | Motion, occlusion | RGB-D alignment | -| Front end | Stable correspondences | Masks, features, association | -| Back end | Robust pose constraints | Consistent coordinates | -| Loop detection | Recognize changed places | Refresh object anchors | -| Map build | Remove dynamic traces | Maintain identities and targets | +| SLAM element | Effect of improving it | Dynamic direction | Semantic direction | +| --- | --- | --- | --- | +| Sensor data | Cleaner, synchronized observations | Observe motion and occlusion | Align RGB and depth | +| Front end | More reliable matches | Match stable structure | Extract masks/features; associate observations | +| Back end | More consistent poses | Reject bad motion constraints | Align object coordinates | +| Loop detection | Revisit constraints help reduce drift | Recognize places despite changes | Support relocalization | +| Map build | A more usable map | Remove dynamic traces | Maintain identities and query targets | -The four cores depend on **pose → correspondence → map decisions**. DUFOMap and BeautyMap filter geometry; ConceptGraphs and HOV-SG associate semantic evidence. This motivates a shared question, without establishing a shared failure. [Analysis](docs/STUDY.md). +The first direction emphasizes reliable motion and geometry. The second adds object meaning and target retrieval. Our four reproductions use supplied poses to isolate **map construction**, not complete SLAM or navigation. -## 3. Hypothesis +## Related works -Retaining observation sources and pose versions, then replaying affected associations within a bounded cache, will recover more valid targets than fixed-history guards. **H1 remains a candidate.** +These are saved-result replays from supplied-pose mapping runs. [GIF sources](results/reference/media-previews-v2/record.json). -The current study tests whether reassociation is needed; it does not test the bounded-cache implementation. +### [DUFOMap](docs/papers/dufomap.md) -## 4. Why this seems plausible +![DUFOMap core replay](results/reference/media-previews-v2/dufomap.gif) -In the fixed-history control, corrected coordinates retain the old object memberships and fused features. Those decisions may need revision, but threshold and support controls may already suffice. +**KITTI-00 outdoor scene, 141 LiDAR scans.** Observed empty space identifies dynamic points; pose margins protect static geometry. The GIF selects 21 scans to compare input, removed and retained points against the final map. [MP4](docs/media/dufomap/replay.mp4). -[Khronos](https://arxiv.org/html/2402.13817v2) and [DovSG](https://arxiv.org/html/2410.11989v2) already reconcile maps or update memory. Replay alone is not a novelty claim. +### [BeautyMap](docs/papers/beautymap.md) -## 5. Method comparisons +![BeautyMap core replay](results/reference/media-previews-v2/beautymap.gif) -These GIFs replay core outputs. LiDAR colors show removal outcomes; semantic highlights are unverified query candidates. [Media scope](docs/RECORDING.md). +**KITTI-00 outdoor scene, 141 LiDAR scans.** Occupancy comparisons remove dynamic traces; restoration protects static geometry. The GIF selects 21 scans to compare input, removed and retained points against the final map. [MP4](docs/media/beautymap/replay.mp4). -| [DUFOMap](docs/papers/dufomap.md) | [BeautyMap](docs/papers/beautymap.md) | -| --- | --- | -| ![DUFOMap core replay](docs/media/dufomap/preview.gif) | ![BeautyMap core replay](docs/media/beautymap/preview.gif) | -| Void-space filtering removes dynamic returns. **141 scans.** | Binary occupancy and restoration clean the map. **141 scans.** | +### [ConceptGraphs](docs/papers/conceptgraphs.md) -| [ConceptGraphs](docs/papers/conceptgraphs.md) | [HOV-SG](docs/papers/hovsg.md) | -| --- | --- | -| ![ConceptGraphs core replay](docs/media/conceptgraphs/preview.gif) | ![HOV-SG core replay](docs/media/hovsg/preview.gif) | -| SAM/CLIP association produces objects and query candidates. **40 frames, 39 representations.** | Segment fusion produces a queryable feature map. **8 frames, 50 segments; no hierarchy/navigation.** | +![ConceptGraphs core replay](results/reference/media-previews-v2/conceptgraphs.gif) + +**Replica room0 indoor scene, 40 RGB-D frames.** Geometry/CLIP matching fuses observations into 39 object representations. The GIF selects 20 frames, showing image segments, the final map and a red text-query candidate. Candidate correctness is unverified. [MP4](docs/media/conceptgraphs/replay.mp4). + +### [HOV-SG](docs/papers/hovsg.md) + +![HOV-SG core replay](results/reference/media-previews-v2/hovsg.gif) + +**Replica room0 indoor scene, 8 RGB-D frames.** Multiview segment/CLIP fusion produces 50 3D segments. The GIF shows input segments, the final feature map and a red query candidate, whose correctness is unverified. This run covers segment mapping; the paper's floor/room hierarchy and navigation are not reproduced. [MP4](docs/media/hovsg/replay.mp4). + +## Common dependency and open question + +DUFOMap and BeautyMap remove dynamic traces while retaining static geometry. ConceptGraphs and HOV-SG organize objects and semantics for language queries. + +All four depend on **pose alignment → correspondence → map decisions**. Misalignment can affect point removal, object fusion or feature assignment. Pose margins, static restoration and association rules already provide protection. + +**After pose correction, how can a map repair decisions made under the earlier poses?** + +For example, corrected coordinates may still leave one object split or two objects merged. This is a candidate failure mode, not a proven shared defect. We first test ConceptGraphs association under identical pose corrections and candidate caps. [Test and limits](docs/STUDY.md). -Larger official runs live on [`reproduce/author-originals`](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals), snapshot **`3b0b9a8`**; the four GIFs above show the earlier subsets. +## Reproduction results -| Work | Official-run evidence | Remaining issue | +Later original-code runs use separate protocols, pinned at **535a278**: + +| Work | Scored scope | Result | | --- | --- | --- | -| DUFOMap | 1,997 scans; [Table IV](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/DUFOMAP_TABLE4.zh-CN.md): 15 accuracy entries match two decimals | Pose sensitivity despite tolerances; needs observed empty space | -| BeautyMap | 1,997 scans; historical KITTI-02 [Table III](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/KITTI_PAPER_PROTOCOL.zh-CN.md): 9 entries match two decimals | Alignment and grid-size trade-offs despite restoration | -| ConceptGraphs | [room0](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/CONCEPTGRAPHS_ROOM0_RESULTS.zh-CN.md): 400 frames, semantic scoring complete | Missed/duplicate objects and caption errors | -| HOV-SG | [20-frame variant](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/HOVSG_HOME_RESULTS.zh-CN.md): 156 segments, scoring pending; 200-frame fusion timed out | Static-scene assumption, slow construction | +| [DUFOMap](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/DUFOMAP_TABLE4.md) | Table IV, 141 released scans | SA 97.9635%, DA 98.7196%; 15 entries match paper rounding | +| [BeautyMap](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/KITTI_PAPER_PROTOCOL.md) | Historical KITTI-02, 91 scans | At XY=1 m: SA 83.3978%, DA 82.4092%; 9 Table III entries match rounding | +| [ConceptGraphs](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/CONCEPTGRAPHS_ROOM0_RESULTS.md) | room0, 400 observations | mIoU 21.3460%, frequency-weighted IoU 50.1379% | +| [HOV-SG](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/HOVSG_HOME_RESULTS.md) | room0, 20-frame resource variant | mIoU 34.7500%, F-mIoU 62.8725%; default 200-frame run incomplete | + +SA/DA measure static retention/dynamic removal. Semantic scoring uses scene-GT classes and different supports/exclusions, not identity recovery or open-world query success. These scores cannot rank the four methods; complete trajectories and robot navigation remain untested. [Scope](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md).
Five more GIFs: recorded 3D viewing -| DUFOMap RViz | BeautyMap RViz | -| --- | --- | -| ![DUFOMap recorded RViz](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/dufomap-rviz.gif) | ![BeautyMap recorded RViz](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/beautymap-rviz.gif) | +Each clip records a 3D viewer displaying saved results. No new inference; query highlights are unverified. -| ConceptGraphs RViz | HOV-SG RViz | -| --- | --- | -| ![ConceptGraphs recorded RViz](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/conceptgraphs-rviz.gif) | ![HOV-SG recorded RViz](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/hovsg-rviz.gif) | +**DUFOMap · RViz** -Earlier core outputs in RViz; saved-map viewing, no new inference. Full videos: [DUFOMap](docs/media/rviz/dufomap.mp4) · [BeautyMap](docs/media/rviz/beautymap.mp4) · [ConceptGraphs](docs/media/rviz/conceptgraphs.mp4) · [HOV-SG](docs/media/rviz/hovsg.mp4). +![DUFOMap recorded RViz](results/reference/media-previews-v2/dufomap-rviz.gif) -![ConceptGraphs original author viewer](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/conceptgraphs-author-viewer.gif) +**KITTI-00, 141-scan run.** RViz switches between input, removed and retained point clouds to inspect dynamic-point removal. [MP4](docs/media/rviz/dufomap.mp4). -400-frame author map: RGB/instance colors and orbit controls, without query/graph display. [60-second video](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4) · [Sources](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json). +**BeautyMap · RViz** -
+![BeautyMap recorded RViz](results/reference/media-previews-v2/beautymap-rviz.gif) + +**KITTI-00, 141-scan run.** RViz compares input, removed and retained point clouds in the same 3D view. [MP4](docs/media/rviz/beautymap.mp4). + +**ConceptGraphs · RViz** -## 6. Observations that motivate the question +![ConceptGraphs recorded RViz](results/reference/media-previews-v2/conceptgraphs-rviz.gif) -![Separate LiDAR core and original semantic measurements](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/baseline-metrics.png) +**Replica room0, 40 RGB-D frames.** The GIF takes chronological excerpts from five saved maps (observations 1/10/20/30/39) and four text-query stages. [MP4](docs/media/rviz/conceptgraphs.mp4). -| Run | Metric | Result | -| --- | --- | ---: | -| DUFOMap, 141 scans | Static retention SA / dynamic removal DA | 97.9798% / 98.7029% | -| BeautyMap, same inputs | SA / DA | 96.9529% / 98.3382% | -| ConceptGraphs, author room0 | mIoU / frequency-weighted IoU | 21.3460% / 50.1379% | -| HOV-SG, author 20 frames | Semantic accuracy | Pending | +**HOV-SG · RViz** + +![HOV-SG recorded RViz](results/reference/media-previews-v2/hovsg-rviz.gif) + +**Replica room0, 8 RGB-D frames.** RViz shows the final 50-segment feature map and text-query candidates. [MP4](docs/media/rviz/hovsg.mp4). + +**ConceptGraphs · Author viewer** + +![ConceptGraphs original author viewer](results/reference/media-previews-v2/conceptgraphs-author-viewer.gif) + +**Replica room0, 400 RGB-D frames.** The original author viewer rotates the saved map and switches RGB/instance colors. Queries and scene-graph relations are not displayed. [60-second video](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4) · [Sources](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json). + + -Separate protocols: LiDAR uses 5 cm map-neighbor scoring; room0 uses 23 classes and 4,085,377 scoring points. Counts are not accuracy. [Definitions/sources](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json) · [Renderer](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/scripts/build_homepage_media.py). +## Evidence that narrowed the question ![Recovery and exposed-candidate cost](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/recovery-cost.png) -room1, immediate correction at 30 cm: fixed-history recovery **11.1%**, oracle **66.7%**, post-hoc support-1 **100%**; candidates **8.3 / 25 / 117**, respectively. Three-seed means, partial AI labels, unequal caps. [Results](docs/DELAYED_RESULTS.md). +room1, immediately after 30 cm correction: fixed-history recovery **11.1%**, oracle **66.7%**, post-hoc support-1 **100%**; candidates **8.3 / 25 / 117**. Three-seed means, partial AI labels, unequal caps. [Results](docs/DELAYED_RESULTS.md). -Lowering the support gate removes the selected recovery deficit while exposing more candidates. Later observations also repair part of the loss. These results motivate an equal-cap test, not a claim of irreversible association loss. +A lower support gate closes this selected recovery gap while exposing more fragments; later observations also repair part of it. **Reassociation is not yet shown necessary.** The next test matches candidate caps and checks identities separately. -## 7. Minimum hypothesis test +## Candidate H1 and next test -On room2, freeze the frontend and five AI-labelled instances. Give fixed history, threshold-1.0, visibility guards and oracle replay the same exact historical pose correction after observation eight. +Retain observation sources and pose versions, then replay affected associations within a bounded cache to recover more valid targets than simple guards. The bounded implementation is **not built or tested**. -Compare support thresholds 1/2/3 at candidate caps 25/50/100/unlimited. Report recovery, query hits, duplicates/mixes and correction cost. Equal caps do not match memory. +room2 freezes one frontend, five AI-labelled instances and exact correction after observation eight. Four arms compare fixed history, threshold-1.0, visibility guards and oracle reassociation at support 1/2/3 and caps 25/50/100/unlimited. **All 28 mapping cells ran; analysis remains pending.** [Protocol](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md). -At matched RMS and support, consider a prototype only if oracle gains ≥10 percentage points over every simple control at two finite caps, with ≥2/3 positive paired seeds and no seed increasing labelled duplicates/mixes. Matching simple controls weakens H1. [Frozen protocol and decision rule](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md). +Only plan a prototype if oracle gains ≥10 percentage points over every simple control at two finite caps, with ≥2/3 positive paired seeds and no seed increasing labelled duplicates/mixes. Otherwise narrow or stop H1. Equal caps do not match memory; AI-only labels cannot confirm H1. [Decision and remaining work](docs/PLAN.md). -All 28 mapping cells ran; independent analysis remains pending. AI-only labels cannot confirm H1. +[Khronos](https://arxiv.org/html/2402.13817v2) and [DovSG](https://arxiv.org/html/2410.11989v2) already reconcile/update maps. A contribution must demonstrate a recovery–cost benefit over existing protections; replay alone is not novel. ## Branches -| Branch | Focus | +| Branch | Role | | --- | --- | -| [`study/identity-budget-v2`](https://github.com/p20030920p/SLAM_Learning/tree/study/identity-budget-v2) | Late pose correction and candidate-budget experiments; H1 unverified. | -| [`reproduce/author-originals`](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals) | Four official pipelines, metric checks and recordings. | -| [`notes/personal-study-guide-20261008`](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008) | [Research notes: H1 and rejection controls](https://github.com/p20030920p/SLAM_Learning/blob/71a2e7556e231c1d0e6814febb085bea9d225f44/notes/OPEN_QUESTION_AND_HYPOTHESIS.zh-CN.md). | -| [`Personal-Learning-Physical`](https://github.com/p20030920p/SLAM_Learning/tree/Personal-Learning-Physical) | [D435/L2 capture, mapping trials and eight-frame semantic-loader checks](https://github.com/p20030920p/SLAM_Learning/blob/4e5a5e8b703e5072ca5e11cf6893d03bca244473/README.zh-CN.md). | +| main | Curated submission: question, four reproductions, counterevidence and candidate H1. | +| [reproduce/author-originals](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals) | Original pipelines, paper-table/semantic scoring and recordings. | +| [notes/personal-study-guide-20261008](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008) | Personal study notes and hardware trials under `physical/`, including operations and failures. | -D435 has no IMU. LiDAR odometry failed the drift check; fusion and semantic quality remain unvalidated. +Late-correction and candidate-budget experiments remain in a [pinned snapshot](https://github.com/p20030920p/SLAM_Learning/tree/4361d4f353a7449c7d6964887643915d2fc72a11); they are exploratory and H1 remains unverified. [AI use](docs/DISCLOSURE.md) · [Sources/licenses](docs/ATTRIBUTION.md) · [Citation](CITATION.cff) · [License](LICENSE) diff --git a/README.zh-CN.md b/README.zh-CN.md index 91b42659..bd3dd00c 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -11,28 +11,24 @@ [English](README.md) | 中文 -[分析](docs/STUDY.zh-CN.md) · [结果](docs/PAIRED_RESULTS.zh-CN.md) · [实物计划](docs/REAL_WORLD.zh-CN.md) +[分析](docs/STUDY.zh-CN.md) · [证据](docs/README.zh-CN.md) · [安装](docs/REPRODUCE.zh-CN.md) -> **room2:**28 单元已运行,分析待完成。使用 AI 标注,H1 未验证。[实验](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md)。 - ![作者地图实测回放](docs/figures/replication_hero.gif) *保存地图回放;GT 仅用于评价/着色。[来源](results/reference/reproduction-media-wsl/record.json)。* -复现四篇 2024 年工作的建图核心,使用给定位姿;当前运行不含轨迹估计与导航。 - -## 1. 开放研究问题 +四篇 2024 年建图工作 → 位姿误差对照 → 候选恢复假设。**H1 尚未验证。** -相同候选上限下,重算关联能否改善迟到位姿修正后的目标恢复? +## SLAM 与两个方向 -## 2. 问题是如何形成的 +**SLAM — Simultaneous Localization and Mapping,同步定位与建图:**利用传感器观测,同时估计自身运动并构建地图。 -- **动态环境 SLAM:**物体运动时,保留稳定几何。 -- **语义建图、视觉定位与导航:**把对象连接到可靠坐标。 +- **动态环境中的鲁棒定位与 SLAM:**物体运动时,仍能可靠估计自身运动并维护稳定地图。 +- **语义建图、视觉定位与导航:**描述物体及其位置,用图像确定自身位姿,并据此到达目标。 -SLAM 同时估计运动与构建地图。 +用五个要素理解这个过程: ```text 传感器数据 → 前端 → 后端(优化) → 地图构建 @@ -40,108 +36,130 @@ SLAM 同时估计运动与构建地图。 回环检测 ──┘ ``` -| SLAM 要素 | 动态鲁棒性 | 语义锚定 | -| --- | --- | --- | -| 传感器数据 | 运动、遮挡 | RGB-D 对齐 | -| 前端 | 稳定对应 | 掩码、特征、关联 | -| 后端 | 鲁棒位姿约束 | 一致坐标 | -| 回环检测 | 变化后识别重访 | 刷新对象锚点 | -| 地图构建 | 消除动态残影 | 维护身份与目标 | +| SLAM 要素 | 改进带来的效果 | 动态方向侧重点 | 语义方向侧重点 | +| --- | --- | --- | --- | +| 传感器数据 | 观测更干净、同步更准确 | 观察运动与遮挡 | 对齐 RGB 与深度 | +| 前端 | 对应关系更可靠 | 匹配稳定结构 | 提取掩码/特征,关联观测 | +| 后端 | 位姿更一致 | 排除错误运动约束 | 对齐对象坐标 | +| 回环检测 | 重访约束帮助减少漂移 | 环境变化后仍能认出地点 | 支持重定位 | +| 地图构建 | 地图更可用 | 消除动态残影 | 维护身份与查询目标 | -四个核心都依赖**位姿 → 对应 → 地图决策**。DUFOMap 与 BeautyMap 过滤几何,ConceptGraphs 与 HOV-SG 关联语义证据。这引出共同问题,尚未证明共同失效。[分析](docs/STUDY.zh-CN.md)。 +第一个方向重在可靠运动与几何。第二个方向增加物体含义与目标检索。四篇复现均使用给定位姿,单独检查**地图构建**,尚未复现完整 SLAM 或导航。 -## 3. 假设 +## 相关工作 -记录观测来源与位姿版本,修正后在有界缓存内重放受影响的关联,将比固定关联保护恢复更多有效目标。**H1 仍是候选假设。** +以下回放给定位姿建图后的保存结果。[GIF 来源](results/reference/media-previews-v2/record.json)。 -当前实验先检验是否需要重算关联,尚未测试有界缓存实现。 +### [DUFOMap](docs/papers/dufomap.zh-CN.md) -## 4. 为什么可能成立 +![DUFOMap 核心回放](results/reference/media-previews-v2/dufomap.gif) -固定关联对照修正坐标后,仍保留旧对象成员与融合特征。这些决策可能需要重算,但阈值与支持门槛也可能已经足够。 +**KITTI-00 户外场景,141 帧激光雷达扫描。**用已观测的空区域识别动态点,位姿容差保护静态几何。GIF 节选 21 帧,对比原始、剔除与保留点,背景为最终地图。[MP4](docs/media/dufomap/replay.mp4)。 -[Khronos](https://arxiv.org/html/2402.13817v2) 与 [DovSG](https://arxiv.org/html/2410.11989v2) 已有地图协调或记忆更新;重放本身不构成创新。 +### [BeautyMap](docs/papers/beautymap.zh-CN.md) -## 5. 方法对照 +![BeautyMap 核心回放](results/reference/media-previews-v2/beautymap.gif) -GIF 回放核心输出:LiDAR 颜色表示移除结果,语义高亮为未验证的查询候选。[媒体说明](docs/RECORDING.zh-CN.md)。 +**KITTI-00 户外场景,141 帧激光雷达扫描。**通过占据比较清理动态残影,用恢复机制保护静态几何。GIF 节选 21 帧,对比原始、剔除与保留点,背景为最终地图。[MP4](docs/media/beautymap/replay.mp4)。 -| [DUFOMap](docs/papers/dufomap.zh-CN.md) | [BeautyMap](docs/papers/beautymap.zh-CN.md) | -| --- | --- | -| ![DUFOMap 核心回放](docs/media/dufomap/preview.gif) | ![BeautyMap 核心回放](docs/media/beautymap/preview.gif) | -| 自由空间判定,移除动态回波。**141 扫描。** | 二进制占据与静态恢复,清理地图。**141 扫描。** | +### [ConceptGraphs](docs/papers/conceptgraphs.zh-CN.md) -| [ConceptGraphs](docs/papers/conceptgraphs.zh-CN.md) | [HOV-SG](docs/papers/hovsg.zh-CN.md) | -| --- | --- | -| ![ConceptGraphs 核心回放](docs/media/conceptgraphs/preview.gif) | ![HOV-SG 核心回放](docs/media/hovsg/preview.gif) | -| SAM/CLIP 关联,生成对象与查询候选。**40 帧、39 个表示。** | 分段融合,生成可查询特征地图。**8 帧、50 分段;未运行层级/导航。** | +![ConceptGraphs 核心回放](results/reference/media-previews-v2/conceptgraphs.gif) + +**Replica room0 室内场景,40 帧 RGB-D。**用几何/CLIP 匹配融合观测,得到 39 个对象表示。GIF 节选 20 帧,展示图像分割、最终地图和红色文本查询候选;候选正确性未验证。[MP4](docs/media/conceptgraphs/replay.mp4)。 + +### [HOV-SG](docs/papers/hovsg.zh-CN.md) + +![HOV-SG 核心回放](results/reference/media-previews-v2/hovsg.gif) + +**Replica room0 室内场景,8 帧 RGB-D。**融合多视角分割与 CLIP 特征,得到 50 个三维分段。GIF 展示输入分割、最终特征地图和红色查询候选;候选正确性未验证。本次仅运行分段建图,未复现论文的楼层/房间层级与导航。[MP4](docs/media/hovsg/replay.mp4)。 + +## 共同依赖与开放问题 + +DUFOMap、BeautyMap 减少动态残影,保留静态几何。ConceptGraphs、HOV-SG 组织对象与语义,支持语言查询。 + +四者都依赖**位姿对齐 → 对应关系 → 地图判断**。错位可能影响点的删除、对象融合或特征归属。位姿容差、静态恢复和关联规则已经提供部分保护。 + +**位姿修正后,基于旧位姿做出的地图判断如何修复?** + +例如,坐标已经正确,一个物体仍可能被拆开,两个物体仍可能被合并。这是候选失效机制,尚未证明是共同缺陷。先在相同位姿修正与候选上限下,检验 ConceptGraphs 的关联恢复。[检验与边界](docs/STUDY.zh-CN.md)。 -更大规模作者运行位于 [`reproduce/author-originals`](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals),快照 **`3b0b9a8`**;以上四个 GIF 对应早期子集。 +## 复现结果 -| 工作 | 作者运行证据 | 剩余问题 | +后续作者原代码运行使用独立协议,固定快照 **535a278**: + +| 工作 | 评分范围 | 结果 | | --- | --- | --- | -| DUFOMap | 1,997 扫描;[表 IV](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/DUFOMAP_TABLE4.zh-CN.md):15 项精度匹配两位小数 | 已有容差仍受位姿影响;需要观测到空域 | -| BeautyMap | 1,997 扫描;历史 KITTI-02 [表 III](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/KITTI_PAPER_PROTOCOL.zh-CN.md):9 项匹配两位小数 | 已有恢复仍有配准与网格尺度取舍 | -| ConceptGraphs | [room0](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/CONCEPTGRAPHS_ROOM0_RESULTS.zh-CN.md):400 帧,语义评分完成 | 漏检/重复对象、描述错误 | -| HOV-SG | [20 帧变体](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/docs/HOVSG_HOME_RESULTS.zh-CN.md):156 分段,待评分;200 帧融合超时 | 静态场景假设、建图耗时 | +| [DUFOMap](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/DUFOMAP_TABLE4.zh-CN.md) | 表 IV,141 扫描公开数据 | SA 97.9635%、DA 98.7196%;15 项匹配论文两位小数 | +| [BeautyMap](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/KITTI_PAPER_PROTOCOL.zh-CN.md) | 历史 KITTI-02,91 扫描 | XY=1 m 时 SA 83.3978%、DA 82.4092%;表 III 共 9 项匹配 | +| [ConceptGraphs](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/CONCEPTGRAPHS_ROOM0_RESULTS.zh-CN.md) | room0,400 观测 | mIoU 21.3460%、类别频率加权 IoU 50.1379% | +| [HOV-SG](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/HOVSG_HOME_RESULTS.zh-CN.md) | room0,20 帧资源变体 | mIoU 34.7500%、F-mIoU 62.8725%;默认 200 帧仍未完成 | + +SA/DA 为静态保留/动态剔除;语义评分使用场景 GT 类别,计分位置/排除项不同,不测身份恢复或开放世界查询。分数不横向排名,完整轨迹与机器人导航仍未测试。[范围](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md)。
另外五个 GIF:真实三维窗口录像 -| DUFOMap RViz | BeautyMap RViz | -| --- | --- | -| ![DUFOMap RViz 录像](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/dufomap-rviz.gif) | ![BeautyMap RViz 录像](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/beautymap-rviz.gif) | +每段均录制真实三维窗口,查看保存结果,未重新推理;查询高亮未验证正确性。 -| ConceptGraphs RViz | HOV-SG RViz | -| --- | --- | -| ![ConceptGraphs RViz 录像](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/conceptgraphs-rviz.gif) | ![HOV-SG RViz 录像](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/hovsg-rviz.gif) | +**DUFOMap · RViz** -RViz 查看早期核心的保存地图,未重新推理。完整视频:[DUFOMap](docs/media/rviz/dufomap.mp4) · [BeautyMap](docs/media/rviz/beautymap.mp4) · [ConceptGraphs](docs/media/rviz/conceptgraphs.mp4) · [HOV-SG](docs/media/rviz/hovsg.mp4)。 +![DUFOMap RViz 录像](results/reference/media-previews-v2/dufomap-rviz.gif) -![ConceptGraphs 作者原版查看器](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/conceptgraphs-author-viewer.gif) +**KITTI-00,141 扫描运行结果。**在 RViz 中切换原始、剔除与保留点云,检查动态点清理效果。[MP4](docs/media/rviz/dufomap.mp4)。 -400 帧作者地图:RGB/实例颜色与旋转,未展示查询/关系图。[60 秒视频](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4) · [来源](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json)。 +**BeautyMap · RViz** -
+![BeautyMap RViz 录像](results/reference/media-previews-v2/beautymap-rviz.gif) + +**KITTI-00,141 扫描运行结果。**在同一三维视角中对比原始、剔除与保留点云。[MP4](docs/media/rviz/beautymap.mp4)。 + +**ConceptGraphs · RViz** -## 6. 引出问题的观察 +![ConceptGraphs RViz 录像](results/reference/media-previews-v2/conceptgraphs-rviz.gif) -![分开的 LiDAR 核心与原始语义指标](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/baseline-metrics.png) +**Replica room0,40 帧 RGB-D。**GIF 按原顺序节选五个建图快照(第 1/10/20/30/39 次观测)与四个文本查询阶段。[MP4](docs/media/rviz/conceptgraphs.mp4)。 -| 运行 | 指标 | 结果 | -| --- | --- | ---: | -| DUFOMap,141 扫描 | 静态保留 SA/动态剔除 DA | 97.9798%/98.7029% | -| BeautyMap,同输入 | SA/DA | 96.9529%/98.3382% | -| ConceptGraphs,作者 room0 | mIoU/类别频率加权 IoU | 21.3460%/50.1379% | -| HOV-SG,作者 20 帧 | 语义精度 | 待完成 | +**HOV-SG · RViz** + +![HOV-SG RViz 录像](results/reference/media-previews-v2/hovsg-rviz.gif) + +**Replica room0,8 帧 RGB-D。**查看最终的 50 分段特征地图与文本查询候选。[MP4](docs/media/rviz/hovsg.mp4)。 + +**ConceptGraphs · 作者查看器** + +![ConceptGraphs 作者原版查看器](results/reference/media-previews-v2/conceptgraphs-author-viewer.gif) + +**Replica room0,400 帧 RGB-D。**在作者原版查看器中旋转保存地图,切换 RGB/实例颜色。未展示查询或场景图关系。[60 秒视频](https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4) · [来源](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json)。 + + -协议分开:LiDAR 使用 5 cm 地图近邻;room0 使用 23 类、4,085,377 计分点。数量不等于精度。[定义/来源](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json) · [生成脚本](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/scripts/build_homepage_media.py)。 +## 让问题收窄的证据 -![恢复表现与暴露候选代价](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/recovery-cost.png) +![恢复率与暴露候选代价](https://raw.githubusercontent.com/p20030920p/SLAM_Learning/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/recovery-cost.png) -room1,30 cm 修正刚发生时:固定关联恢复 **11.1%**,oracle **66.7%**,事后支持门槛 1 为 **100%**;对应候选 **8.3/25/117**。三个种子均值、部分 AI 标注、上限未匹配。[结果](docs/DELAYED_RESULTS.zh-CN.md)。 +room1,30 cm 修正刚发生时:固定关联恢复率 **11.1%**,oracle **66.7%**,事后 support-1 **100%**;候选数为 **8.3/25/117**。三个种子均值、部分 AI 标注、候选上限不等。[结果](docs/DELAYED_RESULTS.zh-CN.md)。 -降低支持门槛消除了所选目标的恢复缺口,但暴露更多候选;后续观测也能修复部分损失。因此需要相同上限对照,不能宣称关联损失不可逆。 +降低支持门槛即可消除这组目标的恢复缺口,同时暴露更多碎片;后续观测也能修复部分损失。**尚未证明必须重算关联。** 下一项实验匹配候选上限,并单独检查身份。 -## 7. 最小假设检验 +## 候选 H1 与下一项检验 -在 room2 固定前端与五个 AI 标注实例。第八次观测后,向固定关联、阈值 1.0、可见性保护与 oracle 回放四组交付相同精确历史位姿修正。 +保留观测来源与位姿版本,修正后在有界缓存内重放受影响的关联,比简单保护恢复更多有效目标。有界实现**尚未编写或测试**。 -离线比较支持门槛 1/2/3、候选上限 25/50/100/不限,报告恢复、查询命中、重复/混合及修正成本。相同上限不等于相同内存。 +room2 固定一个前端、五个 AI 标注实例,第八次观测后交付精确修正。固定关联、阈值 1.0、可见性保护、oracle 重关联四组,比较支持门槛 1/2/3 与候选上限 25/50/100/不限。**28 个建图单元已运行,分析待完成。**[协议](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md)。 -同一 RMS 与支持门槛下,仅当 oracle 在两个有限上限均比所有简单对照高至少 10 个百分点、至少 2/3 配对种子同向且每个种子均不增加已标重复/混合,才考虑原型。简单方法追平将削弱 H1。[冻结协议与完整决策规则](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md)。 +只有 oracle 在两个有限上限下比所有简单对照提升至少 10 个百分点、至少 2/3 配对种子同向,且没有种子增加已标重复/混合身份,才计划原型;否则收窄或停止 H1。相同候选上限不等于相同内存,AI 标注不能确认 H1。[判据与待办](docs/PLAN.zh-CN.md)。 -28 个建图单元已运行,独立分析待完成;AI 标注不能确认 H1。 +[Khronos](https://arxiv.org/html/2402.13817v2) 与 [DovSG](https://arxiv.org/html/2410.11989v2) 已有地图协调/更新。贡献须体现相对已有保护的恢复—成本收益,重放本身不构成创新。 -## 分支导航 +## 分支 -| 分支 | 做了什么 | +| 分支 | 用途 | | --- | --- | -| [`study/identity-budget-v2`](https://github.com/p20030920p/SLAM_Learning/tree/study/identity-budget-v2) | 迟到位姿修正与候选预算对照;H1 未验证。 | -| [`reproduce/author-originals`](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals) | 四篇论文的作者原库复现、指标核对与录像。 | -| [`notes/personal-study-guide-20261008`](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008) | [研究笔记:H1 与否定条件](https://github.com/p20030920p/SLAM_Learning/blob/71a2e7556e231c1d0e6814febb085bea9d225f44/notes/OPEN_QUESTION_AND_HYPOTHESIS.zh-CN.md)。 | -| [`Personal-Learning-Physical`](https://github.com/p20030920p/SLAM_Learning/tree/Personal-Learning-Physical) | [D435/L2 收流、建图试跑与 8 帧语义加载检查](https://github.com/p20030920p/SLAM_Learning/blob/4e5a5e8b703e5072ca5e11cf6893d03bca244473/README.zh-CN.md)。 | +| main | 提交展示:问题、四篇复现、反证与候选 H1。 | +| [reproduce/author-originals](https://github.com/p20030920p/SLAM_Learning/tree/reproduce/author-originals) | 作者原流程、论文表格/语义评分与录制。 | +| [notes/personal-study-guide-20261008](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008) | 个人学习笔记与 `physical/` 实物实验,保留操作说明和失败记录。 | -D435 无 IMU;雷达里程计漂移超标,融合与语义质量未验收。 +迟到修正与候选预算实验保留为[固定快照](https://github.com/p20030920p/SLAM_Learning/tree/4361d4f353a7449c7d6964887643915d2fc72a11);仍属探索,H1 尚未验证。 -[AI 使用](docs/DISCLOSURE.zh-CN.md) · [来源/许可](docs/ATTRIBUTION.zh-CN.md) · [引用](CITATION.cff) · [License](LICENSE) +[AI 使用](docs/DISCLOSURE.zh-CN.md) · [来源/许可](docs/ATTRIBUTION.zh-CN.md) · [引用](CITATION.cff) · [许可](LICENSE) diff --git a/docs/AUDIT.md b/docs/AUDIT.md index 90cfeda0..b4076479 100644 --- a/docs/AUDIT.md +++ b/docs/AUDIT.md @@ -2,6 +2,8 @@ English | [中文](AUDIT.zh-CN.md) +> Historical measurements/analysis; current question and next decision: [STUDY](STUDY.md) · [PLAN](PLAN.md). + Baseline inspected: `af1e58b`. Original files remain recoverable in Git; a local sibling backup was preserved. Historical scores are **unverified inherited claims**, not inputs to the new ledger. | Finding | Consequence | Replacement | diff --git a/docs/AUDIT.zh-CN.md b/docs/AUDIT.zh-CN.md index 40073654..a63f0f5e 100644 --- a/docs/AUDIT.zh-CN.md +++ b/docs/AUDIT.zh-CN.md @@ -2,6 +2,8 @@ [English](AUDIT.md) | 中文 +> 历史测量/分析;当前问题与下一项决策统一见 [STUDY](STUDY.zh-CN.md) · [PLAN](PLAN.zh-CN.md)。 + 检查基线为 `af1e58b`,原文件可从 Git 恢复,也保留了本机相邻备份。历史分数是未核实的继承记录,不参与新汇总。 | 发现 | 影响 | 替换 | diff --git a/docs/DELAYED_RESULTS.md b/docs/DELAYED_RESULTS.md index dc34a90d..a640922c 100644 --- a/docs/DELAYED_RESULTS.md +++ b/docs/DELAYED_RESULTS.md @@ -2,6 +2,8 @@ English | [中文](DELAYED_RESULTS.zh-CN.md) +> Historical measurements/analysis; current question and next decision: [STUDY](STUDY.md) · [PLAN](PLAN.md). + **The frozen experiment passes its historical-decision prerequisite, but a simpler support-gate control removes the selected target deficit without reassociation. H1 remains a candidate; a bounded replay prototype is not justified yet.** This is a new-scene ConceptGraphs diagnostic, not a SLAM, navigation or four-method benchmark. ## What was frozen and checked diff --git a/docs/DELAYED_RESULTS.zh-CN.md b/docs/DELAYED_RESULTS.zh-CN.md index 853e484a..629b1ecc 100644 --- a/docs/DELAYED_RESULTS.zh-CN.md +++ b/docs/DELAYED_RESULTS.zh-CN.md @@ -2,6 +2,8 @@ [English](DELAYED_RESULTS.md) | 中文 +> 历史测量/分析;当前问题与下一项决策统一见 [STUDY](STUDY.zh-CN.md) · [PLAN](PLAN.zh-CN.md)。 + **冻结主实验通过了历史决策效应的前提检验,但更简单的支持门槛对照无需重新关联,就消除了所选目标的恢复缺口。H1 仍是候选,暂不足以支持实现有界回放原型。** 这是新场景上的 ConceptGraphs 诊断,不是完整 SLAM、导航或四方法基准。 ## 冻结内容与核验 diff --git a/docs/DISCLOSURE.md b/docs/DISCLOSURE.md index 05974779..cc805a85 100644 --- a/docs/DISCLOSURE.md +++ b/docs/DISCLOSURE.md @@ -2,8 +2,8 @@ English | [中文](DISCLOSURE.zh-CN.md) -AI contributed to literature discovery and analysis, implementation, debugging, annotation assistance and writing. Measurements come from executed runs; generated explanations do not replace experiments. Room0 and room1 partial-surface annotations were visually checked but await independent human review. Room1 references are excluded from mapping; its six support-gate controls are explicitly post-hoc and separate from 35 frozen cells. +AI assisted literature analysis, implementation, debugging, annotation and writing. Numbers come from recorded execution; generated explanations do not replace experiments. Room0/room1 partial-surface labels lack independent human review. Room2 uses an explicitly AI-only exploratory protocol after the owner waived manual review; this does not constitute confirmation. -Measurements, exploratory interpretations and candidate mechanisms are labeled separately. The applicant should read sources, review annotations and personally walk through at least one reproduction. This repository does not claim independent authorship or complete applicant understanding of every implementation. +Primary protocols, post-hoc controls and candidate mechanisms are distinguished. Room1 references are held out from mapping; its six support controls are separate from 35 frozen cells. Room2's 28 mapping cells ran, but analysis remains pending. Original labels and evidence are preserved. -All current mapping runs use supplied poses. Complete SLAM trajectories, semantic benchmarks, navigation and physical validation remain unfinished. Failures and adverse evidence are retained in public records. +The four research cores use supplied poses. Later original-code runs include scoped semantic scoring; the full benchmarks, complete SLAM, navigation and physical H1 validation remain incomplete. Failures and adverse evidence are public. The applicant should personally read sources and run a reproduction; the repository does not claim independent authorship or complete understanding of every implementation. diff --git a/docs/DISCLOSURE.zh-CN.md b/docs/DISCLOSURE.zh-CN.md index da86da92..8e2be6d2 100644 --- a/docs/DISCLOSURE.zh-CN.md +++ b/docs/DISCLOSURE.zh-CN.md @@ -2,8 +2,8 @@ [English](DISCLOSURE.md) | 中文 -AI 参与文献发现与分析、实现、调试、标注辅助和写作。原始运行产生测量值;AI 生成的解释不代替实验。Room0 与 room1 部分表面标注经视觉检查,但尚未独立人工审核。Room1 参考视图不进入建图;6 个支持门槛对照明确属于事后探索,与 35 个冻结单元分开。 +AI 辅助文献分析、实现、调试、标注和写作。数字来自运行记录,生成解释不代替实验。Room0/room1 部分表面标注尚未独立人审;room2 在所有者豁免人工复核后使用明确的 AI-only 探索协议,不构成确认性证据。 -实测、探索性解释和候选机制分别标明。申请人应亲自阅读来源、检查标注并走通至少一个复现流程;仓库不声称申请人独立写成或已理解全部实现。 +原协议、事后对照和候选机制分别标明。Room1 参考帧不参与建图,六个支持门槛对照与 35 个冻结单元分开。Room2 的 28 个建图单元已运行,分析待完成。原标注及证据保留。 -所有当前建图运行使用给定位姿。完整 SLAM 轨迹、完整语义 benchmark、导航与实物验证尚未完成。失败与不利证据保留在公开记录中。 +四个研究核心使用给定位姿。后续作者原流程有范围限定的语义评分;完整 benchmark、完整 SLAM、导航和实物 H1 验证仍未完成。失败与不利证据公开。申请人应亲自读来源并运行复现;仓库不声称独立写成或已理解全部实现。 diff --git a/docs/LITERATURE.md b/docs/LITERATURE.md index a4767cca..3b32ff4a 100644 --- a/docs/LITERATURE.md +++ b/docs/LITERATURE.md @@ -2,7 +2,7 @@ English | [中文](LITERATURE.zh-CN.md) -Literature cutoff: **7 October 2026**. “Active direction” means several recent representative works pursue it; this is not a bibliometric popularity ranking. The eight core works are chosen for comparable map-update decisions, not a leaderboard across incompatible tasks. +Literature cutoff: **7 October 2026**. “Active direction” means several recent representative works pursue it, not a popularity ranking. Four works were reproduced; four additional papers constrain the interpretation and novelty claim. ## Active directions within fields 1–2 @@ -15,25 +15,25 @@ Literature cutoff: **7 October 2026**. “Active direction” means several rece [AnyLoc](https://arxiv.org/abs/2308.00688) and [Revisit Anything](https://arxiv.org/abs/2409.18049) are adjacent visual place recognition examples. Recall depends on dataset and positive-match definitions; historical scores are not reused. No fresh VPR run is claimed. -## Eight core works +## Four reproduced works and four context papers | Work | Paper evidence | Structural implication (our inference) | Existing protection / boundary | | --- | --- | --- | --- | | [DUFOMap, 2024](https://arxiv.org/html/2403.01449v1) | III-A/B models observed free space and sensor/pose margins; IV-C specifies `d_p=1` | Cleaning uses supplied poses; a margin is not shared-residual covariance | Already addresses pose errors and compares pose sources; “noise unaware” would be wrong | | [BeautyMap, 2024](https://arxiv.org/html/2405.07283v1) | III uses binary occupancy and ray-based refinement/protection; Table I reports HA | Inconsistency after registration can reflect pose error or changes | Already protects against visibility mistakes; acknowledges ground-level limitations | | [ConceptGraphs, ICRA 2024](https://arxiv.org/html/2309.16650v1) | Object association combines geometric overlap and semantics, then fuses points/features | Incorrect world alignment may fragment or merge instances before reasoning | Semantic association helps; this is not evidence that all semantic maps assume static worlds | -| [HOV-SG, RSS 2024](https://arxiv.org/html/2403.17846v2) | III-A uses accurate odometry for projection/fusion; IV-C uses external LiDAR SLAM | Graph/navigation geometry inherits the pose interface | External odometry and loop closure are safeguards; no fresh sensitivity run here | +| [HOV-SG, RSS 2024](https://arxiv.org/html/2403.17846v2) | III-A uses accurate odometry for projection/fusion; IV-C uses external LiDAR SLAM | Graph/navigation geometry inherits the pose interface | External odometry and loop closure are safeguards; paired subset tests do not establish delayed recovery | | [Khronos, 2024](https://arxiv.org/html/2402.13817v2) | IV discusses local consistency; V-B jointly optimizes poses/fragments/background; V-C distinguishes absence of evidence | Candidate generation and local consistency still matter before corrections | **Counterexample:** already has joint optimization, history and visibility; cannot be grouped as fixed-pose independent cleaning | | [DovSG, 2024 preprint / 2025 paper](https://arxiv.org/html/2410.11989v2) | III-D relocalizes using ACE, matching and ICP before local updates | Wrong relocalization may affect associations and obsolete-voxel decisions | Explicitly supports dynamic local updates; refutes “all scene graphs are static” | | [SuperMap, August 2026](https://arxiv.org/html/2608.22896v1) | III conditions on pose; IV uses depth observation states and recursive evidence | Displayed model motivates checking shared pose covariance and calibration | Already separates observable, unobservable and disappeared; an omitted covariance formula does not prove a code defect | | [PerSeM, September 2026 preprint](https://arxiv.org/html/2609.19542v2) | 3.1/3.2 projects into persistent world voxels; 5 discusses drift/correlated errors | Label stability does not guarantee correct geometric evidence assignment | Memory/refinement already exists; correlated geometry is an acknowledged limitation | -The recurring interface is narrow: establish spatial correspondence, then interpret map evidence. These papers do not implement one algorithm, and several already mitigate errors. The candidate question concerns residual shared geometric uncertainty in destructive-update confidence; an empirical cross-field claim still needs annotated pose-error controls beyond the first semantic subset. +The recurring interface is narrow: establish spatial correspondence, then interpret map evidence. Several papers already mitigate errors. The current question tests recovery after late correction; a common dominant shared-uncertainty defect is unestablished. [Current analysis](STUDY.md). ## Code accessibility and scope -DUFOMap and BeautyMap have executable author implementations and small labeled public data. Their exact commits are in [upstreams.json](../configs/upstreams.json). A class-agnostic ConceptGraphs frontend now executed on 40 posed Replica observations; [source/settings](../configs/semantic.json), [scope](SEMANTIC.md). HOV-SG now executes its 8-observation segment feature-map core; [paper card](papers/hovsg.md). The remaining four works were read, not freshly reproduced. [Four-paper structural analysis](STUDY.md). +The [four core snapshots](papers/README.md) pin author commits, inputs and adaptations. [Later original-code runs at 535a278](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md) add paper-table checks and scoped semantic scoring. The other four papers are read context, not freshly reproduced baselines. The [SuperMap repository](https://github.com/superxslam/SuperMap), inspected at `ec95b1d50a458645b2669836e2c431f1e957bbc6`, contained a README, paper and teaser, but no implementation, requirements file or runnable examples. Its setup text is not a runnable recipe at this snapshot. PerSeM is treated as a recent preprint, not an independently validated baseline. -A focused update interface permits author-code measurements and negative controls before the deadline. The next step is the same intervention in a real semantic frontend at matched coverage, rather than presenting synthetic object positions as semantic-navigation results. +Next, finish the frozen room2 equal-cap analysis before proposing bounded replay. Earlier synthetic mechanisms are exploratory context. [Decision gate](PLAN.md). diff --git a/docs/LITERATURE.zh-CN.md b/docs/LITERATURE.zh-CN.md index 629ed919..6cc342c5 100644 --- a/docs/LITERATURE.zh-CN.md +++ b/docs/LITERATURE.zh-CN.md @@ -2,7 +2,7 @@ [English](LITERATURE.md) | 中文 -文献截止 2026 年 10 月 7 日。“活跃方向”表示有多项近期代表工作,不是引用量热度排名。核心工作按地图更新决策选择,不能对不同任务直接排排行榜。 +文献截止 2026 年 10 月 7 日。“活跃方向”表示有多项近期代表工作,不是热度排名。四篇已复现,另外四篇用于约束解释与新颖性声明。 ## 方向 1–2 的活跃主题 @@ -15,27 +15,25 @@ [AnyLoc](https://arxiv.org/abs/2308.00688)、[Revisit Anything](https://arxiv.org/abs/2409.18049) 是相关视觉地点识别例子。召回依赖数据集与正样本定义,本库不沿用历史分数,未做新的 VPR 运行。 -## 八篇核心工作 +## 四篇复现工作与四篇背景文献 | 工作 | 论文证据 | 结构推断 | 已有保护/边界 | | --- | --- | --- | --- | | [DUFOMap,2024](https://arxiv.org/html/2403.01449v1) | III-A/B:观测自由空间与传感器/位姿容差;IV-C:`d_p=1` | 使用给定扫描位姿清图,容差不等于共享残差协方差 | 已考虑位姿误差并比较位姿来源,不能说它“不管噪声” | | [BeautyMap,2024](https://arxiv.org/html/2405.07283v1) | III:二进制占据与射线修正/保护;表 I 用 HA | 配准后不一致可以来自位姿误差或环境变化 | 已保护可见性错误,承认地面层级局限 | | [ConceptGraphs,ICRA 2024](https://arxiv.org/html/2309.16650v1) | 几何重叠与语义相似度关联对象,然后融合点和特征 | 世界坐标对齐错误可能先造成实例碎片化或合并 | 语义帮助关联,不能据此说所有语义地图假设静态世界 | -| [HOV-SG,RSS 2024](https://arxiv.org/html/2403.17846v2) | III-A:准确里程计投影/融合;IV-C:外部 LiDAR SLAM | 图和导航几何继承位姿接口质量 | 外部里程计/回环是保护,本库未实测其敏感性 | +| [HOV-SG,RSS 2024](https://arxiv.org/html/2403.17846v2) | III-A:准确里程计投影/融合;IV-C:外部 LiDAR SLAM | 图和导航几何继承位姿接口质量 | 外部里程计/回环是保护;配对子集不代表迟到修正恢复 | | [Khronos,2024](https://arxiv.org/html/2402.13817v2) | IV:局部一致性;V-B:联合位姿/片段/背景优化;V-C:区分缺少证据 | 修正前的候选生成与局部一致性仍有影响 | **反例:** 已有联合优化、历史和可见性,不能归为固定姿态独立清图 | | [DovSG,2024 预印本/2025 论文](https://arxiv.org/html/2410.11989v2) | III-D:ACE、匹配和 ICP 重定位后局部更新 | 错误重定位可能影响关联与过期体素处理 | 明确支持动态局部更新,反驳“场景图都静态” | | [SuperMap,2026 年 8 月](https://arxiv.org/html/2608.22896v1) | III:条件于位姿;IV:深度观测状态与递归证据 | 展示的模型值得检查共享位姿协方差与校准 | 已区分可观测、不可观测、消失;未展示某公式不等于代码缺陷 | | [PerSeM,2026 年 9 月预印本](https://arxiv.org/html/2609.19542v2) | 3.1/3.2:长期世界体素;5:漂移/相关误差 | 标签稳定不保证几何证据分配正确 | 已有记忆和修正;相关几何是作者承认的局限 | -共同接口只限于“先建立空间对应,再解释地图证据”。这些论文不是一个算法,多个工作已缓解相关问题。候选问题关注剩余共享几何不确定性与不可逆更新的置信度。首个语义子集已执行;实测共性仍需标注和位姿误差对照。 +共同接口只限于“先建立空间对应,再解释地图证据”,多个工作已有保护。当前问题检验迟到修正后的恢复;尚未证明共享不确定性是共同主导缺陷。[当前分析](STUDY.zh-CN.md)。 ## 代码可得性与复现范围 -DUFOMap、BeautyMap 有可执行作者实现与小型公开标注数据,固定提交见 [upstreams.json](../configs/upstreams.json)。ConceptGraphs 的 class-agnostic 前端已处理 40 次提供位姿的 Replica 观测,HOV-SG 已完成 8 观测分段特征建图核心,见[边界](SEMANTIC.zh-CN.md)。其余四篇工作做了阅读,未新近复现。 +[四篇核心快照](papers/README.zh-CN.md)固定作者提交、输入与适配。[535a278 的后续作者原流程](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md)补充论文表格核查与限定语义评分。其余四篇作为已读背景,不计作新复现基线。 [SuperMap 仓库](https://github.com/superxslam/SuperMap)在检查提交 `ec95b1d50a458645b2669836e2c431f1e957bbc6` 时,仅有 README、论文、演示,没有实现、依赖文件与可运行例程,安装文字不构成该快照下的复现配方。PerSeM 是近期预印本,不当作独立验证过的成熟基线。 -先复现可检查的接口和负面对照,再进入真实语义前端;不能把合成对象位置包装成语义导航结果。[阶段安排](PLAN.zh-CN.md)。 - -本次主选四篇为 DUFOMap、BeautyMap、ConceptGraphs、HOV-SG;前两篇完整 teaser,后两篇语义核心子集。HOV-SG 已执行 8 观测分段特征建图,其他四篇只作已读比较与反例。[四篇研究分析](STUDY.zh-CN.md)、[实际范围索引](papers/README.zh-CN.md)。 +先完成冻结的 room2 相同候选上限分析,再决定有界重放。早期合成机制只作探索背景。[决策门槛](PLAN.zh-CN.md)。 diff --git a/docs/PAIRED_RESULTS.md b/docs/PAIRED_RESULTS.md index 94795a39..d4d834c4 100644 --- a/docs/PAIRED_RESULTS.md +++ b/docs/PAIRED_RESULTS.md @@ -2,6 +2,8 @@ English | [中文](PAIRED_RESULTS.zh-CN.md) +> Historical measurements/analysis; current question and next decision: [STUDY](STUDY.md) · [PLAN](PLAN.md). + **Decision: keep H1 as a candidate and narrow the claim.** The completed exploratory study tests downstream map decisions under controlled pose errors. It does not establish a universal failure caused specifically by shared uncertainty, and it does not validate a new method. Temporal ordering can help one map objective and hurt another; simple parameter changes already explain part of the apparent improvement opportunity. ## Evidence and scope diff --git a/docs/PAIRED_RESULTS.zh-CN.md b/docs/PAIRED_RESULTS.zh-CN.md index 6ef75194..10fb39d9 100644 --- a/docs/PAIRED_RESULTS.zh-CN.md +++ b/docs/PAIRED_RESULTS.zh-CN.md @@ -2,6 +2,8 @@ [English](PAIRED_RESULTS.md) | 中文 +> 历史测量/分析;当前问题与下一项决策统一见 [STUDY](STUDY.zh-CN.md) · [PLAN](PLAN.zh-CN.md)。 + **结论:保留候选 H1,收窄主张。** 本轮探索检查受控位姿误差对地图决策的影响,尚未证明“错误处理共享不确定性”是四篇工作的共同主导瓶颈,也未验证新方法。同一种时间结构可能帮助某个地图目标,却损害另一个目标;简单参数变化已经解释了部分看起来值得改进的空间。 ## 证据与范围 diff --git a/docs/PLAN.md b/docs/PLAN.md index 1e98b04e..4dfd69ca 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -1,44 +1,22 @@ -# Reproduction and experiment plan +# Next decision, not a wider roadmap English | [中文](PLAN.zh-CN.md) -The hypothesis remains a candidate until the reproduction gates below are met. The existing synthetic seed sets are exploratory and must not be reused as held-out confirmation. +Finish the existing equal-cap analysis before building H1 or adding methods. [Current question](STUDY.md). -| ID | Work | Exit condition | Current state | -| --- | --- | --- | --- | -| R0 | DUFOMap / BeautyMap author execution | Version, data, return code and output checks; publish measured/table differences | Executed on Windows, Ubuntu CI and local WSL; table differences remain | -| R1 | Reconcile map NN / direct labels / original PCL | Same point identity and threshold; attribute each score difference | PCL/SciPy agree; direct/map scoring effect measured; paper-version and small API remainder open | -| R2 | More real scenes, qualitative output | Same camera/ROI across methods; per-scene rather than one pooled number | Measured replay published; more scenes remain open | -| R3 | Two semantic mapping cores | Author baseline, poses, object associations and queried coordinates reproduced | ConceptGraphs 40-observation and HOV-SG 8-observation cores executed; restricted targets added in the paired study; full hierarchy remains open | -| B0 | Retain or revise the bottleneck | Identify an observed shared failure and an explicit counterexample | Revised after paired evidence; universal correlation-harm rule rejected; H1 remains candidate | -| H0 | Freeze hypothesis and protocol | Commit held-out scenes/seeds, thresholds, coverage/latency budgets and rejection rule | Not frozen | -| E0 | Pose magnitude versus correlation | Exact poses, independent errors and correlated drift with matched marginal error | 76 primary cells + 21 exploratory controls completed; [results](PAIRED_RESULTS.md) | -| E1 | Anchors, visibility and scene changes | Static/moved/removed/occluded identities; minority and majority movers | Exploratory toy exists; real extension planned | -| E2 | Update and query risk | Compare at matched coverage, recall and latency; record stale duration | Planned; current toy alone cannot decide | -| V0 | Publish animation/video | Render from scored labels and bind camera/run/frame metadata | Four per-paper MP4/GIFs and bilingual reports published; drift/held-out comparisons reserved | +| Stage | Status / required output | +| --- | --- | +| Four reproductions | Core outputs published; larger [author runs](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md) include scoped scoring, adaptations and failures | +| Counterevidence | room0: correlation is not uniformly worse; room1: lower support closes the selected recovery deficit | +| room2 mapping | 28 cells executed; one frozen frontend and AI-only labels | +| room2 analysis | Pending: recalculate all seeds/readouts, zero-error parity, identities, query hits and correction cost | +| Prototype decision | Apply the frozen oracle-versus-simple-controls gate below; publish ties and failures | +| Confirmation | Independent label review and broader scenes/events remain necessary; AI-only exploration cannot confirm H1 | -## First semantic reproduction +At matched RMS, support and endpoint, oracle needs ≥10 mean percentage-point improvement over every simple control at two finite caps, ≥2/3 positive paired seeds, and no seed increasing labelled duplicates/mixes. Passing permits a prototype plan; failing narrows or stops H1. [Exact protocol](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md). -Start with the author's offline object-map construction and query interface, not a navigation stack. [ConceptGraphs code](https://github.com/concept-graphs/concept-graphs) is a candidate because geometry/semantic association is inspectable. Before installing it, pin a runnable revision and record its dataset, checkpoints and depth/pose sources. Check GPU memory against the actual pipeline; the current CPU lockfile is not a ConceptGraphs environment. +If justified, compare bounded replay with full replay and the strongest simple controls, measuring recovery/query quality, identity errors, peak memory and correction latency. No budget benefit is established by matching candidate caps alone. -The baseline deliverable is a map built with recorded author settings and explicit adaptations, object association traces, and queries returning world coordinates. If known poses fail to reproduce that baseline, fix setup before injecting drift. ConceptGraphs and HOV-SG subset cores have both executed; see the scoped [semantic baselines](SEMANTIC.md). +Hardware acquisition, full navigation and shared-covariance inference are optional later work, not prerequisites for this decision. Preserve original labels, failures, run hashes and reviewed PDF snapshots. Main changes require commit-bound review, CI and explicit owner approval. -## Candidate confirmation factors - -Hold the frontend fixed. Sweep translation and rotation, stable-anchor fraction, mover fraction, occlusion and pose-correction delay. Separate error magnitude from temporal correlation. Include unchanged and genuinely removed objects; hidden is not removed. - -Compare swept thresholds/margins, visibility gating, independent pose variance and shared-latent inference. Joint systems such as Khronos provide an informed counterexample where integration is feasible. Use validation scenes for all parameters; keep held-out environments and seeds unseen until H0 is committed. - -## Decision variables - -Measure static false deletion, change recall, identity fragmentation, probability calibration, current-target coordinate error, query coverage, stale duration, latency and compute. Publish risk–coverage and risk–latency curves rather than one favorable operating point. Keep world-coordinate query error separate from SLAM ATE and executed navigation success. - -## Media tied to the stages - -R0/R2 feed the raw–removed–retained animation; R1 feeds the correspondence figure; R3 feeds the semantic-map query video; E0 feeds the pose-drift animation; E2 feeds risk curves. The [media index](figures/README.md) contains filenames, captions and evidence requirements. A reserved filename is not a result. - -## Stop or revise - -Do not advance to a confirmatory claim if the baseline measurement is unresolved. Revise H1 if simple threshold sweeps match its benefit, independent variance is sufficient, covariance estimates are uncalibrated, or reduced deletion increases stale-target time. Report majority-motion failure as an information boundary rather than excluding the scene. - -The four delivered scopes are fixed in [paper cards](papers/README.md). The [physical protocol](REAL_WORLD.md) adds fixed-pose visibility controls before handheld error controls. Complete graph/navigation remains outside the delivered semantic subsets. +Legacy R*/E* codes in media records refer to the [earlier staged plan](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/PLAN.md), not current completion claims. diff --git a/docs/PLAN.zh-CN.md b/docs/PLAN.zh-CN.md index fafaa4d8..fb64a9a8 100644 --- a/docs/PLAN.zh-CN.md +++ b/docs/PLAN.zh-CN.md @@ -1,46 +1,22 @@ -# 复现与实验计划 +# 先完成下一项决策 [English](PLAN.md) | 中文 -满足下列复现门槛之前,假设保持候选状态。已有合成种子用于探索,不能重复用作留出确认。 +先完成已有的相同候选上限分析,再决定是否实现 H1 或增加方法。[当前问题](STUDY.zh-CN.md)。 -| 编号 | 工作 | 通过条件 | 当前状态 | -| --- | --- | --- | --- | -| R0 | DUFOMap/BeautyMap 作者方法执行 | 版本、数据、返回码与产物检查;公开实测/论文差值 | Windows、Ubuntu CI、本机 WSL 已执行;表格差值仍存在 | -| R1 | 对齐地图最近邻/直接标签/原 PCL | 相同点身份和阈值;逐项归因分数差异 | PCL/SciPy 一致,直接/地图评分效应已测;论文版本与小的 API 剩余差值待查 | -| R2 | 更多真实场景与定性输出 | 所有方法同视角/范围;按场景统计 | 实测回放已发布;更多场景待做 | -| R3 | 两个语义建图核心 | 复现作者基线、位姿、对象关联与查询坐标 | ConceptGraphs 40 观测、HOV-SG 8 观测已执行;配对研究已补受限目标;完整层级待做 | -| B0 | 保留或修订瓶颈 | 明确实测共性失效与反例 | 按配对证据收窄;否定相关性总有害,H1 保持候选 | -| H0 | 冻结假设与协议 | 提交留出场景/种子、阈值、覆盖率/延迟预算与否定规则 | 尚未冻结 | -| E0 | 位姿幅度与相关性 | 精确位姿、独立误差、相同边际误差的相关漂移 | 76 主单元 + 21 探索对照完成;[结果](PAIRED_RESULTS.zh-CN.md) | -| E1 | 锚点、可见性与场景变化 | 静态/移动/移除/遮挡身份;少数和多数运动 | 已有探索玩具实验;真实扩展待做 | -| E2 | 更新与查询风险 | 匹配覆盖率、召回、延迟;记录过期持续时间 | 计划中;现有玩具实验无法决定 | -| V0 | 发布动画/视频 | 从评分标签渲染,绑定视角/运行/帧元数据 | 四篇各自视频/GIF 及双语 PDF 已发布;漂移/留出视频待做 | +| 阶段 | 状态/必要交付 | +| --- | --- | +| 四篇复现 | 核心产物已发布;更大的[作者原流程](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md)另有限定评分、适配与失败 | +| 反证 | room0:相关性并非总有害;room1:降低支持门槛消除所选目标恢复缺口 | +| room2 建图 | 28 单元已运行;一个冻结前端、AI 标注 | +| room2 分析 | 待完成:全种子/读出复算、零误差等价、身份、查询命中与修正成本 | +| 原型决策 | 应用下列冻结判据;追平与失败同样公开 | +| 确认 | 仍需独立标注复核与更多场景/事件;AI 探索不能确认 H1 | -## 首个语义复现 +固定 RMS、支持门槛和评价项,oracle 须在两个有限上限下比所有简单对照平均提升至少 10 个百分点,至少 2/3 配对种子同向,且没有种子增加已标重复/混合身份。通过仅允许计划原型;未通过则收窄或停止 H1。[完整协议](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md)。 -从作者的离线对象地图构建和查询接口开始,不先搭导航栈。[ConceptGraphs 源码](https://github.com/concept-graphs/concept-graphs)可检查几何/语义关联,作为候选。安装前固定可运行提交,记录数据、权重、深度和位姿来源,并按真实流程检查显存。当前 CPU 锁文件不是 ConceptGraphs 环境。 +若有依据,再将有界重放与全量重放、最强简单对照比较,测恢复/查询质量、身份错误、峰值内存和修正延迟。仅匹配候选上限不能证明预算收益。 -基线交付是记录作者设置及明确适配构建的地图、对象关联轨迹,以及返回世界坐标的查询。已知位姿也无法复现时,先修环境再注入漂移。ConceptGraphs 与 HOV-SG 子集核心均已执行,范围见[语义基线](SEMANTIC.zh-CN.md)。 +硬件采集、完整导航与共享协方差推断属于后续可选工作,不是本轮决策前置条件。保留原标注、失败、运行哈希及审核后的 PDF 快照。main 修改须绑定提交审核、CI 通过并由所有者明确批准。 -## 候选确认因素 - -固定前端,扫描平移、旋转、稳定锚点比例、运动比例、遮挡和位姿修正延迟。误差幅度与时间相关性分开控制,包含不变与确实移除对象;隐藏不等于移除。 - -比较阈值/容差扫描、可见性、独立位姿方差和共享潜变量。可集成时,用 Khronos 等联合系统作有信息的反例。参数只在验证场景选择;H0 提交之前,不查看留出环境和种子的结果。 - -## 决策指标 - -测量静态误删、变化召回、身份碎片化、概率校准、当前目标坐标误差、查询覆盖率、过期时间、延迟和计算量。公开风险—覆盖率、风险—延迟曲线,不只挑有利工作点。世界坐标查询误差与 SLAM ATE、实际导航成功率分别记录。 - -## 媒体与阶段对应 - -R0/R2 对应原始—移除—保留动画;R1 对应评价对应图;R3 对应语义查询视频;E0 对应漂移动画;E2 对应风险曲线。[媒体索引](figures/README.zh-CN.md)固定文件名、图注与证据要求,预留文件名不是实验结果。 - -## 何时停止或修订 - -基线测量未解决时,不进入确认性结论。若简单阈值扫描达到同样收益、独立方差已足够、协方差估计未校准,或少删除增加目标过期时间,则修订 H1。多数运动的失败应作为信息边界报告,而不是删掉场景。 - -## 本次四篇交付更新 - -R3 已执行 ConceptGraphs 40 观测与 HOV-SG 8 观测建图核心;标注准确率及完整层级仍未完成。V0 已发布四篇各自 MP4/GIF 及中英文 PDF;漂移/留出验证图继续预留。[论文范围](papers/README.zh-CN.md)、[实物控制方案](REAL_WORLD.zh-CN.md)。 +媒体记录中的旧 R*/E* 编号对应[早期阶段计划](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/PLAN.zh-CN.md),不代表当前完成声明。 diff --git a/docs/README.md b/docs/README.md index fbd5cf28..30a6feea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,21 +1,17 @@ -# Study materials +# Submission evidence English | [中文](README.zh-CN.md) -Read from claims to measurements and sources. Personal operating and application notes stay local. +Main is the submission entry. Read the question, four reproductions, counterevidence, then the next decision. -| Material | Purpose | +| Read | Purpose | | --- | --- | -| [Research analysis](STUDY.md) | Achievements, shared dependencies, counterexamples, metrics and candidate H1 | -| [Four paper cards](papers/README.md) | Executed scope, videos, reports and failures | -| [Paired results](PAIRED_RESULTS.md) | 97 cells, annotations, parameter controls and limits | -| [Paired protocol](PAIRED_PROTOCOL.md) | Controls, adapters and metric definitions | -| [Delayed correction results](DELAYED_RESULTS.md) | 35 frozen new-scene cells, six post-hoc support controls and revised H1 decision | -| [Delayed correction protocol](DELAYED_PROTOCOL.md) | Held-out references, native parity and historical association intervention | -| [Reproduction results](RESULTS.md) | Paper gaps, PCL agreement and scoring effects | -| [Home validation design](REAL_WORLD.md) | Fixed-sensor events and delayed corrections | -| [Reproduction](REPRODUCE.md) | Minimal commands and separate dependencies | -| [Visualization scope](RECORDING.md) | Output replay, terminal execution and actual RViz inspection | -| [Source analysis](LITERATURE.md) | Prior work and novelty boundaries | -| [AI disclosure](DISCLOSURE.md) | Contributions and evidence levels | -| [Sources and licenses](ATTRIBUTION.md) | Data, weights and media origins | +| [Research analysis](STUDY.md) | Shared interface, paper-specific protections, why ConceptGraphs, candidate H1 | +| [Four core snapshots](papers/README.md) · [later author runs](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md) | Executed scopes, scores, failures, GIFs/videos and historical PDFs | +| [room0 paired results](PAIRED_RESULTS.md) · [protocol](PAIRED_PROTOCOL.md) | 97 cells; pose controls and limitations | +| [room1 delayed results](DELAYED_RESULTS.md) · [protocol](DELAYED_PROTOCOL.md) | 35 frozen cells plus six separate post-hoc controls; counterevidence | +| [room2 exploration](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md) · [next decision](PLAN.md) | 28 mapping cells executed; identity/budget analysis pending | +| [Setup](REPRODUCE.md) · [recording scope](RECORDING.md) | Commands and separation of execution, 3D viewing and saved-map replay | +| [Literature](LITERATURE.md) · [AI use](DISCLOSURE.md) · [sources/licenses](ATTRIBUTION.md) | Prior work, claim boundaries and provenance | + +Optional: [hardware protocol](REAL_WORLD.md) and [device trials](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008/physical). Earlier [reasoning](RESEARCH.md), [refactor audit](AUDIT.md) and [baseline measurements](RESULTS.md) remain available for traceability. diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md index 130de59a..c8180501 100644 --- a/docs/README.zh-CN.md +++ b/docs/README.zh-CN.md @@ -1,21 +1,17 @@ -# 研究材料索引 +# 提交证据索引 [English](README.md) | 中文 -按“结论 → 测量 → 来源”阅读;个人操作和申请准备手册留在本地。 +main 是提交入口,按“问题 → 四篇复现 → 反证 → 下一项决策”阅读。 -| 材料 | 用途 | +| 入口 | 用途 | | --- | --- | -| [研究分析](STUDY.zh-CN.md) | 复现效果、共性依赖、反例、指标和候选 H1 | -| [四篇论文卡](papers/README.zh-CN.md) | 实际执行范围、视频、报告与失败 | -| [配对结果](PAIRED_RESULTS.zh-CN.md) | 97 单元、目标标注、参数对照与证据限制 | -| [配对协议](PAIRED_PROTOCOL.zh-CN.md) | 控制变量、适配和评价定义 | -| [迟到修正结果](DELAYED_RESULTS.zh-CN.md) | 新场景 35 个冻结单元、6 个事后支持门槛对照与 H1 修订决策 | -| [迟到修正协议](DELAYED_PROTOCOL.zh-CN.md) | 独立参考视图、原核心等价与历史关联干预 | -| [原始复现结果](RESULTS.zh-CN.md) | 论文差值、PCL 一致性与评分效应 | -| [居家验证设计](REAL_WORLD.zh-CN.md) | 固定传感器事件与迟到修正实验 | -| [复现入口](REPRODUCE.zh-CN.md) | 最少命令与独立依赖 | -| [可视化范围](RECORDING.zh-CN.md) | 结果回放、终端执行与真实 RViz 查看 | -| [来源分析](LITERATURE.zh-CN.md) | 先验工作与新颖性边界 | -| [AI 披露](DISCLOSURE.zh-CN.md) | 参与方式与证据等级 | -| [来源与许可](ATTRIBUTION.zh-CN.md) | 数据、权重和媒体来源 | +| [研究分析](STUDY.zh-CN.md) | 共同接口、各论文已有保护、为何选 ConceptGraphs、候选 H1 | +| [四篇核心快照](papers/README.zh-CN.md) · [后续作者运行](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md) | 实际范围、评分、失败、GIF/视频与历史 PDF | +| [room0 配对结果](PAIRED_RESULTS.zh-CN.md) · [协议](PAIRED_PROTOCOL.zh-CN.md) | 97 单元,位姿对照与限制 | +| [room1 迟到修正](DELAYED_RESULTS.zh-CN.md) · [协议](DELAYED_PROTOCOL.zh-CN.md) | 35 冻结单元与另列的六个事后对照,保留反证 | +| [room2 探索](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md) · [下一项决策](PLAN.zh-CN.md) | 28 建图单元已运行,身份/预算分析待完成 | +| [安装](REPRODUCE.zh-CN.md) · [录制范围](RECORDING.zh-CN.md) | 命令,以及执行录像、三维查看、保存地图回放的区分 | +| [文献](LITERATURE.zh-CN.md) · [AI 使用](DISCLOSURE.zh-CN.md) · [来源/许可](ATTRIBUTION.zh-CN.md) | 先验工作、声明边界与来源 | + +补充:[实物协议](REAL_WORLD.zh-CN.md)与[设备尝试](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008/physical)。早期[推理](RESEARCH.zh-CN.md)、[重构核查](AUDIT.zh-CN.md)和[基线测量](RESULTS.zh-CN.md)保留供追溯。 diff --git a/docs/REAL_WORLD.md b/docs/REAL_WORLD.md index c1797ace..660c65ac 100644 --- a/docs/REAL_WORLD.md +++ b/docs/REAL_WORLD.md @@ -1,81 +1,28 @@ -# Home validation with D435i and Unitree L2 +# Optional physical validation English | [中文](REAL_WORLD.zh-CN.md) -**No hardware data has been collected yet.** Use this Windows/WSL computer, D435i, L2, tripods, a chair, boxes, an occlusion board, tape measure and a phone to test map decisions and target validity. Test each fixed sensor separately before handheld revisits; no mobile robot is required. +Hardware is a follow-up to the room2 decision, not evidence confirming H1. Current acquisition, failed trials and operating instructions live on the [hardware branch](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008/physical). The connected depth device was identified as D435 without IMU; L2 is tested separately. No mobile robot is required. -## Three distinguishable questions +## One fixed-sensor session -| Question | Intervention | Main criterion | -| --- | --- | --- | -| Is visibility mistaken for change? | Fixed sensor; static, occluded, removed and moved target | False static removal, visible-removal recall and stale-coordinate duration | -| Is pose correction sufficient? | Same observations/features; correct history with associations fixed or recomputed | Surface coverage, identity fragments, coordinate error and recovery time | -| Is bounded H1 worth its cost? | Independent-variance versus shared-pose protection at matched recall, coverage and delay | Risk frontier, memory, replay time and stale-result exposure | - -Raw collection can begin immediately. The second and third questions still require hardware-data adapters and candidate modules; current Replica entry points cannot directly consume device recordings. A sensor image or RViz cloud proves acquisition/viewing, not H1. - -## Room and independent reference - -Include a wall, floor and another plane orientation. Full pose estimation needs independently measured multiple markers or sufficiently observable background; one plane does not constrain all degrees of freedom. Fix markers to the background, not moving targets. - -Fix the sensor and initially place targets around 1.5–3 m away, subject to measured depth validity and L2 return density. Assign physical IDs to the chair and two similar boxes. Mark initial and 30 cm translated locations with tape and record measurement uncertainty. A separate fixed phone should see the objects, sensor and session label. +Use a stable background, a chair, two similar boxes, an occlusion board and a fixed phone showing the event timeline. Assign physical IDs and measured positions before running algorithms. Keep annotation-only markers out of algorithm inputs. -Algorithm-visible anchors are auxiliary inputs shared by applicable baselines. Evaluation-only markers must not leak into inputs. D435i IMU is not position GT. Use identity relative poses for the fixed sensor and record origin/axes per session. - -## A Fixed-sensor events - -Collect four event types separately for each sensor. Each session lasts 80 seconds: static baseline 0–20, event action 20–25, hold 25–60, restoration and static observation 60–80. Log actual times; moving transitions are separate from completed states. - -| Event | Action | Required interpretation | +| Event | Controlled change | Evaluate | | --- | --- | --- | -| Static | Nothing moves | Observation noise should not delete or split targets | -| Occluded | Hide the stationary chair behind a board | Hidden/unknown is not absent; restore the same physical ID afterwards | -| Removed | Remove the chair while old space/background remains visible | Evaluate visible-removal recall only with rays/depth reaching the old space | -| Moved | Translate the chair 30 cm along tape | New coordinates become valid; old coordinates become stale | - -Add out-of-view and failure controls with most similar boxes moving together while stable background is hidden. Unseen old space is not visible removal. Without anchors, coherent object motion and camera drift may be unidentifiable. - -Start with one four-event demonstration per sensor: 5 min 20 s each, for pipeline checking only. For formal exploration, use three validation sessions per event, then freeze and collect five test sessions with a changed layout: 32 sessions or 42 min 40 s per sensor. This does not guarantee statistical power. Do not inspect test outcomes before freezing; statistical units are sessions, not pixels or random seeds. - -## B Delayed corrections on identical observations - -Extract 40 timestamped observations from a fixed-sensor recording. Hold RGB, depth, calibration, masks and per-mask features fixed. Identity poses are the reference. Observations 0–7 are exact; 8–15 receive a world-x bias ramping from 0 to 10 cm; the remainder are exact. This is a deterministic recovery stress test, not a deployment noise model. Report achieved RMS, extrema and ordering; do not claim sorting isolates correlation. - -Deliver the same historical correction at observation 16, 24 or 36, restoring reference poses for 8–15. With a 16-observation cache, the first correction is inside the window; the others include expired provenance. Fall back to full reconstruction or explicitly return unrecoverable. Cross event conditions with delay, debugging on static clips before freezing test settings. Rotation and handheld estimated poses are later separate factors. - -| Comparison | Intervention | -| --- | --- | -| B0 Native core | Preserve original association/fusion and historical decisions | -| B1 Simple protection | Select thresholds/visibility on validation; retain ConceptGraphs threshold 1.0 as a competitor | -| B2 Correct geometry, freeze association | Reproject the same cached observations with corrected poses but retain previous object membership, isolating geometry correction from reassociation | -| B3 Independent variance | Same provenance cache, budget and commit policy; independent uncertainty controls tentative/committed updates | -| B4 Candidate shared pose | Add shared-pose handling and affected-association replay without stronger front ends or additional labels | -| B5 Oracle full replay | Rebuild all history under corrected poses; report actual time and memory | - -Run B0/B1/B2/B5 first to determine whether replay adds value beyond geometry correction. Compare B3/B4 only after uncertainty estimation is implemented and calibrated. Known injected errors/covariance are separate oracle conditions. Provenance and pose versions alone are not demonstrated novelty. - -## C Handheld and dual-sensor extensions - -After fixed-sensor validation, separately walk a slow 1–2 minute revisit loop with each sensor, starting and ending stationary. Keep estimated odometry separate from independent background/marker reference and report reprojection, depth and reference errors. Preserve L2 point time/ring for deskewing; scanning distortion is not automatically scene motion. - -Combine devices only after rigid mounting, extrinsic calibration, timestamp-offset/drift measurement and other-device on/off interference controls. USB/network timestamps and two IMUs do not automatically provide a shared clock or fusion system. - -## Metrics and rejection rules +| Static | Repeat the same view | False removal and baseline identity/query errors | +| Occluded | Hide one unchanged object | Wrong deletion and unsupported stale answers | +| Removed | Remove an object, observe its former space | Removal recall and stale-coordinate duration | +| Moved | Move one marked object | Old/new target coordinates, duplicates and mixed IDs | -| Metric | Definition | -| --- | --- | -| False static removal / real-removal recall | Lost independently annotated visible static support / detected visible-removal events; point and event denominators remain separate | -| Coverage and identity | Annotated visible-surface coverage within 10 cm; recovery requires at least 20% coverage and 50% visible projection precision; count segments per physical ID | -| Target coordinate error | Distance to an independently measured designated surface anchor, with reference uncertainty; not full-object center or navigation error | -| Staleness and delay | Completed event to old-coordinate invalidation; delivered correction to updated query; log valid, tentative, stale and unrecoverable states | -| Resources | Serial runs on this computer; 16 observations / 512 MiB is a proposed provenance-cache budget only. Measure process RSS, GPU peak and replay time separately | +Record raw observations, calibration, depth scale, timestamps, SDK versions and event timing. Sensor images and point clouds establish acquisition, not semantic quality. The [branch recording guide](https://github.com/p20030920p/SLAM_Learning/blob/30ccf1b4299e1d301740423661abaa91bb047573/docs/SIMPLE_RECORDING.md) covers full execution and same-recording replay. -Select operating points on validation, then report test risk–coverage–delay curves with matched change recall. Reject the corresponding H1 benefit if simple protection reaches the same frontier, B2 explains all recovery, uncertainty is uncalibrated, or fewer deletions merely retain stale targets longer. Abstention reduces coverage; retain out-of-window failures. +## Test the same correction question -## Acquisition and video evidence +After the baseline works, reuse identical observations/features and compare exact geometry correction with fixed versus recomputed associations, including threshold and visibility controls. An injected correction tests controlled sensitivity; actual odometry-error claims require an independent reference. Do not equate the two. -Use official RealSense Viewer to record raw RGB/depth/IMU, calibration, depth scale, SDK/firmware versions and hashes. Current documentation uses `.db3`; legacy versions use `.bag`. Choose the installed SDK's format and inspect playback; the extension does not establish IMU completeness. [Official record/playback](https://github.com/realsenseai/librealsense/blob/master/doc/record-and-playback.md). +Score physical-instance recovery and category queries separately, along with identity errors, actual candidates/points, correction latency and peak memory. Unlabelled candidates are unknown. Fixed sensors need no IMU; handheld and cross-device fusion require separate pose/calibration validation. -For L2 pin SDK2/ROS2 and retain all PointCloud2 fields, IMU, point time/ring, actual topics and TF. Official defaults are `unilidar/cloud`, `unilidar/imu` and lidar frame `unilidar_lidar`. The published ROS2 validation environment is Foxy; this host's Humble hardware connection remains unverified. [Official SDK2](https://github.com/unitreerobotics/unilidar_sdk2). +Only design bounded replay if the [room2 decision gate](PLAN.md) supports it. Independent labels and real change events are still needed for confirmation. Preserve full collection/execution videos; label saved-map viewing as replay. [Main recording scope](RECORDING.md). -Each session retains raw files, `capture.json`, calibration, `events.csv`, object/visibility labels, reference measurements, logs, screen capture and phone event video. RGB-D/3D clouds and map/target outputs occupy the main screen area; terminal text establishes commands and exit status. Label inference and offline inspection separately. Publish verified lightweight evidence and short clips on main; keep large files local. +The [earlier detailed protocol](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/REAL_WORLD.md) remains in Git history; current device operations are maintained on the hardware branch. diff --git a/docs/REAL_WORLD.zh-CN.md b/docs/REAL_WORLD.zh-CN.md index 28ec8561..f044aeca 100644 --- a/docs/REAL_WORLD.zh-CN.md +++ b/docs/REAL_WORLD.zh-CN.md @@ -1,81 +1,28 @@ -# 使用 D435i 和 Unitree L2 的居家验证设计 +# 补充实物验证设计 [English](REAL_WORLD.md) | 中文 -**尚未采集硬件数据。** 本设计用这台 Windows/WSL 电脑、D435i、L2、三脚架、椅子、箱子、挡板、卷尺和手机,检验地图决策与目标有效性。先分别固定传感器,后做手持重访;不需要移动机器人。 +实物是 room2 决策后的补充,不是 H1 确认证据。当前采集、失败尝试与操作说明见[实物分支](https://github.com/p20030920p/SLAM_Learning/tree/notes/personal-study-guide-20261008/physical)。已连接深度设备被识别为无 IMU 的 D435;L2 单独测试,不需要移动机器人。 -## 要区分的三个问题 +## 一次固定传感器会话 -| 问题 | 干预 | 主要判据 | -| --- | --- | --- | -| 可见性是否被误当作变化 | 传感器固定,目标静止/遮挡/移除/移动 | 静态误删、可见移除召回、目标旧坐标过期时长 | -| 位姿修正是否足以恢复目标 | 同一批原始观测与特征,修改历史位姿后固定/重新计算关联 | 表面覆盖、身份碎片、目标坐标误差与恢复时间 | -| 有界 H1 是否值得额外成本 | 独立方差保护与共享位姿保护,匹配召回/覆盖/延迟 | 风险前沿、峰值内存、回放时间与过期结果暴露 | - -第一项可以立即开始采集;第二、三项仍需硬件数据适配与候选模块,现有 Replica 入口不能直接读取设备录制文件。传感器图像或 RViz 点云可见,只证明采集/查看链路,不等于 H1 已得到验证。 - -## 房间与独立参考 - -背景至少包含墙、地面和另一方向的平面,尽量覆盖多个方向;需要估计完整位姿时使用独立测量的多标记板或充分可观测的背景。单个平面不能约束所有自由度。将标记固定在背景,移动物体不贴定位锚点。 - -固定传感器,初始目标距其约 1.5–3 m,以实际深度有效率和 L2 回波密度为准。给椅子和两个相似箱子分配物理 ID,在地上贴初始和 30 cm 移动位置,记录尺量不确定性。另一个手机固定拍到物体、传感器和会话编号。 +准备稳定背景、椅子、两个相似箱子、挡板和记录事件时间线的固定手机。在算法运行前指定物理 ID 与测量位置;评价专用标记不进入算法输入。 -算法可见锚点属于辅助输入,必须对所有相应基线相同;评价专用标记不能泄漏到算法输入。D435i IMU 不作为位置真值。固定传感器采用单位相对位姿;原点与轴在每个会话开始记录。 - -## A 固定传感器事件 - -每台传感器分别采集四种事件。每段 80 秒:0–20 秒静止基线,20–25 秒执行事件,25–60 秒保持,60–80 秒恢复和静止。记录实际事件时间,搬动过程单独标为过渡,不算已经完成的状态。 - -| 事件 | 动作 | 正确判断需要什么 | +| 事件 | 控制变化 | 评价 | | --- | --- | --- | -| 静止 | 全程不动 | 不应凭观测抖动删除或分裂目标 | -| 遮挡 | 挡板遮住椅子,椅子不动 | 隐藏/未知不等于消失;移开挡板后恢复同一物理 ID | -| 移除 | 搬走椅子,原空间和背景继续可见 | 必须有射线/深度证据到达原空间,才评价可见移除召回 | -| 移动 | 沿胶带移动椅子 30 cm | 新位置有效,旧坐标应过期;不能用“永久保留”换低误删 | - -另加视野外与“大多数相似箱子同向移动、稳定背景被挡住”的失败对照。看不到旧空间时不算可见移除;没有稳定锚点时不要求系统凭空区分相机漂移与物体运动。 - -先各做一段四事件演示(每台 5 分 20 秒),只用于检查链路。正式探索建议每事件 3 次验证会话,冻结后换布局做 5 次测试会话;每台共 32 段、42 分 40 秒原始数据。这个规模不保证统计功效。测试前不查看结果,按会话而非像素或随机种子统计。 - -## B 同观测的迟到位姿修正 - -先从固定设备录制抽取 40 个有时间戳观测,保持图像、深度、标定、掩码和逐掩码特征不变。以单位位姿为参考,0–7 观测无误差;8–15 观测注入世界 x 方向 0→10 cm 的线性偏差,其余无误差。这是确定性的恢复压力测试,不是定位噪声模型;报告实际 RMS、极值和时序,不使用排序误差来声称隔离相关性。 - -在第 16/24/36 观测分别交付同一组历史修正,恢复 8–15 的参考位姿。16 观测缓存使第一种修正在窗口内,后两种涉及窗口外来源。窗口外必须全量重建或明确标为不可恢复。事件条件与修正延迟交叉;先固定身份的静止片段调试,再冻结测试条件。旋转与手持估计位姿是后续单独因素。 - -| 比较条件 | 固定或改变什么 | -| --- | --- | -| B0 原核心 | 保持原关联/融合与原历史决策,作为未恢复对照 | -| B1 简单保护 | 验证集选择阈值/可见性规则;保留 ConceptGraphs 阈值 1.0 等竞争工作点 | -| B2 修正几何但冻结关联 | 用同一缓存原观测重新投影,保持修正前的对象归属;区分坐标修正与关联恢复收益 | -| B3 独立方差保护 | 相同来源缓存、预算与提交策略,按独立方差决定暂定/提交 | -| B4 候选共享位姿保护 | 只增加共享位姿处理与受影响关联回放;不能同时获得更强前端或更多标注 | -| B5 oracle 全量回放 | 用修正后的完整历史从头重建,作为正确性参考;时间和内存照实报告 | - -先执行 B0/B1/B2/B5,确认回放是否比只改几何有必要。B3/B4 只有在不确定性估计器明确实现、校准后才比较;已知注入误差/协方差属于 oracle,单独列出。共享版本/来源记录不是已证明的新颖算法。 - -## C 手持重访与双设备扩展 - -固定设备测试通过后,分别手持慢走 1–2 分钟,重访同一场景,起止静止。估计里程计与独立背景/标记参考分开,记录重投影残差、深度误差和参考不确定性。L2 保存逐点时间与 ring,扫描运动需去畸变,不能全部归因于场景变化。 - -两设备先各自测试。只有刚性安装、外参标定、时间偏移及漂移量测、另一设备开/关干扰对照完成后,才开展共同几何实验。USB/网络时间戳或两套 IMU 不自动构成共享时钟和融合系统。 - -## 测量与否定规则 +| 静止 | 重复相同视角 | 误删与基线身份/查询错误 | +| 遮挡 | 遮住未移动对象 | 错误删除与无依据的过期答案 | +| 移除 | 移走对象并观测原位置 | 移除召回与旧坐标过期时长 | +| 移动 | 移动一个已编号对象 | 新旧目标坐标、重复与混合身份 | -| 指标 | 定义与报告方式 | -| --- | --- | -| 静态误删/真实移除召回 | 独立标注的静态可见支持误删比例/可见移除事件检测比例;事件和点级分母分开 | -| 覆盖与身份 | 已标可见表面 10 cm 内覆盖;匹配表面可见投影精度至少 50%、覆盖至少 20% 才算恢复;记录一个物理 ID 对应的片段数 | -| 目标坐标误差 | 对独立测量的指定表面锚点报告距离与参考误差;不声称完整物体中心或导航误差 | -| 过期与延迟 | 实际事件完成到旧坐标失效的时间、修正送达到查询更新的时间;有效/暂定/过期/不可恢复均记录 | -| 计算与预算 | 同一电脑串行执行;16 观测/512 MiB 仅是候选来源缓存预算,进程 RSS、峰值显存与回放耗时另外实测 | +保存原始观测、标定、深度标尺、时间戳、SDK 版本和事件时刻。图像与点云只证明采集,不代表语义质量。[分支录制指南](https://github.com/p20030920p/SLAM_Learning/blob/30ccf1b4299e1d301740423661abaa91bb047573/docs/SIMPLE_RECORDING.md)说明完整执行与同记录回放。 -先在验证会话选择工作点,测试时报告完整风险—覆盖—延迟曲线,并匹配变化召回。若简单保护达到同样前沿、B2 已解释全部恢复、估计不确定性未校准,或少删除仅靠更多过期目标,应否定相应 H1 收益。查询拒答计入覆盖损失,窗口外失败保留。 +## 检验相同修正问题 -## 采集与视频证据 +基线可运行后,固定相同观测/特征,比较精确几何修正下的固定关联与重算关联,加入阈值、可见性对照。注入修正检验受控敏感性;真实里程计误差结论需要独立参考,两者分开。 -D435i 使用官方 RealSense Viewer 录原始 RGB/深度/IMU,并保存内外参、深度标尺、SDK/固件版本和文件哈希。官方新文档使用 `.db3`,旧版本使用 `.bag`,按实际版本选择并回放检查;格式名不能证明 IMU 完整。[官方录制与回放](https://github.com/realsenseai/librealsense/blob/master/doc/record-and-playback.md)。 +物理实例恢复与类别查询分别评分,并记录身份错误、实际候选/点数、修正延迟和峰值内存。未标候选属未知。固定传感器不需要 IMU,手持及跨设备融合另需位姿/标定验证。 -L2 使用固定提交的 SDK2/ROS2 包,保存 PointCloud2 全字段和 IMU、逐点 time/ring、实际话题及 TF;官方默认话题是 `unilidar/cloud`、`unilidar/imu`,雷达坐标系为 `unilidar_lidar`。官方列出的 ROS2 验证环境是 Foxy,本机 Humble 硬件连通性需另验。[官方 SDK2](https://github.com/unitreerobotics/unilidar_sdk2)。 +只有 [room2 判据](PLAN.zh-CN.md)支持后才设计有界重放;确认仍需独立标注及真实变化事件。保留完整采集/执行视频,保存地图查看明确标为回放。[主库录制范围](RECORDING.zh-CN.md)。 -每段保留原始文件、`capture.json`、标定、`events.csv`、对象 ID/可见性标注、参考测量、日志、屏幕视频和手机事件视频。录屏主画面是 RGB-D/三维点云及地图/目标结果,终端用于显示命令和退出码。算法运行与离线结果查看分开标注。主分支只发布经核查的轻量证据及短片;大文件留本地。 +[早期详细协议](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/REAL_WORLD.zh-CN.md)保留在 Git 历史,当前设备操作统一维护在实物分支。 diff --git a/docs/RECORDING.md b/docs/RECORDING.md index 53242e2a..8a544a98 100644 --- a/docs/RECORDING.md +++ b/docs/RECORDING.md @@ -27,6 +27,16 @@ Four separate complete xterm/PTY recordings span fresh command startup through e The original per-paper GIFs/MP4s are rendered replays of measured final maps. LiDAR input/removed/retained views use original PCL classifications; semantic panels combine native observations, final maps and candidates. ConceptGraphs coordinates are checked against its actual absolute-pose entrypoint and 39 saved camera matrices, without applying the first-frame transform again. +The homepage now uses [native-size GIFs](../results/reference/media-previews-v2/record.json): 1200/1280 pixels wide, a 256-color palette, and 5 fps for recorded viewers. The ConceptGraphs RViz GIF samples all nine stages in chronological order; the MP4 remains complete. [Before/after](../results/reference/media-previews-v2/before-after.png). + +Regenerate with existing `ffmpeg` and `ffprobe`; add `--wsl Ubuntu-22.04` on Windows. Sources are hash-checked and an existing output directory is rejected. + +```bash +uv run python scripts/export_media_previews.py \ + --author-video /path/to/conceptgraphs-room0-original-window.mp4 \ + --output results/runs/my-previews +``` + Sixteen bilingual PDFs retain their own generation snapshots, byte hashes and page-review evidence. Current prose edits do not silently overwrite historical reports. [Paper media and reports](papers/README.md) · [Paired report review](../results/reference/paired-report-review/record.json). Detailed manual recording, installation and host-operation notes stay in personal local documentation. The room1 delayed-correction study adds three complete local terminal recordings: frontend 82.4 s, 35-cell suite 509.4 s and six post-hoc controls 189.8 s. The last recording held one frame; all MP4s were fully decoded. [Hashes, commands, logs and review frames](../results/reference/delayed-recordings/record.json) bind them to the corresponding scientific records. These are execution recordings; the separate RViz clips above inspect saved baseline outputs. [Study results](DELAYED_RESULTS.md). diff --git a/docs/RECORDING.zh-CN.md b/docs/RECORDING.zh-CN.md index 7e721cb3..4942acd2 100644 --- a/docs/RECORDING.zh-CN.md +++ b/docs/RECORDING.zh-CN.md @@ -27,6 +27,16 @@ 论文卡原有 GIF/MP4 是已测最终地图的绘制回放。LiDAR 原始/移除/保留来自原 PCL 分类;语义面板显示原生观测、最终地图和查询候选。ConceptGraphs 世界坐标按实际绝对位姿入口及 39 个相机矩阵核查,不额外乘第一帧变换。 +首页现使用[原尺寸 GIF](../results/reference/media-previews-v2/record.json):宽 1200/1280 像素、256 色调色板,窗口录像为 5 fps。ConceptGraphs RViz GIF 按原顺序节选全部九个阶段,MP4 保留完整录像。[前后对比](../results/reference/media-previews-v2/before-after.png)。 + +使用现有 `ffmpeg` 与 `ffprobe` 重新导出;Windows 添加 `--wsl Ubuntu-22.04`。脚本校验源视频哈希,拒绝覆盖已有输出目录。 + +```bash +uv run python scripts/export_media_previews.py \ + --author-video /path/to/conceptgraphs-room0-original-window.mp4 \ + --output results/runs/my-previews +``` + 16 份双语 PDF 保留各自生成源快照、字节哈希和逐页检查证据;当前文字修订不静默覆盖历史报告。[论文媒体与报告](papers/README.zh-CN.md) · [配对报告及检查](../results/reference/paired-report-review/record.json)。完整手动录制、安装与本机操作步骤放个人本地手册。 Room1 迟到修正实验另增三段完整本地终端录像:前端 82.4 秒、35 单元主实验 509.4 秒、6 单元事后对照 189.8 秒。最后一段有一次画面保持;全部 MP4 已完整解码。[哈希、命令、日志和检查图](../results/reference/delayed-recordings/record.json)绑定对应科学记录。这些是执行录像;上方独立 RViz 视频查看已有基线的保存输出。[实验结果](DELAYED_RESULTS.zh-CN.md)。 diff --git a/docs/REPRODUCE.md b/docs/REPRODUCE.md index b1773903..cf3fe825 100644 --- a/docs/REPRODUCE.md +++ b/docs/REPRODUCE.md @@ -44,3 +44,29 @@ The 76 primary and 21 exploratory control cells have a separate [protocol](PAIRE The new room1 study has 35 frozen delayed-correction cells and six separate post-hoc support controls. [Protocol and fresh-run sequence](DELAYED_PROTOCOL.md#reproduction-status) · [Results and revised H1 decision](DELAYED_RESULTS.md). Configs, source snapshots and run records pin data/weight checksums, author revisions and resource adaptations. [Sources and licenses](ATTRIBUTION.md) remain traceable. Detailed personal installation/recording/troubleshooting notes stay local. Public PDFs are record-bound generation snapshots; editing current research text does not silently rewrite them. + +## Maintenance + +```text +src/slam_learning/ CPU package: CLI → orchestration → geometry/scoring/I/O +scripts/ Experiment, viewer and export entry points +configs/ Frozen inputs and protocols +environments/ Separate CUDA environment snapshots +results/reference/ Immutable evidence and executed source snapshots +``` + +CPU checks only; no dataset download or GPU required: + +```bash +uv sync --frozen --python 3.10 --extra dev --extra audit +uv run --no-sync deptry src +uv run --no-sync lint-imports --no-cache +uv run --no-sync vulture +uv run --no-sync pytest -q +``` + +[deptry](https://deptry.com/usage/) checks packaged dependencies. Pillow is direct; the four DEP002 exceptions cover BeautyMap's subprocess imports (`fire`, `dztimer`, `tqdm`) and optional Open3D viewers. [Import Linter](https://import-linter.readthedocs.io/en/stable/contract_types/) enforces acyclic imports, layer direction and separation from CUDA/ROS. + +[Vulture](https://github.com/jendrikseipp/vulture) checks active source, scripts and tests at 100% confidence. Lower-confidence results require review: framework attributes and file-interface methods may be called externally. Frozen source snapshots and CUDA dependency lists are outside this cleanup scope. + +[IWYU](https://github.com/include-what-you-use/include-what-you-use) applies to upstream C++ builds. Use matching Clang and a compilation database in a separate build, then run `iwyu_tool.py -p /path/to/build`. No IWYU result is claimed here; this checkout owns no C++ target. diff --git a/docs/REPRODUCE.zh-CN.md b/docs/REPRODUCE.zh-CN.md index f5e98920..1bec41b4 100644 --- a/docs/REPRODUCE.zh-CN.md +++ b/docs/REPRODUCE.zh-CN.md @@ -44,3 +44,29 @@ LiDAR 地图近邻阈值 5 cm;SA/DA 的分母及 DUFOMap 直接标签与地 新 room1 实验含 35 个冻结迟到修正单元和 6 个独立事后支持门槛对照。[协议与新运行步骤](DELAYED_PROTOCOL.zh-CN.md#复现状态) · [结果与 H1 修订决策](DELAYED_RESULTS.zh-CN.md)。 数据/权重校验、作者提交和资源适配在配置、源码快照和运行记录内固定;[来源与许可](ATTRIBUTION.zh-CN.md)可追溯。完整安装、个人录制和本机排错手册留在本地。公开 PDF 为记录绑定的生成快照,修改当前研究文字不会静默改写旧报告。 + +## 维护 + +```text +src/slam_learning/ CPU 包:CLI → 运行编排 → 几何/评分/读写 +scripts/ 实验、查看器与导出入口 +configs/ 固定输入与协议 +environments/ 独立 CUDA 环境快照 +results/reference/ 不可改写的证据与已执行源码快照 +``` + +仅检查 CPU 代码,无需下载数据或使用 GPU: + +```bash +uv sync --frozen --python 3.10 --extra dev --extra audit +uv run --no-sync deptry src +uv run --no-sync lint-imports --no-cache +uv run --no-sync vulture +uv run --no-sync pytest -q +``` + +[deptry](https://deptry.com/usage/) 检查包内依赖。Pillow 显式声明;四项 DEP002 例外对应 BeautyMap 子进程使用的 `fire`/`dztimer`/`tqdm` 和可选 Open3D 查看器。[Import Linter](https://import-linter.readthedocs.io/en/stable/contract_types/) 检查循环依赖、分层方向及 CUDA/ROS 隔离。 + +[Vulture](https://github.com/jendrikseipp/vulture) 以 100% 置信度检查现行源码、脚本与测试。低置信度结果需人工判断,框架属性和文件接口可能被外部调用。冻结源码快照和 CUDA 依赖清单不纳入此次清理。 + +[IWYU](https://github.com/include-what-you-use/include-what-you-use) 用于上游 C++ 构建。单独准备匹配的 Clang 与编译数据库,再运行 `iwyu_tool.py -p /path/to/build`。本工作区没有自有 C++ 构建目标,此处不声称已通过 IWYU。 diff --git a/docs/RESEARCH.md b/docs/RESEARCH.md index 4528dfb1..7505a73b 100644 --- a/docs/RESEARCH.md +++ b/docs/RESEARCH.md @@ -1,66 +1,14 @@ -# From reproduction to a candidate bottleneck +# Earlier reasoning and experiment history English | [中文](RESEARCH.zh-CN.md) -Current extension: [paired results](PAIRED_RESULTS.md) adds restricted annotations, 97 mapping cells, simple controls and a narrower candidate H1. Earlier baseline PDFs retain their recorded source snapshot; the paired-study PDF is the current extension. +The current open question and H1 are maintained only in [STUDY](STUDY.md), with the decision gate in [PLAN](PLAN.md). -The research order is **reproduction → observations → structural bottleneck → candidate hypothesis → held-out experiments**. Existing controlled results are exploratory: they helped select the question and cannot serve as independent confirmation of that selected hypothesis. This order is a workflow, not a rewritten history of when earlier runs occurred. +| Historical evidence | What it can establish | +| --- | --- | +| [Synthetic mechanisms and evaluator checks](RESULTS.md) | Simplified observability/correlation examples and scoring differences; not a late-correction H1 test | +| [room0 paired controls](PAIRED_RESULTS.md) | Task-specific pose sensitivity and inexpensive parameter controls | +| [room1 delayed correction](DELAYED_RESULTS.md) | Recovery versus exposure tradeoff; post-hoc support controls challenge reassociation necessity | +| [room2 experiment](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md) | Frozen equal-cap exploration; mapping executed, analysis pending | -## 1. Start with the measured outputs - -DUFOMap and BeautyMap completed the same 141-frame teaser on Windows and Ubuntu. Their map-level scores agree across those platforms, but both differ from the corresponding paper targets. DUFOMap's direct-label sensitivity diagnostic also yields a different zero-perturbation score from the output-map nearest-neighbor evaluation. A same-instance control now localizes most of the SA gap to map correspondence; a small native-export remainder is still unresolved. [Numbers, artifacts and exact limits](RESULTS.md). - -The first unresolved task is therefore a **measurement question**: which points are being judged, under which correspondence rule and implementation path? Before claiming a method fails, reconcile those protocols. Small injected pose errors sometimes improve scores in the current diagnostic; the observations do not justify universal degradation claims. - -## 2. What might be shared across methods? - -The [literature matrix](LITERATURE.md) traces how poses establish spatial correspondence before cleaning, association or semantic fusion. The possible bottleneck is **insufficient independent constraints on the geometry used to interpret a change**. It has three related parts: - -| Part | Why it is structural | Evidence level now | -| --- | --- | --- | -| Identifiability | Shared camera error and coherent object motion can produce the same residual without a stable reference | Controlled counterexample; not a deployed-system observation | -| Evidence dependence | Many points or revisits can share one pose error, so their count is not their independent information content | Analytic derivation and matched synthetic model | -| Commitment before correction | Association/fusion/deletion can be committed before a later pose correction resolves the geometry | Pipeline inference; full feedback loop not reproduced | - -[Khronos](https://arxiv.org/html/2402.13817v2) already jointly optimizes poses and structure. [SuperMap](https://arxiv.org/html/2608.22896v1) has visibility/disappearance states; [PerSeM](https://arxiv.org/html/2609.19542v2) has persistent semantic memory and acknowledges correlated geometric limitations. These are constraints on the claim. “Add memory,” “use visibility” or “jointly optimize” cannot be presented as the new idea. - -The cross-field argument remains partly inferred. Annotated paired controls now show metric-specific effects rather than one universal failure; the [paired study](PAIRED_RESULTS.md) narrows the question. Shared uncertainty as the dominant common cause is not established. - -## 3. Minimal mechanism - -A linearized residual for object i at time t can be written as - -$$r_{it}\approx J^p_{it}\delta\xi_t+J^o_{it}\delta o_i+\epsilon_{it}.$$ - -Pose error $\delta\xi_t$ is shared. With otherwise independent errors, - -$$\operatorname{Cov}(r_{it},r_{jt})=J^p_{it}\Sigma_{\xi_t}(J^p_{jt})^\top.$$ - -In one dimension, readings $r_k=b+\delta+\epsilon_k$ sharing bias b give - -$$\operatorname{Var}(\bar r\mid\delta=0)=\sigma_p^2+\sigma_s^2/N.$$ - -An independent-pose-noise model instead uses $(\sigma_p^2+\sigma_s^2)/N$. That model can become too certain while the shared error remains. These are our simplifying derivations, not equations attributed to a reviewed paper. A full SLAM posterior contains additional correlations. - -When most visible objects move together, a median correction can select that moving group as the stable reference. Better thresholds cannot create a missing anchor. IMU constraints, static geometry or an independently localized view may be necessary. - -## 4. Candidate hypothesis, not a conclusion - -**H1.** At matched observation budget, query coverage and update latency, a change update that accounts for shared pose uncertainty will reduce false deletion and stale-target error relative to visibility-aware thresholds and independent-noise inference, when enough stable geometry or external constraints make pose identifiable. - -One possible design keeps shared pose latent variables through association and change decisions, discounts correlated evidence, and defers ambiguous edits. Provisional semantic/geometric updates could be re-associated after pose correction. This complete interface is not implemented here; known estimation ideas alone do not establish novelty. - -**Additional conjectures:** stable-anchor selection may matter more than adding semantic memory in high-motion scenes; reversible updates may be useful when pose corrections arrive late. Neither conjecture is tested by the current full-system evidence. - -## 5. What the exploratory experiments say - -Common-mode correction plus supplied visibility helps in the minority-motion synthetic case, then fails with a moving majority. Shared-latent inference avoids overconfidence in a Gaussian model with known noise scales, but has lower changed-object recall. These results motivate the hypotheses; they do not show an improvement at matched coverage/latency in real semantic navigation. [Full interpretation](RESULTS.md). - -## 6. What would count as a test? - -Evaluator reconciliation, semantic cores and restricted paired-target exploration are complete. Independently review labels and add new scenes, actual changes and correction delays; freeze factors, validation/held-out scenes, thresholds, budgets and rejection criteria before confirmation. Keep the existing exploratory seeds out of the confirmation set. [Staged experiment plan](PLAN.md). - -Reject or narrow H1 if a swept threshold performs equally well at matched coverage/latency; an independent-noise model does equally well under correlated drift; estimated covariance removes the benefit; or fewer deletions merely leave stale objects longer. A system with no stable reference is outside the identifiable case. Negative results should revise the hypothesis, not trigger a new scoring rule. - - -*Figure slot: `docs/figures/bottleneck_diagram.svg`. Show the pose–correspondence–update interface and identify empirical observations separately from conjectured feedback.* +The [earlier derivations and broader conjectures](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/RESEARCH.md) remain in Git history. They are not a second current hypothesis. Published PDFs keep their own source snapshots; current text changes do not rewrite them. diff --git a/docs/RESEARCH.zh-CN.md b/docs/RESEARCH.zh-CN.md index 0efbcf1c..09c8d6d2 100644 --- a/docs/RESEARCH.zh-CN.md +++ b/docs/RESEARCH.zh-CN.md @@ -1,66 +1,14 @@ -# 从复现走向候选瓶颈 +# 早期推理与实验历史 [English](RESEARCH.md) | 中文 -本轮扩展:[配对结果](PAIRED_RESULTS.zh-CN.md) 补受限标注、97 个建图单元、简单对照及收窄的候选 H1。先前基线 PDF 保留其记录的源快照,配对研究 PDF 是本轮扩展。 +当前开放问题与 H1 统一维护在 [STUDY](STUDY.zh-CN.md),决策门槛见 [PLAN](PLAN.zh-CN.md)。 -研究顺序是**复现 → 观察 → 结构性瓶颈 → 候选假设 → 留出实验**。已有受控结果属于探索:它们帮助选择问题,不能独立确认看过结果之后选出的假设。这个顺序是工作流程,不是重写早期运行发生的时间。 +| 历史证据 | 能说明什么 | +| --- | --- | +| [合成机制与评价核查](RESULTS.zh-CN.md) | 简化可观测性/相关性例子和评分差异,不是迟到修正 H1 检验 | +| [room0 配对对照](PAIRED_RESULTS.zh-CN.md) | 不同任务的位姿敏感性与廉价参数对照 | +| [room1 迟到修正](DELAYED_RESULTS.zh-CN.md) | 恢复与候选暴露的权衡;事后支持门槛对照挑战重关联必要性 | +| [room2 实验](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md) | 冻结的相同候选上限探索;建图已运行、分析待完成 | -## 1. 从实测输出开始 - -DUFOMap 和 BeautyMap 在 Windows、Ubuntu 上完成相同的 141 帧 teaser。地图级分数跨平台一致,但均与对应论文目标存在差值。DUFOMap 直接标签诊断的零扰动分数,也与输出地图的最近邻评分不同,同实例对照已把大部分 SA 差距定位到地图对应,小的原生输出剩余差值仍未隔离。[数值、产物与准确边界](RESULTS.zh-CN.md)。 - -因此第一个未解决问题是**测量问题**:评价哪批点、使用什么对应规则和实现路径?声称方法失效之前,先对齐这些口径。当前诊断里小位姿扰动有时提高分数,不能据此声称普遍退化。 - -## 2. 不同方法可能共享什么问题? - -[论文对照](LITERATURE.zh-CN.md)追踪位姿怎样在清图、关联或语义融合之前建立空间对应。可能的瓶颈是:**解释变化所依赖的几何,还没有得到足够独立约束。** 它有三个相关部分: - -| 部分 | 为什么是结构问题 | 当前证据级别 | -| --- | --- | --- | -| 可辨识性 | 缺少稳定参考时,公共相机误差与对象同向运动可能产生相同残差 | 受控反例;不是部署系统观察 | -| 证据相关性 | 许多点或重访可能共享一个位姿误差,数量不等于独立信息量 | 解析推导与匹配的合成模型 | -| 修正前提交 | 后续位姿修正澄清几何之前,已经完成关联、融合或删除 | 从流程推断;完整反馈环尚未复现 | - -[Khronos](https://arxiv.org/html/2402.13817v2) 已联合优化位姿和结构;[SuperMap](https://arxiv.org/html/2608.22896v1) 已有可见性/消失状态;[PerSeM](https://arxiv.org/html/2609.19542v2) 已有长期语义记忆并承认相关几何局限。它们约束我们的论证,不能把“加记忆”“用可见性”“联合优化”包装成新想法。 - -跨领域论证仍含推导。补标注后的位姿配对对照呈现指标相关效应,而非普遍同一种失效;[配对研究](PAIRED_RESULTS.zh-CN.md) 已收窄问题,尚未证明共享不确定性是共同主因。 - -## 3. 最小机制 - -对象 i、时刻 t 的线性化残差可以写成: - -$$r_{it}\approx J^p_{it}\delta\xi_t+J^o_{it}\delta o_i+\epsilon_{it}.$$ - -位姿误差 $\delta\xi_t$ 是共享的。其余误差独立时: - -$$\operatorname{Cov}(r_{it},r_{jt})=J^p_{it}\Sigma_{\xi_t}(J^p_{jt})^\top.$$ - -一维读数 $r_k=b+\delta+\epsilon_k$ 共享偏差 b,则: - -$$\operatorname{Var}(\bar r\mid\delta=0)=\sigma_p^2+\sigma_s^2/N.$$ - -独立位姿噪声模型却使用 $(\sigma_p^2+\sigma_s^2)/N$,可能在公共误差仍存在时越来越确定。这是我们的简化推导,不是某篇论文的原公式;完整 SLAM 后验还有其他相关项。 - -大多数可见对象一起运动时,中位数修正可能把它们选成稳定参考。调阈值无法创造缺失锚点,可能需要 IMU、静态几何或独立定位视角。 - -## 4. 候选假设,而非结论 - -**H1。** 在匹配观测预算、查询覆盖率和更新延迟时,考虑共享位姿不确定性的变化更新,相比可见性阈值与独立噪声推断,可降低误删和过期目标错误;前提是稳定几何或外部约束足以使位姿可辨识。 - -一种可能设计:关联与变化决策保留共享位姿潜变量,对相关证据降权,暂缓有歧义的更新;位姿修正后重新关联暂定语义/几何更新。完整接口尚未实现,使用已有估计思想本身也不证明创新。 - -**额外猜想:** 高运动场景中,稳定锚点选择可能比增加语义记忆更关键;位姿修正迟到时,可回退更新可能有用。当前完整系统证据没有检验这些猜想。 - -## 5. 探索性实验说明了什么? - -公共偏差修正加已知可见性,在少数运动对象的合成情形有效,但会在运动多数时失效。共享潜变量推断在已知噪声的高斯模型中避免过度自信,却有更低的变化召回。这些结果形成了假设,尚未证明真实语义导航在匹配覆盖率/延迟下有收益。[完整解释](RESULTS.zh-CN.md)。 - -## 6. 怎样才算验证? - -PCL 对照、语义子集及受限标注配对误差探索已完成;下一步为独立人工审核、更多场景与动态/延迟对照。正式验证之前冻结因素、验证/留出场景、阈值、预算和否定条件,现有探索种子不能进入确认集。[分阶段实验计划](PLAN.zh-CN.md)。 - -若阈值扫描在相同覆盖率/延迟下同样有效,独立噪声模型在相关漂移下同样有效,估计协方差使收益消失,或少删除只是令过期对象保留更久,则否定或收窄 H1。无稳定参考的系统不属于可辨识情形。负面结果应修改假设,而不是换评分规则。 - - -*图位:`docs/figures/bottleneck_diagram.svg`。展示位姿—对应—更新接口,分清实测观察与猜测的反馈。* +[早期推导与更宽的猜想](https://github.com/p20030920p/SLAM_Learning/blob/dfd4a05f02352d32b4f0a2bf522e189708c9e2b2/docs/RESEARCH.zh-CN.md)保留在 Git 历史,不作为第二套当前假设。已发布 PDF 保留各自源码快照,当前文字修改不覆盖旧报告。 diff --git a/docs/RESULTS.md b/docs/RESULTS.md index 1c2068c3..7ed7c447 100644 --- a/docs/RESULTS.md +++ b/docs/RESULTS.md @@ -2,6 +2,8 @@ English | [中文](RESULTS.zh-CN.md) +> Historical measurements/analysis; current question and next decision: [STUDY](STUDY.md) · [PLAN](PLAN.md). + Current extension: [paired results](PAIRED_RESULTS.md) adds restricted annotations, 97 mapping cells, simple controls and a narrower candidate H1. Earlier baseline PDFs retain their recorded source snapshot; the paired-study PDF is the current extension. Measured on 7 October 2026. Portable records bind commands, versions, source hashes, data checksums and output hashes. Windows author/controlled experiments use Python 3.10.19. Both author methods and all six real-data sensitivity cells also **executed successfully on GitHub Actions Ubuntu 22.04**, with a fresh download and environment. [Linux run](https://github.com/p20030920p/SLAM_Learning/actions/runs/37622082701), [execution metadata](../results/ci/linux-run.json). Docker was not locally built. On 8 October, local WSL2 author, PCL and semantic-subset runs completed; see sections 5–6 and [WSL](REPRODUCE.md). diff --git a/docs/RESULTS.zh-CN.md b/docs/RESULTS.zh-CN.md index 83228044..4b1ee7b9 100644 --- a/docs/RESULTS.zh-CN.md +++ b/docs/RESULTS.zh-CN.md @@ -2,6 +2,8 @@ [English](RESULTS.md) | 中文 +> 历史测量/分析;当前问题与下一项决策统一见 [STUDY](STUDY.zh-CN.md) · [PLAN](PLAN.zh-CN.md)。 + 本轮扩展:[配对结果](PAIRED_RESULTS.zh-CN.md) 补受限标注、97 个建图单元、简单对照及收窄的候选 H1。先前基线 PDF 保留其记录的源快照,配对研究 PDF 是本轮扩展。 实测日期为 2026 年 10 月 7 日。可发布记录绑定命令、版本、源码/数据/产物哈希。Windows 作者方法与受控实验使用 Python 3.10.19;两种作者方法和六组真实敏感性实验,也在干净 GitHub Ubuntu 22.04 环境成功执行。[Linux 运行](https://github.com/p20030920p/SLAM_Learning/actions/runs/37622082701)、[元数据](../results/ci/linux-run.json)。Docker 未在本机构建。10 月 8 日,本机 WSL2 作者方法、PCL 对照与语义子集已完成,见第 5–6 节。 diff --git a/docs/STUDY.md b/docs/STUDY.md index 98842233..ae4656a5 100644 --- a/docs/STUDY.md +++ b/docs/STUDY.md @@ -1,52 +1,48 @@ -# How the reproductions support and limit the hypothesis +# From four reproductions to one testable question English | [中文](STUDY.zh-CN.md) -**Spatial correspondence affects map decisions; a common dominant shared-pose-uncertainty bottleneck has not been established.** All four cores ran, but optimize different tasks. Author mechanisms, measurements and our inferences are separated below. [Full paired report](PAIRED_RESULTS.md) · [Raw evidence](../results/reference/paired-pose/record.json). +**At the same candidate cap, does reassociation recover more targets after a late pose correction than coordinate correction and simple guards?** H1 remains a candidate. -## What each reproduction achieved +## The common interface, and its limits -| Core and connection to the hypothesis | Achieved scope and metrics | Remaining gap or counterevidence | -| --- | --- | --- | -| DUFOMap: poses determine ray paths and free-space evidence; the author already models pose/measurement tolerances | Full teaser: map-proximity SA 97.9798%, DA 98.7029%; PCL and SciPy agree pointwise | Not all paper values match within 0.01 pp; no trajectory evaluation. Direct identity and proximity scoring differ by 5.347532 pp, not an algorithm benefit | -| BeautyMap: global occupancy comparisons depend on alignment; hidden static geometry has a recovery mechanism | Same teaser: SA 96.9529%, DA 98.3382%; GT physically excluded from algorithm inputs | Paper gaps remain. “Unseen means deleted” is inaccurate; ground structure and visibility remain separate failure sources | -| ConceptGraphs: geometric and semantic similarity determine association/fusion, connecting pose to identity and query coordinates | 40 observations, 39 objects; 39 saved camera matrices confirm absolute poses. The paired eight-observation reference recovers all four annotated surfaces | Reference restricted queries hit only 2/3. Object count is not association accuracy; complete identity GT, LLM reasoning and dynamic-update evaluation remain unfinished | -| HOV-SG: poses assign pixel features to reference geometry before segment merging | Eight observations, 50 segments and 166,777 points; reference cache replay matches map/features bytewise. All paired tests recover the four surfaces | The 40-observation attempt exited 137 for an unconfirmed reason. Full hierarchy, navigation and online recovery are unfinished; more segments do not imply better semantics | - -Achievement here means execution and measurement within the stated scope, not reproduction of every paper result. [Paper cards](papers/README.md) retain settings, sources and failures. +The two directions meet at **pose → correspondence → map decisions**. Dynamic mapping decides which geometry to retain; semantic mapping decides which observations belong to an object and where a query points. Correcting coordinates need not revise decisions made under the earlier alignment. This is our inference, not an observed common dominant defect. -## What is empirically shared - -The shared dependency is **posed observation → spatial correspondence → map decision**. Losses and assumptions differ: DUFOMap has tolerances, BeautyMap restores hidden geometry, ConceptGraphs supports updates, and HOV-SG states a static-scene limitation. +| Reproduced work | Pose-dependent decision | Existing protection / unresolved boundary | +| --- | --- | --- | +| [DUFOMap](papers/dufomap.md) | Rays establish void regions used for point classification | Pose/measurement margins already exist; never-observed empty space remains ambiguous | +| [BeautyMap](papers/beautymap.md) | Registered occupancy drives removal/restoration | Static restoration already exists; alignment and grid/ground assumptions still matter | +| [ConceptGraphs](papers/conceptgraphs.md) | Geometric/semantic similarity drives object fusion | Thresholds and later observations may suffice; corrected geometry does not itself reassign fixed members/features | +| [HOV-SG](papers/hovsg.md) | Poses attach features to geometry before segment fusion | External odometry is a safeguard; static-scene and hierarchy limits differ from object-map association | -The following are means over three seeds at 30 cm RMS. Both semantic cores use the same eight source observations. Metrics describe different tasks and cannot rank methods. +These are mapping-core reproductions, using supplied poses. Larger original-code runs and scoped semantic scores are [pinned separately](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md). They do not establish trajectory accuracy or navigation success. -| Metric | Reference | Shuffled | Monotone drift | Interpretation | -| --- | ---: | ---: | ---: | --- | -| DUFOMap direct-label SA % | 92.6341 | 76.5854 | 88.5977 | Pose sensitivity, but drift preserves more static points; DA is 98.9654 / 98.9571 / 98.9231% | -| BeautyMap proximity SA % | 96.9529 | 93.2688 | 95.8456 | Same direction; DA is 98.3382 / 98.1861 / 97.9847%, so deletion recall also matters | -| ConceptGraphs partial-surface coverage | 0.9256 | 0.5991 | 0.3984 | Drift harms fixed-world reference coverage more; target recovery is 1 / 0.6667 / 0.5 | -| HOV-SG partial-surface coverage | 0.9256 | 0.9061 | 0.9136 | Annotated geometry remains relatively stable; no common geometric collapse is established | -| HOV-SG restricted query hit | 0.6667 | 0.6667 | 0.3333 | Retrieval can degrade while surfaces remain; geometry and query validity need separate checks | +## Why start with ConceptGraphs? -Thus **“correlation is always worse” is rejected by counterexamples**. Local consistency might protect relative geometry while world coordinates drift. This explanation fits the results but is not uniquely identified: sorting also changes which view receives each error. +Its association traces expose observation membership, support counts and fused features. With one frozen frontend and identical exact historical correction, fixed membership can be compared with reassociation. This separates coordinate error, low-support filtering and association history. DUFOMap/BeautyMap motivate the geometric interface; HOV-SG checks that semantic coverage and retrieval can differ. None is silently counted as another delayed-correction replication. -Simple controls are strong competitors. Increasing DUFOMap d_p from 1 to 2 raises reference SA from 92.6341% to 99.7817% while DA falls to 96.3900%. Lowering ConceptGraphs association threshold from 1.2 to 1.0 makes all three 30 cm drift seeds hit all three restricted queries. Any new mechanism must improve on these inexpensive choices. +## What the experiments established -## What the metrics cannot establish +Early room0 controls use three seeds at 30 cm RMS; the semantic cores share eight observations. [Full paired study](PAIRED_RESULTS.md). -SA/DA measure static retention and dynamic removal. Semantic coverage measures support for annotated partial surfaces; recovery also requires visible projection precision. Restricted query hits check top-1 correspondence to annotated targets. Surface distance is neither full-object center error nor navigation error. Baseline query misses cannot be attributed to injected poses, and an unannotated instance may still be valid. +| Metric | Zero error | Shuffled error | Monotone drift | +| --- | ---: | ---: | ---: | +| DUFOMap direct-label SA % | 92.6341 | 76.5854 | 88.5977 | +| BeautyMap proximity SA % | 96.9529 | 93.2688 | 95.8456 | +| ConceptGraphs partial-surface coverage | 0.9256 | 0.5991 | 0.3984 | +| HOV-SG partial-surface coverage | 0.9256 | 0.9061 | 0.9136 | +| HOV-SG restricted query hit | 0.6667 | 0.6667 | 0.3333 | -The four surfaces are AI-assisted annotations without independent human review; reference images are also mapping inputs, and the exact first pose protects some geometry. Three seeds are not three scenes and their range is not a confidence interval. Both arrangements share pose error across all points in a frame; **shared-variable and independent-variance estimators were not compared**. Static room0 cannot measure real change recall, and final offline maps cannot measure staleness or delayed-correction recovery. +Correlation is not uniformly worse; geometry and retrieval are different outcomes. These metrics do not rank methods. Three seeds are not three scenes, and these controls do not compare shared-latent versus independent-variance estimators. -## Open question and candidate H1 +room1 then tested late correction. At observation eight and 30 cm, fixed history recovers 11.1%, oracle 66.7%, while a post-hoc support-1 control reaches 100% with 117 candidates versus oracle's 25. Later observations also repair part of the deficit. **This counterevidence weakens the necessity of reassociation.** Partial plant/vase labels and unlabelled fragments prevent a full identity conclusion. [35 frozen cells and six separate post-hoc controls](DELAYED_RESULTS.md). -**When a later pose correction changes historical correspondence, how can object identity and query coordinates recover, with a measurable bound on exposure to stale results?** Pose sensitivity and the separation between geometry and retrieval motivate the question. They do not yet demonstrate that a recovery mechanism is necessary or beneficial. +## Candidate H1 and its decision gate -Candidate H1 retains observation provenance, shared pose versions, tentative associations and a pre-window checkpoint. After correction it replays every contributor to affected components; queries return coordinates, pose version, validity and timestamp. Start with ConceptGraphs and a proposed 16-observation / 512 MiB budget. Neither the budget nor benefit is measured yet. +H1 retains observation sources and pose versions, then replays affected associations within a bounded cache to recover more valid targets than simple guards. The current oracle test asks whether reassociation is worth pursuing; it does not test bounded storage. -The [new-scene delayed-correction study](DELAYED_RESULTS.md) now compares these controls in 35 frozen cells. Oracle initially improves selected-target recovery over full corrected geometry with fixed associations, but six post-hoc controls remove that deficit by lowering the support gate, at the cost of exposing many more fragments. Later observations also repair much of the primary deficit. This supports a support/exposure tradeoff rather than a demonstrated need for historical reassociation. Hold H1 implementation until independent labels and equal-budget identity/change evaluation resolve that cheaper explanation. Shared-variable versus independent-variance estimators remain untested. +room2 fixes five AI-labelled instances, held-out reference frames and one frontend. All 28 mapping cells ran; analysis remains pending. Support 1/2/3 and caps 25/50/100/unlimited are readouts of complete pre-filter snapshots. Category-query hits and physical identities are separate; unlabelled candidates are unknown. [Frozen exploratory protocol](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.md). -Freeze new scenes and independent annotations before inspecting results. Measure coverage, identity fragments, current coordinate error, change recall, stale duration, update latency, replay time and peak memory. Reject the corresponding H1 benefit if simple protection reaches the same frontier, pose correction explains all gains, or lower deletion risk merely retains stale objects longer. Without stable anchors, camera drift and coherent object motion may be unidentifiable. +At matched RMS, support and endpoint, oracle must beat every simple control by ≥10 mean percentage points at two finite caps, with ≥2/3 positive paired seeds and no seed increasing labelled duplicates/mixes. Only then propose a bounded prototype. Matching controls weaken H1. Equal caps do not match points or memory; AI-only labels cannot confirm H1. [Next steps](PLAN.md). -[Khronos](https://arxiv.org/html/2402.13817v2) already provides joint optimization and map reconciliation; memory or rollback alone is not novel. A bounded interface between pose correction and open-vocabulary target validity is only a potential contribution, pending a broader prior-work check. [Source analysis](LITERATURE.md) · [Next experiment design](REAL_WORLD.md). +[Khronos](https://arxiv.org/html/2402.13817v2) already reconciles maps; [DovSG](https://arxiv.org/html/2410.11989v2) already updates scene graphs. The potential contribution is a measured recovery–cost benefit over existing protections, not memory/replay alone. Shared uncertainty as a universal cause, dynamic change recall and hardware H1 validation remain unestablished. diff --git a/docs/STUDY.zh-CN.md b/docs/STUDY.zh-CN.md index 35f71eee..16430850 100644 --- a/docs/STUDY.zh-CN.md +++ b/docs/STUDY.zh-CN.md @@ -1,52 +1,48 @@ -# 复现结果如何支持和限制研究假设 +# 从四篇复现收敛到一个可检验问题 [English](STUDY.md) | 中文 -**目前支持“空间对应会影响地图决策”,尚不支持“共享定位不确定性是四者的共同主导瓶颈”。** 四个核心均已执行,但目标不同。下面把作者方法、实测结果和我们的推断分开;完整数字见[配对报告](PAIRED_RESULTS.zh-CN.md),原始记录见[证据入口](../results/reference/paired-pose/record.json)。 +**相同候选上限下,迟到位姿修正后重算关联,能否比仅修正坐标与简单保护恢复更多目标?** H1 保持候选。 -## 每项复现达到什么 +## 共同接口及其边界 -| 核心及与假设的关联 | 达到的效果与指标 | 未达到或受到挑战的部分 | -| --- | --- | --- | -| DUFOMap:位姿决定射线经过哪些空间,空域证据影响点是否删除;作者已有位姿/量测容差 | 完整 teaser 的地图近邻 SA 97.9798%、DA 98.7029%;PCL/SciPy 逐点一致。原生动态过滤可执行 | 并非全部论文表格差值小于 0.01 百分点;未测定位轨迹。直接身份与近邻评分相差 5.347532 百分点,不能归因于方法提升 | -| BeautyMap:全局占据比较依赖配准,已有被遮挡静态几何恢复 | 同一 teaser 的 SA 96.9529%、DA 98.3382%;GT 已从算法输入移除 | 表格差距仍存在;不能概括为“没看到就删除”。地面结构和可见性可能独立造成失效 | -| ConceptGraphs:几何和语义相似度决定对象关联/融合,位姿会影响身份与查询坐标 | 40 观测得到 39 对象;39 个保存矩阵核对为绝对位姿。配对八观测零误差恢复四个已标表面 | 零误差受限查询仅 2/3;对象数不是关联准确率。未完成完整身份真值、LLM 图推理或动态更新评价 | -| HOV-SG:像素特征按位姿分配给参考几何,再合并为分段 | 八观测得到 50 分段、166,777 点;缓存重放零误差地图和特征逐字节等价。配对测试均恢复四个已标表面 | 40 观测尝试 exit 137,原因未确认;完整层级、导航和在线恢复未完成。分段增加不能代表语义改善 | - -这里的“达到”指声明范围内的执行与测量,不等于复现整篇论文全部结果。[四篇论文卡](papers/README.zh-CN.md)保留方法来源、设置与失败。 +两个方向交汇于**位姿 → 对应 → 地图决策**:动态建图决定保留哪些几何,语义建图决定观测属于哪个对象、查询指向哪里。修正坐标未必重算早先配准下的决策。这是我们的推断,尚非已观察到的共同主导缺陷。 -## 哪些共性已经测到 - -四者共有的是 **观测经位姿形成空间对应,再据此作地图决策**。它们并不共享同一种损失,也并非都假设静态世界:DUFOMap 有误差容差,BeautyMap 有恢复机制,ConceptGraphs 支持更新,HOV-SG 承认静态场景限制。 +| 已复现工作 | 依赖位姿的决策 | 已有保护/尚待解决的边界 | +| --- | --- | --- | +| [DUFOMap](papers/dufomap.zh-CN.md) | 射线建立空域,用于点分类 | 已有位姿/量测容差;未观测到空域仍有歧义 | +| [BeautyMap](papers/beautymap.zh-CN.md) | 配准后的占据决定移除/恢复 | 已有静态恢复;配准、网格/地面假设仍重要 | +| [ConceptGraphs](papers/conceptgraphs.zh-CN.md) | 几何/语义相似度决定对象融合 | 调阈值或后续观测可能已足够;修正几何不会自动重分固定成员/特征 | +| [HOV-SG](papers/hovsg.zh-CN.md) | 位姿把特征分配到几何,再融合分段 | 外部里程计是保护;静态场景、层级边界与对象关联不同 | -30 cm RMS、三个种子的均值如下。语义核心统一用八个源观测;这些指标衡量不同任务,不能横向排名。 +以上复现为使用给定位姿的建图核心。更大的作者原流程和限定语义评分有[独立快照](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md),不代表已测轨迹精度或导航成功率。 -| 指标 | 零误差 | 打乱 | 单调漂移 | 能说明什么 | -| --- | ---: | ---: | ---: | --- | -| DUFOMap 直接标签 SA % | 92.6341 | 76.5854 | 88.5977 | 静态保留对位姿敏感,但漂移比打乱好;相应 DA 为 98.9654/98.9571/98.9231% | -| BeautyMap 近邻 SA % | 96.9529 | 93.2688 | 95.8456 | 方向相同;相应 DA 为 98.3382/98.1861/97.9847%,需结合删除召回解读 | -| ConceptGraphs 部分表面覆盖 | 0.9256 | 0.5991 | 0.3984 | 漂移更损害固定世界参考覆盖;目标恢复率为 1/0.6667/0.5 | -| HOV-SG 部分表面覆盖 | 0.9256 | 0.9061 | 0.9136 | 已标几何恢复相对稳定,不能宣称四者都有相同几何崩溃 | -| HOV-SG 受限查询命中 | 0.6667 | 0.6667 | 0.3333 | 查询可能退化而表面仍存在;几何覆盖与检索质量需要分别检查 | +## 为什么先选 ConceptGraphs -因此,**“相关误差总是更坏”已被反例否定**。局部一致性可能保护相对几何而允许世界坐标漂移,但这只是与结果相容的解释:排序也改变了误差分配到哪个视角,尚未隔离唯一原因。 +关联轨迹能保留观测成员、支持数与融合特征。同一个冻结前端、相同精确历史位姿修正下,比较固定成员与重新关联,可分开坐标误差、低支持过滤和历史关联的影响。DUFOMap/BeautyMap 引出几何接口,HOV-SG 检查几何覆盖与检索是否分离;它们不被计作已完成的迟到修正复现。 -两个强竞争基线已出现:DUFOMap 的 d_p 从 1 到 2,将零误差 SA 从 92.6341% 提至 99.7817%,同时 DA 降至 96.3900%;ConceptGraphs 阈值从 1.2 降至 1.0,使 30 cm 漂移三个种子均命中三项受限查询。任何新机制必须解释它为何胜过这些简单选择。 +## 实验已经说明什么 -## 指标不能回答什么 +早期 room0 对照使用 30 cm RMS、三个种子;语义核心统一取八次观测。[完整配对研究](PAIRED_RESULTS.zh-CN.md)。 -SA/DA 测静态保留与动态删除;语义覆盖测已标部分表面是否有几何支持;恢复率还要求可见投影精度;受限查询命中测 top-1 是否对应已标目标。目标表面距离不是物体中心误差,更不是导航误差。零误差已存在的检索未命中不能归因于注入误差,未标实例也可能是有效答案。 +| 指标 | 零误差 | 打乱误差 | 单调漂移 | +| --- | ---: | ---: | ---: | +| DUFOMap 直接标签 SA % | 92.6341 | 76.5854 | 88.5977 | +| BeautyMap 近邻 SA % | 96.9529 | 93.2688 | 95.8456 | +| ConceptGraphs 部分表面覆盖 | 0.9256 | 0.5991 | 0.3984 | +| HOV-SG 部分表面覆盖 | 0.9256 | 0.9061 | 0.9136 | +| HOV-SG 受限查询命中 | 0.6667 | 0.6667 | 0.3333 | -现有四个表面由 AI 辅助标注,尚未独立人工审核,参考帧也进入建图;固定第一位姿保护了部分参考几何。三个种子不是三个场景,范围不是置信区间。两组一帧内的点都共享位姿误差,**没有比较共享隐变量估计器与独立方差估计器**。静态 room0 无法测真实变化召回,最终离线地图无法测过期时长或迟到修正后的恢复。 +相关性并非总有害,几何与检索也是不同结果。这些指标不横向排名;三个种子不是三个场景,也未比较共享隐变量与独立方差估计器。 -## 开放问题与候选 H1 +随后 room1 检验迟到修正:第八次观测、30 cm 时,固定关联恢复 11.1%,oracle 66.7%;事后 support-1 达 100%,候选 117 个,oracle 为 25 个。后续观测也修复部分缺口。**这一反证削弱了重关联的必要性。** 植物/花瓶部分标注和未标碎片不足以判定完整身份。[35 个冻结单元及另列的六个事后对照](DELAYED_RESULTS.zh-CN.md)。 -**当后续位姿修正改变历史对应时,如何恢复对象身份和查询坐标,并可测地限制过期结果的暴露时间?** 这个问题由“空间对应敏感”和“几何存在不保证查询有效”共同引出;现有结果还没有证明恢复机制一定必要或有效。 +## 候选 H1 与决策门槛 -候选 H1 保存观测来源、共享位姿版本、暂定关联和窗口前检查点;修正后回放受影响分量的全部贡献者,查询同时返回坐标、位姿版本、有效性状态和时间戳。先在 ConceptGraphs 测试 16 观测/512 MiB 的设计预算;预算和收益均待实测。 +H1 保留观测来源与位姿版本,修正后在有界缓存内重放受影响的关联,比简单保护恢复更多有效目标。当前 oracle 实验先问重关联是否值得做,不测试有界存储。 -[新场景迟到修正实验](DELAYED_RESULTS.zh-CN.md)已完成这组对照的 35 个冻结单元。Oracle 起初优于保留历史关联的全量几何修正,但 6 个事后对照仅降低支持门槛就消除了所选目标恢复缺口,代价是暴露更多碎片;后续观测也修复了主实验大部分缺口。因此当前支持的是支持门槛/暴露权衡,尚未证明必须恢复历史关联。先用独立标注和相同预算下的身份/变化评价排除廉价解释,再实现 H1。共享隐变量与独立方差估计器仍未比较。 +room2 固定五个 AI 标注实例、留出参考帧和同一个前端。28 个建图单元已运行,分析待完成。支持门槛 1/2/3、候选上限 25/50/100/不限,仅从过滤前完整状态读出。类别查询命中与物理身份分开评价;未标候选属未知。[冻结探索协议](https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/docs/IDENTITY_BUDGET.zh-CN.md)。 -新场景和独立标注必须在查看结果前冻结;同时测覆盖、身份碎片、当前坐标误差、变化召回、过期时长、更新延迟、回放时间和峰值内存。简单保护达到同样前沿、收益全由位姿修正解释,或仅靠保留过期物体减少误删,均否定相应 H1 收益。没有稳定锚点时,相机漂移与一致物体运动可能不可辨识。 +固定 RMS、支持门槛和评价项,oracle 须在两个有限上限下比所有简单对照平均提升至少 10 个百分点,至少 2/3 配对种子同向,且没有种子增加已标重复/混合身份,才提出有界原型。简单方法追平则削弱 H1。相同上限不等于相同点数或内存,AI 标注不能确认 H1。[下一步](PLAN.zh-CN.md)。 -[Khronos](https://arxiv.org/html/2402.13817v2) 已有联合优化与地图协调,记忆/回滚不能单独作为创新。潜在贡献只能暂定为“有界位姿修正与开放词汇目标有效性接口”,仍需进一步先验工作核查。[来源分析](LITERATURE.zh-CN.md) · [新实验设计](REAL_WORLD.zh-CN.md)。 +[Khronos](https://arxiv.org/html/2402.13817v2) 已协调地图,[DovSG](https://arxiv.org/html/2410.11989v2) 已更新场景图。潜在贡献是相对已有保护可测的恢复—成本收益,不能只说增加记忆/重放。共享不确定性作为普遍主因、动态变化召回与实物 H1 验证均未建立。 diff --git a/docs/figures/slots.json b/docs/figures/slots.json index 5d906ebf..08cd338c 100644 --- a/docs/figures/slots.json +++ b/docs/figures/slots.json @@ -760,6 +760,132 @@ "results/reference/delayed-support-control/record.json" ], "source_artifact": "figures/support-control.png" + }, + { + "id": "preview-v2-dufomap", + "path": "results/reference/media-previews-v2/dufomap.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "dufomap: native-size GIF from a verified saved-result MP4.", + "zh": "dufomap:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "dufomap.gif" + }, + { + "id": "preview-v2-beautymap", + "path": "results/reference/media-previews-v2/beautymap.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "beautymap: native-size GIF from a verified saved-result MP4.", + "zh": "beautymap:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "beautymap.gif" + }, + { + "id": "preview-v2-conceptgraphs", + "path": "results/reference/media-previews-v2/conceptgraphs.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "conceptgraphs: native-size GIF from a verified saved-result MP4.", + "zh": "conceptgraphs:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "conceptgraphs.gif" + }, + { + "id": "preview-v2-hovsg", + "path": "results/reference/media-previews-v2/hovsg.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "hovsg: native-size GIF from a verified saved-result MP4.", + "zh": "hovsg:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "hovsg.gif" + }, + { + "id": "preview-v2-dufomap-rviz", + "path": "results/reference/media-previews-v2/dufomap-rviz.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "dufomap-rviz: native-size GIF from a verified saved-result MP4.", + "zh": "dufomap-rviz:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "dufomap-rviz.gif" + }, + { + "id": "preview-v2-beautymap-rviz", + "path": "results/reference/media-previews-v2/beautymap-rviz.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "beautymap-rviz: native-size GIF from a verified saved-result MP4.", + "zh": "beautymap-rviz:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "beautymap-rviz.gif" + }, + { + "id": "preview-v2-conceptgraphs-rviz", + "path": "results/reference/media-previews-v2/conceptgraphs-rviz.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "conceptgraphs-rviz: native-size GIF from a verified saved-result MP4.", + "zh": "conceptgraphs-rviz:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "conceptgraphs-rviz.gif" + }, + { + "id": "preview-v2-hovsg-rviz", + "path": "results/reference/media-previews-v2/hovsg-rviz.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "hovsg-rviz: native-size GIF from a verified saved-result MP4.", + "zh": "hovsg-rviz:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "hovsg-rviz.gif" + }, + { + "id": "preview-v2-conceptgraphs-author-viewer", + "path": "results/reference/media-previews-v2/conceptgraphs-author-viewer.gif", + "stage": "Existing measured video preview", + "status": "published", + "caption": { + "en": "conceptgraphs-author-viewer: native-size GIF from a verified saved-result MP4.", + "zh": "conceptgraphs-author-viewer:由已校验的保存结果 MP4 导出的原尺寸 GIF。" + }, + "source_records": [ + "results/reference/media-previews-v2/record.json" + ], + "source_artifact": "conceptgraphs-author-viewer.gif" } ] } diff --git a/docs/papers/README.md b/docs/papers/README.md index 8e3580a7..c97e97c2 100644 --- a/docs/papers/README.md +++ b/docs/papers/README.md @@ -1,4 +1,4 @@ -# Four related paper reproductions +# Four early core reproduction snapshots English | [中文](README.zh-CN.md) @@ -11,6 +11,8 @@ The common interface is posed observation → spatial correspondence → map dec | ConceptGraphs | 40 posed Replica observations; SAM/CLIP and object fusion | [Card](conceptgraphs.md) | [MP4](../media/conceptgraphs/replay.mp4) / [GIF](../media/conceptgraphs/preview.gif) | [EN](../../output/pdf/conceptgraphs.en.pdf) / [中文](../../output/pdf/conceptgraphs.zh-CN.pdf) | | HOV-SG | 8 posed observations; segment feature-map core | [Card](hovsg.md) | [MP4](../media/hovsg/replay.mp4) / [GIF](../media/hovsg/preview.gif) | [EN](../../output/pdf/hovsg.en.pdf) / [中文](../../output/pdf/hovsg.zh-CN.pdf) | -All use supplied poses. Full SLAM, semantic paper benchmarks, scene-graph reasoning and navigation are not completed. Failed runs and resource adaptations are retained. The [cross-paper analysis](../STUDY.md) and [D435i/L2 protocol](../REAL_WORLD.md) have separate bilingual PDFs in [output/pdf](../../output/pdf). +These GIFs, cards and PDFs describe earlier supplied-pose subsets. Later original-code runs include paper-table checks and scoped semantic scoring: [author scope at 535a278](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.md). Full SLAM, complete benchmarks, scene-graph reasoning and navigation remain incomplete. + +PDFs in [output/pdf](../../output/pdf) retain their recorded generation snapshots, including earlier study/hardware text; they are not the current submission narrative. Read [STUDY](../STUDY.md) and [PLAN](../PLAN.md) for the current question and decision. Failures and resource adaptations remain recorded. Follow [RECORDING](../RECORDING.md) to regenerate media/reports from verified local outputs. [paper_suite.json](../../configs/paper_suite.json) binds this selection to native records, commands and language editions. diff --git a/docs/papers/README.zh-CN.md b/docs/papers/README.zh-CN.md index 4bc37fb7..6df06aca 100644 --- a/docs/papers/README.zh-CN.md +++ b/docs/papers/README.zh-CN.md @@ -1,4 +1,4 @@ -# 四篇相关论文复现 +# 四篇早期核心复现快照 [English](README.md) | 中文 @@ -11,6 +11,8 @@ | ConceptGraphs | 40 次给定位姿 Replica 观测,SAM/CLIP 及对象融合 | [论文卡](conceptgraphs.zh-CN.md) | [MP4](../media/conceptgraphs/replay.mp4) / [GIF](../media/conceptgraphs/preview.gif) | [EN](../../output/pdf/conceptgraphs.en.pdf) / [中文](../../output/pdf/conceptgraphs.zh-CN.pdf) | | HOV-SG | 8 次给定位姿观测,分段特征建图核心 | [论文卡](hovsg.zh-CN.md) | [MP4](../media/hovsg/replay.mp4) / [GIF](../media/hovsg/preview.gif) | [EN](../../output/pdf/hovsg.en.pdf) / [中文](../../output/pdf/hovsg.zh-CN.pdf) | -全部使用给定位姿。完整 SLAM、语义论文 benchmark、场景图推理及导航未完成。保留失败和资源适配。[四篇共性分析](../STUDY.zh-CN.md)与 [D435i/L2 实物方案](../REAL_WORLD.zh-CN.md)另有双语 PDF,见 [output/pdf](../../output/pdf)。 +这些 GIF、论文卡和 PDF 对应早期给定位姿子集。后续作者原流程已有论文表格核查和限定语义评分,见 [535a278 范围](https://github.com/p20030920p/SLAM_Learning/blob/535a2780af7ca7eb3aa02f722e1340fe90bc2dcf/docs/SCOPE.zh-CN.md)。完整 SLAM、完整 benchmark、场景图推理和导航仍未完成。 + +[output/pdf](../../output/pdf) 保留录制时的生成快照,包括早期研究/实物文本,不代替当前提交叙述。当前问题与决策见 [STUDY](../STUDY.zh-CN.md) 和 [PLAN](../PLAN.zh-CN.md)。失败与资源适配继续保留。 依据[录制说明](../RECORDING.zh-CN.md)从校验后的本地输出重新生成媒体/报告。[paper_suite.json](../../configs/paper_suite.json)绑定所选论文、原生记录、命令及语言版本。 diff --git a/pyproject.toml b/pyproject.toml index e2f9be06..b6335024 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,11 +7,12 @@ name = "slam-learning" version = "0.2.0" description = "Evidence-first experiments on changing maps and semantic localization" requires-python = ">=3.10,<3.12" -dependencies = ["numpy==1.26.4", "scipy==1.14.1", "matplotlib==3.9.2"] +dependencies = ["numpy==1.26.4", "scipy==1.14.1", "matplotlib==3.9.2", "pillow==12.3.0"] [project.optional-dependencies] methods = ["dufomap==1.1.1", "open3d==0.18.0", "fire==0.7.0", "dztimer==1.1.1", "tqdm==4.66.5"] dev = ["pytest==8.3.3", "ruff==0.7.3"] +audit = ["deptry==0.25.1", "import-linter==2.15", "vulture==2.16"] [project.scripts] slam-study = "slam_learning.cli:main" @@ -28,3 +29,42 @@ target-version = "py310" [tool.ruff.lint] select = ["E4", "E7", "E9", "F"] + +[tool.deptry] +optional_dependencies_dev_groups = ["dev", "audit"] +package_module_name_map = { pillow = "PIL", dufomap = "dufomap", open3d = "open3d", fire = "fire", dztimer = "dztimer", tqdm = "tqdm" } + +[tool.deptry.per_rule_ignores] +# BeautyMap subprocess imports fire/dztimer/tqdm; Open3D serves the optional viewers. +# See docs/REPRODUCE.md#maintenance; these are outside the packaged src scan. +DEP002 = ["open3d", "fire", "dztimer", "tqdm"] + +[tool.importlinter] +root_package = "slam_learning" +include_external_packages = true + +[[tool.importlinter.contracts]] +name = "No module cycles" +type = "acyclic_siblings" +ancestors = ["slam_learning"] + +[[tool.importlinter.contracts]] +name = "CLI above orchestration above reusable foundations" +type = "layers" +containers = ["slam_learning"] +exhaustive = true +layers = [ + "cli", + "adapters : api_check : evaluation_check : evidence_stress : fetch : pose_stress : render_reproduction : report : runner : synthetic", + "delayed_pose : metrics : paired_pose : pcd : pose_audit : provenance", +] + +[[tool.importlinter.contracts]] +name = "CUDA and ROS stay in separate experiment environments" +type = "forbidden" +source_modules = ["slam_learning"] +forbidden_modules = ["torch", "conceptgraph", "hovsg", "rclpy"] + +[tool.vulture] +paths = ["src", "scripts", "tests"] +min_confidence = 100 diff --git a/requirements.lock b/requirements.lock index 85679650..680616bf 100644 --- a/requirements.lock +++ b/requirements.lock @@ -489,6 +489,7 @@ pillow==12.3.0 \ # via # matplotlib # open3d + # slam-learning platformdirs==4.12.3 \ --hash=sha256:080f3b39423b5abfca9a23d84c4e9795f54d395cd8459867a8ded44084fcd5f8 \ --hash=sha256:427fc0bb321ae0c5b037fa03238ca74820437be162e78b4848c4d4055b9b766c diff --git a/results/reference/media-previews-v2/beautymap-rviz.gif b/results/reference/media-previews-v2/beautymap-rviz.gif new file mode 100644 index 00000000..0eb6d3b7 Binary files /dev/null and b/results/reference/media-previews-v2/beautymap-rviz.gif differ diff --git a/results/reference/media-previews-v2/beautymap.gif b/results/reference/media-previews-v2/beautymap.gif new file mode 100644 index 00000000..2b8f9e12 Binary files /dev/null and b/results/reference/media-previews-v2/beautymap.gif differ diff --git a/results/reference/media-previews-v2/before-after.png b/results/reference/media-previews-v2/before-after.png new file mode 100644 index 00000000..cf56a6ea Binary files /dev/null and b/results/reference/media-previews-v2/before-after.png differ diff --git a/results/reference/media-previews-v2/conceptgraphs-author-viewer.gif b/results/reference/media-previews-v2/conceptgraphs-author-viewer.gif new file mode 100644 index 00000000..8eb37f51 Binary files /dev/null and b/results/reference/media-previews-v2/conceptgraphs-author-viewer.gif differ diff --git a/results/reference/media-previews-v2/conceptgraphs-nine-stages.png b/results/reference/media-previews-v2/conceptgraphs-nine-stages.png new file mode 100644 index 00000000..d7fc6a2c Binary files /dev/null and b/results/reference/media-previews-v2/conceptgraphs-nine-stages.png differ diff --git a/results/reference/media-previews-v2/conceptgraphs-rviz.gif b/results/reference/media-previews-v2/conceptgraphs-rviz.gif new file mode 100644 index 00000000..4359c5a5 Binary files /dev/null and b/results/reference/media-previews-v2/conceptgraphs-rviz.gif differ diff --git a/results/reference/media-previews-v2/conceptgraphs.gif b/results/reference/media-previews-v2/conceptgraphs.gif new file mode 100644 index 00000000..80b110bb Binary files /dev/null and b/results/reference/media-previews-v2/conceptgraphs.gif differ diff --git a/results/reference/media-previews-v2/dufomap-rviz.gif b/results/reference/media-previews-v2/dufomap-rviz.gif new file mode 100644 index 00000000..e357be3d Binary files /dev/null and b/results/reference/media-previews-v2/dufomap-rviz.gif differ diff --git a/results/reference/media-previews-v2/dufomap.gif b/results/reference/media-previews-v2/dufomap.gif new file mode 100644 index 00000000..2ac82773 Binary files /dev/null and b/results/reference/media-previews-v2/dufomap.gif differ diff --git a/results/reference/media-previews-v2/export_media_previews.source.py b/results/reference/media-previews-v2/export_media_previews.source.py new file mode 100644 index 00000000..1c385896 --- /dev/null +++ b/results/reference/media-previews-v2/export_media_previews.source.py @@ -0,0 +1,164 @@ +"""Export native-size GIF previews from hash-verified recorded MP4 files.""" +from __future__ import annotations + +import argparse +import json +import os +import shutil +import subprocess +import sys +from pathlib import Path + +from PIL import Image, ImageStat + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) +from slam_learning.provenance import digest, utc_now, write_json + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--author-video", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--wsl", help="Use an existing WSL distro's ffmpeg/ffprobe, without installation") + args = parser.parse_args() + root = Path(__file__).resolve().parents[1] + output = args.output.resolve() + + def media_path(path): + value = Path(path).resolve().as_posix() + if args.wsl: + if len(value) < 3 or value[1:3] != ":/": + raise ValueError("WSL input must be a local Windows drive path") + return "/mnt/" + value[0].lower() + value[2:] + return value + + def run(program, options): + prefix = ["wsl", "-d", args.wsl, "--exec"] if args.wsl else [] + if program == "ffmpeg" and (args.wsl or os.name != "nt"): + prefix += ["nice", "-n", "10"] + command = [*prefix, program, *options] + result = subprocess.run(command, capture_output=True, check=False) + if result.returncode: + error = result.stderr.decode("utf-8", errors="replace") + raise RuntimeError(f"{program} failed ({result.returncode}): {error[-3000:]}") + return result.stdout, command + + def probe(path): + data, _ = run("ffprobe", ["-v", "error", "-show_entries", + "stream=width,height,avg_frame_rate:format=duration", + "-of", "json", media_path(path)]) + return json.loads(data) + + def record_source(relative, artifact, video, name, fps, start, end): + record_path = root / relative + record = json.loads(record_path.read_text(encoding="utf-8")) + if record.get("status") != "executed": + raise ValueError(f"Source record is not completed: {relative}") + return {"name": name, "video": video, "sha256": record["artifacts"][artifact]["sha256"], + "source_record": relative, "record_sha256": digest(record_path), + "fps": fps, "start_seconds": start, "end_seconds": end} + + methods = ("dufomap", "beautymap", "conceptgraphs", "hovsg") + items = [record_source(f"results/reference/paper-media-{method}/record.json", "replay.mp4", + root / f"docs/media/{method}/replay.mp4", method, 1.5, 0, None) + for method in methods] + items += [record_source("results/reference/visual-review/record.json", f"{method}/review.mp4", + root / f"docs/media/rviz/{method}.mp4", method + "-rviz", 5, 5, + 64 if method == "conceptgraphs" else 29) for method in methods] + items.append({"name": "conceptgraphs-author-viewer", "video": args.author_video.resolve(), + "sha256": "2eb0bc99c6319ebac785eaccc444a3a8fe9db1701775ab30c2ea6888af3883b3", + "source_record": "https://github.com/p20030920p/SLAM_Learning/blob/" + "4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json", + "source_url": "https://github.com/p20030920p/SLAM_Learning/blob/" + "3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/" + "conceptgraphs-room0-original-window.mp4", + "fps": 5, "start_seconds": 5, "end_seconds": 53}) + for item in items: + if digest(item["video"]) != item["sha256"]: + raise ValueError(f"Source video changed: {item['name']}") + item["source_metadata"] = probe(item["video"]) + stream = item["source_metadata"]["streams"][0] + duration = float(item["source_metadata"]["format"]["duration"]) + end = duration if item["end_seconds"] is None else item["end_seconds"] + if not 0 <= item["start_seconds"] < end <= duration: + raise ValueError(f"Clip outside source: {item['name']}") + item["duration_seconds"] = end - item["start_seconds"] + item["dimensions"] = [stream["width"], stream["height"]] + item["source_intervals_seconds"] = [[item["start_seconds"], end]] + item["sampling_filter"] = f"fps={item['fps']}" + if item["name"] == "conceptgraphs-rviz": + original = json.loads((root / item["source_record"]).read_text(encoding="utf-8")) + summary = next(part for part in original["summary"] if part["method"] == "conceptgraphs") + starts = summary["qa_times_s"] + if len(starts) != summary["steps"] or len(starts) != 9: + raise ValueError("Expected all nine recorded ConceptGraphs stages") + item["source_intervals_seconds"] = [[start, start + 3] for start in starts] + terms = [f"gte(t,{start - item['start_seconds']})*lt(t,{start + 3 - item['start_seconds']})" + for start in starts] + item["sampling_filter"] = "select='" + "+".join(terms) + "',setpts=N/(5*TB),fps=5" + item["preview_duration_seconds"] = sum(end - start for start, end in item["source_intervals_seconds"]) + + output.mkdir(parents=True, exist_ok=False) + version, _ = run("ffmpeg", ["-version"]) + records = [] + for item in items: + target = output / (item["name"] + ".gif") + palette = output / (item["name"] + ".palette.png") + source_options = ["-hide_banner", "-loglevel", "error", "-nostdin", "-threads", "1", + "-ss", str(item["start_seconds"]), "-t", str(item["duration_seconds"]), + "-i", media_path(item["video"])] + _, palette_command = run("ffmpeg", [*source_options, "-filter_threads", "1", "-vf", + f"{item['sampling_filter']},palettegen=max_colors=256:" + "reserve_transparent=1:stats_mode=diff", + "-frames:v", "1", media_path(palette)]) + _, gif_command = run("ffmpeg", [*source_options, "-i", media_path(palette), + "-filter_complex_threads", "1", "-lavfi", + f"{item['sampling_filter']}[a];[a][1:v]paletteuse=" + "dither=sierra2_4a:diff_mode=rectangle", + "-threads", "1", "-loop", "0", "-gifflags", "+transdiff", + media_path(target)]) + run("ffmpeg", ["-v", "error", "-threads", "1", "-i", media_path(target), + "-f", "null", "-"]) + with Image.open(target) as gif: + if list(gif.size) != item["dimensions"] or gif.info.get("loop") != 0: + raise ValueError(f"Incorrect GIF size or loop: {item['name']}") + frames = gif.n_frames + elapsed_ms = 0 + for index in range(frames): + gif.seek(index) + gif.convert("RGB").load() + elapsed_ms += gif.info.get("duration", 0) + if index in (0, frames // 2, frames - 1): + if max(ImageStat.Stat(gif.convert("RGB")).stddev) < 3: + raise ValueError(f"Blank GIF: {item['name']}") + if abs(elapsed_ms / 1000 - item["preview_duration_seconds"]) > 0.15: + raise ValueError(f"Unexpected GIF duration: {item['name']}") + if target.stat().st_size > 10 * 1024 * 1024: + raise ValueError(f"Preview exceeds the local 10 MiB budget: {target.name}") + if digest(item["video"]) != item["sha256"]: + raise ValueError("Source changed during export") + public = {key: value for key, value in item.items() if key != "video"} + public.update(source_video=item["video"].relative_to(root).as_posix() + if item["video"].is_relative_to(root) else item["source_url"], + decoded_frames=frames, gif_duration_seconds=elapsed_ms / 1000, + palette_colors=256, dither="sierra2_4a", full_decode_passed=True, + commands=[palette_command, gif_command]) + records.append(public) + print(f"{target.name}: {item['dimensions']}, {elapsed_ms / 1000:.2f}s, " + f"{target.stat().st_size / 1024 / 1024:.2f} MiB", flush=True) + palette.unlink() + shutil.copy2(__file__, output / "export_media_previews.source.py") + record = {"schema_version": 1, "kind": "recorded_media_preview_export", "status": "executed", + "created_at": utc_now(), "exit_code": 0, "generator_sha256": digest(Path(__file__)), + "ffmpeg": version.decode("utf-8").splitlines()[0], "clips": records, + "scope": "Existing measured MP4s, native dimensions, palette optimization only. " + "No new inference, interpolated frames or algorithm-runtime claim.", "artifacts": {}} + for path in sorted(output.iterdir()): + record["artifacts"][path.name] = {"sha256": digest(path), "bytes": path.stat().st_size, + "availability": "portable"} + write_json(output / "record.json", record) + print(output / "record.json", flush=True) + + +if __name__ == "__main__": + main() diff --git a/results/reference/media-previews-v2/hovsg-rviz.gif b/results/reference/media-previews-v2/hovsg-rviz.gif new file mode 100644 index 00000000..674de681 Binary files /dev/null and b/results/reference/media-previews-v2/hovsg-rviz.gif differ diff --git a/results/reference/media-previews-v2/hovsg.gif b/results/reference/media-previews-v2/hovsg.gif new file mode 100644 index 00000000..45591f47 Binary files /dev/null and b/results/reference/media-previews-v2/hovsg.gif differ diff --git a/results/reference/media-previews-v2/record.json b/results/reference/media-previews-v2/record.json new file mode 100644 index 00000000..c619481d --- /dev/null +++ b/results/reference/media-previews-v2/record.json @@ -0,0 +1,1086 @@ +{ + "schema_version": 1, + "kind": "recorded_media_preview_export", + "status": "executed", + "created_at": "2026-10-09T15:18:28+00:00", + "exit_code": 0, + "generator_sha256": "1e729aaff6bb26a9139c2c8f1ab48c2f0790cbe6f1ea0623b45bda1f1fd8d7c9", + "ffmpeg": "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers", + "clips": [ + { + "name": "dufomap", + "sha256": "ab4ea8289e5387b19f75e0253a7b24b67c3dc1f839a148669b50008af97fccc0", + "source_record": "results/reference/paper-media-dufomap/record.json", + "record_sha256": "b08e14c3db27509d58a2d7f7bc171293fa1479365ee016531592f237c4d2bfd5", + "fps": 1.5, + "start_seconds": 0, + "end_seconds": null, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1200, + "height": 440, + "avg_frame_rate": "12/1" + } + ], + "format": { + "duration": "14.000000" + } + }, + "duration_seconds": 14.0, + "dimensions": [ + 1200, + 440 + ], + "source_intervals_seconds": [ + [ + 0, + 14.0 + ] + ], + "sampling_filter": "fps=1.5", + "preview_duration_seconds": 14.0, + "source_video": "docs/media/dufomap/replay.mp4", + "decoded_frames": 21, + "gif_duration_seconds": 13.99, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "14.0", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/dufomap/replay.mp4", + "-filter_threads", + "1", + "-vf", + "fps=1.5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "14.0", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/dufomap/replay.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=1.5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap.gif" + ] + ] + }, + { + "name": "beautymap", + "sha256": "9e563c937a9149ef769be520130efd5a64fac6cb49391382733e369331f88475", + "source_record": "results/reference/paper-media-beautymap/record.json", + "record_sha256": "ed9bfa361cae53befd0725b20a8a8965cf4187daf44b4f403af82be5db7398ea", + "fps": 1.5, + "start_seconds": 0, + "end_seconds": null, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1200, + "height": 440, + "avg_frame_rate": "12/1" + } + ], + "format": { + "duration": "14.000000" + } + }, + "duration_seconds": 14.0, + "dimensions": [ + 1200, + 440 + ], + "source_intervals_seconds": [ + [ + 0, + 14.0 + ] + ], + "sampling_filter": "fps=1.5", + "preview_duration_seconds": 14.0, + "source_video": "docs/media/beautymap/replay.mp4", + "decoded_frames": 21, + "gif_duration_seconds": 13.99, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "14.0", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/beautymap/replay.mp4", + "-filter_threads", + "1", + "-vf", + "fps=1.5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "14.0", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/beautymap/replay.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=1.5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap.gif" + ] + ] + }, + { + "name": "conceptgraphs", + "sha256": "a524ba34528f4d1ec8ea2a161ef74eff3a9204ae7d03d38522e7cf44af70dbb9", + "source_record": "results/reference/paper-media-conceptgraphs/record.json", + "record_sha256": "1476b6b75187a78755007aa29ca2f5e1fcca7cc8f14ad828fc4cb036dd9232a6", + "fps": 1.5, + "start_seconds": 0, + "end_seconds": null, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 650, + "avg_frame_rate": "12/1" + } + ], + "format": { + "duration": "13.334000" + } + }, + "duration_seconds": 13.334, + "dimensions": [ + 1280, + 650 + ], + "source_intervals_seconds": [ + [ + 0, + 13.334 + ] + ], + "sampling_filter": "fps=1.5", + "preview_duration_seconds": 13.334, + "source_video": "docs/media/conceptgraphs/replay.mp4", + "decoded_frames": 20, + "gif_duration_seconds": 13.34, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "13.334", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/conceptgraphs/replay.mp4", + "-filter_threads", + "1", + "-vf", + "fps=1.5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "13.334", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/conceptgraphs/replay.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=1.5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs.gif" + ] + ] + }, + { + "name": "hovsg", + "sha256": "8f3ad596dc24dd42b83e77c5eb06acdf59cf5f4cfbf71c5a2ecc03dd42839e17", + "source_record": "results/reference/paper-media-hovsg/record.json", + "record_sha256": "0ceb9c33d74e378a093d43b4b53257486bc986ba140a108df1125b640c23bb32", + "fps": 1.5, + "start_seconds": 0, + "end_seconds": null, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 650, + "avg_frame_rate": "12/1" + } + ], + "format": { + "duration": "5.334000" + } + }, + "duration_seconds": 5.334, + "dimensions": [ + 1280, + 650 + ], + "source_intervals_seconds": [ + [ + 0, + 5.334 + ] + ], + "sampling_filter": "fps=1.5", + "preview_duration_seconds": 5.334, + "source_video": "docs/media/hovsg/replay.mp4", + "decoded_frames": 8, + "gif_duration_seconds": 5.34, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "5.334", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/hovsg/replay.mp4", + "-filter_threads", + "1", + "-vf", + "fps=1.5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "0", + "-t", + "5.334", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/hovsg/replay.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=1.5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg.gif" + ] + ] + }, + { + "name": "dufomap-rviz", + "sha256": "d8e0e1cbc66ac0a2a8795d1915328e75f0b1bb440bbd64307d0ae60520d31881", + "source_record": "results/reference/visual-review/record.json", + "record_sha256": "27aec8b50a8bd265cd75ce84a40b4ca4e33de9c91221326d4f779f1a5b5baf70", + "fps": 5, + "start_seconds": 5, + "end_seconds": 29, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 800, + "avg_frame_rate": "5/1" + } + ], + "format": { + "duration": "34.400000" + } + }, + "duration_seconds": 24, + "dimensions": [ + 1280, + 800 + ], + "source_intervals_seconds": [ + [ + 5, + 29 + ] + ], + "sampling_filter": "fps=5", + "preview_duration_seconds": 24, + "source_video": "docs/media/rviz/dufomap.mp4", + "decoded_frames": 120, + "gif_duration_seconds": 24.0, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/dufomap.mp4", + "-filter_threads", + "1", + "-vf", + "fps=5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap-rviz.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/dufomap.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap-rviz.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/dufomap-rviz.gif" + ] + ] + }, + { + "name": "beautymap-rviz", + "sha256": "1015682d4c62d13ee8c6bf48ca7a67788e51617b015f49c1b7e0fa7a97f0b8da", + "source_record": "results/reference/visual-review/record.json", + "record_sha256": "27aec8b50a8bd265cd75ce84a40b4ca4e33de9c91221326d4f779f1a5b5baf70", + "fps": 5, + "start_seconds": 5, + "end_seconds": 29, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 800, + "avg_frame_rate": "5/1" + } + ], + "format": { + "duration": "34.400000" + } + }, + "duration_seconds": 24, + "dimensions": [ + 1280, + 800 + ], + "source_intervals_seconds": [ + [ + 5, + 29 + ] + ], + "sampling_filter": "fps=5", + "preview_duration_seconds": 24, + "source_video": "docs/media/rviz/beautymap.mp4", + "decoded_frames": 120, + "gif_duration_seconds": 24.0, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/beautymap.mp4", + "-filter_threads", + "1", + "-vf", + "fps=5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap-rviz.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/beautymap.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap-rviz.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/beautymap-rviz.gif" + ] + ] + }, + { + "name": "conceptgraphs-rviz", + "sha256": "bb28408dfc19c2484e549047ebf884ac2494739eb38f1a95d25e57a0e47cc96f", + "source_record": "results/reference/visual-review/record.json", + "record_sha256": "27aec8b50a8bd265cd75ce84a40b4ca4e33de9c91221326d4f779f1a5b5baf70", + "fps": 5, + "start_seconds": 5, + "end_seconds": 64, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 800, + "avg_frame_rate": "5/1" + } + ], + "format": { + "duration": "69.600000" + } + }, + "duration_seconds": 59, + "dimensions": [ + 1280, + 800 + ], + "source_intervals_seconds": [ + [ + 5, + 8 + ], + [ + 12, + 15 + ], + [ + 19, + 22 + ], + [ + 26, + 29 + ], + [ + 33, + 36 + ], + [ + 40, + 43 + ], + [ + 47, + 50 + ], + [ + 54, + 57 + ], + [ + 61, + 64 + ] + ], + "sampling_filter": "select='gte(t,0)*lt(t,3)+gte(t,7)*lt(t,10)+gte(t,14)*lt(t,17)+gte(t,21)*lt(t,24)+gte(t,28)*lt(t,31)+gte(t,35)*lt(t,38)+gte(t,42)*lt(t,45)+gte(t,49)*lt(t,52)+gte(t,56)*lt(t,59)',setpts=N/(5*TB),fps=5", + "preview_duration_seconds": 27, + "source_video": "docs/media/rviz/conceptgraphs.mp4", + "decoded_frames": 135, + "gif_duration_seconds": 27.0, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "59", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/conceptgraphs.mp4", + "-filter_threads", + "1", + "-vf", + "select='gte(t,0)*lt(t,3)+gte(t,7)*lt(t,10)+gte(t,14)*lt(t,17)+gte(t,21)*lt(t,24)+gte(t,28)*lt(t,31)+gte(t,35)*lt(t,38)+gte(t,42)*lt(t,45)+gte(t,49)*lt(t,52)+gte(t,56)*lt(t,59)',setpts=N/(5*TB),fps=5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-rviz.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "59", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/conceptgraphs.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-rviz.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "select='gte(t,0)*lt(t,3)+gte(t,7)*lt(t,10)+gte(t,14)*lt(t,17)+gte(t,21)*lt(t,24)+gte(t,28)*lt(t,31)+gte(t,35)*lt(t,38)+gte(t,42)*lt(t,45)+gte(t,49)*lt(t,52)+gte(t,56)*lt(t,59)',setpts=N/(5*TB),fps=5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-rviz.gif" + ] + ] + }, + { + "name": "hovsg-rviz", + "sha256": "8c0cdbc920979b8df0a79802df55c19ae0664392b90ad03507e12828c0e0f132", + "source_record": "results/reference/visual-review/record.json", + "record_sha256": "27aec8b50a8bd265cd75ce84a40b4ca4e33de9c91221326d4f779f1a5b5baf70", + "fps": 5, + "start_seconds": 5, + "end_seconds": 29, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 800, + "avg_frame_rate": "5/1" + } + ], + "format": { + "duration": "34.400000" + } + }, + "duration_seconds": 24, + "dimensions": [ + 1280, + 800 + ], + "source_intervals_seconds": [ + [ + 5, + 29 + ] + ], + "sampling_filter": "fps=5", + "preview_duration_seconds": 24, + "source_video": "docs/media/rviz/hovsg.mp4", + "decoded_frames": 120, + "gif_duration_seconds": 24.0, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/hovsg.mp4", + "-filter_threads", + "1", + "-vf", + "fps=5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg-rviz.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "24", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/docs/media/rviz/hovsg.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg-rviz.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/hovsg-rviz.gif" + ] + ] + }, + { + "name": "conceptgraphs-author-viewer", + "sha256": "2eb0bc99c6319ebac785eaccc444a3a8fe9db1701775ab30c2ea6888af3883b3", + "source_record": "https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json", + "source_url": "https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4", + "fps": 5, + "start_seconds": 5, + "end_seconds": 53, + "source_metadata": { + "programs": [], + "streams": [ + { + "width": 1280, + "height": 720, + "avg_frame_rate": "15/1" + } + ], + "format": { + "duration": "60.000000" + } + }, + "duration_seconds": 48, + "dimensions": [ + 1280, + 720 + ], + "source_intervals_seconds": [ + [ + 5, + 53 + ] + ], + "sampling_filter": "fps=5", + "preview_duration_seconds": 48, + "source_video": "https://github.com/p20030920p/SLAM_Learning/blob/3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/conceptgraphs-room0-original-window.mp4", + "decoded_frames": 240, + "gif_duration_seconds": 48.0, + "palette_colors": 256, + "dither": "sierra2_4a", + "full_decode_passed": true, + "commands": [ + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "48", + "-i", + "/mnt/d/workspace/be2/SLAM_Recordings/author-originals/conceptgraphs-room0-original-window.mp4", + "-filter_threads", + "1", + "-vf", + "fps=5,palettegen=max_colors=256:reserve_transparent=1:stats_mode=diff", + "-frames:v", + "1", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-author-viewer.palette.png" + ], + [ + "wsl", + "-d", + "Ubuntu-22.04", + "--exec", + "nice", + "-n", + "10", + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-nostdin", + "-threads", + "1", + "-ss", + "5", + "-t", + "48", + "-i", + "/mnt/d/workspace/be2/SLAM_Recordings/author-originals/conceptgraphs-room0-original-window.mp4", + "-i", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-author-viewer.palette.png", + "-filter_complex_threads", + "1", + "-lavfi", + "fps=5[a];[a][1:v]paletteuse=dither=sierra2_4a:diff_mode=rectangle", + "-threads", + "1", + "-loop", + "0", + "-gifflags", + "+transdiff", + "/mnt/d/workspace/be2/SLAM_Dependency_Audit/results/runs/media-previews-v2-002/conceptgraphs-author-viewer.gif" + ] + ] + } + ], + "scope": "Existing measured MP4s, native dimensions, palette optimization only. No new inference, interpolated frames or algorithm-runtime claim.", + "artifacts": { + "beautymap-rviz.gif": { + "sha256": "ae1f469a6b1ea49c40697145fabfbefad7433570f4f807f05491432357c214e2", + "bytes": 2912621, + "availability": "portable" + }, + "beautymap.gif": { + "sha256": "a4e9be3dbe66b1fbded75e08d8da90b6a6e71b94b357f103590c0403065d7e0a", + "bytes": 878975, + "availability": "portable" + }, + "conceptgraphs-author-viewer.gif": { + "sha256": "2a251f221b566328ab247cd8865b87bfd97b02f8e00687adc15f0b43418aa665", + "bytes": 1424073, + "availability": "portable" + }, + "conceptgraphs-rviz.gif": { + "sha256": "bbf0390cf36b16fd288b13883483c026459829ca0990d2723af8c47a3692779f", + "bytes": 4404028, + "availability": "portable" + }, + "conceptgraphs.gif": { + "sha256": "e5564157a0183af01026db96a92014113ac266e9e217ab5503fbc11041667bb7", + "bytes": 2053022, + "availability": "portable" + }, + "dufomap-rviz.gif": { + "sha256": "9e0a5d621faa596cc2010555a929a945e6410c320134c7e3b780ef85ade287d3", + "bytes": 2846634, + "availability": "portable" + }, + "dufomap.gif": { + "sha256": "da62a54da987ef745c1b86f98847374cedc165bde28966382bf055238d653931", + "bytes": 869847, + "availability": "portable" + }, + "export_media_previews.source.py": { + "sha256": "1e729aaff6bb26a9139c2c8f1ab48c2f0790cbe6f1ea0623b45bda1f1fd8d7c9", + "bytes": 9535, + "availability": "portable" + }, + "hovsg-rviz.gif": { + "sha256": "cf1ca66207a10c341659bf894f23e5a6c154f6fe0c8349edf5b17dd51ad51063", + "bytes": 3687819, + "availability": "portable" + }, + "hovsg.gif": { + "sha256": "dac824c878ab3a750a714695d0c003cf00e722ebe1a1a50c720d93dd8d3fed00", + "bytes": 827998, + "availability": "portable" + }, + "before-after.png": { + "sha256": "b1bcbbaebce5be6dbad822523d50e9fd4ba53471ee55417391b943d98fcc2f60", + "bytes": 825793, + "availability": "portable" + }, + "conceptgraphs-nine-stages.png": { + "sha256": "3ca89deda5d37f869812ae86ff5886e1cf7e43df5c930f6418a2d3aec6317ef6", + "bytes": 1033674, + "availability": "portable" + } + }, + "visual_review": { + "reviewer": "AI", + "independent_human_review": false, + "checks": [ + "First, middle and last frame of every GIF inspected", + "All nine ConceptGraphs RViz stages inspected in recorded order", + "Before/after native-scale text and point-cloud crops inspected" + ], + "negative_checks": [ + "Mismatched source rejected before output creation", + "Existing output directory rejected without changing GIF hashes" + ] + }, + "comparison_source_gif": { + "url": "https://github.com/p20030920p/SLAM_Learning/blob/4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/dufomap-rviz.gif", + "sha256": "e43648071bd384aeb0ebcd4535293f725876a63ba1a0f60a79c43a1caea94f94" + } +} diff --git a/scripts/export_media_previews.py b/scripts/export_media_previews.py new file mode 100644 index 00000000..1c385896 --- /dev/null +++ b/scripts/export_media_previews.py @@ -0,0 +1,164 @@ +"""Export native-size GIF previews from hash-verified recorded MP4 files.""" +from __future__ import annotations + +import argparse +import json +import os +import shutil +import subprocess +import sys +from pathlib import Path + +from PIL import Image, ImageStat + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) +from slam_learning.provenance import digest, utc_now, write_json + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--author-video", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--wsl", help="Use an existing WSL distro's ffmpeg/ffprobe, without installation") + args = parser.parse_args() + root = Path(__file__).resolve().parents[1] + output = args.output.resolve() + + def media_path(path): + value = Path(path).resolve().as_posix() + if args.wsl: + if len(value) < 3 or value[1:3] != ":/": + raise ValueError("WSL input must be a local Windows drive path") + return "/mnt/" + value[0].lower() + value[2:] + return value + + def run(program, options): + prefix = ["wsl", "-d", args.wsl, "--exec"] if args.wsl else [] + if program == "ffmpeg" and (args.wsl or os.name != "nt"): + prefix += ["nice", "-n", "10"] + command = [*prefix, program, *options] + result = subprocess.run(command, capture_output=True, check=False) + if result.returncode: + error = result.stderr.decode("utf-8", errors="replace") + raise RuntimeError(f"{program} failed ({result.returncode}): {error[-3000:]}") + return result.stdout, command + + def probe(path): + data, _ = run("ffprobe", ["-v", "error", "-show_entries", + "stream=width,height,avg_frame_rate:format=duration", + "-of", "json", media_path(path)]) + return json.loads(data) + + def record_source(relative, artifact, video, name, fps, start, end): + record_path = root / relative + record = json.loads(record_path.read_text(encoding="utf-8")) + if record.get("status") != "executed": + raise ValueError(f"Source record is not completed: {relative}") + return {"name": name, "video": video, "sha256": record["artifacts"][artifact]["sha256"], + "source_record": relative, "record_sha256": digest(record_path), + "fps": fps, "start_seconds": start, "end_seconds": end} + + methods = ("dufomap", "beautymap", "conceptgraphs", "hovsg") + items = [record_source(f"results/reference/paper-media-{method}/record.json", "replay.mp4", + root / f"docs/media/{method}/replay.mp4", method, 1.5, 0, None) + for method in methods] + items += [record_source("results/reference/visual-review/record.json", f"{method}/review.mp4", + root / f"docs/media/rviz/{method}.mp4", method + "-rviz", 5, 5, + 64 if method == "conceptgraphs" else 29) for method in methods] + items.append({"name": "conceptgraphs-author-viewer", "video": args.author_video.resolve(), + "sha256": "2eb0bc99c6319ebac785eaccc444a3a8fe9db1701775ab30c2ea6888af3883b3", + "source_record": "https://github.com/p20030920p/SLAM_Learning/blob/" + "4361d4f353a7449c7d6964887643915d2fc72a11/results/reference/homepage-media/record.json", + "source_url": "https://github.com/p20030920p/SLAM_Learning/blob/" + "3b0b9a88ac7c77431268b6c869c369e01bd19b3e/evidence/videos/" + "conceptgraphs-room0-original-window.mp4", + "fps": 5, "start_seconds": 5, "end_seconds": 53}) + for item in items: + if digest(item["video"]) != item["sha256"]: + raise ValueError(f"Source video changed: {item['name']}") + item["source_metadata"] = probe(item["video"]) + stream = item["source_metadata"]["streams"][0] + duration = float(item["source_metadata"]["format"]["duration"]) + end = duration if item["end_seconds"] is None else item["end_seconds"] + if not 0 <= item["start_seconds"] < end <= duration: + raise ValueError(f"Clip outside source: {item['name']}") + item["duration_seconds"] = end - item["start_seconds"] + item["dimensions"] = [stream["width"], stream["height"]] + item["source_intervals_seconds"] = [[item["start_seconds"], end]] + item["sampling_filter"] = f"fps={item['fps']}" + if item["name"] == "conceptgraphs-rviz": + original = json.loads((root / item["source_record"]).read_text(encoding="utf-8")) + summary = next(part for part in original["summary"] if part["method"] == "conceptgraphs") + starts = summary["qa_times_s"] + if len(starts) != summary["steps"] or len(starts) != 9: + raise ValueError("Expected all nine recorded ConceptGraphs stages") + item["source_intervals_seconds"] = [[start, start + 3] for start in starts] + terms = [f"gte(t,{start - item['start_seconds']})*lt(t,{start + 3 - item['start_seconds']})" + for start in starts] + item["sampling_filter"] = "select='" + "+".join(terms) + "',setpts=N/(5*TB),fps=5" + item["preview_duration_seconds"] = sum(end - start for start, end in item["source_intervals_seconds"]) + + output.mkdir(parents=True, exist_ok=False) + version, _ = run("ffmpeg", ["-version"]) + records = [] + for item in items: + target = output / (item["name"] + ".gif") + palette = output / (item["name"] + ".palette.png") + source_options = ["-hide_banner", "-loglevel", "error", "-nostdin", "-threads", "1", + "-ss", str(item["start_seconds"]), "-t", str(item["duration_seconds"]), + "-i", media_path(item["video"])] + _, palette_command = run("ffmpeg", [*source_options, "-filter_threads", "1", "-vf", + f"{item['sampling_filter']},palettegen=max_colors=256:" + "reserve_transparent=1:stats_mode=diff", + "-frames:v", "1", media_path(palette)]) + _, gif_command = run("ffmpeg", [*source_options, "-i", media_path(palette), + "-filter_complex_threads", "1", "-lavfi", + f"{item['sampling_filter']}[a];[a][1:v]paletteuse=" + "dither=sierra2_4a:diff_mode=rectangle", + "-threads", "1", "-loop", "0", "-gifflags", "+transdiff", + media_path(target)]) + run("ffmpeg", ["-v", "error", "-threads", "1", "-i", media_path(target), + "-f", "null", "-"]) + with Image.open(target) as gif: + if list(gif.size) != item["dimensions"] or gif.info.get("loop") != 0: + raise ValueError(f"Incorrect GIF size or loop: {item['name']}") + frames = gif.n_frames + elapsed_ms = 0 + for index in range(frames): + gif.seek(index) + gif.convert("RGB").load() + elapsed_ms += gif.info.get("duration", 0) + if index in (0, frames // 2, frames - 1): + if max(ImageStat.Stat(gif.convert("RGB")).stddev) < 3: + raise ValueError(f"Blank GIF: {item['name']}") + if abs(elapsed_ms / 1000 - item["preview_duration_seconds"]) > 0.15: + raise ValueError(f"Unexpected GIF duration: {item['name']}") + if target.stat().st_size > 10 * 1024 * 1024: + raise ValueError(f"Preview exceeds the local 10 MiB budget: {target.name}") + if digest(item["video"]) != item["sha256"]: + raise ValueError("Source changed during export") + public = {key: value for key, value in item.items() if key != "video"} + public.update(source_video=item["video"].relative_to(root).as_posix() + if item["video"].is_relative_to(root) else item["source_url"], + decoded_frames=frames, gif_duration_seconds=elapsed_ms / 1000, + palette_colors=256, dither="sierra2_4a", full_decode_passed=True, + commands=[palette_command, gif_command]) + records.append(public) + print(f"{target.name}: {item['dimensions']}, {elapsed_ms / 1000:.2f}s, " + f"{target.stat().st_size / 1024 / 1024:.2f} MiB", flush=True) + palette.unlink() + shutil.copy2(__file__, output / "export_media_previews.source.py") + record = {"schema_version": 1, "kind": "recorded_media_preview_export", "status": "executed", + "created_at": utc_now(), "exit_code": 0, "generator_sha256": digest(Path(__file__)), + "ffmpeg": version.decode("utf-8").splitlines()[0], "clips": records, + "scope": "Existing measured MP4s, native dimensions, palette optimization only. " + "No new inference, interpolated frames or algorithm-runtime claim.", "artifacts": {}} + for path in sorted(output.iterdir()): + record["artifacts"][path.name] = {"sha256": digest(path), "bytes": path.stat().st_size, + "availability": "portable"} + write_json(output / "record.json", record) + print(output / "record.json", flush=True) + + +if __name__ == "__main__": + main() diff --git a/uv.lock b/uv.lock index 88118719..bda46e5e 100644 --- a/uv.lock +++ b/uv.lock @@ -259,6 +259,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/29/498125538103a11eab9cfbbde41bacf93e14ab3ac92ae9fb4ac0ac4dd61b/dash-4.4.1-py3-none-any.whl", hash = "sha256:72120a91b10ee4d73f9446efd5d6a4ec218086feed7b1b479d2259844d1f658f", size = 8945027, upload-time = "2026-07-21T18:58:11.405Z" }, ] +[[package]] +name = "deptry" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "packaging" }, + { name = "requirements-parser" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/b2/50ccc99362ae7757342978b7ecb3b98e47fade721fd617d74db1948ec3a1/deptry-0.25.1.tar.gz", hash = "sha256:45c8cd982c85cd4faae573ddff6920de7eec735336db6973f26a765ae7950f7d", size = 509748, upload-time = "2026-03-18T23:22:18.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/1d/b538dc635e873b25360d761cfe1fa0ccd7d6c69b698047e552f33401e60d/deptry-0.25.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:a4dd1148db24a1ddacfa8b840836c6019c2f864fcb7579dd089fd217606338c8", size = 1850319, upload-time = "2026-03-18T23:22:15.65Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a9/511477a8f0ae4f6021d68a80bdca77e7ffb0722008dc24ee5d9ef49f5c88/deptry-0.25.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c67c666d916ef12013c0772e40d78be0f21577a495d8d99ec5fcb18c332d393d", size = 1759259, upload-time = "2026-03-18T23:22:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4b/c9f0bdda410912a6df79a789cb118fa29acae02a397794ead3c84adcda5c/deptry-0.25.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d39279828dbf4efc1abb40bf50a71b21499c36759bed5a8d8a3c0e3149b091", size = 1872012, upload-time = "2026-03-18T23:22:19.145Z" }, + { url = "https://files.pythonhosted.org/packages/72/9c/6f6f9125bac74b5d5d2af89536cbdb3fa159b6466aa097b74e7e85e8e030/deptry-0.25.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14bfcc28b4326ed8c6abb30691b19077d4ef8613cfba6c37ef5b1f471775bf6f", size = 1926575, upload-time = "2026-03-18T23:22:11.269Z" }, + { url = "https://files.pythonhosted.org/packages/52/48/2a5e705a7f898295966ade67bd1223e2af96da433e25b39f6b9483ba2c7b/deptry-0.25.1-cp310-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:555f5f9a487899ec9bf301eecba1745e14d212c4b354f4d3a5fd691e907366d3", size = 2050816, upload-time = "2026-03-18T23:22:27.439Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c6/50f189a894e1f3bf21266299112c8a06cb731838976e1b9a9cadd0b4a86e/deptry-0.25.1-cp310-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d21b3545ab2bfec53f3f45c6f5f201d55f713323327f8d12674505469ae6b7", size = 2145416, upload-time = "2026-03-18T23:22:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/7a/6a/3f82f7a06217778282bc4456af1b4ffb3bc4b2c8e7891d00e8323f9ad0b8/deptry-0.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:b59a560cb7dffb21832a98bb80d33d614cfb5630ea36ce21833eabf4eae3df99", size = 1718489, upload-time = "2026-03-18T23:22:28.589Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7f/cd6b3ac8cf95f2f1c5c7a74ff6452e9098af89a9b56607381f677880641e/deptry-0.25.1-cp310-abi3-win_arm64.whl", hash = "sha256:6efffd8116fb9d2c45a251382ce4ce1c38dbb17179f581ec9231ed5390f7fc12", size = 1647020, upload-time = "2026-03-18T23:22:23.311Z" }, + { url = "https://files.pythonhosted.org/packages/46/e7/b554568a84197c0a4177b51c9880b55e9861de08d9acfd914a08148a1faa/deptry-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:30d64d4df1c08bc69de56cb0b4ec1f4cd9fa2e42582347d5b1eb25fd0e401745", size = 1846779, upload-time = "2026-03-18T23:22:21.887Z" }, + { url = "https://files.pythonhosted.org/packages/d9/63/38cf5ab4b81fcb1c58909ab0fe1ccc62b36f61c5f7d213a7d0474f620925/deptry-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:87bcd90f99a98bb059c7580bc315c3f87d97fe2db725530030bc974176834735", size = 1758420, upload-time = "2026-03-18T23:22:14.315Z" }, + { url = "https://files.pythonhosted.org/packages/a8/fb/234c333d5dfcc810bb3ca5b3b420355bdd759901c75e41f0441a9871a1cd/deptry-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f31eb5c520651b102568dd91f738222b250a3e44c9e95d4941322109b8d40a", size = 1870345, upload-time = "2026-03-18T23:22:29.734Z" }, + { url = "https://files.pythonhosted.org/packages/59/62/cb63e5210d1ba36cf68cdc0e4fdea73e48f80ac3b7680228816f39ff696a/deptry-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df88952a2bab7517ef23cb304b979199b28449e5d9db2e9ba9bc27a286ac852b", size = 1922759, upload-time = "2026-03-18T23:22:17.121Z" }, + { url = "https://files.pythonhosted.org/packages/a3/8c/e079c44ed98464930e83ca54ea5d40fec522d234e8428e06a1be7f6c7a9a/deptry-0.25.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e6f7b8fa72932e51e86799b10dcd29381b2132dc799c790dca3b28ab08dffb28", size = 2049576, upload-time = "2026-03-18T23:22:12.797Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f2/6a89ad9e5e8e9d37def57a28020d6d7fbcf900b2e5f4dfbbace349cdca91/deptry-0.25.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e3fa3321078e11cd1ac3f10ce3ff0547731c53f9253b87c757a8749c76fe8fa9", size = 2144676, upload-time = "2026-03-18T23:22:26.319Z" }, + { url = "https://files.pythonhosted.org/packages/04/9a/b3358690a1a47381d995c3d3587798ab2cd086baf4b839e35183599aa2e1/deptry-0.25.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:03c032c32492fde434736954fbcaff09c02bf207b0f793b77e9040300e34b344", size = 1715518, upload-time = "2026-03-18T23:22:20.486Z" }, +] + [[package]] name = "dufomap" version = "1.1.1" @@ -316,7 +346,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -408,6 +438,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f6/10/d45b74135d5d642cb3a4fb0a957c1613ef93de4c8548671dfc3a5bf38299/fonttools-4.66.1-py3-none-any.whl", hash = "sha256:7234ae9e28db64273fbbfa72caebd0a97e3bdba6b05064114741b9539ef339d0", size = 1202222, upload-time = "2026-09-29T16:11:51.678Z" }, ] +[[package]] +name = "grimp" +version = "3.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/2e/95736b7c984705ff5ee376f07c6e71bb80fcbb22c8fa3b8c1cfbfa919d5c/grimp-3.17.tar.gz", hash = "sha256:5161e03c6f518fe4da43b06c97ff49a1e224ecb0e4b9fd6ef48235373d1b7b33", size = 832923, upload-time = "2026-09-04T11:28:54.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/73/2ba5e50f353d4c4863fe062e3afcbc03aee7506138833956399ba09784ce/grimp-3.17-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4faf10d69056deef996b385084309c757317c3631661b02327a8e8be804b249a", size = 2142675, upload-time = "2026-09-04T11:28:08.45Z" }, + { url = "https://files.pythonhosted.org/packages/53/e2/0edc3f8de68fdcd42ee2a8e497714522cbd4f25ed231f96025b99795ea13/grimp-3.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2749e56d737efcfab87fbdddfbdf221205c35283eb4e0d039910265953ce426", size = 2102808, upload-time = "2026-09-04T11:28:00.115Z" }, + { url = "https://files.pythonhosted.org/packages/3d/75/a83d98b234f433e457a6071bc391ba5b5ca06440a4fe62355e978cb1a0c2/grimp-3.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81e68a2c4894cde7aa71648c3af122c7f1666d9adcfd385ecd3a59a43bbf911b", size = 2284513, upload-time = "2026-09-04T11:26:57.611Z" }, + { url = "https://files.pythonhosted.org/packages/44/ba/e5a2e403a59c28c9e3fd30fc43182eec526e5cc6ded2b496689e70f21d0b/grimp-3.17-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f94828d17f9d6934d389149e927a1ed64d9eca1f40124ee4a7245c9d03462eb6", size = 2222995, upload-time = "2026-09-04T11:27:07.52Z" }, + { url = "https://files.pythonhosted.org/packages/ac/10/792162e80389189fb1ea96ac6ce7673cd79194ed09ad10842b1c8251e2de/grimp-3.17-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef09db99d6ac05bb31e45218ae3e5c9113a178ea0a9de4cfa669b6e5006dda9e", size = 2375185, upload-time = "2026-09-04T11:27:35.539Z" }, + { url = "https://files.pythonhosted.org/packages/3c/3c/e5dd9efdea973ac49463d502b21473c67df1d42b4ee9ed7be0497f610ca6/grimp-3.17-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:259945c06c984abc8cc8587c8ff3850c38714d7a75066fd04590fae96abef4a0", size = 2633969, upload-time = "2026-09-04T11:27:16.454Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c1/925c44b81c5ccbf550e738999d44778d5519ac0520f0eca4dd9fe17d59e6/grimp-3.17-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e9d43748cd384cd79229cebb845ce74898f0914984f5506d09ad0baa914398d", size = 2351178, upload-time = "2026-09-04T11:27:26.161Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/f563f878a0c22dfa46d014cccf7905e2780ab1c2f1b001820d897faf7ffa/grimp-3.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d086ca2b30481e4b7d6fcc34812c71e9f3215bf8a865034883f125c9542647a8", size = 2288827, upload-time = "2026-09-04T11:27:47.801Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c9/fb5831679671c84c75be4ff1c91770a8c6b13296f89ef63d437ad3b90ff2/grimp-3.17-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:15d58ae5f27d3fd150dc9d26808c9a5201e3728d144ea219b240dac031f125de", size = 2460503, upload-time = "2026-09-04T11:28:15.789Z" }, + { url = "https://files.pythonhosted.org/packages/19/cf/bf9e7ac00842a68ec3635cb044de9cbd5ac065915cbe1015bfef56201fef/grimp-3.17-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:40aa7538f252f99392ba7b3349f73d3567a2688b419026c1a042b61b4b57705a", size = 2497928, upload-time = "2026-09-04T11:28:25.496Z" }, + { url = "https://files.pythonhosted.org/packages/18/e0/e3f5c504903a05e92e97a6da1864359cb5a2af6ade0afe4ce5ef30f3c757/grimp-3.17-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0373c957aad7bc9e930ce0cd8a13782f4d6e502b641a4f2935ea1de10c210ff5", size = 2530787, upload-time = "2026-09-04T11:28:34.811Z" }, + { url = "https://files.pythonhosted.org/packages/e1/12/68854b5ec1648d95c07c0600597fe9ce1a95ec3cb99a10643c9a83b19a19/grimp-3.17-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aebfc37b02e3751cb97c83524482bc104978ecce352cbd2d3463cd22b880e055", size = 2544344, upload-time = "2026-09-04T11:28:44.729Z" }, + { url = "https://files.pythonhosted.org/packages/ca/89/b0888d02136ab66395495e083be1336e37735dfe76fc0cb2345f80041131/grimp-3.17-cp310-cp310-win32.whl", hash = "sha256:0e22893e2876f5606d6f418b32ee3336ec49dfb90fc3ab2219d9a8dd79334758", size = 1874923, upload-time = "2026-09-04T11:29:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b2/eca1270dbddb5add091660047b5b4402d55318dd5bdc0cb0d4673bbe1c16/grimp-3.17-cp310-cp310-win_amd64.whl", hash = "sha256:1337b0f4fba282bae2299aff9cc74917b39d67791394250c4c34ec3f7fcecd61", size = 2003454, upload-time = "2026-09-04T11:29:05.777Z" }, + { url = "https://files.pythonhosted.org/packages/75/7f/99365747c992a97e775829e859bde28993a1771fa932a5b160e3e629769e/grimp-3.17-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:aa1b4d439d18372390a61926a3c33d5de2f5dff7ac7a71b8b5a665644ce81bc6", size = 2143022, upload-time = "2026-09-04T11:28:09.761Z" }, + { url = "https://files.pythonhosted.org/packages/39/38/84eb297e570f0eceb916f3d11fc399de78309e837f4a1c5fcff36af5e800/grimp-3.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe6c3c9f111e900a43a3657d3b1d35b920af6ff943bc417bca4ebcd6140e1e50", size = 2101124, upload-time = "2026-09-04T11:28:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3c/abc9de477962e071480cd7f2fa4fbd171e1f3f2d2ebf7aeb704138b28f94/grimp-3.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5834e34cbf5ef52877dd6f6a3bcda137d0f07d44c65084d63913931b21951b2f", size = 2283264, upload-time = "2026-09-04T11:26:59.045Z" }, + { url = "https://files.pythonhosted.org/packages/12/2c/07f824f3d3776265831d555b458380fa32214b3ff1534a11b2d22b292c78/grimp-3.17-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d97de5133ae1588230d9c9c9724526e48e62be79caf32a85b8ce970db8ce46de", size = 2223945, upload-time = "2026-09-04T11:27:08.711Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c0/bcb08d1a5446a5618f129f0789fc2ea38d643974db1094d7eb68adb09508/grimp-3.17-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3cbb0a6c5e8bf38ecd2e6d051e9d0992f3cf4c65bb01d3ccf525f48586f456b", size = 2375571, upload-time = "2026-09-04T11:27:37.307Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f7/0a81e9cac29af4c88e73d7bf4d250bd01b04894b0bffa70ad5026846eaf3/grimp-3.17-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c423bcd7fd139553d184f194486e1a718e816b5898ff688c436456151eb70c61", size = 2633241, upload-time = "2026-09-04T11:27:17.639Z" }, + { url = "https://files.pythonhosted.org/packages/05/71/c2d80fab1af8bf92ce86b18d30b9a7f1d2315e72e4205774590fb8d7ac55/grimp-3.17-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ffb9e69af7bd09cab96786bc3f21716dced76d9daf6d553ef6eb4437b4cd7b", size = 2352338, upload-time = "2026-09-04T11:27:27.439Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a2/0e5aa9fc7b3d18620b36b68c2645b9cb12364e316bc827452e2447c90709/grimp-3.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c615cd6f08965831adb5383c9214054003eb2b5ee2f4c466c388a9b87835cb0e", size = 2288519, upload-time = "2026-09-04T11:27:49.095Z" }, + { url = "https://files.pythonhosted.org/packages/5e/3b/d874409b8deacc419e847bff13e1706e7b45772cc2ad80fdf44d79f0d337/grimp-3.17-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f6cc4ba9510691dd56111894da83bca78e407037f8149f808012dd67f0b5272d", size = 2460716, upload-time = "2026-09-04T11:28:17.05Z" }, + { url = "https://files.pythonhosted.org/packages/c1/08/667c2af86cdb8ed210e42ec4dfb4d0c3dd0f9e08818dfba6435742a14f60/grimp-3.17-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd72e76528837b634057689179aac014e3995f41d142c2e9eff8bf46f82c96e5", size = 2499499, upload-time = "2026-09-04T11:28:26.764Z" }, + { url = "https://files.pythonhosted.org/packages/6a/81/5d93258181d6333ab01014884a2beca1ac39c25ddea3492b12364041eca8/grimp-3.17-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:58ce75a40a0817bf5725f7a67cb5cc38f76f23a028e624b1125959d06db76a36", size = 2533771, upload-time = "2026-09-04T11:28:36.204Z" }, + { url = "https://files.pythonhosted.org/packages/21/52/d82b1c772509c80e1f0988694e30fb4fc4888c983273c2249a82effc15b0/grimp-3.17-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5e4dc31f50d695091fef8013e562470cd759123bd06fad2ebb91251850ba97a4", size = 2543062, upload-time = "2026-09-04T11:28:46.493Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f6/fec538a49b3297c0aba0386971e478522ec4b2f8fc25d6575f9579e57a36/grimp-3.17-cp311-cp311-win32.whl", hash = "sha256:802ea10b9d9e7b422c83f1277286be4225402bb4d2ab31b17ab43f3e850639d4", size = 1875122, upload-time = "2026-09-04T11:29:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/27/a4/b1a2a1d7c53e6f0976bc33e3225b82e8d45ad32ec528ac3e251d94172bc4/grimp-3.17-cp311-cp311-win_amd64.whl", hash = "sha256:11533e4afad7a516a4c2a6b8b3b24383fba9901c8fa0072b33450603eedc0649", size = 2002060, upload-time = "2026-09-04T11:29:07.629Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a5/3fb3e39ba1a34231bcdf27922121f864307f6b9a2f8145f17e285749d092/grimp-3.17-cp311-cp311-win_arm64.whl", hash = "sha256:488c0a70118c3600dd344455f280ab8d8894583f76e4091de770b019d9e30cde", size = 1926777, upload-time = "2026-09-04T11:28:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/22/e89d58bc1c96ec118e371abca8c07d4c6ad53b263e9f00e552b93aa34797/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645f17b80f61e33969d5e8ab30c1fb1247b44d6372c64fc6b50703f438f18186", size = 2287565, upload-time = "2026-09-04T11:27:05.979Z" }, + { url = "https://files.pythonhosted.org/packages/9c/13/e1679bdcb44a2ae72300fb7358d2a9fe84de5b96d8d5ef4a605287f73613/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:047955683b4113ce265b00fa4704f92b93e248390768bb45f5968aaafff0c5be", size = 2225542, upload-time = "2026-09-04T11:27:15.167Z" }, + { url = "https://files.pythonhosted.org/packages/99/9d/b53c545f8bb34988d26a1f690ad18228d58fa0dfad29c0353193bf99fab6/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e88c83f3772681e3aff138fd7865b551d436d25e30d85fbed05f92cf05fefd", size = 2380060, upload-time = "2026-09-04T11:27:46.477Z" }, + { url = "https://files.pythonhosted.org/packages/73/90/2d291b17529adb5fb3fc579dfeb0c7ec5e662e6a9d5eb77d3ea12300daf0/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8129c210bdc73547ec78d11b1dfa48bd74e9da62157b0458c0ed5fe698d6c403", size = 2631413, upload-time = "2026-09-04T11:27:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/23/0d/a069e17c524d04f9a01d97ad8f2bacd3947af300e5d968dc6854278424b1/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:935beb0f0b920d3629b9da4fcc457f70e76a9fd159eefd7d2c57ab99e712d80e", size = 2351953, upload-time = "2026-09-04T11:27:34.314Z" }, + { url = "https://files.pythonhosted.org/packages/fe/af/8ff5b3ffeb062a5337a8e124a0909cb2866e6448858ffa14bef8cfb8e27d/grimp-3.17-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:788d5ecf1ab806e18b788952cb205e135e4da4ae00882f552dada144bc6f9b68", size = 2291463, upload-time = "2026-09-04T11:27:58.839Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b1/64de4ca73e8c9bd8eed7f6019f18e96f4f8e02417bdb1f9208a3b55662bb/grimp-3.17-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ff7dcc4746fd8f8b8e8104db19cd15665c61c6bd56dc492e632ac336b07efd77", size = 2463481, upload-time = "2026-09-04T11:28:23.798Z" }, + { url = "https://files.pythonhosted.org/packages/79/7a/dd2c5ef860cecfbcee7cc6eb00c1a2185a8ce12227aa4015b189d7ee1796/grimp-3.17-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:8575b7a82983f138fd06ebcafce89797fce36f69b6381f79b05714b8b9fcf2fe", size = 2500644, upload-time = "2026-09-04T11:28:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f7/9f3c7f2bef0fdde9a4a3627cf2c9c79e0f6fc3f637d694b384e3fd0237ff/grimp-3.17-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:a88e38dc9e5410a951fd97595816396e3e6f05d2c2a43665a777a9558ba5dde5", size = 2537284, upload-time = "2026-09-04T11:28:43.262Z" }, + { url = "https://files.pythonhosted.org/packages/16/d6/acf7dc5d08ecb24700071c6e807b396603148b98f111df412ea1502606c4/grimp-3.17-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1334e8ba5d1b57dec70e8990ba4c8c829fc7e999ac4345da45348488dc84b814", size = 2545938, upload-time = "2026-09-04T11:28:53.196Z" }, +] + [[package]] name = "idna" version = "3.20" @@ -417,6 +494,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" }, ] +[[package]] +name = "import-linter" +version = "2.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "grimp" }, + { name = "rich" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/81/1bb414f8c8bcd024499e91f112d317c36a86bc264da1fd43f9797fc2b7b0/import_linter-2.15.tar.gz", hash = "sha256:1da912bea5e172a82a3ce617b5543f75cf64dc0d8f4d9b46c5578b68ccb81590", size = 1405973, upload-time = "2026-09-04T14:47:56.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/31/4571c20652a4002ed9e500046386f3731a77e23d95a608ae8a87f1fbb2da/import_linter-2.15-py3-none-any.whl", hash = "sha256:9aaf16a88ac1e99d5a464cd7f66b6a05f7060bfa761162e0ed441773a267ed3b", size = 640512, upload-time = "2026-09-04T14:47:54.878Z" }, +] + [[package]] name = "importlib-metadata" version = "9.0.1" @@ -567,6 +660,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d3/52/5aef56f21a460a6e43ab3cdfc7697d59d7b87deb0ec97a0f7b91aa4a521b/kiwisolver-1.5.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f", size = 98465, upload-time = "2026-08-28T10:28:25.696Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + [[package]] name = "markupsafe" version = "3.0.4" @@ -638,6 +743,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7", size = 7829377, upload-time = "2024-08-13T01:44:44.843Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "narwhals" version = "2.26.0" @@ -924,6 +1038,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/1d/068464f23075f66a8f1b806935e9cd9363ee446636ea70d2c22ee8659dbf/pydantic_core-2.46.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d0a24b40877af2de4950252be9d21eaf7fb07660f3c2cae1f56c6b599ada5266", size = 2140686, upload-time = "2026-08-28T10:01:28.947Z" }, ] +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + [[package]] name = "pyparsing" version = "3.3.3" @@ -1039,6 +1162,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] +[[package]] +name = "requirements-parser" +version = "0.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/1a/5f3c22d38bf1d87d1f4a961489d9eba35c4370a21395562d94410cdd0e73/requirements_parser-0.13.1.tar.gz", hash = "sha256:78811383b2089b6c5197a1431bc2c12ff950245edca39a23eea3460782038dd3", size = 22783, upload-time = "2026-06-18T07:52:25.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/f9/15b44d5e4401b0013bbcefe3c09d7bfddcce28cc3d41b1d3077bcedf5b1f/requirements_parser-0.13.1-py3-none-any.whl", hash = "sha256:6e385663eb32589d16e5b22bb6e5251a57908e73803ffff438b53cd6ea2056e0", size = 14926, upload-time = "2026-06-18T07:52:24.171Z" }, +] + [[package]] name = "retrying" version = "1.4.2" @@ -1048,6 +1183,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/f3/6cd296376653270ac1b423bb30bd70942d9916b6978c6f40472d6ac038e7/retrying-1.4.2-py3-none-any.whl", hash = "sha256:bbc004aeb542a74f3569aeddf42a2516efefcdaff90df0eb38fbfbf19f179f59", size = 10859, upload-time = "2025-08-03T03:35:23.829Z" }, ] +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + [[package]] name = "rpds-py" version = "0.30.0" @@ -1270,10 +1418,16 @@ source = { editable = "." } dependencies = [ { name = "matplotlib" }, { name = "numpy" }, + { name = "pillow" }, { name = "scipy" }, ] [package.optional-dependencies] +audit = [ + { name = "deptry" }, + { name = "import-linter" }, + { name = "vulture" }, +] dev = [ { name = "pytest" }, { name = "ruff" }, @@ -1288,18 +1442,22 @@ methods = [ [package.metadata] requires-dist = [ + { name = "deptry", marker = "extra == 'audit'", specifier = "==0.25.1" }, { name = "dufomap", marker = "extra == 'methods'", specifier = "==1.1.1" }, { name = "dztimer", marker = "extra == 'methods'", specifier = "==1.1.1" }, { name = "fire", marker = "extra == 'methods'", specifier = "==0.7.0" }, + { name = "import-linter", marker = "extra == 'audit'", specifier = "==2.15" }, { name = "matplotlib", specifier = "==3.9.2" }, { name = "numpy", specifier = "==1.26.4" }, { name = "open3d", marker = "extra == 'methods'", specifier = "==0.18.0" }, + { name = "pillow", specifier = "==12.3.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = "==8.3.3" }, { name = "ruff", marker = "extra == 'dev'", specifier = "==0.7.3" }, { name = "scipy", specifier = "==1.14.1" }, { name = "tqdm", marker = "extra == 'methods'", specifier = "==4.66.5" }, + { name = "vulture", marker = "extra == 'audit'", specifier = "==2.16" }, ] -provides-extras = ["methods", "dev"] +provides-extras = ["methods", "dev", "audit"] [[package]] name = "termcolor" @@ -1397,6 +1555,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" }, ] +[[package]] +name = "vulture" +version = "2.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/3e/4d08c5903b2c0c70cad583c170cc4a663fc6a61e2ad00b711fcda61358cd/vulture-2.16.tar.gz", hash = "sha256:f8d9f6e2af03011664a3c6c240c9765b3f392917d3135fddca6d6a68d359f717", size = 52680, upload-time = "2026-03-25T14:41:27.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/be/f935130312330614811dae2ea9df3f395f6d63889eb6c2e68c14507152ee/vulture-2.16-py3-none-any.whl", hash = "sha256:6e0f1c312cef1c87856957e5c2ca9608834a7c794c2180477f30bf0e4cc58eee", size = 26993, upload-time = "2026-03-25T14:41:26.21Z" }, +] + [[package]] name = "werkzeug" version = "3.1.9"