Files
Mini-Nav/docs/experiments.md
SikongJueluo d6e1b9d8ba refactor(cam): rename read-noise path to read-pass-through and reorganize test module structure
- Rename `read_noise` scenarios and noise_mode to `read_pass_through` across
  run_cam_correctness.py, test_run_cam_correctness.py, and Makefiles
- Update RTL comment in match_engine_pipeline.sv to reflect pass-through behavior
- Move unit-level cocotb tests from `tests.test_*` flat namespace to
  `tests.modules.*` and `tests.top.*` subdirectory layout, matching actual
  Makefile paths (hw/sim/tests/modules/..., hw/sim/tests/top/...)
- Remove redundant dual-noise subtarget from read_noise/Makefile
- Update help text and docs to reflect read-path pass-through semantics
- Add .codegraph to .gitignore
2026-05-27 16:34:34 +08:00

15 KiB
Raw Permalink Blame History

Mini-Nav 实验可行性调研报告

本文档调研当前 Mini-Nav 项目对论文/报告第 6.26.8 节实验的支持程度,判断哪些实验可以直接开展,哪些实验只能部分开展,以及还需要补齐哪些代码、脚本或评估流程。

调研范围:当前仓库中的 Python 代码、CAM RTL、Cocotb 仿真、benchmark 框架、Scene Graph 原型、Habitat simulator 辅助代码与现有配置。

总体结论

实验章节 当前状态 结论
6.2 CAM 硬件功能正确性验证 较完整 可以做
6.3 CAM 硬件性能基准测试 有参数化仿真基础 部分可做,性能/资源脚本缺失
6.4 Hash Compressor 检索性能实验 有模型和训练代码 部分可做,缺系统化评估脚本
6.5 对象级 Top-K 检索实验 有雏形 部分可做,但集成问题较多
6.6 Scene Graph 构建与路径推理实验 很弱 大多还不能做
6.7 CAM 加速后的整体框架实验 缺软件-硬件桥接与端到端闭环 只能做局部模拟
6.8 消融实验与误差分析 依赖前面模块 只能做少量离线消融

简短判断:6.2 最成熟6.3、6.4 可较快补齐6.5 有雏形但需要修集成6.6、6.7、6.8 中涉及 Scene Graph 和端到端导航的部分目前还不具备完整实验条件。

项目中已有的关键能力

CAM 硬件与仿真

相关路径:

  • hw/rtl/cam_top.sv
  • hw/rtl/cam_noisy.sv
  • hw/rtl/core/cam_core_banked.sv
  • hw/rtl/core/match_engine_pipeline.sv
  • hw/rtl/core/popcount_pipeline.sv
  • hw/rtl/noise/cam_write_noise.sv
  • hw/rtl/noise/cam_read_noise.sv
  • hw/rtl/noise/noise_mask_bernoulli.svPhase 2 后 read noise 改为 pass-through该模块仅用于 write noise mask 生成)
  • hw/rtl/cam_params.svh
  • hw/sim/model/ref_model.py
  • hw/sim/sweep_noise.py
  • hw/sim/tests/*.py
  • hw/sim/Makefile
  • .justfile

已有能力:

  • CAM 顶层模块支持写入、查询、匹配输出。
  • 参数支持 NUM_ROWSHASH_BITSLANES
  • 有写噪声和读噪声模块。
  • 有 Python 参考模型用于验证噪声和匹配行为。
  • 有 Cocotb/Verilator 测试命令:
    • just cam-test-py
    • just cam-test-all
    • just cam-test-module MODULE=...

Hash Compressor 与检索

相关路径:

  • mini-nav/compressors/hash_compressor.py
  • mini-nav/compressors/common.py
  • mini-nav/compressors/train.py
  • mini-nav/compressors/pipeline.py
  • mini-nav/commands/benchmark.py
  • mini-nav/benchmarks/tasks/retrieval.py

已有能力:

  • HashCompressor 支持 DINO token 到二值 hash bits 的映射。
  • 默认目标是 512-bit CAM-compatible hash code。
  • HashLoss 包含 contrastive、distillation、quantization 三类损失。
  • train.py 可以在 CIFAR-10 上训练 HashCompressor。
  • common.py 有 Hamming distance / similarity 工具。

对象级检索雏形

相关路径:

  • mini-nav/benchmarks/tasks/multi_object_retrieval.py
  • mini-nav/data_loading/insdet_scenes.py
  • mini-nav/data_loading/loader.py
  • mini-nav/compressors/pipeline.py

已有能力:

  • 有多对象检索 benchmark task 雏形。
  • 有 object-level vector 建库、query、scene-level aggregation 的基本逻辑。
  • HashPipeline 支持 OWLv2 文本检测、SAM 分割、DINO 特征、Hash 压缩的流水线设计。

主要问题:

  • multi_object_retrieval.py 引入 utils.sam,但源码中没有 mini-nav/utils/sam.py,只有历史 __pycache__
  • 普通 benchmark 使用字段 img,多对象检索使用字段 image,存在数据接口不一致。
  • 当前多对象检索主要走 LanceDB 连续向量检索,不是真正的 CAM/hash 检索。

Scene Graph 与 Habitat 辅助代码

相关路径:

  • mini-nav/scenegraph/objectnode.py
  • mini-nav/scenegraph/roomnode.py
  • mini-nav/scenegraph/scenegraph.py
  • mini-nav/simulator/habitat.py
  • mini-nav/simulator/views.py
  • mini-nav/simulator/topdown.py

已有能力:

  • ObjectNode 数据结构中已有 visual_hashsemantic_hash 字段。
  • SimpleSceneGraph 目前仅保存 roomsobjects 两个字典。
  • Habitat 侧有 simulator 创建、随机 navigable point 采图、topdown map 可视化辅助函数。

主要问题:

  • 没有 Scene Graph 构建器。
  • 没有 room-waypoint-object 拓扑关系。
  • 没有检索结果到导航目标点的转换。
  • 没有 episode、policy、SPL/success 等导航评估指标。

6.2 CAM 硬件功能正确性验证

结论:可以做。

小节 状态 说明
6.2.1 写入与读取功能验证 可以做 cam_core_bankedcam_top 有 Cocotb 测试
6.2.2 汉明距离计算验证 可以做 match_engine_pipeline 和 ref model 覆盖 bit match / popcount
6.2.3 Top-K 输出正确性验证 部分可做 当前硬件更接近 Top-1 输出,不是完整 Top-K 列表
6.2.4 噪声注入功能验证 可以做 写噪声、读噪声、组合噪声都有测试和参考模型

已具备内容

  • 写入/读取:hw/rtl/core/cam_core_banked.svhw/sim/tests/test_cam_core_banked.py
  • 匹配与 popcounthw/rtl/core/match_engine_pipeline.svhw/rtl/core/popcount_pipeline.sv
  • 噪声模块:hw/rtl/noise/cam_write_noise.svhw/rtl/noise/cam_read_noise.svPhase 2 后 read noise 改为 pass-through实际翻转仅由 write noise 模块产生)
  • 参考模型:hw/sim/model/ref_model.py
  • 集成测试:hw/sim/tests/test_cam_basic.py

还需补齐

  1. 如果论文中写的是严格的 Top-K 硬件输出,当前 RTL 需要补 Top-K 选择/排序模块,或者明确实验是 Top-1 / Top-K 由软件侧重排实现。
  2. 需要统一整理仿真日志、表格和截图,形成可放入论文的实验结果。
  3. 建议补一个 scripts/run_cam_correctness.py 或类似脚本,一键跑 6.2 所需配置。

6.3 CAM 硬件性能基准测试

结论:部分可做。

小节 状态 说明
6.3.1 不同行数 NUM_ROWS 下的延迟 部分可做 Makefile 支持参数化,但缺自动 latency 统计
6.3.2 不同 HASH_BITS 下的资源占用 暂不能充分做 缺 Yosys/Vivado/Quartus 综合脚本
6.3.3 不同 LANES 下的吞吐率 部分可做 RTL 参数支持,但缺吞吐率测量脚本
6.3.4 与软件检索方法的性能对比 还不能完整做 缺统一的硬件/软件 benchmark 脚本

已具备内容

  • hw/sim/Makefile 支持:
    • NUM_ROWS
    • HASH_BITS
    • LANES
    • WRITE_NOISE_*
    • 读取路径 pass-through 验证(读阶段不再注入噪声)
  • .justfile 已封装远程 Verilator/Cocotb 执行命令。

还需补齐

  1. CAM 性能 sweep 脚本:
    • 输入:NUM_ROWSHASH_BITSLANES
    • 输出latency cycles、throughput、仿真耗时
  2. Cocotb latency 统计:
    • 记录 query_validresult_valid 的周期数。
  3. 综合/资源统计流程:
    • Yosys 或 Vivado TCL。
    • 输出 LUT、FF、BRAM、频率估计。
  4. 软件 baseline
    • Python/NumPy Hamming scan。
    • PyTorch vectorized Hamming。
    • LanceDB/DINO continuous vector retrieval。

6.4 Hash Compressor 检索性能实验

结论:部分可做。

小节 状态 说明
6.4.1 原始 DINOv2 特征与二值哈希特征对比 可补后做 DINO 和 Hash 都有,但缺统一评估脚本
6.4.2 不同哈希长度消融实验 可补后做 HashCompressor(hash_bits=...) 支持,但训练脚本固定 512
6.4.3 不同压缩方法对比实验 暂不能做 目前只有一种 MLP HashCompressor无 PCA/随机投影/ITQ/LSH baseline
6.4.4 相似度保持能力分析 可补后做 有 DINO embedding 和 hash similarity缺相关性分析脚本

已具备内容

  • HashCompressor.encode() 可以生成 binary bits。
  • HashCompressor.compute_similarity() 可以计算 Hamming similarity。
  • HashLoss 支持相似度蒸馏,有利于做 similarity preservation 分析。
  • train.py 可训练基础 512-bit compressor。

还需补齐

建议新增 scripts/eval_hash_retrieval.py,支持:

  • DINO baseline vs Hash baseline。
  • hash_bits = 64 / 128 / 256 / 512
  • Recall@K、mAP、query latency。
  • DINO cosine similarity 与 Hash Hamming similarity 的 Spearman/Pearson 相关性。
  • storage compression ratio。

如果要做 6.4.3,需要新增压缩 baseline

  • random projection + sign。
  • PCA + sign。
  • LSH。
  • ITQ 或简化二值量化方法。

6.5 对象级 Top-K 检索实验

结论:部分可做,但当前不能顺畅跑完整实验。

小节 状态 说明
6.5.1 图像查询实验 部分可做 有 object retrieval 框架,但需修 utils.sam 和字段兼容
6.5.2 文本类别查询实验 部分可做 HashPipeline 支持 OWLv2 text labels但 benchmark 未集成
6.5.3 多视角对象特征融合实验 暂不能做 没有 object tracking / multi-view merge / feature aggregation
6.5.4 类别过滤与重排序实验 只有基础 有 mask filtering类别级过滤和重排序逻辑还需补

已具备内容

  • multi_object_retrieval.py 有对象级检索任务结构。
  • data_loading/loader.py 能加载带 bbox/category 的 InsDet scene 数据。
  • HashPipeline 支持文本标签驱动的 OWLv2 检测。

主要问题

  1. utils.sam 缺失。
  2. img / image 字段不一致。
  3. 数据库 schema 与 object-level retrieval 的 schema 需要和 runner 对齐。
  4. 当前 object retrieval 不是 hash/CAM 检索。
  5. 缺类别过滤、重排序、多视角融合的正式评估接口。

还需补齐

  1. mini-nav/utils/sam.py,或改为复用 compressors/model_loader.pycompressors/proposal
  2. 统一 benchmark dataset item 字段。
  3. 给 object retrieval 增加三种模式:
    • DINO continuous vector。
    • Hash/Hamming。
    • CAM/ref_model Hamming。
  4. 增加 category filter 与 rerank 开关。
  5. 多视角融合需要新增 object association 和 feature aggregation。

6.6 Scene Graph 构建与路径推理实验

结论:大部分还不能做。

小节 状态 说明
6.6.1 ObjectNode 构建质量验证 只能做静态/伪数据 有数据结构,无自动构建流程
6.6.2 房间层与 waypoint 层关系验证 不能做 没有 waypoint node / room-waypoint graph
6.6.3 检索结果到导航目标点转换实验 不能做 没有 object → navigable point / goal pose 映射
6.6.4 基于 Scene Graph 的路径生成实验 不能做 没有 graph search / Habitat path planner 封装

已具备内容

  • ObjectNode 能存储 object id、room id、position、visual hash、semantic hash。
  • RoomNodeSimpleSceneGraph 是极简数据结构。
  • Habitat simulator helper 可以采集场景图像和 topdown map。

还需补齐

  1. SceneGraph builder
    • 输入多视角图像、检测结果、相机位姿。
    • 输出 ObjectNode、RoomNode、WaypointNode。
  2. 多视角 object association
    • 判断不同视角中同一物体。
    • 合并位置和 hash 特征。
  3. Waypoint graph
    • 房间节点、waypoint 节点、object 节点关系。
  4. Path planning
    • 检索结果转 target pose。
    • target pose 转 Habitat shortest path 或自定义 graph path。

6.7 CAM 加速后的整体框架实验

结论:端到端还不能做;局部对比可以做。

小节 状态 说明
6.7.1 无 CAM 与加入 CAM 的检索延迟对比 可补脚本后做局部实验 可用 Python CAM ref model 模拟,但无硬件级整体接入
6.7.2 无 Scene Graph 与加入 Scene Graph 的目标选择对比 不能做 Scene Graph 目标选择逻辑不足
6.7.3 Top-K 候选切换与失败恢复实验 不能做 没有导航策略/失败恢复机制
6.7.4 端到端离线闭环实验 不能做 缺 query → retrieve → goal → plan → evaluate 闭环

可以先做的局部实验

  • DINO/LanceDB 检索延迟 vs Hash/Hamming 检索延迟。
  • Python CAM ref model 检索延迟 vs PyTorch Hamming scan。
  • 噪声 CAM 对 Top-1 / Top-K 稳定性的影响。

还需补齐

  1. Hash output 到 CAM/ref_model 的桥接脚本。
  2. CAM 检索 API给定 query hash 和 database hash返回 Top-K candidate。
  3. 整体 pipeline
    • image/text query
    • object retrieval
    • scene graph rerank
    • target waypoint selection
    • path planning
    • offline evaluation

6.8 消融实验与误差分析

结论:只能做部分离线消融。

小节 状态 说明
6.8.1 去除类别过滤 可补后做 类别过滤还没有完整 pipeline
6.8.2 去除多视角融合 不能做 多视角融合本身未实现
6.8.3 去除 Scene Graph 重排序 不能做 Scene Graph rerank 未实现
6.8.4 CAM 噪声对最终结果的影响 可做局部 可测对检索结果影响,不能测完整导航最终结果
6.8.5 失败案例分析 可做检索失败分析 导航失败案例暂不可做

可先做的误差分析

  • Hash 检索失败案例query 与 top candidates 可视化。
  • CAM 噪声导致 Top-1 改变的案例。
  • DINO 与 Hash 排序不一致的案例。
  • SAM/OWLv2 分割或检测失败案例。

暂不能做的误差分析

  • 多视角融合失败原因。
  • Scene Graph 重排序失败原因。
  • 端到端导航失败恢复分析。

推荐实施顺序

阶段 1快速产出可用实验结果

优先完成:

  1. 6.2 CAM correctness。
  2. 6.3 CAM 仿真性能 sweep。
  3. 6.4 DINO vs Hash 检索性能对比。

建议新增脚本:

  • scripts/run_cam_correctness.py
  • scripts/sweep_cam_perf.py
  • scripts/eval_hash_retrieval.py

阶段 2解锁对象级实验

优先修复:

  1. mini-nav/utils/sam.py 缺失问题。
  2. benchmark dataset 字段不一致问题。
  3. object-level schema 与 runner 对齐问题。
  4. object retrieval 的 hash/CAM 模式。

然后开展:

  • 6.5.1 图像查询实验。
  • 6.5.2 文本类别查询实验。
  • 6.5.4 类别过滤与重排序实验。

阶段 3实现 Scene Graph 与端到端闭环

需要新增核心模块:

  1. SceneGraph builder。
  2. Waypoint graph。
  3. Object-to-goal mapping。
  4. Navigation evaluator。
  5. Candidate switching / failure recovery。

完成后才能正式开展:

  • 6.6 Scene Graph 构建与路径推理。
  • 6.7 CAM 加速后的整体框架实验。
  • 6.8 中涉及 Scene Graph、导航闭环、多视角融合的消融实验。

最小可行实验组合

如果目标是尽快形成一组完整、可信的实验章节,建议先采用以下组合:

  1. CAM 功能正确性:覆盖 6.2。
  2. CAM 参数化仿真性能:覆盖 6.3 的一部分。
  3. DINO vs Hash 检索性能:覆盖 6.4.1。
  4. Hash length ablation:覆盖 6.4.2。
  5. CAM noise 对检索稳定性的影响:覆盖 6.2.4、6.8.4 的离线部分。
  6. 对象级检索 demo:修复 utils.sam 后覆盖 6.5.1 的基础版本。

这组实验避开了目前尚未实现的 Scene Graph 端到端导航闭环,同时能充分利用当前仓库中已经完成度较高的 CAM 和 HashCompressor 模块。