Add multiple research papers in PDF format to the repository, including recent works on AI and physics, with file sizes ranging from 1.7 MB to 32.3 MB.
Sync to site1 / sync (push) Has been cancelled
Sync to site1 / sync (push) Has been cancelled
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Submodule
+1
Submodule research/multiply/MultiPLY added at 2888361d39
@@ -0,0 +1,324 @@
|
||||
# MultiPLY 技术讲解:面向 3D 世界的多感官、以物体为中心的具身大语言模型
|
||||
|
||||
> 论文全称:*MultiPLY: A Multisensory Object-Centric Embodied Large Language Model in 3D World*
|
||||
> 发表会议:CVPR 2024
|
||||
> 机构:UMass Amherst、UCLA、MIT-IBM Watson AI Lab
|
||||
> 作者:Yining Hong, Zishuo Zheng, Peihao Chen, Yian Wang, Junyan Li, Zhenfang Chen, Chuang Gan
|
||||
> arXiv:[2401.08577](https://arxiv.org/abs/2401.08577)(2024-01-16)
|
||||
> 项目主页:<https://vis-www.cs.umass.edu/multiply/>
|
||||
> 代码仓库:<https://github.com/UMass-Embodied-AGI/MultiPLY>
|
||||
|
||||
本讲解面向具身智能 / 多模态大模型方向的研究者,目标是把 MultiPLY 的动机、核心设计、数据构造、模型结构、训练范式与实验结论讲清楚,并对它在技术谱系中的位置与局限做出评估。
|
||||
|
||||
---
|
||||
|
||||
## 1. 一句话概括
|
||||
|
||||
MultiPLY 是第一批把"**主动交互式多感官感知**"塞进大语言模型的工作之一。它让一个由 LLM 驱动的具身智能体(embodied agent)在 3D 场景里**主动行动**——导航、靠近、敲击、触摸物体——并在每一步把视觉、听觉(撞击声)、触觉、温度等**多感官反馈**重新喂回 LLM,从而在"词语—动作—感知"三者之间建立关联。
|
||||
|
||||
与"被动多模态 LLM"(一次性把所有传感数据当输入塞进去)相比,MultiPLY 的关键差异是:**多感官细节只有在智能体真正去交互时才被"揭示"出来**,这使得感知是按需的、序列化的、可推理的。
|
||||
|
||||
---
|
||||
|
||||
## 2. 它想解决什么问题
|
||||
|
||||
### 2.1 被动感知的局限
|
||||
|
||||
当下绝大多数多模态 LLM(图文模型、3D-LLM 等)都是**被动吸收**传感数据:图像、点云、音频在推理开始时就被一次性编码为输入 token。这带来两个问题:
|
||||
|
||||
- **缺乏主动性**:模型无法"决定去摸一下这个杯子有多烫"或"敲一下这个箱子是不是空的"。而物体的很多属性(材质、温度、是否中空、软硬)本质上必须通过交互才能获得。
|
||||
- **信息纠缠**:把所有模态一次性融合成单一 embedding,会让细粒度区分(材质 vs 温度 vs 声音)混在一起,难以分步推理。
|
||||
|
||||
### 2.2 整体点云表示的代价
|
||||
|
||||
同组的前作 **3D-LLM**(把整体 3D 点云编码进 LLM)证明了 3D 推理的可行性,但代价是:**训练昂贵、对单个物体的推理效率低**。当任务其实只关心场景里少数几个物体时,编码整张场景的稠密点云是浪费。
|
||||
|
||||
### 2.3 数据稀缺
|
||||
|
||||
要训练一个"会交互的多感官具身 LLM",需要"动作 + 多感官观测 + 语言"三元对齐的数据。这类数据现实中几乎不存在。MultiPLY 的相当一部分贡献其实在于**用仿真 + LLM 自动化地把这套数据造出来**。
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心思想总览
|
||||
|
||||
MultiPLY 把三件事拼在一起:
|
||||
|
||||
1. **以物体为中心的抽象场景表示**(object-centric scene representation)——场景一开始只给"有哪些物体、在哪里"的抽象信息,不给细节感官数据。
|
||||
2. **动作 token(action tokens)**——让 LLM 直接"生成动作",驱动智能体去交互。
|
||||
3. **状态 token(state tokens)**——把交互后获得的多感官观测,编码后**追加回上下文**,供 LLM 生成后续文本或下一个动作。
|
||||
|
||||
这三者构成一个**闭环**:
|
||||
|
||||
```
|
||||
抽象场景表示 → LLM 生成 [动作 token] → 智能体在仿真中执行动作
|
||||
↑ │
|
||||
└──── [状态 token](多感官观测编码回填) ←──────┘
|
||||
│
|
||||
LLM 继续生成文本 / 下一个动作
|
||||
```
|
||||
|
||||
这正是它区别于"一次性塞输入"的被动模型的根本所在:**感知是行动的结果,而行动是 LLM 推理的产物。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 数据:Multisensory Universe(500k 条交互数据)
|
||||
|
||||
数据是 MultiPLY 的基石,整条生成流水线值得拆开看。
|
||||
|
||||
### 4.1 场景底座:HM3D
|
||||
|
||||
使用 **Habitat-Matterport 3D(HM3D)** 提供的真实室内 3D 场景作为环境底座,在 **Habitat-sim** 仿真器里运行。
|
||||
|
||||
**问题**:HM3D 原生场景里的物体传感信息不足、多样性有限,而且在 Habitat-sim 里**不可交互**。
|
||||
|
||||
### 4.2 注入可交互的多感官物体
|
||||
|
||||
为此作者往场景里**添加新的可交互物体**,来源有两个:
|
||||
|
||||
- **ObjectFolder**:约 1k 个物体网格,其**撞击声(impact sound)以隐式神经场(implicit neural field)形式存储**,并标注了材质信息。这是音频与材质感官的主要来源。
|
||||
- **Objaverse**:约 80 万个 3D 物体的超大物体库,从中筛选适合出现在室内场景的物体,扩充视觉多样性。
|
||||
|
||||
### 4.3 多感官信号怎么来
|
||||
|
||||
不同模态由不同仿真/编码手段生成:
|
||||
|
||||
| 模态 | 信号来源 | 触发动作 |
|
||||
|------|----------|----------|
|
||||
| 视觉 / 点云 | 物体网格渲染 + 以物体为中心的特征 | OBSERVE |
|
||||
| 音频(撞击声) | ObjectFolder 的隐式神经声场 | HIT |
|
||||
| 触觉 | **DiffTactile**(基于 MLS-MPM 仿真刚性 / 弹性 / 弹塑性物体,使用带位置标记点的 bubble gripper) | TOUCH |
|
||||
| 温度(热成像) | 物体逐个标注 / 模拟的温度数据 | TOUCH |
|
||||
|
||||
### 4.4 用 ChatGPT 批量生成任务
|
||||
|
||||
作者用 **ChatGPT** 来"出题":生成各类任务的输入与输出(指令与目标回答),覆盖多感官描述(captioning)、问答(QA)、对话(dialogue)、操作(manipulation)、任务分解(task decomposition)等。随后让一个**具身智能体在仿真环境里真正去探索、交互**,采集这些任务对应的多感官观测,形成"指令 — 动作序列 — 多感官观测 — 回答"的完整训练样本。
|
||||
|
||||
最终得到 **Multisensory Universe:约 50 万条多感官交互数据**。
|
||||
|
||||
> 这套"用 LLM 自动造指令数据 + 仿真采集观测"的思路,是 LLaVA "用 GPT-4 造图文指令数据再做 instruction tuning" 范式向**具身、多感官、3D 交互**的延伸。
|
||||
|
||||
---
|
||||
|
||||
## 5. 模型架构
|
||||
|
||||
### 5.1 以物体为中心的场景编码
|
||||
|
||||
MultiPLY **不**把整张场景编码成稠密点云,而是构建抽象的、以物体为中心的表示。论文叙述上对标 **ConceptGraphs**(开放词表 3D 场景图、CLIP grounding)的思路:从带位姿的 RGB-D 序列出发,分割出物体区域、用 CLIP 编码并跨多视角融合,得到"3D 物体 + 视觉/语言描述符"的集合。
|
||||
|
||||
不过**公开仓库里 `simulator/semantic_extractor.py` 与 `feature_extractor.py` 的真实实现更直接**:智能体在房间的可导航网格点上逐点"球形扫描"(左转 3 次凑满 360° + 上看 + 下看,共 6 视角),每帧拿 RGB + 深度 + **仿真器给出的 ground-truth 语义分割**;对每个实例 mask 抠图,送入 **LLaVA 的 CLIP 视觉编码器(`LlaVa_Encoder`)** 编码,再对该物体的多视角特征取均值,得到一个 **1024 维**的物体级特征(逐物体存成 `.pt`);点云则由深度图反投影(`Reconstruct3D.depth_map2points`)后下采样得到。也就是说,released 版用**仿真器真值语义掩码**替代了 SAM/检测器这一步,是一种工程上更省事的近似。
|
||||
|
||||
这套表示的两大好处不变:**开放词表/语义丰富** + **稀疏高效**(只保留物体级抽象,而非全场景稠密点云)。在 MultiPLY 里,它的作用是先让 LLM 知道"场景里有哪些物体、大致在哪",而**把每个物体的细节多感官信息留到交互时再揭示**。
|
||||
|
||||
### 5.2 各模态编码器
|
||||
|
||||
每条感官流都被编码成 **1024 维**特征,再通过各自的投影层映射进 LLM 的隐藏维度(hidden size)。从代码(`llava_arch.py`)看,投影层分两套:
|
||||
|
||||
- **场景 / 视觉(`<scene>` / `<visual>`)**:复用 LLaVA 原有的视觉投影器 `mm_projector`(线性或 `mlp2x_gelu`)。特征来源是上文的多视角 CLIP 物体特征。
|
||||
- **触觉(`<tactile>`)**:来自触觉仿真读数(`tactile_reading/marker4.pt`,对应论文里的 **DiffTactile**,基于 MLS-MPM 仿真、bubble gripper 标记点),经一个**新增的 2 层 GELU MLP**(`tactile_projector`)投影。
|
||||
- **声音(`<sound>`)**:来自 ObjectFolder 的撞击声特征(`impact_sound .pt`),或场景环境音的 audioset embedding;经**新增 2 层 GELU MLP**(`sound_projector`)投影。论文层面对应用 **CLAP** 把声音对齐到语言空间。
|
||||
- **温度(`<temperature>`)**:论文中作为第四种感官,但 released `llava_arch.py` 中**没有**对应的 `temperature_projector`,公开训练循环也未真正喂入温度特征——属于代码未完整释出的部分。
|
||||
|
||||
> 关键工程细节:训练时 `del model.model.vision_tower`,即**把 LLaVA 自带的在线 CLIP 视觉塔删掉**——所有感官特征都是**离线预提取**好的 `.pt`,训练时直接加载。这大幅降低了显存与计算开销,但也意味着特征提取与 LLM 训练是解耦的两个阶段。
|
||||
|
||||
### 5.3 LLM 主干与 token 体系
|
||||
|
||||
MultiPLY 构建在 **LLaVA 框架**之上,主干语言模型为 **Vicuna-7B(即 `liuhaotian/llava-v1.5-7b`,源自 LLaMA-2)**,并在其上做指令微调。各感官观测由各自的传感编码器编码,再通过投影层(sensor-to-image adapter)连接进 LLM——即把各模态特征对齐到 LLaVA 原本处理图像特征的接口上。它在 LLM 的词表里通过 `tokenizer.add_tokens(..., special_tokens=True)` + `resize_token_embeddings` 引入了两类**特殊 token**(token 字符串均来自仓库 `dataset.py`,是真实命名):
|
||||
|
||||
- **状态 token(state tokens)**:占位符,前向时其 embedding 会被对应的感官特征**替换**。包括 `<scene>`(场景里各物体的抽象特征)、`<visual>`(观察得到的物体点云/视觉特征)、`<tactile>`(触觉)、`<sound>`(撞击声)、`<temperature>`(温度)、`<ambient>`(环境音)。
|
||||
- **动作 token(action tokens)**:让 LLM"说出"要执行的动作,驱动智能体交互。包括 `<observe>`(观察、取物体点云)、`<touch>`(触摸,取触觉/温度)、`<hit>`(敲击,取撞击声)、`<select>`(选定目标物体)、`<nav>`(导航)、`<pick-up>` / `<pick-down>`(拿起/放下)、`<look-around>`(环视探索)。
|
||||
|
||||
> 注意:论文行文里把动作写成 NAVIGATE / OBSERVE / TOUCH / HIT 等大写名,而**代码里的真实 token 是上面这些尖括号小写形式**。此外,released 训练脚本实际只接入了 `<scene>` / `<visual>` / `<tactile>` / `<sound>` 四类状态特征(见第 7 节),`<temperature>` / `<ambient>` 及部分动作 token 已在词表中定义但未在公开训练循环里完整启用。
|
||||
|
||||
### 5.4 推理时的闭环
|
||||
|
||||
推理时模型与环境形成闭环:
|
||||
|
||||
1. LLM 基于当前上下文(抽象场景 + 已有观测)**生成一个动作 token**;
|
||||
2. 智能体在仿真环境中**执行该动作**,得到下一帧多感官状态观测;
|
||||
3. 观测经对应编码器编码为**状态 token**,**追加回 LLM 上下文**;
|
||||
4. LLM 据此**继续生成文本(回答)或下一个动作 token**,直至完成任务。
|
||||
|
||||
这套"生成动作 → 环境反馈 → 回填状态 → 再生成"的机制,使 LLM 能像人一样**边探索边收集证据、分步推理**,而不是一次性接收全部感官输入。
|
||||
|
||||
---
|
||||
|
||||
## 6. 训练范式
|
||||
|
||||
- **指令微调(instruction tuning)**:在 Multisensory Universe 数据上做指令微调,把动作 token 与状态 token 一并纳入序列建模。数据以 `Question: ... Answer: ...` 形式组织,**只对答案部分计算语言建模损失**(`fsdp_train.py` 里用分隔符 token id `22550`,即 "Answer" 定位答案起点,之前的 token 全部置为 `-100` 忽略)。
|
||||
- **全参数微调,而非冻结**:与"冻结编码器只训投影层"的直觉不同,released 脚本里 `model.requires_grad_(True)`——**整个 LLM + 各投影层一起训练**(视觉塔已被删除,特征离线预提取)。优化器 AdamW,学习率 **1e-6**,`batch_size=2`,`max_length=2048`。
|
||||
- **双目标损失**(这是代码里最值得注意的设计,论文正文较少强调):
|
||||
- **`loss1`(语言建模)**:标准的下一 token 交叉熵,只在答案 token 上生效。
|
||||
- **`loss2`(物体选择 / grounding)**:用 LLM **最后一层、最后一个位置的 hidden state** 与投影后的场景物体特征做点积(`einsum("abf,acf->abc")`)得到每个物体的"被选中分数",再对二值标签 `prediction`(该物体是否为目标)做 **加权 BCE**(正样本权重 1、负样本 0.2、padding 0,外加 `pos_weight=5`)。
|
||||
- 总损失 `loss = loss1 + loss2`。这把"物体检索/指代消解"显式地变成一个可监督的注意力对齐任务,正是它在物体检索基准上大幅领先的工程原因之一。
|
||||
- **分布式训练**:使用 **FSDP(Fully Sharded Data Parallel)**,`ShardingStrategy.SHARD_GRAD_OP`、fp16 混合精度、按 `LlamaDecoderLayer` 自动 wrap。入口 `fsdp_train.py`,通过 SLURM + `torchrun` 启动(示例:`--folder retrieval_attention3 --num_epochs=1000`,默认 8 卡/节点)。
|
||||
|
||||
---
|
||||
|
||||
## 6.5 代码级实现剖析(基于本地仓库精读)
|
||||
|
||||
仓库结构清晰,分三块:`model_release/`(改造版 LLaVA + 训练/数据)、`simulator/`(Habitat-sim 多感官仿真与特征提取)、`utils/`。以下是把"论文概念"对应到"代码事实"的关键点。
|
||||
|
||||
### 6.5.1 多感官特征如何"插入"LLM
|
||||
|
||||
核心在 `llava_arch.py` 的 `prepare_inputs_labels_for_multimodal`:
|
||||
|
||||
1. 先用 `embed_tokens` 把 `input_ids` 正常编码为文本 embedding;
|
||||
2. 把各模态特征过投影层:`scene/visual → mm_projector`,`tactile → tactile_projector`,`sound → sound_projector`;
|
||||
3. 用 `_insert_feature` 按"插入位置"(dataset 里记录的各占位 token 出现处 `*_insert_loc`)**逐位替换** embedding,并把这些位置的 label 设为 `-100`(不计入 LM 损失);
|
||||
4. 之后就是标准 LLaMA 前向 + `lm_head`。
|
||||
|
||||
也就是说,多感官信息是以"**把占位 token 的词向量替换成感官特征向量**"的方式进入 LLM 的——这与 LLaVA 处理图像 patch 的机制同源。
|
||||
|
||||
### 6.5.2 占位符的数量对齐技巧
|
||||
|
||||
`dataset.py` 里有一个巧妙处理:文本中每出现一个 `<scene>`(或 `<tactile>` 等),会被**按特征条数复制**——`text.replace(self.scene_token, self.scene_token*len(scene_feature))`。这样占位 token 的数量正好等于要插入的特征向量数量,使第 6.5.1 步的"逐位替换"严格对齐。场景特征默认形状是 `(256, 1024)`(最多 256 个物体、每个 1024 维)。
|
||||
|
||||
### 6.5.3 数据条目的结构
|
||||
|
||||
每条样本是一个 JSON dict,可能包含:`question` / `answer` / `scene`(场景 id,去 `dataset/feature_dict/<scene>/<obj_id>.pt` 取物体特征)/ `visual` / `tactile_reading` / `impact_sound` / `temperature` / `prediction`(逐物体的目标性标签,用于 `loss2`)。`__getitem__` 用 `try/except` 包裹,取不到特征就回退到上一条——这是研究代码常见的容错写法,也说明数据完整性需要使用者自行保证。
|
||||
|
||||
### 6.5.4 仿真器(`simulator/`)
|
||||
|
||||
`MultisensorySimulator` 继承自 `habitat_sim.Simulator`:
|
||||
|
||||
- **放置可交互物体**:`_place_objs` 把 Objaverse / ObjectFolder 的网格按 bbox 缩放、定位、设材质与质量(动态/静态)后注入 HM3D 场景,并赋予从 10000 起的语义 id(便于和原生物体区分)。
|
||||
- **导航**:`move_agent_to_target` 用 `ShortestPathFollower` 沿最短路径走到目标。
|
||||
- **声学**:`calculate_audio` 用各步的**房间脉冲响应(RIR)**与声源音频做 `fftconvolve` 卷积,生成**双耳(binaural)空间化音频**——这是 SoundSpaces 式的声学仿真。
|
||||
- **特征提取**:`semantic_extractor.py` / `feature_extractor.py` 在网格点球形扫描,借助 GT 语义掩码抠出物体、用 LLaVA CLIP 编码并多视角平均,落盘为物体级 `.pt` 特征与房间点云。
|
||||
|
||||
### 6.5.5 推理评测
|
||||
|
||||
`fsdp_train.py` 的 `eval()` 对短答案 QA 做贪心生成(`do_sample=False, max_new_tokens=10`),与真值字符串精确匹配统计准确率——对应论文里问答类任务的评测方式。
|
||||
|
||||
---
|
||||
|
||||
## 7. 能做哪些任务
|
||||
|
||||
MultiPLY 是一个**统一**的多任务模型,论文展示了它在以下任务上的能力:
|
||||
|
||||
- 多感官描述(multisensory captioning)
|
||||
- 多感官问答 / 具身问答(multisensory QA / embodied QA)
|
||||
- 对话(dialogue)
|
||||
- 物体检索(object retrieval)——给定多感官线索找到目标物体
|
||||
- 工具使用(tool use)
|
||||
- 任务分解(task decomposition)
|
||||
- 操作与导航(manipulation / navigation)
|
||||
|
||||
---
|
||||
|
||||
## 8. 实验结论
|
||||
|
||||
论文围绕几个研究问题(RQ)组织实验:物体检索、工具使用、多感官描述、任务分解,以及各感官模态的贡献(消融)。
|
||||
|
||||
### 8.1 物体检索(最具代表性的量化结果)
|
||||
|
||||
| 模型 | 物体检索准确率 |
|
||||
|------|----------------|
|
||||
| **MultiPLY** | **56.7%** |
|
||||
| PointBind-LLM(微调) | 48.9% |
|
||||
| ConceptGraph + CLIP | 18.7% |
|
||||
|
||||
MultiPLY 大幅领先。作者的分析是:**让 LLM 把不同传感数据"解耦、分步推理",而不是融合成单一 embedding**,对于需要细粒度区分(材质、温度等)的检索任务至关重要。
|
||||
|
||||
### 8.2 总体表现与消融
|
||||
|
||||
- 在物体检索、工具使用、多感官描述、任务分解等一系列具身任务上,MultiPLY **大幅超越各类基线**。
|
||||
- 消融实验表明:**逐步叠加感官模态会持续提升性能**,使用视觉 + 音频 + 触觉 + 温度的完整模型取得最高准确率——验证了"多感官交互式感知"这一核心设计的价值。
|
||||
|
||||
> 注:除物体检索的具体数值外,工具使用 / 描述 / 任务分解的完整对比表与逐模态消融的精确数值,建议查阅 [CVPR 2024 论文 PDF](https://openaccess.thecvf.com/content/CVPR2024/papers/Hong_MultiPLY_A_Multisensory_Object-Centric_Embodied_Large_Language_Model_in_3D_CVPR_2024_paper.pdf) 原表。
|
||||
|
||||
---
|
||||
|
||||
## 9. 在技术谱系中的位置
|
||||
|
||||
MultiPLY 站在几条线索的交叉点上:
|
||||
|
||||
- **LLaVA**(视觉指令微调)→ 提供了"用强 LLM 造指令数据 + 冻结编码器 + 指令微调"的训练范式;MultiPLY 把它从 2D 图文推广到具身多感官 3D 交互。
|
||||
- **3D-LLM**(同组前作,整体点云进 LLM)→ MultiPLY 用**以物体为中心的稀疏表示**替代稠密点云,降低训练/推理成本。
|
||||
- **ConceptGraphs**(开放词表 3D 场景图,CLIP grounding)→ 提供了以物体为中心、开放词表的场景编码骨架。
|
||||
- **ObjectFolder / DiffTactile / CLAP**(多感官仿真与编码)→ 提供视觉之外的声、触、热信号来源与编码手段。
|
||||
|
||||
它的**真正新意**在于把"**动作 token + 状态 token 的交互闭环**"引入 LLM,把感知从"被动输入"变为"主动行动的产物"。
|
||||
|
||||
---
|
||||
|
||||
## 10. 局限与可讨论之处
|
||||
|
||||
以研究者视角,几个值得关注的点:
|
||||
|
||||
- **强依赖仿真**:多感官信号(撞击声、触觉、温度)主要来自仿真(ObjectFolder 神经声场、DiffTactile、标注温度)。从仿真到真实世界(sim-to-real)的迁移、真实触觉/热传感的噪声与标定,论文未充分覆盖。
|
||||
- **数据由 ChatGPT 生成**:指令与目标回答由 ChatGPT 自动产出,可能继承其偏置或产生与物理不完全一致的"幻觉式"标注;数据质量的系统评估是开放问题。
|
||||
- **动作空间相对受限**:`<nav>` / `<observe>` / `<touch>` / `<hit>` 等是离散、高层的动作原语,距离真实机器人连续控制(力控、抓取轨迹)还有距离。
|
||||
- **以物体为中心的取舍**:抽象表示高效,但会丢失场景级几何/空间关系的细节,对需要精细空间推理的任务可能不利;且 released 特征提取依赖仿真器 GT 语义掩码,迁移到真实场景需换成真正的开放词表分割(如 SAM/ConceptGraphs)。
|
||||
- **复现成本与代码完整度**:FSDP 多卡训练 + 多个仿真器/编码器(Habitat-sim、DiffTactile、SoundSpaces 声学、CLIP 提取)的环境搭建较重;并且**公开代码是研究级、部分释出**——`README` 的 Requirements / Dataset Curation 仍为 TODO,温度模态投影器缺失,`model/feature_encoder.py` 等被引用文件未包含,数据 JSON(`all_questions.json`)与预提取特征需自行准备。把它当作"权威参考实现"而非"开箱即用工程"更稳妥。
|
||||
|
||||
---
|
||||
|
||||
## 11. 给想上手的研究者的建议路径
|
||||
|
||||
1. 先读 [arXiv 论文](https://arxiv.org/abs/2401.08577) 的 Method 与 Figure(动作/状态 token 闭环、数据流水线图)建立整体直觉。
|
||||
2. 直接读代码三条主线,按这个顺序最省力:
|
||||
- **token 与数据**:`model_release/dataset.py`(特殊 token 定义、占位符复制对齐、各模态特征加载);
|
||||
- **模型如何吃进多感官特征**:`model_release/llava/llava/model/llava_arch.py` 的 `prepare_inputs_labels_for_multimodal` + `multimodal_projector/builder.py`;
|
||||
- **训练目标**:`model_release/fsdp_train.py` 的 `train_one_epoch`(双损失 `loss1`+`loss2`、答案掩码、FSDP 配置)。
|
||||
3. 想搞数据/仿真,再看 `simulator/`:`multisensory_simulator.py`(放物体、导航、RIR 声学)与 `semantic_extractor.py` / `feature_extractor.py`(球形扫描 + 物体级 CLIP 特征落盘)。
|
||||
4. 沿依赖补外部组件背景:**Habitat-sim + HM3D**(环境)、**Objaverse / ObjectFolder**(物体与撞击声)、**DiffTactile**(触觉)、**LLaVA-1.5**(主干)。
|
||||
5. 若关注方法迁移,重点研究"动作/状态 token 闭环 + 物体选择注意力损失"这一组合——它可脱离具体仿真器,迁移到其他需要"模型主动获取信息再决策"的场景(主动视觉、工具调用、检索增强)。
|
||||
|
||||
---
|
||||
|
||||
## 12. 相关工作(10 篇相近方向论文)
|
||||
|
||||
按子方向分组,附 arXiv 链接,并标注与 MultiPLY 的关系。
|
||||
|
||||
### 12.1 3D-LLM 谱系与具身 VLA(与 MultiPLY 最直接相关,多为同组工作)
|
||||
|
||||
1. **3D-LLM: Injecting the 3D World into Large Language Models**(NeurIPS 2023)—— MultiPLY 的直接前作,把整体 3D 点云特征注入 LLM;MultiPLY 用"以物体为中心的稀疏表示"改进了它的训练/推理效率。<https://arxiv.org/abs/2307.12981>
|
||||
2. **3D-VLA: A 3D Vision-Language-Action Generative World Model**(ICML 2024)—— 同组工作,同样在 LLM 词表里加 scene / object / action 特殊 token,并接生成式世界模型;与 MultiPLY 的 token 机制是姊妹设计。<https://arxiv.org/abs/2403.09631>
|
||||
3. **LEO: An Embodied Generalist Agent in 3D World**(ICML 2024)—— 两阶段训练(3D 视觉-语言对齐 + VLA 指令微调)的具身通用智能体,与 MultiPLY 在"3D 具身指令微调"上高度并行。<https://arxiv.org/abs/2311.12871>
|
||||
|
||||
### 12.2 具身多模态大模型(感知—推理—动作)
|
||||
|
||||
4. **PaLM-E: An Embodied Multimodal Language Model**(2023)—— 把连续传感模态直接编码进 LLM,建立"词语—感知"链接,是 MultiPLY"多感官入 LLM"思路的奠基工作之一。<https://arxiv.org/abs/2303.03378>
|
||||
5. **EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought**(NeurIPS 2023)—— 具身链式思维 + EgoCOT 数据集的端到端具身基础模型。<https://arxiv.org/abs/2305.15021>
|
||||
6. **Matcha: Chat with the Environment — Interactive Multimodal Perception Using LLMs**(IROS 2023)—— 与 MultiPLY"主动交互式感知"最神似:用 LLM 指挥探索性动作,对视觉/声音/触觉/本体感觉反馈做推理与规划。<https://arxiv.org/abs/2303.08268>
|
||||
|
||||
### 12.3 点云 / 物体级 3D LLM(含 MultiPLY 的实际基线)
|
||||
|
||||
7. **PointLLM: Empowering LLMs to Understand Point Clouds**(ECCV 2024)—— 物体级彩色点云理解与描述,3D-LLM 方向代表作。<https://arxiv.org/abs/2308.16911>
|
||||
8. **Point-Bind & Point-LLM: Aligning Point Cloud with Multi-modality**(2023)—— 把点云与多模态对齐;其微调版 **PointBind-LLM 正是 MultiPLY 物体检索实验里的最强基线**(48.9% vs MultiPLY 56.7%)。<https://arxiv.org/abs/2309.00615>
|
||||
|
||||
### 12.4 多感官物体感知与触觉
|
||||
|
||||
9. **The ObjectFolder Benchmark: Multisensory Learning with Neural and Real Objects**(CVPR 2023)—— 视觉/听觉/触觉的物体级多感官数据集与基准,**正是 MultiPLY 撞击声与材质数据的来源**(早期版 <https://arxiv.org/abs/2109.07991>)。<https://arxiv.org/abs/2306.00956>
|
||||
10. **VTV-LLM: Universal Visuo-Tactile Video Understanding for Embodied Interaction**(2025)—— 首个面向"视触觉视频"理解的多模态 LLM,把触觉感知接入语言,延续 MultiPLY 的触觉方向。<https://arxiv.org/abs/2505.22566>
|
||||
|
||||
### 12.5 延伸阅读(3D 场景级 LLM 与综述)
|
||||
|
||||
- **LL3DA: Visual Interactive Instruction Tuning for Omni-3D Understanding**<https://arxiv.org/abs/2311.18651>
|
||||
- **Chat-Scene / Chat-3D v2: Bridging 3D Scene and LLMs with Object Identifiers**<https://arxiv.org/abs/2312.08168>
|
||||
- **Scene-LLM: Extending Language Model for 3D Visual Understanding and Reasoning**<https://arxiv.org/abs/2403.11401>
|
||||
- **综述:Exploring Embodied Multimodal Large Models**<https://arxiv.org/abs/2502.15336>
|
||||
|
||||
---
|
||||
|
||||
## 来源(Sources)
|
||||
|
||||
- [MultiPLY 论文 arXiv:2401.08577](https://arxiv.org/abs/2401.08577)
|
||||
- [CVPR 2024 Open Access PDF](https://openaccess.thecvf.com/content/CVPR2024/papers/Hong_MultiPLY_A_Multisensory_Object-Centric_Embodied_Large_Language_Model_in_3D_CVPR_2024_paper.pdf)
|
||||
- [项目主页 vis-www.cs.umass.edu/multiply](https://vis-www.cs.umass.edu/multiply/)
|
||||
- [GitHub 代码仓库 UMass-Embodied-AGI/MultiPLY](https://github.com/UMass-Embodied-AGI/MultiPLY)
|
||||
- [CVPR 2024 Poster #29685](https://cvpr.thecvf.com/virtual/2024/poster/29685)
|
||||
- [UMass Embodied AGI 发表列表](https://embodied-agi.cs.umass.edu/publications/)
|
||||
|
||||
相关工作(第 12 节)来源:
|
||||
- [3D-LLM (2307.12981)](https://arxiv.org/abs/2307.12981)
|
||||
- [3D-VLA (2403.09631)](https://arxiv.org/abs/2403.09631)
|
||||
- [LEO (2311.12871)](https://arxiv.org/abs/2311.12871)
|
||||
- [PaLM-E (2303.03378)](https://arxiv.org/abs/2303.03378)
|
||||
- [EmbodiedGPT (2305.15021)](https://arxiv.org/abs/2305.15021)
|
||||
- [Matcha (2303.08268)](https://arxiv.org/abs/2303.08268)
|
||||
- [PointLLM (2308.16911)](https://arxiv.org/abs/2308.16911)
|
||||
- [Point-Bind & Point-LLM (2309.00615)](https://arxiv.org/abs/2309.00615)
|
||||
- [ObjectFolder Benchmark (2306.00956)](https://arxiv.org/abs/2306.00956)
|
||||
- [VTV-LLM (2505.22566)](https://arxiv.org/abs/2505.22566)
|
||||
@@ -0,0 +1,205 @@
|
||||
# MultiPLY 训练过程讲解
|
||||
|
||||
> 本文基于 MultiPLY 官方仓库(`model_release/` 下的 `fsdp_train.py`、`dataset.py`、`llava/llava/model/llava_arch.py`、`builder.py`)的**真实代码**,逐步讲清它"怎么训"。
|
||||
> 配套阅读:同目录《MultiPLY技术讲解.md》(含完整架构与代码级剖析)。
|
||||
> 一句话定位:MultiPLY = **在 LLaVA-1.5-7B 上、用预提取的多感官特征做指令微调**,并叠加一个**物体选择(grounding)注意力损失**形成双目标训练。
|
||||
|
||||
---
|
||||
|
||||
## 0. 全局概览
|
||||
|
||||
训练可以拆成"一个离线阶段 + 一个在线阶段":
|
||||
|
||||
```
|
||||
阶段零(离线,仿真器里做) 阶段一(在线,fsdp_train.py 做)
|
||||
仿真采集 → 各模态特征预提取 .pt 加载 LLaVA-1.5-7B → 注入多感官 token
|
||||
视觉/点云 (CLIP) → 删除视觉塔、全参数可训
|
||||
触觉 (DiffTactile) → FSDP 分布式
|
||||
撞击声 (ObjectFolder/CLAP) → 双损失:语言建模 + 物体选择
|
||||
逐物体目标标签 prediction → AdamW / fp16 / 每 epoch 存档
|
||||
```
|
||||
|
||||
关键点先记住三条:
|
||||
|
||||
1. **特征是离线算好的**:训练时不跑视觉塔,直接从 `.pt` 加载各模态特征(省显存/算力)。
|
||||
2. **全参数微调**:不是"冻结编码器只训投影头",而是整个 LLM + 各投影层一起训。
|
||||
3. **双目标损失**:语言建模损失(`loss1`)+ 物体选择损失(`loss2`),两者相加。
|
||||
|
||||
---
|
||||
|
||||
## 1. 阶段零:离线特征预提取(数据准备)
|
||||
|
||||
训练读的不是原始图像/声音,而是**预先算好的特征张量**。每条样本对应一个 JSON 字典(来自 `all_questions.json`),可能含这些字段:
|
||||
|
||||
| 字段 | 含义 | 训练时如何用 |
|
||||
|------|------|--------------|
|
||||
| `question` / `answer` | 指令与目标回答 | 拼成文本序列 |
|
||||
| `scene` | 场景 id | 去 `dataset/feature_dict/<scene>/<obj_id>.pt` 取**每个物体的 1024 维特征**(CLIP 风格,多视角平均;默认场景特征形状 `(256,1024)`,即最多 256 个物体) |
|
||||
| `visual` | 观察到的物体 | 取该物体的视觉/点云特征 |
|
||||
| `tactile_reading` | 触觉读数路径 | 取 `data5/<...>/marker4.pt` 并按 marker 维取均值(对应 DiffTactile) |
|
||||
| `impact_sound` | 撞击声 | 取 `impact_sound_*/0.pt`;或场景环境音 audioset embedding |
|
||||
| `temperature` | 温度 | 代码中部分实现(投影器在公开版未完整释出) |
|
||||
| `prediction` | **逐物体的目标性二值标签** | 用于 `loss2` 物体选择损失 |
|
||||
|
||||
> 这些特征由 `simulator/` 里的网格扫描 + 各模态仿真器离线生成(详见《MultiPLY技术讲解》第 6.5 节)。训练阶段只管"加载 + 喂进 LLM"。
|
||||
|
||||
---
|
||||
|
||||
## 2. 训练数据怎么组织(`dataset.py`)
|
||||
|
||||
### 2.1 文本模板与"占位符复制"技巧
|
||||
|
||||
`MultisensoryDataset.__getitem__` 把样本拼成固定模板:
|
||||
|
||||
```
|
||||
Question: {question} Answer: {answer} {eos}
|
||||
```
|
||||
|
||||
其中文本里嵌有特殊**占位 token**(`<scene>` `<visual>` `<tactile>` `<sound>` 等)。关键技巧是:**每个占位 token 会按其特征条数被复制**——
|
||||
|
||||
```python
|
||||
text = text.replace(self.scene_token, self.scene_token * len(scene_feature))
|
||||
.replace(self.tactile_token, self.tactile_token * len(tactile_feature))
|
||||
.replace(self.sound_token, self.sound_token * len(sound_feature))
|
||||
.replace(self.visual_token, self.visual_token * len(visual_feature))
|
||||
```
|
||||
|
||||
这样"占位 token 的数量 == 要插入的特征向量数量",保证后面逐位替换严格对齐(见 §3)。
|
||||
|
||||
### 2.2 tokenize 与插入位置
|
||||
|
||||
文本经 tokenizer(`max_length=2048`,padding 到最大长度)后:
|
||||
|
||||
- 记录每类占位 token 在序列里的下标 `*_insert_loc`(`scene_insert_loc` / `visual_insert_loc` / `tactile_insert_loc` / `sound_insert_loc`);
|
||||
- 各模态特征按插入位置数量截断对齐;
|
||||
- `prediction` 转成 0/1 浮点张量(`>0` 的置 1),作为物体选择监督。
|
||||
|
||||
### 2.3 collate(成 batch)
|
||||
|
||||
`collate_wrapper` 把一个 batch 拼起来:场景特征 zero-pad 到 batch 内最大物体数,记录 `max_scene_length`,并把各 `insert_loc` 改写成 `[batch_idx, 位置]` 的形式,便于跨 batch 定位。`batch_size=2`。
|
||||
|
||||
---
|
||||
|
||||
## 3. 模型怎么"吃"多感官特征(`llava_arch.py`)
|
||||
|
||||
前向第一步是 `prepare_inputs_labels_for_multimodal`,核心是**把占位 token 的词向量替换成感官特征向量**:
|
||||
|
||||
1. 先正常 `embed_tokens(input_ids)` 得到文本 embedding;
|
||||
2. 把各模态特征过投影层对齐到 LLM 隐藏维:
|
||||
- `scene` / `visual` → 复用 LLaVA 的 **`mm_projector`**
|
||||
- `tactile` → 新增的 **`tactile_projector`**(2 层 GELU MLP)
|
||||
- `sound` → 新增的 **`sound_projector`**(2 层 GELU MLP)
|
||||
3. `_insert_feature` 按 `*_insert_loc` **逐位把占位 token 的 embedding 覆盖成对应特征**,同时把这些位置的 label 设为 `-100`(不计入语言建模损失);
|
||||
4. 之后就是标准 LLaMA 前向 + `lm_head`。
|
||||
|
||||
> 这与 LLaVA 处理图像 patch 的机制同源——多感官信息以"替换占位词向量"的方式进入 LLM。
|
||||
|
||||
---
|
||||
|
||||
## 4. 训练主循环(`fsdp_train.py`)
|
||||
|
||||
### 4.1 模型加载与可训设置(`main`)
|
||||
|
||||
```python
|
||||
model_path = "liuhaotian/llava-v1.5-7b"
|
||||
tokenizer, model, image_processor, context_len = load_pretrained_model(
|
||||
model_path, None, model_name, device_map=None, add_multisensory_token=True)
|
||||
```
|
||||
|
||||
- `add_multisensory_token=True`:在 `builder.py` 里把 `<scene>/<visual>/<tactile>/<sound>/<observe>/<touch>/<hit>` 等加进 tokenizer 并 `resize_token_embeddings`(扩词表)。
|
||||
- `model.requires_grad_(True)`:**全参数可训**(整 LLM + 投影层)。
|
||||
- `del model.model.vision_tower`:**删掉 LLaVA 自带的在线 CLIP 视觉塔**(特征已离线预提取,省显存)。
|
||||
|
||||
### 4.2 分布式与优化器
|
||||
|
||||
- **FSDP**(Fully Sharded Data Parallel):
|
||||
- `auto_wrap_policy` 按 `LlamaDecoderLayer` 自动 wrap;
|
||||
- `MixedPrecision` 全 fp16(param/reduce/buffer);
|
||||
- `ShardingStrategy.SHARD_GRAD_OP`(分片梯度与优化器状态)。
|
||||
- 优化器:**AdamW,lr = 1e-6**。
|
||||
- 数据:`DistributedSampler` + `DataLoader(batch_size=2, num_workers=4)`。
|
||||
- 训练 `num_epochs` 轮,每轮 `train_one_epoch` 后 `save_checkpoint`(FSDP `FULL_STATE_DICT`,rank0 存 `checkpoint_{epoch}.pt`)。
|
||||
|
||||
### 4.3 单步训练(`train_one_epoch`)—— 这是核心
|
||||
|
||||
```python
|
||||
labels = input_ids.clone()
|
||||
answer_indices = torch.where(labels == 22550)[1] # 22550 = "Answer" 分隔符
|
||||
for j, answer_idx in enumerate(answer_indices):
|
||||
labels[j, :answer_idx+2] = -100 # 只对"答案"部分算语言损失
|
||||
labels[labels == tokenizer.pad_token_id] = -100 # padding 不算损失
|
||||
|
||||
with torch.autocast(device_type="cuda"):
|
||||
outputs = llava_model(input_ids, attention_mask, labels=labels,
|
||||
feature_dict=feature_dict, output_hidden_states=True)
|
||||
# —— loss2:物体选择(grounding)——
|
||||
hidden_state = outputs['hidden_states'][-1][:, -1, :].unsqueeze(1) # 最后层、最后位置
|
||||
scene_feature = llava_model.model.mm_projector(sample.scene_feature) # 投影后的物体特征
|
||||
attention = torch.einsum("abf,acf->abc", scene_feature, hidden_state).squeeze(-1)
|
||||
# 加权 BCE:正样本权重1、负样本0.2、忽略0;pos_weight=5
|
||||
loss2 = F.binary_cross_entropy_with_logits(attention, prediction,
|
||||
weight=weights, pos_weight=pos_weight)
|
||||
|
||||
loss = outputs.loss + loss2 # loss1 + loss2
|
||||
loss.backward(); optimizer.step()
|
||||
```
|
||||
|
||||
**要点拆解**:
|
||||
|
||||
- **标签掩码**:用 token id `22550`(LLaMA 分词下的 "Answer")定位答案起点,把它之前的 token 全置 `-100`——即**只在"答案"部分计算语言建模损失**(问题、占位符、padding 都不算)。
|
||||
- **loss1(语言建模)**:标准下一 token 交叉熵(在 `llava_llama.py` 的 forward 里算好,移位后 `CrossEntropyLoss`)。
|
||||
- **loss2(物体选择 / grounding)**:用 LLM **最后一层、最后一个位置的 hidden state** 与投影后的场景物体特征做点积(`einsum`),得到每个物体的"被选中分数",再对二值标签 `prediction` 做**加权 BCE**:
|
||||
- 权重 `weights`:目标物体(pred==1)权重 1,非目标(pred==0)权重 0.2,忽略(pred==-1)权重 0;超过 `max_scene_length` 的 padding 物体权重 0;
|
||||
- 额外 `pos_weight=5` 缓解正负样本不平衡。
|
||||
- **总损失**:`loss = loss1 + loss2`,一起反传。
|
||||
|
||||
> 这个 `loss2` 把"物体检索/指代消解"显式变成可监督的注意力对齐任务——正是 MultiPLY 在物体检索基准上大幅领先(56.7% vs 次优 48.9%)的工程原因之一。
|
||||
|
||||
---
|
||||
|
||||
## 5. 推理 / 评测(`eval`)
|
||||
|
||||
评测对短答案 QA 做贪心生成并与真值精确匹配:
|
||||
|
||||
```python
|
||||
output_ids = model.generate(input_ids, feature_dict=feature_dict,
|
||||
do_sample=False, max_new_tokens=10)
|
||||
# 解码后与 ground-truth 字符串 .lower().strip() 精确匹配,统计准确率
|
||||
```
|
||||
|
||||
推理时同样先把多感官特征注入占位 token,再自回归生成;在完整的具身设定下,模型还会**生成动作 token**(`<observe>/<touch>/<hit>` 等)驱动智能体交互、把新观测作为状态 token 回填——形成"动作→反馈→再生成"的闭环(详见架构文档)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 关键超参数 / 配置一览
|
||||
|
||||
| 项 | 取值 | 出处 |
|
||||
|----|------|------|
|
||||
| 主干 | `liuhaotian/llava-v1.5-7b`(Vicuna-7B / LLaMA-2 系) | `fsdp_train.py` |
|
||||
| 可训范围 | 全参数(`requires_grad_(True)`),删除视觉塔 | `fsdp_train.py` |
|
||||
| 优化器 / 学习率 | AdamW / **1e-6** | `fsdp_train.py` |
|
||||
| batch size | 2 | `fsdp_train.py` |
|
||||
| 序列长度 | 2048 | `dataset.py` |
|
||||
| 分布式 | FSDP,`SHARD_GRAD_OP`,fp16 混合精度 | `fsdp_train.py` |
|
||||
| 损失 | `loss1`(LM CE) + `loss2`(物体选择加权 BCE, pos_weight=5) | `train_one_epoch` |
|
||||
| 答案分隔符 | token id `22550`("Answer") | `train_one_epoch` |
|
||||
| 特征维度 | 各模态 1024 维 → 投影到 LLM 隐藏维 | `dataset.py` / `llava_arch.py` |
|
||||
| 投影层 | scene/visual→`mm_projector`;tactile/sound→各自 2 层 GELU MLP | `llava_arch.py` |
|
||||
| 存档 | 每 epoch,FSDP FULL_STATE_DICT,rank0 保存 | `save_checkpoint` |
|
||||
|
||||
---
|
||||
|
||||
## 7. 与论文叙述的差异 / 注意点
|
||||
|
||||
- **"冻结"误区**:直觉上 LLaVA 式训练常冻结编码器,但 MultiPLY released 脚本是**全参数微调**(视觉塔已删、特征离线)。
|
||||
- **双损失少被强调**:论文正文偏重"动作/状态 token 闭环",但代码里 `loss2`(物体选择)对检索类任务很关键。
|
||||
- **温度模态未完整**:`<temperature>` 在词表/数据里出现,但 `llava_arch.py` 没有对应投影器、公开训练循环也未真正喂入——属于部分释出。
|
||||
- **研究级代码**:`all_questions.json`、预提取特征、`requirements` 等需自行准备;`__getitem__` 用 `try/except` 容错,数据完整性需使用者保证。
|
||||
|
||||
---
|
||||
|
||||
## 8. 小结:MultiPLY 训练的三句话
|
||||
|
||||
1. **离线**把视/触/听等多感官信号各自编码成 1024 维特征 `.pt`;
|
||||
2. **在线**在 LLaVA-1.5-7B 上做全参数指令微调,用"占位 token 替换成特征向量"的方式把多感官喂进 LLM,只在答案上算语言损失;
|
||||
3. 叠加一个**物体选择注意力损失**(hidden state × 物体特征 的加权 BCE),让模型学会"挑出目标物体",与语言损失一起用 FSDP/AdamW/fp16 训练。
|
||||
@@ -0,0 +1,344 @@
|
||||
---
|
||||
title: "V-JEPA 2 深度技术剖析:从自监督视频表征到零样本机器人规划"
|
||||
date: 2026-05-24
|
||||
draft: false
|
||||
tags: ["V-JEPA 2", "JEPA", "Meta", "world-model", "self-supervised", "video", "robotics", "action-conditioned", "MPC"]
|
||||
categories: ["JEPA"]
|
||||
description: "论文(arXiv:2506.09985)+ 官方代码(facebookresearch/vjepa2)结合的 V-JEPA 2 深度技术剖析:逐模块讲解编码器/预测器架构、四支柱 scaling 策略、动作条件世界模型 V-JEPA 2-AC,以及基于 MPC + CEM 的零样本机器人规划。"
|
||||
---
|
||||
|
||||
> 本文聚焦 **V-JEPA 2**(Assran, Bardes, Fan, Garrido, LeCun 等,FAIR @ Meta + Mila,arXiv:2506.09985,2025-06),采用"论文 + 代码"双线讲解:先讲清论文里的设计动机与方法,再对照官方仓库 `facebookresearch/vjepa2` 与 HuggingFace `transformers` 集成讲实现细节。它是 [JEPA 系列综述](index.md) 中 V-JEPA 2 一节的展开深挖版。
|
||||
|
||||
---
|
||||
|
||||
## 一、一句话定位与三大能力
|
||||
|
||||
V-JEPA 2 把一个核心论断推到了规模化的极致:**在表示空间(latent space)中做预测,而不是在像素空间里重建**,配合互联网级视频数据,可以让一个自监督模型同时具备三种能力——
|
||||
|
||||
1. **理解(Understanding)**:作为冻结视觉编码器,在运动理解、动作识别上达到 SOTA。
|
||||
2. **预测 / 预判(Prediction / Anticipation)**:预测未来表示,在人类动作预判(Epic-Kitchens-100)上超过专用模型。
|
||||
3. **规划(Planning)**:在少量机器人交互数据上后训练出 **V-JEPA 2-AC**(action-conditioned),用世界模型做模型预测控制(MPC),在两个全新实验室的 Franka 机械臂上**零样本**完成抓取与放置。
|
||||
|
||||
它与两条主流路线的区别构成了全文的方法论主线:
|
||||
|
||||
- **vs 纯交互式学习(RL / 行为克隆)**:那类方法依赖昂贵的真机交互数据。V-JEPA 2 用互联网视频学习"世界如何演化"——视频里有状态序列但**没有显式动作标签**,自监督正好能利用这种"无动作"数据。
|
||||
- **vs 视频生成式世界模型(如扩散类 Cosmos)**:生成式目标逼迫模型刻画像素级的不可预测细节(纹理、光影)。JEPA 只预测**可预测的语义部分**(如运动物体的轨迹),主动忽略不可预测细节,因此表示更紧凑、规划更快。
|
||||
|
||||
---
|
||||
|
||||
## 二、设计哲学:为什么是 latent prediction + 两阶段
|
||||
|
||||
JEPA 的基本计算图(沿用自 LeCun 2022 与 I-JEPA / V-JEPA):
|
||||
|
||||
```
|
||||
上下文块 x_ctx ──► 编码器 E_θ ──► z_ctx
|
||||
目标块 x_tgt ──► 目标编码器 E_θ̄(EMA) ──► z_tgt (stop-gradient)
|
||||
预测器 P_φ(z_ctx, mask_tokens) ──► ẑ_tgt
|
||||
损失 L = || ẑ_tgt − z_tgt || (仅在被掩码 patch 上计算)
|
||||
```
|
||||
|
||||
两个关键稳定性设计:
|
||||
|
||||
- **目标编码器用 EMA(指数移动平均)更新**,而非反向传播,避免表示坍塌(representation collapse)。
|
||||
- **stop-gradient** 切断目标分支梯度,防止编码器把所有输入映射到常数这种平凡解。
|
||||
|
||||
V-JEPA 2 在此之上做的最大结构决策是**两阶段解耦**:
|
||||
|
||||
- **阶段一(动作无关预训练)**:在 100 万+ 小时互联网视频上学"世界的动态",得到通用视觉表示 + 一个动作无关的预测器。这一步完全不需要动作标签。
|
||||
- **阶段二(动作条件后训练,V-JEPA 2-AC)**:**冻结**阶段一编码器,只在 <62 小时的无标注机器人视频(Droid)上训练一个**新的、动作条件的预测器**。
|
||||
|
||||
这种解耦的好处:把"昂贵但稀缺"的真机数据只用在很小的预测器上,把"廉价且海量"的网络视频用在大编码器上——这正是它能用极少机器人数据做零样本规划的根因。
|
||||
|
||||
---
|
||||
|
||||
## 三、阶段一:动作无关自监督预训练
|
||||
|
||||
### 3.1 数据 —— VideoMix22M (VM22M)
|
||||
|
||||
- 规模:**超过 100 万小时**互联网视频 + 约 100 万张图像。
|
||||
- 视频条数从 V-JEPA(一代)的约 200 万条扩大到 **2200 万条**。
|
||||
- 组成:SSv2、Kinetics、HowTo100M、ImageNet,叠加一个经过筛选的 YT-Temporal-1B 子集。
|
||||
- 数据扩量是后面所有性能提升的基础"燃料"。
|
||||
|
||||
### 3.2 输入 tokenization 与 3D-RoPE
|
||||
|
||||
- 视频切成 **tubelet(时空管元)**,尺寸 `2 × 16 × 16`(T × H × W),即每 2 帧 × 16×16 像素打成一个 token。
|
||||
- 位置编码采用 **3D-RoPE(三维旋转位置编码)**:把特征维度近似三等分,分别对应**时间 / 高 / 宽**三个轴,各自施加 1D 旋转。
|
||||
- 动机是**大模型训练稳定性**:论文发现在十亿参数规模下,用 3D-RoPE 取代绝对 sincos 位置编码能显著稳住训练。这是 scaling 到 ViT-g 的关键一招。
|
||||
|
||||
### 3.3 编码器:ViT-g(>1B)
|
||||
|
||||
- 从 V-JEPA 的 **ViT-L(约 300M)** 扩到 **ViT-g(>1B)**。
|
||||
- ViT-g 的隐藏维度 `embed_dim = 1408`(这一点在代码里直接可见,见 §4.3)。
|
||||
- 编码器承担"把视频/图像编码成语义表示"的全部重活。
|
||||
|
||||
### 3.4 预测器:刻意做小
|
||||
|
||||
- 阶段一的预测器是一个**轻量 Transformer**:约 **12 层、宽度 384、约 22M 参数**(ViT-S 量级)。
|
||||
- 设计意图:预测器只负责"在表示空间里补全被掩码区域",不需要很大;把容量集中给编码器。
|
||||
|
||||
### 3.5 掩码策略
|
||||
|
||||
- **Multi-block 时空掩码**:混合短程与长程块,整体**掩码率逼近 90%**。
|
||||
- 空间尺度 0.15–0.7,时间维掩码率 ≈ 1.0(即被选中的空间区域在整段时间上都被遮)。
|
||||
- **损失只在被掩码 patch 的预测上计算**——逼模型真正去"想象"看不见的部分,而不是抄可见区域。
|
||||
|
||||
### 3.6 四支柱 Scaling 策略(论文最实用的工程经验)
|
||||
|
||||
V-JEPA 2 把"如何把 V-JEPA 放大"拆成四条同时发力的轴:
|
||||
|
||||
| 支柱 | 一代 V-JEPA | V-JEPA 2 |
|
||||
|------|------------|----------|
|
||||
| **数据** | ~2M 视频 | ~22M 视频(VM22M,>1M 小时) |
|
||||
| **模型** | ViT-L 300M | ViT-g >1B(+3D-RoPE 稳定) |
|
||||
| **分辨率/时长** | 固定 | **渐进式分辨率**(progressive resolution) |
|
||||
| **训练时长** | 90k 迭代 | **252k 迭代**(warmup-constant-decay) |
|
||||
|
||||
其中**渐进式分辨率训练**最值得单独说:
|
||||
|
||||
- 训练大部分时间跑在**低分辨率、短时长**(16 帧 @256×256)的 warmup/constant 阶段;
|
||||
- 仅在末尾 cooldown 阶段切到**高分辨率、长时长**(64 帧 @384×384)。
|
||||
- 相比全程高分辨率,**最高约 8.4× 加速**,同时几乎不损失(甚至提升)性能。
|
||||
|
||||
综合这四支柱,冻结编码器在 6 个运动/外观分类任务(SSv2、Diving-48、Jester、Kinetics、COIN、ImageNet)上取得 **88.2% 平均准确率**。
|
||||
|
||||
---
|
||||
|
||||
## 四、代码剖析:官方仓库 + HuggingFace 集成
|
||||
|
||||
> 官方仓库:`facebookresearch/vjepa2`("PyTorch code and models for VJEPA2 self-supervised learning from video")。本节路径/类名均来自官方仓库与 HF `transformers` 文档;建议在本地 `git clone` 后对照阅读。
|
||||
|
||||
### 4.1 顶层目录结构
|
||||
|
||||
```
|
||||
vjepa2/
|
||||
├── app/ # 训练 loop(按用途分子目录)
|
||||
│ ├── vjepa/ # V-JEPA 2 预训练
|
||||
│ ├── vjepa_2_1/ # V-JEPA 2.1 预训练(后续版本)
|
||||
│ ├── vjepa_droid/ # 动作条件模型(V-JEPA 2-AC)训练,train.py
|
||||
│ ├── main.py # 本地启动入口
|
||||
│ └── main_distributed.py # SLURM 集群启动入口
|
||||
├── configs/ # 全部实验超参(YAML)
|
||||
│ ├── train/ # 预训练 phase1 + cooldown phase2 + 动作条件
|
||||
│ ├── train_2_1/ # V-JEPA 2.1
|
||||
│ └── eval/ (含 inference/) # 冻结评测 / 仅推理
|
||||
├── evals/ # 基于冻结骨干的 attentive probe 评测
|
||||
│ ├── video_classification_frozen/
|
||||
│ ├── image_classification_frozen/
|
||||
│ ├── action_anticipation_frozen/ # 动作预判 eval.py
|
||||
│ ├── main.py / main_distributed.py
|
||||
├── src/ # 核心包
|
||||
│ ├── datasets/ # 数据集与 data loader
|
||||
│ └── models/ # 模型定义(编码器 + probe)
|
||||
└── notebooks/
|
||||
└── vjepa2_demo.ipynb # 最小可跑 demo
|
||||
```
|
||||
|
||||
设计上职责清晰:`app/` 放训练循环、`evals/` 放探针评测、`src/` 放核心模型、`configs/` 放所有超参。
|
||||
|
||||
### 4.2 编码器入口:`src/models/vision_transformer.py`
|
||||
|
||||
demo 里加载 ViT-g 编码器的关键调用:
|
||||
|
||||
```python
|
||||
from src.models.vision_transformer import vit_giant_xformers_rope
|
||||
# 函数名直接揭示三件事:
|
||||
# giant -> ViT-g(十亿级)
|
||||
# xformers -> 用 xFormers 做高效注意力
|
||||
# rope -> 使用(3D)RoPE 位置编码
|
||||
```
|
||||
|
||||
### 4.3 注意力探针:`src/models/attentive_pooler.py`
|
||||
|
||||
冻结评测不是简单的线性探针,而是一个 **4 层注意力探针(attentive probe)**:
|
||||
|
||||
```python
|
||||
from src.models.attentive_pooler import AttentiveClassifier
|
||||
|
||||
# 以 Something-Something v2 为例(174 类)
|
||||
classifier = AttentiveClassifier(
|
||||
embed_dim=1408, # 对应 ViT-g 的隐藏维度
|
||||
num_heads=16,
|
||||
depth=4, # 4 个 transformer block
|
||||
num_classes=174,
|
||||
).cuda().eval()
|
||||
# 权重从 checkpoint 的 ["classifiers"][0] 取
|
||||
```
|
||||
|
||||
探针结构要点:4 个 transformer block,**最后一个 block 用 cross-attention + 一个可学习 query token** 取代标准 self-attention,把整段视频 token 聚合成分类特征。推理时从一段视频里采多个 clip,logits 跨 clip 取平均。
|
||||
|
||||
### 4.4 训练与评测的运行方式
|
||||
|
||||
```bash
|
||||
# 本地预训练(ViT-L 配置示例)
|
||||
python -m app.main \
|
||||
--fname configs/train/vitl16/pretrain-256px-16f.yaml --devices cuda:0
|
||||
|
||||
# SLURM 分布式
|
||||
python -m app.main_distributed \
|
||||
--fname configs/train/vitl16/pretrain-256px-16f.yaml \
|
||||
--time 6000 --account my_account --qos my_qos
|
||||
```
|
||||
|
||||
- **预训练 phase1 与 cooldown phase2 用同一条命令、不同 config**(cooldown / 动作条件的 config 与初始训练放在同一目录)。
|
||||
- 动作条件模型走 `app/vjepa_droid/train.py`,用 teacher-forcing + 自回归 rollout 双目标。
|
||||
- 评测:在冻结骨干上训 attentive probe;官方放出了 SSv2、Diving48 和 EK-100 三个任务的探针 checkpoint(`wget .../vjepa2/evals/ssv2-vitg-384-64x2x3.pt`),可直接跑 `configs/inference/` 做推理。
|
||||
|
||||
### 4.5 HuggingFace `transformers` 集成(最易上手的路径)
|
||||
|
||||
`transformers` 已原生支持 V-JEPA 2(`VJEPA2Model` / `VJEPA2ForVideoClassification` / `VJEPA2Config`)。
|
||||
|
||||
**(a) 抽取视频特征:**
|
||||
|
||||
```python
|
||||
from transformers import AutoVideoProcessor, AutoModel
|
||||
|
||||
hf_repo = "facebook/vjepa2-vitl-fpc64-256" # fpc64 = 64 帧/clip
|
||||
model = AutoModel.from_pretrained(hf_repo)
|
||||
processor = AutoVideoProcessor.from_pretrained(hf_repo)
|
||||
|
||||
# 采 64 帧(要与模型的 fpc 对齐),过 processor,再前向
|
||||
video = processor(frames, return_tensors="pt")
|
||||
with torch.no_grad():
|
||||
embeds = model.get_vision_features(**video)
|
||||
```
|
||||
|
||||
完整前向 `outputs = model(**video)` 会同时给出:
|
||||
- `outputs.last_hidden_state` —— 编码器输出(等价 `get_vision_features()`);
|
||||
- `outputs.predictor_output.last_hidden_state` —— 预测器输出。
|
||||
|
||||
**(b) 视频分类(SSv2 微调版):**
|
||||
|
||||
```python
|
||||
from transformers import AutoVideoProcessor, AutoModelForVideoClassification
|
||||
|
||||
hf_repo = "facebook/vjepa2-vitl-fpc16-256-ssv2"
|
||||
model = AutoModelForVideoClassification.from_pretrained(hf_repo).to("cuda").eval()
|
||||
processor = AutoVideoProcessor.from_pretrained(hf_repo)
|
||||
# 输入 pixel_values_videos: [B, T, C, H, W];分类头 = attentive pooler 上接一个线性层
|
||||
```
|
||||
|
||||
**关键超参 `NUM_FRAMES`**:必须匹配 checkpoint——`fpc64` 用 64 帧,`fpc16` 用 16 帧。单图嵌入则把一帧 `repeat` 成 16/64 帧再喂进去。
|
||||
|
||||
**可用预训练权重**(编码器):`facebook/vjepa2-vitl-fpc64-256`、`-vith-fpc64-256`、`-vitg-fpc64-256`、`-vitg-fpc64-384`;分类微调版:`-vitl-fpc16-256-ssv2`、`-vitg-fpc64-384-ssv2`。
|
||||
|
||||
---
|
||||
|
||||
## 五、理解与预测能力:评测数字
|
||||
|
||||
### 5.1 冻结探针(运动 / 外观理解)
|
||||
|
||||
- **6 任务平均 88.2%**(SSv2 / Diving-48 / Jester / Kinetics / COIN / ImageNet)。
|
||||
- **Something-Something v2:77.3 top-1**(运动理解的硬骨头,强调时序因果而非静态外观)。
|
||||
- 协议:冻结编码器,只训 4 层 attentive probe(§4.3)。
|
||||
|
||||
### 5.2 动作预判(Anticipation)
|
||||
|
||||
- **Epic-Kitchens-100:39.7 recall@5**,超过此前专用模型。这是"预测人接下来要做什么动作"的 SOTA。
|
||||
|
||||
### 5.3 视频问答(对齐 LLM 后)
|
||||
|
||||
把 V-JEPA 2 编码器作为视觉编码器对齐到一个 LLM(8B 规模),在多项 VideoQA 上 SOTA:
|
||||
|
||||
- **PerceptionTest:84.0**
|
||||
- **TempCompass:76.9**
|
||||
- 一个值得注意的发现:即便 V-JEPA 2 预训练时**没有任何语言监督**,对齐后的 VideoQA 表现依然很强——说明纯视频自监督学到的表示对语言对齐是友好的。
|
||||
|
||||
---
|
||||
|
||||
## 六、阶段二:V-JEPA 2-AC 动作条件世界模型
|
||||
|
||||
### 6.1 架构与"块因果"注意力
|
||||
|
||||
- 一个 **约 300M 参数** 的 Transformer 预测器 `P_φ`:**24 层、16 头、隐藏 1024、GELU**。
|
||||
- 训练时**冻结**阶段一的 ViT-g 编码器,只学这个新预测器。
|
||||
- 核心机制 **block-causal attention(块因果注意力)**:在某个时间步上,每个 patch 特征可以注意到——**同一时间步的动作、末端执行器状态(end-effector state)、其他 patch**,以及**所有更早时间步**的对应内容;但不能看未来。由此自回归地预测"下一帧的表示"。
|
||||
- 位置编码:视频 patch 用 3D-RoPE,动作与位姿用**时间维 RoPE**,再叠加块因果掩码刻画时间上的因果依赖。
|
||||
|
||||
### 6.2 训练数据与目标
|
||||
|
||||
- 数据:**Droid** 数据集的无标注机器人视频,**< 62 小时 / 约 23k 条轨迹**(含成功与失败,来自遥操作的 Franka Emika Panda)。
|
||||
- 目标:**teacher-forcing 损失**(预测下一帧表示)+ **rollout 损失**(多步自回归预测)联合优化。后者是让模型在"想象多步未来"时不漂移的关键。
|
||||
|
||||
### 6.3 规划:MPC + 交叉熵法(CEM)
|
||||
|
||||
V-JEPA 2-AC **不学固定策略**,而是把预测器当世界模型,在**模型预测控制(MPC)**回路里在线优化动作:
|
||||
|
||||
```
|
||||
给定当前观测 x_k 与目标图像 x_g:
|
||||
1. 编码:x_k, x_g ──► 表示空间
|
||||
2. 对候选动作序列 a_{k:k+T},用预测器想象未来状态 ẑ
|
||||
3. 能量函数 E = || ẑ_future − z_goal ||_1 (latent 空间 L1 距离)
|
||||
4. 用交叉熵法(CEM)采样-评估-更新,找使 E 最小的动作序列
|
||||
5. 只执行第一个动作,然后重新规划(receding horizon,滚动时域)
|
||||
```
|
||||
|
||||
实现细节:
|
||||
- **能量 = 想象未来表示与目标表示在 latent 空间的 L1 距离**(goal-conditioned energy function)。论文报告该能量地形**平滑且局部凸**,因此 CEM 能高效收敛。
|
||||
- 动作被约束在 **L1 球、半径 0.075** 内(约对应末端执行器单步位移 ≤ 13 cm),因为大动作对模型而言偏离分布。
|
||||
- 多阶段任务(pick-and-place)用**多子目标**:先对"抓住"子目标优化 4 步 → 切到"举起"子目标 10 步 → 最后"放置"子目标 4 步。
|
||||
|
||||
### 6.4 机器人实验结果(零样本、跨实验室)
|
||||
|
||||
部署条件极具挑战:同一套权重与推理代码,部署到**两个不同实验室**、**Droid 里没出现过**的 Franka + RobotiQ 夹爪,仅靠一个**未标定的低分辨率单目 RGB 相机**,**无奖励、无任务特定数据**。
|
||||
|
||||
| 任务 | V-JEPA 2-AC | 对比基线 |
|
||||
|------|-------------|----------|
|
||||
| Reach(到达目标位姿,无物体) | **100%** | Cosmos: 80% |
|
||||
| Grasp(抓杯/盒) | 65%(杯)/ 25%(盒),均值 65% | Octo: 15%;Cosmos: 0–30% |
|
||||
| Reach w/ Object(持物到位) | 75%(杯)/ 75%(盒) | — |
|
||||
| Pick-and-Place(取放,多阶段) | 80%(杯)/ 65%(盒) | — |
|
||||
| **单步规划耗时** | **~16 秒/动作** | Cosmos: ~4 分钟/动作 |
|
||||
|
||||
- 单目标到达可把位置误差**稳定压到 4 cm 以内**。
|
||||
- 两个对比基线都被"降维打击":**Octo**(行为克隆 VLA,且在 100 万+ 轨迹的 Open-X 上预训练、又在整个 Droid 上微调,数据量远超 V-JEPA 2-AC)物体交互均值仅 ~15%;**Cosmos**(扩散式视频生成世界模型,用同样的能量规划框架)reach 还行(80%)但物体交互很弱,且**单步规划要 4 分钟**——一次完整取放要超过 1 小时机器人执行时间。
|
||||
- 核心结论:**把"学观测"与"学动作条件"解耦**,让大编码器吃海量被动视频、小预测器吃少量真机数据,就能换来零样本可迁移的规划能力。
|
||||
|
||||
---
|
||||
|
||||
## 七、局限与后续方向
|
||||
|
||||
论文与社区讨论中提到的主要局限:
|
||||
|
||||
- **目标图像依赖**:规划需要"目标图像"来定义能量,长程或语言指定的目标还不够自然(后续 TC-JEPA 这类文本条件方向正是补这一块)。
|
||||
- **相机/视角敏感**:对相机位置较敏感,长时域规划仍可能漂移。
|
||||
- **空间任务为主**:当前机器人评测集中在桌面抓取/取放等准静态任务。
|
||||
|
||||
后续演进(仅作指路,细节以各自原始来源为准):
|
||||
|
||||
- **V-JEPA 2.1**:官方仓库已含 `app/vjepa_2_1/` 与 `configs/train_2_1/`,社区报道其主打"解锁稠密特征(dense features)",是 V-JEPA 2 的升级版。
|
||||
- **JEPA 世界模型规划研究**:`facebookresearch/jepa-wms`("What drives success in physical planning with JEPA World Models?")。
|
||||
- **物理推理新基准**:Meta 随 V-JEPA 2 发布了 IntPhys 2 / MVPBench / CausalVQA 等物理常识评测,用于衡量世界模型的"直觉物理"。
|
||||
|
||||
> 上述 2026 年的后续工作请以各自论文/仓库的一手来源核实再引用,本文不对其细节数字背书。
|
||||
|
||||
---
|
||||
|
||||
## 八、与本项目(world model / 具身智能)的对接
|
||||
|
||||
结合 [JEPA 系列综述](index.md) 中已记录的关联,V-JEPA 2 对你正在做的方向有几处直接可借鉴:
|
||||
|
||||
1. **两阶段解耦的工程范式**:大编码器吃海量被动数据、小预测器吃少量交互数据——这套"廉价感知 + 稀缺动作"的配比,对任何"先建感知再加控制"的具身系统都成立。
|
||||
2. **latent 能量规划(MPC + CEM)**:用"想象未来表示与目标表示的 L1 距离"作能量、滚动时域优化动作,是一个**不需要奖励、不需要策略网络**的轻量规划骨架,适合作为 imagination-based planning 的基线实现。
|
||||
3. **渐进式分辨率训练**:若你也要 scaling 视频/多感官编码器,这条 8.4× 提速的 recipe 很值钱。
|
||||
4. **冻结骨干 + 注意力探针**:作为下游任务(分类/检索/对齐 LLM)的标准评测协议,便于公平比较表征质量。
|
||||
|
||||
> 提示:要做"语言指定目标"的规划,V-JEPA 2 原生的"目标图像"接口需要替换为文本条件能量——这正是文本条件 JEPA 路线要解决的缺口。
|
||||
|
||||
---
|
||||
|
||||
## 九、参考与资源
|
||||
|
||||
**论文 / 官方**
|
||||
- V-JEPA 2 论文:arXiv:2506.09985("Self-Supervised Video Models Enable Understanding, Prediction and Planning",FAIR @ Meta + Mila)
|
||||
- Meta 官方介绍:ai.meta.com/research/vjepa/ 与 ai.meta.com/blog/v-jepa-2-world-model-benchmarks/
|
||||
- 官方代码:github.com/facebookresearch/vjepa2(demo: `notebooks/vjepa2_demo.ipynb`)
|
||||
- HuggingFace 文档:huggingface.co/docs/transformers/en/model_doc/vjepa2
|
||||
- 权重:huggingface.co/facebook(vjepa2-vit{l,h,g}-fpc64-* 及 ssv2 微调版)
|
||||
|
||||
**关键数字速查**
|
||||
- 编码器 ViT-g >1B(隐藏维 1408);预训练预测器 ~22M(12 层/384);AC 预测器 ~300M(24 层/16 头/1024)
|
||||
- tubelet 2×16×16;3D-RoPE;掩码率 ~90%;训练 90k→252k 迭代;渐进分辨率 8.4× 提速
|
||||
- 数据:VM22M(22M 视频,>1M 小时)+ 1M 图像;AC 数据 Droid <62h / ~23k 轨迹
|
||||
- SSv2 77.3;EK-100 39.7 R@5;6 任务均值 88.2%;PerceptionTest 84.0;TempCompass 76.9
|
||||
- 机器人:Reach 100% / Grasp 65% / Pick-place 80%(杯);16 s/动作 vs Cosmos 4 min/动作
|
||||
@@ -0,0 +1,542 @@
|
||||
---
|
||||
title: "V-JEPA 2 源码逐模块剖析(代码篇)"
|
||||
date: 2026-05-24
|
||||
draft: false
|
||||
tags: ["V-JEPA 2", "JEPA", "源码", "code-walkthrough", "self-supervised", "RoPE", "masking", "world-model", "robotics"]
|
||||
categories: ["JEPA"]
|
||||
description: "基于 facebookresearch/vjepa2 本地源码的逐模块剖析:multi-block tube 掩码采样、编码器(3D-RoPE/apply_masks)、动作无关预测器、V-JEPA 2-AC 块因果预测器,以及自监督训练全链路闭环。是《V-JEPA 2 深度技术剖析》的代码篇配套。"
|
||||
---
|
||||
|
||||
> 本文是 [《V-JEPA 2 深度技术剖析》](V-JEPA2深度技术剖析.md) 的**代码篇配套**,全部基于本地 clone 的官方仓库 `facebookresearch/vjepa2`(MIT License)逐行阅读整理。行号与文件路径以仓库 `main` 分支为准,升级版本可能略有变动。
|
||||
>
|
||||
> 阅读主线(数据流顺序):**掩码采样 → 编码器 → 动作无关预测器 → AC 预测器 → 训练闭环**。
|
||||
|
||||
---
|
||||
|
||||
## 〇、文件地图与真实配置速查
|
||||
|
||||
| 模块 | 文件 | 关键类/函数 |
|
||||
|------|------|-------------|
|
||||
| 掩码采样 | `src/masks/multiseq_multiblock3d.py` | `MaskCollator` / `_MaskGenerator` |
|
||||
| 取 token 工具 | `src/masks/utils.py` | `apply_masks` |
|
||||
| 编码器 | `src/models/vision_transformer.py` | `VisionTransformer` / `vit_giant_xformers_rope` |
|
||||
| tubelet 切分 | `src/models/utils/patch_embed.py` | `PatchEmbed3D` |
|
||||
| 注意力 / RoPE | `src/models/utils/modules.py` | `RoPEAttention` / `ACRoPEAttention` / `rotate_queries_or_keys` / `build_action_block_causal_attention_mask` |
|
||||
| 动作无关预测器 | `src/models/predictor.py` | `VisionTransformerPredictor` |
|
||||
| AC 预测器 | `src/models/ac_predictor.py` | `VisionTransformerPredictorAC` |
|
||||
| 预训练循环 | `app/vjepa/train.py` | `train_step` / `forward_context` / `forward_target` / `loss_fn` |
|
||||
| AC 训练循环 | `app/vjepa_droid/train.py` | teacher-forcing + rollout |
|
||||
| AC 推理/规划桥接 | `notebooks/utils/world_model_wrapper.py` | `WorldModel`(encode / infer_next_action) |
|
||||
| CEM + 能量函数 | `notebooks/utils/mpc_utils.py` | `cem` / `l1` / `compute_new_pose` |
|
||||
|
||||
**编码器 ViT-g**(`vit_giant_xformers_rope`):`embed_dim=1408, depth=40, num_heads=22, mlp_ratio=48/11, use_rope=True`。
|
||||
|
||||
**动作无关预测器**(`pretrain-256px-16f.yaml`):`pred_embed_dim=384, pred_depth=12, pred_num_heads=12, use_mask_tokens=True`(≈22M,刻意做小)。
|
||||
|
||||
**AC 预测器**(`configs/train/vitg16/droid-256px-8f.yaml`):`pred_embed_dim=1024, pred_depth=24, pred_num_heads=16, pred_is_frame_causal=True, use_extrinsics=False, use_rope=True`(≈300M);`context_encoder_key=target_encoder`(直接拿 EMA target encoder 当冻结编码器)。
|
||||
|
||||
**掩码**(`pretrain-256px-16f.yaml`,两套并行):
|
||||
|
||||
```yaml
|
||||
mask:
|
||||
- num_blocks: 8 # 短程:8 个小块
|
||||
spatial_scale: [0.15, 0.15] # 每块覆盖 15% 空间
|
||||
temporal_scale: [1.0, 1.0] # 时间贯穿整段(tube)
|
||||
aspect_ratio: [0.75, 1.5]
|
||||
- num_blocks: 2 # 长程:2 个大块
|
||||
spatial_scale: [0.7, 0.7]
|
||||
temporal_scale: [1.0, 1.0]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 一、掩码采样:`multiseq_multiblock3d.py`
|
||||
|
||||
整条 JEPA 管线的起点。`masks_enc`(上下文下标)/ `masks_pred`(目标下标)都在这里生产。
|
||||
|
||||
### 1.1 两层结构:调度 vs 采样
|
||||
|
||||
`MaskCollator` 是 DataLoader 的 `collate_fn`,本身不采样,只负责调度:按 frames-per-clip(fpc) 分桶(不同帧数 token 网格大小不同,不能混),再对每套掩码配置各调一次生成器:
|
||||
|
||||
```python
|
||||
for i, mask_generator in enumerate(self.mask_generators[fpc]):
|
||||
masks_enc, masks_pred = mask_generator(batch_size)
|
||||
collated_masks_enc.append(masks_enc)
|
||||
collated_masks_pred.append(masks_pred)
|
||||
```
|
||||
|
||||
所以 `masks_enc` / `masks_pred` 是 **list**(每套配置一项)——这解释了编码器里 `for m in masks:` 和 `torch.cat(masks, dim=0)` 为什么要遍历。
|
||||
|
||||
### 1.2 种子心机:块"大小"同步,块"位置"随机
|
||||
|
||||
```python
|
||||
seed = self.step() # 跨 worker 共享计数器
|
||||
g = torch.Generator(); g.manual_seed(seed)
|
||||
p_size = self._sample_block_size(generator=g, ...) # 用种子 → 块大小确定
|
||||
```
|
||||
|
||||
块**尺寸 (t,h,w) 用种子采样**,保证所有数据并行 worker/GPU 采到相同大小(token 序列等长,可凑规整 batch);块**位置**用不带种子的 `torch.randint`,每个样本各自随机。同步大小 + 随机位置 = 既能 batch 又有多样性。
|
||||
|
||||
### 1.3 一个块怎么采
|
||||
|
||||
定大小(scale + 长宽比反解):
|
||||
|
||||
```python
|
||||
t = max(1, int(self.duration * temporal_mask_scale)) # temporal_scale=1.0 → t=duration(贯穿全部帧)
|
||||
spatial_num_keep = int(self.height * self.width * spatial_mask_scale)
|
||||
h = round(sqrt(spatial_num_keep * aspect_ratio))
|
||||
w = round(sqrt(spatial_num_keep / aspect_ratio))
|
||||
```
|
||||
|
||||
`temporal_scale=1.0` ⇒ `t=duration`,块在时间上**贯穿整段** = 一根"时空管(tube)"。这是要点:把同一空间位置在所有帧上一起遮掉,**模型无法靠抄相邻帧作弊,只能真正学运动**。
|
||||
|
||||
定位置并标 0(`0=待预测,1=上下文`):
|
||||
|
||||
```python
|
||||
mask = torch.ones((duration, height, width))
|
||||
mask[start:start+t, top:top+h, left:left+w] = 0
|
||||
```
|
||||
|
||||
### 1.4 多块取并集,切出两组下标
|
||||
|
||||
```python
|
||||
mask_e = torch.ones((duration, height, width))
|
||||
for _ in range(self.npred): # npred = num_blocks,如 8
|
||||
mask_e *= self._sample_block_mask(p_size) # 连乘 = 并集
|
||||
mask_e = mask_e.flatten()
|
||||
|
||||
mask_p = torch.argwhere(mask_e == 0).squeeze() # 目标(被遮)下标
|
||||
mask_e = torch.nonzero(mask_e).squeeze() # 上下文(保留)下标
|
||||
```
|
||||
|
||||
`mask_e *= block` 连乘是精髓:patch 只有**落在所有块之外**才保持 1,落进任意块就被乘成 0。`npred` 个块取**并集**,两套配置(8×15% + 2×70%)叠加后被遮区逼近 ~90%。`argwhere(==0)` 出目标下标、`nonzero` 出上下文下标,二者是同一 token 网格上互补的索引集合。
|
||||
|
||||
`empty_context` while 守卫:若某次把所有 patch 都遮了就重采,保证编码器有输入。
|
||||
|
||||
### 1.5 截断到 min_keep(为了 stack)
|
||||
|
||||
每样本被遮数不同 → 下标长度不齐 → 没法堆张量。于是全 batch 取最短并截断:
|
||||
|
||||
```python
|
||||
collated_masks_enc = [cm[:min_keep_enc] for cm in collated_masks_enc]
|
||||
collated_masks_pred = [cm[:min_keep_pred] for cm in collated_masks_pred]
|
||||
collated_masks_enc = torch.utils.data.default_collate(collated_masks_enc)
|
||||
```
|
||||
|
||||
这就是 `apply_masks` 拿到的 `masks` 为规整 `[B, K]` 张量的原因。
|
||||
|
||||
### 1.6 几个开关
|
||||
|
||||
- `full_complement`:预测掩码 = 编码掩码的精确补集(集合差)。
|
||||
- `pred_full_complement`:反向,编码掩码 = 预测掩码补集。
|
||||
- `inv_block`:交换返回 `return masks_pred, masks_enc`(用块预测上下文的反向任务)。默认 `return masks_enc, masks_pred`。
|
||||
|
||||
---
|
||||
|
||||
## 二、取 token 工具:`apply_masks`(`src/masks/utils.py`)
|
||||
|
||||
```python
|
||||
def apply_masks(x, masks, concat=True):
|
||||
# x: [B, N, D]; masks: list of [B, K] 下标
|
||||
all_x = []
|
||||
for m in masks:
|
||||
mask_keep = m.unsqueeze(-1).repeat(1, 1, x.size(-1)) # [B, K, D]
|
||||
all_x += [torch.gather(x, dim=1, index=mask_keep)] # 按下标取 token
|
||||
return torch.cat(all_x, dim=0)
|
||||
```
|
||||
|
||||
核心是 `torch.gather`:沿 token 维按下标取出需要的 token。多块掩码沿 batch 维(dim=0)堆叠,相当于把一个样本的多种掩码当成更大 batch 一起算。
|
||||
|
||||
---
|
||||
|
||||
## 三、编码器:`VisionTransformer.forward`(`vision_transformer.py:161`)
|
||||
|
||||
> 关键认知:代码里**没有"裁一块图"**。整段视频先切成全部 token,再用下标 `gather` 出上下文 token。被遮 token 不是置零,而是**直接删除、不参与计算**。
|
||||
|
||||
```python
|
||||
def forward(self, x, masks=None):
|
||||
# (a) 切 token:3D 卷积;use_rope 时不加绝对位置
|
||||
if not self.use_rope:
|
||||
pos_embed = self.interpolate_pos_encoding(x, self.pos_embed)
|
||||
x = self.patch_embed(x); x += pos_embed
|
||||
else:
|
||||
x = self.patch_embed(x) # ViT-g 走这条
|
||||
|
||||
# (b) 挑出上下文 token
|
||||
if masks is not None:
|
||||
x = apply_masks(x, masks) # 丢掉被遮 token
|
||||
masks = torch.cat(masks, dim=0) # 下标继续往下传(给 RoPE 还原位置)
|
||||
|
||||
# (c) Transformer 编码
|
||||
for blk in self.blocks:
|
||||
x = blk(x, mask=masks, attn_mask=None, T=T, H_patches=H_patches, W_patches=W_patches)
|
||||
x = self.norm(x)
|
||||
return x
|
||||
```
|
||||
|
||||
`apply_masks` 在 tokenize 之后、进 Transformer 之前 → ~90% token 在进注意力前就丢了,这是高掩码率下省算力的根因。
|
||||
|
||||
### 3.1 tubelet 切分:`PatchEmbed3D`
|
||||
|
||||
```python
|
||||
self.proj = nn.Conv3d(
|
||||
in_channels=3, out_channels=embed_dim,
|
||||
kernel_size=(tubelet_size, patch_size, patch_size), # (2, 16, 16)
|
||||
stride=(tubelet_size, patch_size, patch_size), # 不重叠
|
||||
)
|
||||
def forward(self, x): # x: [B, C, T, H, W]
|
||||
return self.proj(x).flatten(2).transpose(1, 2) # -> [B, N, embed_dim]
|
||||
```
|
||||
|
||||
一个 `2×16×16` 时空管元 → 一个向量。
|
||||
|
||||
### 3.2 删了 token,位置靠"下标"续命:`RoPEAttention`(`modules.py:266`)
|
||||
|
||||
token 被删一大半、顺序也乱,模型怎么知道每个上下文块原来的位置?答案在传下来的下标:
|
||||
|
||||
```python
|
||||
if mask is not None:
|
||||
mask = mask.unsqueeze(1).repeat(1, self.num_heads, 1)
|
||||
d_mask, h_mask, w_mask = self.separate_positions(mask, H_patches, W_patches)
|
||||
```
|
||||
|
||||
`separate_positions` 把一维下标反解成 (帧, 高, 宽) 三个坐标:
|
||||
|
||||
```python
|
||||
frame_ids = ids // tokens_per_frame
|
||||
height_ids = (ids - 帧分量) // tokens_per_row
|
||||
width_ids = ids - 帧分量 - 高分量
|
||||
```
|
||||
|
||||
再把每个 head 的特征维三等分,按 t/h/w 各自旋转:
|
||||
|
||||
```python
|
||||
qd = rotate_queries_or_keys(q[..., s:s+self.d_dim], pos=d_mask) # 时间
|
||||
qh = rotate_queries_or_keys(q[..., s:s+self.h_dim], pos=h_mask) # 高
|
||||
qw = rotate_queries_or_keys(q[..., s:s+self.w_dim], pos=w_mask) # 宽
|
||||
q = torch.cat([qd, qh, qw, qr], dim=-1) # qr 是不旋转的余数维
|
||||
```
|
||||
|
||||
**要点:位置不靠 token 在序列里的顺序,而靠它的原始下标算出来**——所以哪怕 token 删得七零八落,每个块仍带着真实 (t,h,w)。
|
||||
|
||||
### 3.3 RoPE 旋转真身 + 一个官方标注的 bug:`rotate_queries_or_keys`(`modules.py:26`)
|
||||
|
||||
```python
|
||||
def rotate_queries_or_keys(x, pos):
|
||||
B, num_heads, N, D = x.size()
|
||||
omega = torch.arange(D // 2) / (D / 2.0)
|
||||
omega = 1.0 / 10000**omega # 角速度 ω_i
|
||||
freq = torch.einsum("..., f -> ... f", pos, omega) # 角度 = 位置 × ω
|
||||
emb_sin, emb_cos = freq.sin(), freq.cos()
|
||||
|
||||
# ↓↓↓ 官方注释:这里有个 subtle bug,频率在配对维上被错误复制
|
||||
emb_sin = emb_sin.squeeze(-1).repeat(1, 1, 1, 2) # 实际用的(有 bug)
|
||||
emb_cos = emb_cos.squeeze(-1).repeat(1, 1, 1, 2)
|
||||
# emb_sin = emb_sin.repeat_interleave(2, dim=-1) # 正确写法(被注释掉)
|
||||
# emb_cos = emb_cos.repeat_interleave(2, dim=-1)
|
||||
|
||||
y = x.unflatten(-1, (-1, 2))
|
||||
y1, y2 = y.unbind(dim=-1)
|
||||
y = torch.stack((-y2, y1), dim=-1).flatten(-2) # (y1,y2)->(-y2,y1)
|
||||
return (x * emb_cos) + (y * emb_sin)
|
||||
```
|
||||
|
||||
RoPE 思想:不是"加"位置向量,而是按位置把特征在每个二维平面里**旋转一个角度**;两 token 点积时旋转角之差只取决于**相对位置** → 天然编码相对距离、可外推到没见过的分辨率/长度(这正是论文用 3D-RoPE 稳住大模型 + 支持渐进分辨率的底层依据)。
|
||||
|
||||
**那个 bug 的工程教训**:标准 RoPE 频率应与相邻配对 `(y1,y2)` 用 `repeat_interleave(2)`(`[a,b,c]→[a,a,b,b,c,c]`)对齐;代码用了 `repeat(...,2)`(`[a,b,c]→[a,b,c,a,b,c]`),频率与配对维错位。官方明说:发布的预训练权重就是在这个"错"的实现上训出来的,**改对反而和 checkpoint 不兼容**,故保留原样、正确版注释旁边。加载官方权重做下游必须沿用 bug 版;只有从头自训才该切正确版。
|
||||
|
||||
---
|
||||
|
||||
## 四、动作无关预测器:`VisionTransformerPredictor.forward`(`predictor.py:174`)
|
||||
|
||||
任务:拿编码器给的上下文表示 `z_ctx`,在**目标位置**把表示补出来。
|
||||
|
||||
```python
|
||||
def forward(self, x, masks_x, masks_y, ...):
|
||||
# x: 上下文表示(z_ctx);masks_x: 上下文下标;masks_y: 目标下标
|
||||
```
|
||||
|
||||
### 4.1 先降维("预测器很轻"的代码证据)
|
||||
|
||||
```python
|
||||
x = self.predictor_embed(x) # Linear: 1408 -> 384
|
||||
```
|
||||
|
||||
进门就压到 384 维,整个预测器在窄空间算,算完再投影回去。
|
||||
|
||||
### 4.2 给目标位置造可学习占位符
|
||||
|
||||
```python
|
||||
pred_tokens = self.mask_tokens[mask_index] # 一个可学习 [MASK] 向量
|
||||
pred_tokens = pred_tokens.repeat(B, self.num_patches, 1)
|
||||
pred_tokens = apply_masks(pred_tokens, masks_y) # 只在目标位置放占位符
|
||||
```
|
||||
|
||||
目标位置**不喂内容**(内容正是要预测的),只放一个所有目标位置共享的可学习 mask token,信息全靠位置编码注入。
|
||||
|
||||
### 4.3 拼接 + 排序
|
||||
|
||||
```python
|
||||
x = torch.cat([x, pred_tokens], dim=1) # [上下文表示 | 目标占位符]
|
||||
masks = torch.cat([masks_x, masks_y], dim=1) # 每个 token 的原始下标
|
||||
argsort = torch.argsort(masks, dim=1) # 按原始位置排序
|
||||
x = ...[argsort]; masks = ...[argsort]
|
||||
```
|
||||
|
||||
拼起来的序列空间上是乱的,按原始下标排序恢复成 (t,h,w) 顺序,再把 `masks` 传进 `blk(x, mask=masks)` 让 RoPE 还原坐标。
|
||||
|
||||
### 4.4 过 Transformer,抠回目标、升回维
|
||||
|
||||
```python
|
||||
for blk in self.predictor_blocks:
|
||||
x = blk(x, mask=masks, attn_mask=None)
|
||||
x = self.predictor_norm(x)
|
||||
reverse_argsort = torch.argsort(argsort, dim=1)
|
||||
x = ...[reverse_argsort]; x = x[:, N_ctxt:] # 复原排序,只取目标位置
|
||||
x = self.predictor_proj(x) # Linear: 384 -> 1408
|
||||
return x # ẑ_tgt
|
||||
```
|
||||
|
||||
整条链路 **1408 → 压到 384 算 → 升回 1408** 就是"轻量预测器"的全部秘密。
|
||||
|
||||
---
|
||||
|
||||
## 五、AC 预测器:`VisionTransformerPredictorAC`(`ac_predictor.py`)
|
||||
|
||||
把"被遮 patch"换成"未来帧","mask token"换成"动作/状态 token + 块因果掩码",复用同一套 latent 预测骨架做规划。
|
||||
|
||||
### 5.1 四个编码器:把"看的"和"做的"统一进 1024 维
|
||||
|
||||
```python
|
||||
self.predictor_embed = nn.Linear(embed_dim, 1024) # 1408 -> 1024(图像 patch)
|
||||
self.action_encoder = nn.Linear(action_embed_dim, 1024) # 7 -> 1024(动作)
|
||||
self.state_encoder = nn.Linear(action_embed_dim, 1024) # 7 -> 1024(末端位姿/本体感知)
|
||||
self.extrinsics_encoder = nn.Linear(action_embed_dim-1, 1024) # 6 -> 1024(相机外参,droid 关闭)
|
||||
```
|
||||
|
||||
`action_embed_dim=7`:Franka 动作/状态正好 7 维(末端 6-DoF 位姿增量 + 1 维夹爪)。动作/位姿各过一个线性层变成与 patch 同维的 token——这是"注入"的第一层含义。
|
||||
|
||||
### 5.2 注入方式:把动作/状态插进每帧开头
|
||||
|
||||
```python
|
||||
s = self.state_encoder(states).unsqueeze(2) # [B, T, 1, D]
|
||||
a = self.action_encoder(actions).unsqueeze(2) # [B, T, 1, D]
|
||||
x = x.view(B, T, H*W, D)
|
||||
x = torch.cat([a, s, x], dim=2).flatten(1, 2) # [B, T*(H*W+2), D]
|
||||
```
|
||||
|
||||
序列按帧分块:`[ a₁ s₁ p₁... | a₂ s₂ p₂... | ... ]`。`cond_tokens=2`(开 extrinsics 则 3)。这对应论文"每个 patch 能注意到同一时间步的动作、末端状态和其他 patch"。
|
||||
|
||||
### 5.3 块因果掩码:`build_action_block_causal_attention_mask`
|
||||
|
||||
```python
|
||||
def build_action_block_causal_attention_mask(T, H, W, add_tokens=1):
|
||||
N_T = add_tokens + (H * W) # 每帧 block 的 token 数
|
||||
mask = torch.zeros(T*N_T, T*N_T).bool()
|
||||
mask_block = torch.ones(N_T, N_T).bool() # 帧内:全连接
|
||||
local_window_time = T # 看全部历史
|
||||
for t1 in range(T):
|
||||
for t2 in range(max(0, t1 - local_window_time + 1), t1 + 1): # t2 <= t1
|
||||
mask[t1*N_T:(t1+1)*N_T, t2*N_T:(t2+1)*N_T] = mask_block
|
||||
return mask
|
||||
```
|
||||
|
||||
- `mask_block=ones`:**帧内部全连接**(同一时刻动作/状态/所有 patch 互看)。
|
||||
- `t2` 只到 `t1`:**只能 attend 过去帧,禁看未来**。
|
||||
- 即"**块**因果":帧粒度因果、块内全连接(不希望同帧后一个 patch 看不到前一个,只希望整帧看不到下一帧)。
|
||||
- 布尔约定:直接喂 `F.scaled_dot_product_attention(attn_mask=mask)`,`True=允许 attend`。
|
||||
|
||||
**`is_causal` 怎么生效**:真正的因果性靠这个**显式 attn_mask** 实现,**不是** SDPA 的 `is_causal` flag(那是逐 token 下三角,对块结构是错的)。config 的 `pred_is_frame_causal: true` 控制的是"造不造并用这个块因果矩阵"(构造函数里 `if self.is_frame_causal: attn_mask = build_...`),而非把 SDPA 的 `is_causal` 设 True。
|
||||
|
||||
### 5.4 动作 token 与 patch 的 RoPE 不同(`ACRoPEAttention`)
|
||||
|
||||
```python
|
||||
# 动作/状态 token:只在时间维(depth)旋转,位置=帧号
|
||||
qd = rotate_queries_or_keys(q[..., :self.d_dim], pos=torch.arange(T))
|
||||
qr = q[..., self.d_dim:] # 其余维不旋转
|
||||
```
|
||||
|
||||
patch token 走完整 3D-RoPE。对应论文"动作和位姿用时间维 rotary,视频 patch 用 3D-RoPE"——动作没有空间行列,只有"第几帧"。另有分辨率归一化:`h_mask *= grid_size/H; w_mask *= grid_size/W`(换分辨率时位置编码一致)。
|
||||
|
||||
### 5.5 出口:只要 patch 预测
|
||||
|
||||
```python
|
||||
x = x.view(B, T, cond_tokens + H*W, D)
|
||||
x = x[:, :, cond_tokens:, :].flatten(1, 2) # 丢掉动作/状态 token
|
||||
x = self.predictor_norm(x)
|
||||
x = self.predictor_proj(x) # 1024 -> 1408
|
||||
return x
|
||||
```
|
||||
|
||||
动作/状态只是条件输入、不需预测;输出只取 patch、投影回 1408,得到"给定历史帧 + 当前动作,下一帧每个 patch 的预测表示"。
|
||||
|
||||
> 注:`ac_predictor.py` 里 `from src.models.utils.modules import ACBlock as Block`,块内部用的是 `ACBlock`(其 `forward` 接收 `action_tokens` 参数)。
|
||||
|
||||
---
|
||||
|
||||
## 六、预训练训练循环:`app/vjepa/train.py:424`
|
||||
|
||||
```python
|
||||
def forward_target(c):
|
||||
with torch.no_grad(): # stop-grad
|
||||
h = target_encoder(c) # 喂【完整视频】,不传 masks
|
||||
h = [F.layer_norm(hi, (hi.size(-1),)) for hi in h]
|
||||
return h
|
||||
|
||||
def forward_context(c):
|
||||
z = encoder(c, masks_enc) # 只看上下文 → z_ctx
|
||||
z = predictor(z, masks_enc, masks_pred) # 补目标位置 → ẑ_tgt
|
||||
return z
|
||||
|
||||
def loss_fn(z, h):
|
||||
h = [apply_masks(hi, mi, concat=False) for hi, mi in zip(h, masks_pred)] # 此处才取目标块
|
||||
loss = torch.mean(torch.abs(zij - hij) ** loss_exp) / loss_exp # loss_exp=1 → L1
|
||||
```
|
||||
|
||||
两条编码路径的对比是关键:
|
||||
|
||||
- **上下文分支**:`encoder(c, masks_enc)` —— 只看上下文、可训练。
|
||||
- **目标分支**:`target_encoder(c)` —— 看完整视频、是 encoder 的 **EMA 副本**、`no_grad`;直到 `loss_fn` 才用 `masks_pred` 抠出目标块当真值。
|
||||
|
||||
损失 `|z − h|`(`loss_exp=1` 即 L1),只在被遮 token 上算——与论文"表示空间 L1、仅在 masked patch"一致。EMA + stop-grad 即防坍塌机制。
|
||||
|
||||
---
|
||||
|
||||
## 七、AC 推理:CEM + 能量函数规划(`notebooks/utils/`)
|
||||
|
||||
> 定位提醒:`app/vjepa_droid/` 是**训练侧**;真正"跑起来"的规划在 `notebooks/utils/mpc_utils.py`(CEM)与 `world_model_wrapper.py`(桥接)。二者与训练侧的 rollout 是同一机制的"推理版/训练版"。
|
||||
|
||||
### 7.1 桥接层 `WorldModel`(`world_model_wrapper.py`)
|
||||
|
||||
把"编码器 + AC 预测器"包成可被规划器调用的世界模型。默认 MPC 超参:
|
||||
|
||||
```python
|
||||
mpc_args = {"rollout": 2, "samples": 400, "topk": 10, "cem_steps": 10,
|
||||
"momentum_mean": 0.15, "momentum_std": 0.15, "maxnorm": 0.05}
|
||||
```
|
||||
|
||||
`encode(image)`:单帧得先复制成 2 帧(tubelet 时间核=2)再编码,且**必须 layer_norm**(与训练目标同一归一化空间,能量尺度才对齐):
|
||||
|
||||
```python
|
||||
clip = clip.permute(...).flatten(0,1).unsqueeze(2).repeat(1, 1, 2, 1, 1) # 单帧 → 2 帧
|
||||
h = self.encoder(clip)
|
||||
if self.normalize_reps: h = F.layer_norm(h, (h.size(-1),))
|
||||
```
|
||||
|
||||
`infer_next_action`:定义"走一步"的闭包交给 `cem`。要点——**视觉表示靠 AC 预测器"想象",本体位姿靠运动学硬算**:
|
||||
|
||||
```python
|
||||
def step_predictor(reps, actions, poses):
|
||||
next_rep = self.predictor(reps, actions, poses)[:, -self.tokens_per_frame:] # 取最后一帧预测
|
||||
if self.normalize_reps: next_rep = F.layer_norm(next_rep, (next_rep.size(-1),))
|
||||
next_pose = compute_new_pose(poses[:, -1:], actions[:, -1:]) # 运动学积分,非网络预测
|
||||
return next_rep, next_pose
|
||||
mpc_action = cem(context_frame=rep, context_pose=pose, goal_frame=goal_rep,
|
||||
world_model=step_predictor, **self.mpc_args)[0]
|
||||
```
|
||||
|
||||
### 7.2 能量函数就是 latent L1(`mpc_utils.py`)
|
||||
|
||||
```python
|
||||
def l1(a, b):
|
||||
return torch.mean(torch.abs(a - b), dim=-1) # 想象状态 vs 目标状态,逐元素 L1
|
||||
```
|
||||
|
||||
论文的 goal-conditioned energy function,落到代码就这一行。
|
||||
|
||||
### 7.3 只优化"平移 + 夹爪",旋转冻结为 0(读源码才见的简化)
|
||||
|
||||
动作名义 7 维,分布只建在 4 维(xyz + gripper)上;采样时旋转 3 维恒填 0:
|
||||
|
||||
```python
|
||||
std = cat([ones((rollout,3)) * maxnorm, ones((rollout,1))], dim=-1) # xyz 的 std=maxnorm
|
||||
action_samples = randn(samples, 4) * std[h] + mean[h]
|
||||
action_samples[:, :3] = clip(action_samples[:, :3], -maxnorm, maxnorm) # ← L1 球动作约束
|
||||
action_samples = cat([action_samples[:, :3], zeros((len,3)), action_samples[:, -1:]], -1) # 旋转恒 0
|
||||
```
|
||||
|
||||
`clip(±maxnorm)` 即论文"每步动作约束在 L1 球内"(默认 `maxnorm=0.05`;论文桌面实验报半径 0.075≈13cm,数量级一致,实验脚本可覆盖默认值),理由是大动作 out-of-distribution。
|
||||
|
||||
### 7.4 想象 rollout + 选精英 + 动量更新
|
||||
|
||||
```python
|
||||
for h in range(rollout): # 400 条候选同时在 latent 里播放 rollout 步
|
||||
next_frame, next_pose = world_model(frame_traj, action_traj, pose_traj)
|
||||
...
|
||||
sims = l1(final_state.flatten(1), goal_state.flatten(1)) # 只比【最终想象帧】vs 目标
|
||||
idx = sims.topk(topk, largest=False).indices # 取能量最小的 topk 精英
|
||||
mean = mean_selected * (1 - momentum_mean) + mean * momentum_mean # 带动量更新分布
|
||||
std = std_selected * (1 - momentum_std) + std * momentum_std
|
||||
```
|
||||
|
||||
全程不解码回像素——预测/比较/打分都在表示空间,这是比扩散式 Cosmos 快一个数量级(16s vs 4min)的根因。迭代 `cem_steps` 轮后返回分布均值作动作。标准 CEM:采样 → 评估 → 留精英 → 更新分布,纯采样无梯度,单卡可跑。
|
||||
|
||||
### 7.5 受控时域(receding horizon)
|
||||
|
||||
`cem` 返回 `[1, rollout, 7]` 整条轨迹,但外层执行循环**只落地第一个动作,再重新编码当前观测、重新规划**。`rollout=2` = 每次做 2 步前瞻、只执行 1 步,用前瞻避免短视。
|
||||
|
||||
### 7.6 位姿用确定性运动学:`compute_new_pose`
|
||||
|
||||
```python
|
||||
new_xyz = pose[:, :3] + action[:, :3] # 平移相加
|
||||
angle_diff = [dm @ m for dm, m in zip(delta_matrices, matrices)] # 旋转矩阵相乘复合
|
||||
new_closedness = np.clip(pose[:, -1:] + action[:, -1:], 0, 1) # 夹爪裁剪
|
||||
```
|
||||
|
||||
位姿用真实运动学递推(平移加、旋转复合、夹爪裁剪),不让网络在低维本体状态上犯错。`poses_to_diff` 是逆运算(从当前位姿→目标位姿反解动作)。
|
||||
|
||||
### 7.7 训练侧为何配套:teacher-forcing + rollout 双损失(`app/vjepa_droid/train.py:417`)
|
||||
|
||||
推理要多步 rollout,训练就必须同时练单步和多步,否则误差累积漂移:
|
||||
|
||||
```python
|
||||
z_tf = _step_predictor(z[:, :-tokens_per_frame], actions, states[:,:-1], extrinsics[:,:-1]) # teacher forcing
|
||||
_z = cat([z[:, :tokens_per_frame], z_tf[:, :tokens_per_frame]], dim=1)
|
||||
for n in range(1, auto_steps): # 用自己的预测往后滚
|
||||
_z_nxt = _step_predictor(_z, actions[:, :n+1], states[:, :n+1], extrinsics[:, :n+1])[:, -tokens_per_frame:]
|
||||
_z = cat([_z, _z_nxt], dim=1)
|
||||
z_ar = _z[:, tokens_per_frame:]
|
||||
loss = loss_fn(z_tf, h) + loss_fn(z_ar, h) # 单步 L1 + 多步 rollout L1
|
||||
```
|
||||
|
||||
`sloss`(rollout 项)让预测器在"喂自己预测"时也不漂,**推理时 CEM 的 latent rollout 才可信**——训练 rollout 与推理 CEM rollout 是配套设计。
|
||||
|
||||
---
|
||||
|
||||
## 八、全链路闭环
|
||||
|
||||
```
|
||||
MaskCollator(_MaskGenerator):多块连乘取并集
|
||||
→ (masks_enc 上下文下标, masks_pred 目标下标) §一
|
||||
│
|
||||
▼
|
||||
encoder(clips, masks_enc) → 只编码上下文 → z_ctx §三
|
||||
predictor(z_ctx, masks_enc, masks_pred) → 在目标位置补出 ẑ_tgt §四
|
||||
target_encoder(clips) + apply_masks(masks_pred) → 目标真值 h(EMA, stop-grad)
|
||||
loss = |ẑ_tgt − h|(仅 masks_pred 上, L1) §六
|
||||
```
|
||||
|
||||
AC 阶段(§五):把"被遮 patch"换成"未来帧","mask token"换成"动作/状态 token + 块因果掩码",复用同一 latent 预测骨架;推理时反过来用——给目标图像编码成 `z_goal`,枚举动作让模型在 latent 里 rollout,以 `‖ẑ_future − z_goal‖₁` 为能量,CEM 搜最优动作、执行第一步再重规划(receding horizon)。
|
||||
|
||||
---
|
||||
|
||||
## 九、两条值得记住的设计要点
|
||||
|
||||
1. **multi-block tube 掩码**:① 时间贯穿的 tube(`temporal_scale=1.0`)逼模型学运动而非抄帧;② 块大小同步、位置随机 + 多块并集,在可批处理前提下做出 ~90% 高难度掩码。
|
||||
2. **下标即位置**:掩码通过"删 token + 传下标"实现,位置信息全程由下标 → 3D-RoPE 还原,而非依赖序列顺序。这套机制同时服务于编码器、动作无关预测器和 AC 预测器。
|
||||
|
||||
---
|
||||
|
||||
## 十、工程备忘
|
||||
|
||||
- **RoPE bug 不可贸然修**:`rotate_queries_or_keys` 的频率展开有已知 bug,但权重与之绑定。加载官方 checkpoint 必须沿用 bug 版;从头自训可切注释里的 `repeat_interleave(2)` 正确版。
|
||||
- **块因果 ≠ is_causal**:AC 的时间因果由显式 `attn_mask` 实现,`pred_is_frame_causal` 控制是否构造该矩阵;勿与 SDPA 的逐 token `is_causal` 混淆。
|
||||
- **min_keep 截断有信息损失**:为可批处理,全 batch 下标截到最短,会丢掉少量 patch;高 batch 多样性下影响小。
|
||||
- **AC 复用 EMA 编码器**:`context_encoder_key=target_encoder`,AC 阶段冻结的是预训练的 EMA target encoder,不是在线 encoder。
|
||||
- **规划默认不搜旋转**:`cem` 默认只优化平移 + 夹爪,旋转 3 维恒为 0(`axis` 可手动钉死其他维);大幅缩小搜索空间。
|
||||
- **能量尺度靠 layer_norm 对齐**:编码、预测、目标三处都 layer_norm,规划能量(latent L1)才在同一尺度;推理侧 `normalize_reps` 必须与训练一致。
|
||||
- **训练 rollout ↔ 推理 CEM rollout 配套**:缺了训练侧的 `sloss`(autoregressive rollout 损失),推理时多步 latent rollout 会漂移、CEM 失准。
|
||||
|
||||
---
|
||||
|
||||
> 配套阅读:方法/数字/机器人结果见 [《V-JEPA 2 深度技术剖析》](V-JEPA2深度技术剖析.md);系列脉络见 [《Meta JEPA 系列全面调研》](index.md)。
|
||||
@@ -0,0 +1,542 @@
|
||||
# 多感官物体感知与触觉:方向综述
|
||||
|
||||
> 子方向:Multisensory Object Perception & Tactile Sensing
|
||||
> 锚点论文:**ObjectFolder 系列**(CoRL 2021 / CVPR 2022 / CVPR 2023)与 **VTV-LLM**(NeurIPS 2025)
|
||||
> 定位:本综述以 MultiPLY 为出发点,系统梳理"让机器同时用视觉、听觉、触觉(乃至温度)感知物体"这一方向的传感器、仿真、数据集、表示学习、与大模型结合、以及机器人操作应用,面向研究者。
|
||||
> 配套阅读:同目录《MultiPLY技术讲解.md》
|
||||
|
||||
---
|
||||
|
||||
## 1. 这个方向是什么,为什么重要
|
||||
|
||||
人类认识一个物体,从来不是只靠"看"。判断牛油果熟没熟要捏一捏(触觉硬度),判断杯子是空是满可以敲一敲(撞击声),判断锅烫不烫要靠温度。这些**只有交互才能获得**的物理属性,正是纯视觉模型的盲区——视觉能告诉你"这是个杯子",但说不准它的材质、软硬、温度、是否中空。
|
||||
|
||||
"多感官物体感知与触觉"这个方向,研究的就是如何让机器获得、表示并推理这些**视觉之外的物体物理属性**,核心模态是:
|
||||
|
||||
- **触觉(tactile)**:接触面的微观几何、纹理、软硬、滑动/形变——最难也最关键的一环;
|
||||
- **听觉(audio / impact sound)**:敲击声携带材质、结构(实心/中空)、尺寸信息;
|
||||
- **温度(thermal)**:材质导热性的代理信号;
|
||||
- 它们与**视觉、语言**的对齐与融合。
|
||||
|
||||
这与 MultiPLY 的关系非常直接:**MultiPLY 是"具身体 + 多感官 + LLM"的集成系统,而本方向提供它赖以成立的全部底层积木**——MultiPLY 的撞击声与材质来自 **ObjectFolder**,触觉来自 **DiffTactile**,而把触觉/多感官接进语言模型的范式(Octopi、TVL、VTV-LLM)则是它的同代与后继。
|
||||
|
||||
---
|
||||
|
||||
## 2. 方向地图(Taxonomy)
|
||||
|
||||
可以从五个正交维度理解这个方向的所有工作:
|
||||
|
||||
1. **模态组合**:触觉单模态 / 视-触 / 视-触-语 / 视-听-触 / 视-听-触-温。
|
||||
2. **数据来源**:仿真(ObjectFolder、TACTO、Taxim、DiffTactile)vs 真实采集(Touch and Go、SSVTP、ObjectFolder Real)。
|
||||
3. **表示与监督**:自监督跨模态对比(SSVTP、Touch and Go)/ 绑定到视觉锚点(UniTouch,ImageBind 式)/ 三模态成对对比(TVL)/ 隐式神经场(ObjectFolder)。
|
||||
4. **与语言/LLM 的结合度**:无语言(纯表示)→ 触觉-语言对齐(Touch100k、TLV)→ 触觉接入 LLM 做推理(Octopi、VTV-LLM)→ 接入动作(Tactile-VLA、MultiPLY)。
|
||||
5. **下游任务**:材质/属性识别、跨模态检索、接触定位、抓取稳定性预测、形状重建、物理推理问答、操作控制。
|
||||
|
||||
下面先深入两条锚点线,再横向铺开传感器、仿真、数据集、表示学习、LLM 结合与机器人操作。
|
||||
|
||||
---
|
||||
|
||||
## 3. 锚点一:ObjectFolder 系列——多感官物体的"隐式神经数据库"
|
||||
|
||||
ObjectFolder 由斯坦福 / CMU(Ruohan Gao、Jiajun Wu、Li Fei-Fei、Wenzhen Yuan 等)推动,三代演进,是整个方向最具影响力的数据基座。
|
||||
|
||||
### 3.1 核心思想:Object File 与隐式神经表示
|
||||
|
||||
它借用认知科学的 **"Object File"** 概念(Kahneman)——一个物体在某位置上被接收到的全部感官信息。ObjectFolder 把每个物体建模成一个**紧凑的隐式神经网络**,内含三个子网络:
|
||||
|
||||
- **VisionNet**:给定相机视角/光照,渲染外观;
|
||||
- **AudioNet**:给定敲击位置/力度,给出撞击声;
|
||||
- **TouchNet**:给定接触位置/凝胶形变,给出触觉读数(按 DIGIT 传感器建模)。
|
||||
|
||||
关键设计是 **"intrinsic(物体内禀)/ extrinsic(查询参数)分离"**:物体的内禀属性固化在网络权重里,用外参(视角、敲击点、接触点)去"查询"就能得到对应模态的感官信号。这让数据集既紧凑又灵活——存的是网络,不是海量渲染结果。
|
||||
|
||||
### 3.2 三代演进
|
||||
|
||||
| 代次 | 会议 | 物体数 | 关键进展 |
|
||||
|------|------|--------|----------|
|
||||
| **ObjectFolder 1.0** | CoRL 2021 | 100(虚拟) | 首次把视/听/触统一进隐式神经表示;4 个基准任务:实例识别、跨模态检索、3D 重建、机器人抓取 |
|
||||
| **ObjectFolder 2.0** | CVPR 2022 | 1000(虚拟) | 规模 ×10、渲染快几个数量级、质量大幅提升;**首次实现 sim2real**(尺度估计、接触定位、形状重建三任务从虚拟物体迁移到真实物体) |
|
||||
| **ObjectFolder Benchmark + ObjectFolder Real** | CVPR 2023 | +100(真实) | 10 个标准化任务(围绕识别、重建、操作);用 Franka 机械臂 + GelSight 采集 100 个真实家用物体的网格、视频、撞击声、触觉,建立 neural↔real 对照基准 |
|
||||
|
||||
### 3.3 它为什么对 MultiPLY 至关重要
|
||||
|
||||
MultiPLY 的数据流水线里,**ObjectFolder 提供了 1k 物体网格 + 以隐式神经场存储的撞击声 + 材质标注**——智能体"敲击"(`<hit>`)一个物体时听到的声音,正是查询 AudioNet 得到的。可以说没有 ObjectFolder 这类"可查询的多感官物体库",MultiPLY 的"主动交互取声"就无从谈起。
|
||||
|
||||
---
|
||||
|
||||
## 4. 锚点二:VTV-LLM——把触觉"视频"接进大语言模型
|
||||
|
||||
**VTV-LLM: Universal Visuo-Tactile Video Understanding for Embodied Interaction**(NeurIPS 2025,Yifan Xie 等)是首个面向**通用视触觉视频(Visuo-Tactile Video)理解**的多模态大语言模型,把触觉感知正式当作"跨模态推理"问题——让触觉视频与语言描述对齐,从而对物理属性做复杂推理。
|
||||
|
||||
### 4.1 为什么是"视频"而非"图像"
|
||||
|
||||
视触觉传感器(GelSight/DIGIT 等)本质是相机,但它的输出与自然图像差异巨大,且**触觉本身是时序过程**:按压、滑动、形变都在时间维度展开,存在帧间相关与时间冗余。所以 VTV-LLM 强调对触觉**视频**做鲁棒的时序表示,而非把它当静态图。
|
||||
|
||||
### 4.2 VTV150K 数据集
|
||||
|
||||
- **规模**:150,000 视频帧,来自 **100 个物体**;
|
||||
- **跨传感器**:横跨 **GelSight Mini、DIGIT、Tac3D** 三种传感器(这点很重要——跨传感器泛化是触觉领域的老大难);
|
||||
- **属性标注**:四个基础触觉属性——**硬度(hardness)、凸起(protrusion)、弹性(elasticity)、摩擦(friction)**;
|
||||
- **问答构造**:用结构化模板 + 比较算子(more/less/most/least)+ 属性选择器,生成约 **10,000 条 QA 对**,支持比较分析、场景决策等。
|
||||
|
||||
### 4.3 三阶段训练范式
|
||||
|
||||
1. **VTV enhancement**:学习鲁棒的视触觉表示(针对触觉视频的特性做专门微调);
|
||||
2. **VTV-text alignment**:建立视触觉与语言的跨模态对应;
|
||||
3. **text prompt finetuning**:让模型用自然语言生成回答。
|
||||
|
||||
最终能做触觉特征评估、表面特征区分、触觉场景分析等具身交互任务。
|
||||
|
||||
### 4.4 它在谱系中的位置
|
||||
|
||||
VTV-LLM 与 MultiPLY 是互补的:MultiPLY 把触觉作为"多感官之一"塞进具身 LLM、强调主动交互闭环;VTV-LLM 则**专攻触觉这一条模态的深度理解**(时序、跨传感器、细粒度属性、可比较推理)。两者合起来勾勒了"触觉 + 语言"的两种走法:广度集成 vs 深度专精。
|
||||
|
||||
---
|
||||
|
||||
## 5. 传感器基础:触觉与听觉怎么"采"
|
||||
|
||||
### 5.1 视触觉(vision-based tactile)传感器
|
||||
|
||||
这是当前触觉学习的主流硬件,原理是用一块**可形变弹性体(凝胶)**做接触介质,背后一个**微型相机**拍下凝胶被压出的形变,从而把"触觉"转化为"图像"——于是所有计算机视觉/深度学习算法都能直接用。
|
||||
|
||||
- **GelSight**(MIT 起源):高分辨率,能估计接触几何与受力;很多变体(GelSlim 等)。
|
||||
- **DIGIT**(Meta AI × GelSight,2020/2021):小型化、低成本、可装在多指手上,是机器学习社区用得最多的型号;2024 年推出 **Digit 360**(>18 种感知特征)。
|
||||
- **Tac3D** 等:提供三维形变/力场估计。
|
||||
|
||||
视触觉传感器的优点是"信息密度高、可直接复用视觉模型",缺点是**各家输出不标准化**——这正是 UniTouch、TLV-CoRe 等要解决的"跨传感器泛化"问题。
|
||||
|
||||
### 5.2 听觉:接触式麦克风与撞击声
|
||||
|
||||
撞击声携带材质、结构、尺寸信息,且**极具判别性**且能捕捉"视觉看不到的瞬时事件"。采集上常用**接触式麦克风(contact microphone)**(如 See Hear Feel),物理上则可由声学仿真(如 ObjectFolder 的 AudioNet、SoundSpaces 的房间脉冲响应)合成。
|
||||
|
||||
---
|
||||
|
||||
## 6. 仿真与数据生成:触觉/声音"造数据"
|
||||
|
||||
真实触觉数据采集昂贵(要机械臂逐点接触),所以仿真是这个方向的命脉。视触觉仿真有一条清晰的演进线:
|
||||
|
||||
| 仿真器 | 年份/会议 | 类型 | 关键特点 |
|
||||
|--------|-----------|------|----------|
|
||||
| **TACTO** | 2020(RAL/IROS) | 渲染式 | 高速渲染 DIGIT/OmniTact 触觉图像(数百 FPS),接触动力学交给 PyBullet 等外部物理引擎 |
|
||||
| **Taxim** | 2021(RAL 2022) | 示例式/数据驱动 | 用多项式查找表建模光学响应 + 弹性叠加原理建模 marker 运动;**<100 个真实标定点**即可,CPU 可跑 |
|
||||
| **DiffTactile** | ICLR 2024 | 物理式**可微** | FEM 软体模型 + 多材质仿真(刚/弹/弹塑性);可微性支持梯度优化做 sim2real 标定与技能学习 |
|
||||
|
||||
值得注意的是 **DiffTactile 正是 MultiPLY 触觉信号的来源**,且其作者(Zilin Si)也是 Taxim 的主导者,呈现清晰的研究传承;DiffTactile 隶属 Genesis-Embodied-AI 生态。更新的 **DOT-Sim** 进一步用 MPM(物质点法)建模软体传感器,提升物理精度。
|
||||
|
||||
声学方面,撞击声可由 ObjectFolder 的隐式声场查询得到,环境/空间化音频则可用 SoundSpaces 式的**房间脉冲响应(RIR)卷积**生成(MultiPLY 仿真器即如此)。
|
||||
|
||||
---
|
||||
|
||||
## 7. 数据集谱系(一张表看懂)
|
||||
|
||||
| 数据集 | 年份/会议 | 模态 | 规模 | 传感器/来源 | 特点 |
|
||||
|--------|-----------|------|------|-------------|------|
|
||||
| **ObjectFolder 1.0** | CoRL 2021 | 视/听/触 | 100 虚拟物体 | DIGIT(触觉) | 隐式神经 Object File |
|
||||
| **ObjectFolder 2.0** | CVPR 2022 | 视/听/触 | 1000 虚拟物体 | 仿真 | 实时渲染、sim2real |
|
||||
| **ObjectFolder Real** | CVPR 2023 | 视/听/触 | 100 真实物体 | Franka + GelSight | 真实多感官测量、10 任务基准 |
|
||||
| **SSVTP** | RSS 2023 | 视-触 | ~4.5k 对齐对 | UR5 + DIGIT | 机器人自采、空间对齐 |
|
||||
| **Touch and Go (TAG)** | NeurIPS 2022 | 视-触 | in-the-wild | 人采 + GelSight | 自然场景、真实物体 |
|
||||
| **VisGel** | (早期) | 视-触 | ~大规模 | GelSight | 后续多个语言数据集的视触来源 |
|
||||
| **PhysiCLeAR**(Octopi) | RSS 2024 | 触-语 | 408 视频/74 物体 | GelSight | 硬度/粗糙/凹凸属性标注 |
|
||||
| **TVL** | ICML 2024 | 触-视-语 | 44K 对 | SSVTP+HCT;GPT-4V 伪标注 | 三模态对齐 |
|
||||
| **TLV** | 2024 | 触-语-视 | ~19.8k 条 | VisGel + 人机协作标注 | 句级描述 |
|
||||
| **Touch100k** | 2024(Inf. Fusion) | 触-语-视 | ~100k 条 | TAG+VisGel;GPT-4V | 多粒度触觉描述 |
|
||||
| **VTV150K**(VTV-LLM) | NeurIPS 2025 | 视-触(视频)-语 | 150k 帧/100 物体 | GelSight Mini/DIGIT/Tac3D | 跨传感器、4 属性、QA |
|
||||
|
||||
一个清晰的趋势:**从"视-触成对"→"加上语言"→"视频化、跨传感器、问答化"**,数据正在朝"能直接训练触觉大模型"的方向演进。
|
||||
|
||||
---
|
||||
|
||||
## 8. 表示学习:把触觉对齐到视觉与语言
|
||||
|
||||
核心问题:触觉信号怎么学到一个**能和视觉、语言互通**的表示?四种代表性思路:
|
||||
|
||||
- **自监督跨模态对比(机器人自采)——SSVTP**(RSS 2023):让机器人自动采集**空间对齐**的视-触图像对,用跨模态对比损失学共享隐空间,免人工标注;下游 5 个定位/跟随任务取得 73–100% 成功率。
|
||||
- **自然场景视-触学习——Touch and Go**(NeurIPS 2022):人手持 GelSight 在真实世界探物 + 录第一视角视频,做自监督视触特征、触觉驱动图像风格化、触觉未来帧预测。
|
||||
- **绑定到视觉锚点——UniTouch**(CVPR 2024,"Binding Touch to Everything"):把触觉 embedding 对齐到**已与多模态关联的预训练图像 embedding**(ImageBind 式),并用**可学习的"传感器特定 token"**同时吃多种异构传感器;从而零样本做材质识别、抓取稳定性预测、触觉图像问答,还能接 diffusion 做触觉→图像生成。
|
||||
- **三模态成对对比 + 生成——TVL**(ICML 2024,UC Berkeley/Meta):不把一切绑到视觉,而是在**触/视/语三模态间两两对比**;用 44K 对(10% 人工 + 90% GPT-4V 伪标注)训练触觉编码器,再微调 **LLaMA2-7B** 生成触觉描述;分类 +29%,触视理解超 GPT-4V +12%。
|
||||
|
||||
延伸:**Touch100k / TLV-Link** 用课程学习把触-语-视对齐做到 100k 规模;**TLV-CoRe**(2026)提出 Sensor-Aware Modulator 统一不同传感器特征,专攻跨传感器鲁棒性。
|
||||
|
||||
---
|
||||
|
||||
## 9. 触觉/多感官接入语言与 LLM
|
||||
|
||||
这是与 MultiPLY 最近的一圈,可按"理解 → 推理 → 动作"排列:
|
||||
|
||||
- **触觉物理属性推理——Octopi**(RSS 2024):用 GelSight 触觉视频 + VLM,最小语言微调即可预测并推理物体物理属性(硬度/粗糙/凹凸)。经典例子:摸两个牛油果,结合触觉(更软)+ 常识(更软=更熟)选出更熟的那个——展示了"触觉 + 常识推理"的闭环。
|
||||
- **触觉视频大模型——VTV-LLM**(NeurIPS 2025):见第 4 节,跨传感器、时序、可比较推理。
|
||||
- **触觉生成式语言模型——TVL**:见第 8 节,LLaMA2 生成触觉描述。
|
||||
- **触觉进入 VLA(动作)——Tactile-VLA / VTLA**:把触觉接入"视觉-语言-动作"模型,用混合位置-力控制器 + 触觉反馈推理,做插入等接触密集型操作。
|
||||
- **集大成的具身多感官 LLM——MultiPLY**:把视/听/触/温作为状态 token、配动作 token,形成主动交互闭环(详见配套文档)。
|
||||
|
||||
**一句话对比**:Octopi/VTV-LLM 专注"触觉→语言理解与推理";TVL 专注"触觉表示 + 描述生成";Tactile-VLA 把触觉接到动作;MultiPLY 把它们整合进具身 3D 智能体。
|
||||
|
||||
---
|
||||
|
||||
## 10. 多感官机器人操作:为什么需要不止一种感官
|
||||
|
||||
回到机器人本身——多感官的价值在操作任务上最直观:
|
||||
|
||||
- **See, Hear, and Feel**(CoRL 2022,Hao Li 等):用相机(看)+ 接触式麦克风(听)+ 视触觉传感器(触),自注意力融合三模态。在**密集装填(dense packing)**与**倒水(pouring)**两个难任务上验证:视觉给全局但易遮挡,**音频给关键时刻的即时反馈(甚至是看不见的)**,触觉给精确局部几何——三者缺一不可。
|
||||
- **MidasTouch**(CoRL 2022):**纯触觉**全局定位——传感器在物体表面滑动,用粒子滤波 + 触觉码网络估计位姿分布,无需视觉先验;并发布 YCB-Slide 数据集。说明触觉单模态也能解决"我现在摸到的是物体哪个部位"。
|
||||
- **声音引导探索**:如"Impact Makes a Sound"指出声音高度判别且常被忽视;AuRL 用接触麦克风的声音做自监督学习动态操作。
|
||||
|
||||
这些工作共同说明:**遮挡、瞬时事件、精细局部几何**这三类信息分别由视觉、听觉、触觉最擅长覆盖,多感官融合不是锦上添花而是任务刚需。
|
||||
|
||||
---
|
||||
|
||||
## 11. 开放问题与趋势
|
||||
|
||||
- **跨传感器泛化**:GelSight / DIGIT / Tac3D 输出不标准,模型换个传感器就掉点。UniTouch 的传感器 token、TLV-CoRe 的 Sensor-Aware Modulator、VTV150K 的跨传感器数据都是尝试,但远未解决。
|
||||
- **Sim2Real**:触觉/声学仿真与真实的差距仍大;DiffTactile 的可微标定、ObjectFolder 的 neural↔real 基准是方向,但真实触觉的噪声、磨损、标定漂移仍棘手。
|
||||
- **数据稀缺与标注**:触觉天然缺语言标签,目前大量依赖 GPT-4V 伪标注(TVL、Touch100k),质量与偏置存疑。
|
||||
- **时序与动态**:多数工作仍偏静态接触;VTV-LLM 强调视频时序是重要一步,但动态滑动/力控的建模仍欠缺。
|
||||
- **温度等"长尾模态"**:温度、本体感觉等被 MultiPLY 列入但少有专门数据与模型(MultiPLY 代码里温度模态甚至未完整释出)。
|
||||
- **从理解到动作的闭环**:Tactile-VLA、MultiPLY 起步,但"主动决定去摸哪、摸完怎么改计划"的交互式策略仍是前沿。
|
||||
- **统一的多感官基础模型**:把视/听/触/温 + 语言 + 动作统一在一个模型里(MultiPLY 的愿景),数据、表示、训练范式都还在早期。
|
||||
|
||||
---
|
||||
|
||||
## 12. 与 MultiPLY 的呼应
|
||||
|
||||
把本方向的积木对回 MultiPLY,就能看清它"站在巨人肩上"的具体位置:
|
||||
|
||||
- **数据底座** ← ObjectFolder(撞击声 + 材质 + 物体库);
|
||||
- **触觉信号** ← DiffTactile(可微触觉仿真);
|
||||
- **声学空间化** ← SoundSpaces 式 RIR 卷积;
|
||||
- **触觉/多感官 + 语言范式** ← Octopi / TVL / VTV-LLM 的同代探索;
|
||||
- **多感官操作动机** ← See Hear Feel 证明的"三感官互补";
|
||||
- **MultiPLY 的增量** = 把这些整合进**具身 3D 智能体 + 主动交互闭环(动作 token / 状态 token)+ LLM**。
|
||||
|
||||
换句话说,本方向回答的是"**每一种感官怎么采、怎么表示、怎么对齐语言**",而 MultiPLY 回答的是"**如何让一个 LLM 智能体主动调度这些感官去完成任务**"。
|
||||
|
||||
---
|
||||
|
||||
## 13. 论文与资源清单
|
||||
|
||||
### 锚点
|
||||
- ObjectFolder 1.0(CoRL 2021)<https://arxiv.org/abs/2109.07991>
|
||||
- ObjectFolder 2.0(CVPR 2022)<https://arxiv.org/abs/2204.02389>
|
||||
- ObjectFolder Benchmark / Real(CVPR 2023)<https://arxiv.org/abs/2306.00956>
|
||||
- VTV-LLM(NeurIPS 2025)<https://arxiv.org/abs/2505.22566>
|
||||
|
||||
### 触觉/多感官 + 语言与 LLM
|
||||
- Octopi(RSS 2024)<https://arxiv.org/abs/2405.02794>
|
||||
- TVL: Touch-Vision-Language Dataset(ICML 2024)<https://arxiv.org/abs/2402.13232>
|
||||
- UniTouch: Binding Touch to Everything(CVPR 2024)<https://arxiv.org/abs/2401.18084>
|
||||
- TLV: Touch-Language-Vision Dataset(2024)<https://arxiv.org/abs/2403.09813>
|
||||
- Touch100k(2024)<https://arxiv.org/abs/2406.03813>
|
||||
- TLV-CoRe(2026)<https://arxiv.org/abs/2511.11512>
|
||||
- Tactile-VLA(2025)<https://arxiv.org/abs/2507.09160>
|
||||
|
||||
### 视触觉表示学习与数据集
|
||||
- SSVTP(RSS 2023)<https://arxiv.org/abs/2209.13042>
|
||||
- Touch and Go(NeurIPS 2022)<https://arxiv.org/abs/2211.12498>
|
||||
|
||||
### 传感器与仿真
|
||||
- TACTO 仿真器<https://arxiv.org/abs/2012.08456>
|
||||
- Taxim 仿真器(GelSight)<https://arxiv.org/abs/2109.04027>
|
||||
- DiffTactile(ICLR 2024,MultiPLY 触觉来源)<https://arxiv.org/abs/2403.08716>
|
||||
|
||||
### 多感官机器人操作
|
||||
- See, Hear, and Feel(CoRL 2022)<https://arxiv.org/abs/2212.03858>
|
||||
- MidasTouch(CoRL 2022)<https://arxiv.org/abs/2210.14210>
|
||||
- Impact Makes a Sound(2022)<https://arxiv.org/abs/2208.02680>
|
||||
|
||||
---
|
||||
|
||||
## 14. 硬件方案:多感官数据采集设备选型(国际主流 vs 中国平替)
|
||||
|
||||
> 目标场景:搭建一套能采集**视觉 / 深度 / 触觉 / 撞击声 / 温度**的物体级多感官数据采集装置(对标 ObjectFolder Real、TVL、VTV150K 的数据规格)。
|
||||
> 选型基调:**性能 / 生态优先**——主推社区成熟、论文复现友好的国际主流器件,同时为每一类给出**中国平替**,便于成本敏感时替换。
|
||||
> 价格为公开渠道的大致参考,会随时间与汇率波动,仅供量级判断。
|
||||
|
||||
### 14.0 一套采集装置需要哪些"感官硬件"
|
||||
|
||||
把多感官数据采集拆成"感官通道 + 交互执行 + 同步"三部分:
|
||||
|
||||
- **感官通道**:① 视触觉/触觉传感器(触)② RGB-D 相机(视 + 点云)③ 接触式麦克风 + 麦克风(听,尤其撞击声)④ 热成像/温度(温)。
|
||||
- **交互执行**("主动采集"的关键,对标 ObjectFolder Real 用 Franka + GelSight 逐点接触):⑤ 机械臂 ⑥ 夹爪/灵巧手 ⑦ 六维力/力矩传感器(控制接触力、保护传感器)。
|
||||
- **同步与底座**:转台、标定板、统一时间戳采集(硬件触发或 ROS 时间同步)。
|
||||
|
||||
下面逐类给出选型。
|
||||
|
||||
### 14.1 视触觉(光学)触觉传感器——"触觉相机"
|
||||
|
||||
把凝胶形变拍成图像,可直接复用视觉模型,是当前触觉学习数据采集的首选。**强烈建议数据采集主力选 GelSight Mini 或 DIGIT**——因为 ObjectFolder、Touch and Go、TVL、PhysiCLeAR、VTV150K 等数据集大多基于它们,复现/迁移最顺。
|
||||
|
||||
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||
|------|-----------|----------|--------|------|
|
||||
| **GelSight Mini** | GelSight(美) | 超人类分辨率 2D/3D,浏览器即插即用,提供 ROS/Python | ~$499 | 生态最成熟、采集首选 |
|
||||
| **DIGIT** | Meta×GelSight(美) | 小型化、USB-3、可装多指手,开源(digit.ml) | 低成本/开源 | 论文用得最多、适合上手 |
|
||||
| **Digit 360** | Meta×GelSight(美) | 指尖形、~830 万 taxel、可测 1mN、含振动/热/气味 | 科研早期申请 | 最前沿、面向多模态触觉研究 |
|
||||
| **DM-Tac W / F** | 戴盟 Daimon(深圳) | 多维高分辨率视触觉、CE/FCC、>500 万次按压寿命 | 询价 | 中国平替,主打高频高分辨率 |
|
||||
| **GF225** | 纬钛 WTac(中国) | 10µm 级分辨率、可同测法向/切向力 | 询价 | 中国平替,分辨率高 |
|
||||
|
||||
### 14.2 多维力阵列 / 电子皮肤 / 仿生触觉
|
||||
|
||||
当需要**法向+切向力、温度、振动**等更"物理量化"的触觉(而非纯图像),用阵列式/仿生传感器。这一类**中国厂商已相当强**(人形机器人热潮推动),可大胆用国产。
|
||||
|
||||
| 型号 | 厂商/产地 | 原理 | 关键规格 | 备注 |
|
||||
|------|-----------|------|----------|------|
|
||||
| **BioTac** | SynTouch(美) | 液阻 + 热敏 + 水听器 | 测法向/切向力、振动、温度梯度,仿人指尖 | 经典仿生、多模态 |
|
||||
| **uSkin** | XELA Robotics(日) | 霍尔阵列 + 磁体 | 3 轴力分布阵列,可贴/拧到手指手掌 | 分布式多点 |
|
||||
| **ReSkin** | Meta/学术(美) | 磁性软皮肤 | <$30、2–3mm 薄、400Hz、1mm 空间分辨、可更换 | 极低成本、自采友好 |
|
||||
| **PX 多维触觉 / DexH** | 帕西尼 PaXini(深圳) | 6D 霍尔阵列 | 第三代 15 维感知,单价降至数千元;曾用于英伟达 CES 展示机器人 | 中国平替,多维+灵巧手生态 |
|
||||
| **TS 指尖触觉** | 他山 TASHAN(中国) | 电容 + 触觉 AI 芯片 | 0.01N 力分辨,含接近觉/三维力/纹理;自研类脑触觉芯片 | 中国平替,边缘智能 |
|
||||
| **柔性触觉芯片** | 钛深 TacSense(深圳) | 柔性离电子(Iontronic) | 薄膜分布式压力、高灵敏;与优必选/大疆合作 | 中国平替,柔性大面积 |
|
||||
|
||||
### 14.3 RGB-D / 深度相机——视觉与点云
|
||||
|
||||
提供外观图像 + 深度点云(对标 ObjectFolder 的 VisionNet、3D 重建)。**注意:Intel 已停止 RealSense 新品研发**,长周期项目建议把 Orbbec(奥比中光)作为"未来可持续"的首选之一——它自研深度芯片、生态接近、价格更低。
|
||||
|
||||
| 型号 | 厂商/产地 | 原理 | 关键规格 | 参考价 |
|
||||
|------|-----------|------|----------|--------|
|
||||
| **RealSense D405 / D435i / D455** | Intel(美) | 主动红外双目 | D405 近距操作首选;D455 FOV 90×65、0.6–6m;板载算深度 | ~$250–400(已停研,渠道库存) |
|
||||
| **Azure Kinect DK** | Microsoft(美) | ToF | 大 FOV、高彩色分辨、30fps、3m 内骨架追踪佳 | ~$400 |
|
||||
| **ZED 2 / ZED X** | Stereolabs(美) | 被动双目 + GPU 神经深度 | 户外可用、最远 ~20m,需 CUDA GPU | ~$450+ |
|
||||
| **Gemini 335 / Femto Bolt** | Orbbec 奥比中光(深圳) | 主动双目 / ToF | Gemini 335 户外/复杂场景优于 D435i,FOV 更大;Femto Bolt 兼容 Azure Kinect SDK | ~¥1950 / ~$250 |
|
||||
| **Percipio 系列** | 图漾 PercipioXYZ(上海) | 主动双目 + 结构光辅助 | 工业级、环境适应性强 | 询价 |
|
||||
|
||||
### 14.4 热成像 / 温度——第四感官
|
||||
|
||||
温度是材质导热性的代理信号(MultiPLY 列为第四模态)。FLIR 的 Lepton/Boson 是集成生态标杆;但**中国厂商在出货量上已全球领先**,性价比高,平替力度可大。
|
||||
|
||||
| 型号 | 厂商/产地 | 关键规格 | 备注 |
|
||||
|------|-----------|----------|------|
|
||||
| **FLIR Lepton** | Teledyne FLIR(美) | 微型 LWIR 模组,160×120 / 80×60,可辐射测温 | 集成生态最佳(多平台 SDK) |
|
||||
| **FLIR Boson** | Teledyne FLIR(美) | 12µm 非制冷、640 分辨率,性能参考级 | 高端核心 |
|
||||
| **艾睿 / Micro III 等模组** | 睿创微纳 InfiRay/Raytron(烟台) | 模组/机芯齐全,独立测评对比 FLIR 表现接近 | 中国平替,出货量大 |
|
||||
| **HIKMICRO 模组** | 海康微影(杭州) | MEMS 自研,探测器/机芯/模组全栈 | 中国平替,供应链完整 |
|
||||
| **Guide 高德** | 高德红外/高德智感(武汉) | 中国最大、全球第二大红外探测器企业 | 中国平替,自研探测器 |
|
||||
|
||||
> 提示:高端探测器精度上国产仍略逊 FLIR,但对"物体相对温度/材质区分"这类数据采集足够。
|
||||
|
||||
### 14.5 音频——撞击声与环境声
|
||||
|
||||
对标 ObjectFolder 的 AudioNet(撞击声)。两类麦克风互补:**接触式麦克风(压电 piezo)采"敲击/接触的结构声"**,**麦克风阵列采"空间环境声 + 声源定位"**。
|
||||
|
||||
- **接触式麦克风(撞击声主力)**:压电片把表面振动转成电信号,能隔离空气噪声、专捕接触/撞击声。注意 piezo 频响非线性、有谐振着色,采集时需做阻抗匹配/滤波。国际可选 DPA、Shure 等专业贴片式;低成本可用通用压电片 + 前置放大。
|
||||
- **麦克风阵列(环境声/定位)**:如 8 麦阵列可做声源到达方向估计(DoA)。开源生态常用 **ReSpeaker** 系列阵列(带 ROS 接口)。采集时遵循"stop-perceive-act"(采集瞬间停住)以减少自运动噪声。
|
||||
|
||||
### 14.6 机械臂——"主动接触"的执行主体
|
||||
|
||||
ObjectFolder Real 用 **Franka + GelSight 逐点接触**采集真实触觉。研究级采集强烈建议选**带关节力矩、1kHz 低层控制、ROS2 生态好**的臂——这对"力控接触不压坏触觉传感器"至关重要。
|
||||
|
||||
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||
|------|-----------|----------|--------|------|
|
||||
| **Franka Research 3** | Franka(德) | 7-DOF、每关节力矩、1kHz、低层接口 | ~$25–30K | 学术操作研究事实标准 |
|
||||
| **Kinova Gen3** | Kinova(加) | 7-DOF、每关节力矩、ROS2、30 分钟上手 | ~$28K | 研究级、轻量便携 |
|
||||
| **UR5e** | Universal Robots(丹麦) | 5kg/850mm、工业可靠性标杆 | ~$35K | 标配无关节力矩 |
|
||||
| **RealMan RM65-B** | 睿尔曼(北京) | 6-DOF、整臂 7.2kg、负载 5kg(峰值 9kg)、610mm、ROS | 显著更低 | 中国平替,国内具身/模仿学习常用 |
|
||||
| **JAKA / AUBO / Dobot** | 节卡/遨博/越疆(中国) | 协作臂,±0.02–0.1mm,负载/易用性强 | 较低 | 中国平替,工业生态成熟 |
|
||||
|
||||
> 取舍:Franka/Kinova 强在**低层力矩控制 + 开放研究接口**;多数国产协作臂历史上偏工业易用/负载/价格,研究级力控 API 稍弱,但 RealMan 等已专攻具身研究位。
|
||||
|
||||
### 14.7 末端执行器——夹爪与灵巧手
|
||||
|
||||
采集时用来"持握触觉传感器去接触物体"或"做抓取交互"。若只为给传感器做接触,二指夹爪足矣;若要采集灵巧操作数据,再上灵巧手。
|
||||
|
||||
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||
|------|-----------|----------|--------|------|
|
||||
| **Robotiq 2F-85** | Robotiq(加) | 二指自适应、行程 85mm、握力 30–100N、负载 5kg、即插即用 | 中端 | 接触采集够用、最省心 |
|
||||
| **Allegro Hand** | Wonik(韩) | 直驱四指研究标准、原生兼容 DIGIT | ~$16K | 研究常用,连续负载易过热 |
|
||||
| **Shadow Hand** | Shadow Robot(英) | 24-DOF、>100 传感器、1kHz,最仿人 | >$100K | 最高保真,贵且维护重 |
|
||||
| **因时 Inspire RH56** | 因时机器人(北京) | 6-DOF/12 关节、内置 6 路力传感、力位混合控制 | 较低 | 中国平替,已规模出货 |
|
||||
| **LinkerHand L20/L30** | 灵心巧手 Linkerbot(北京) | 21/22-DOF(研究版至 42-DOF),多传动 | ~¥5–10 万 | 中国平替,高自由度领先 |
|
||||
| **BrainCo Revo 2** | 强脑(杭州) | 11-DOF、383g、握力 50N、含 3D 触觉 | 较低 | 中国平替,超轻+触觉 |
|
||||
|
||||
### 14.8 六维力/力矩传感器——接触力闭环
|
||||
|
||||
装在臂腕与末端之间,用于**控制接触力、保护脆弱的触觉凝胶、并把力觉作为一路数据**。这一类**国产成熟度高、性价比突出**,坤维已可对标 ATI。
|
||||
|
||||
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||
|------|-----------|----------|--------|------|
|
||||
| **ATI Nano 系列** | ATI(美) | 0.5% 精度、硅应变片,计量级 | 可达 ~¥10 万/个 | 行业龙头、最高精度 |
|
||||
| **Robotiq FT 300** | Robotiq(加) | 电容式、±300N/±30N·m、全数字 | 中端 | 高重复性而非高精度,UR 即插即用 |
|
||||
| **坤维 Kunwei** | 坤维科技(中国) | 0.5% 精度对标 ATI,协作机器人市占率 >80% | ~¥2 万+ | 中国平替首选 |
|
||||
| **宇立 SRI** | 宇立仪器(中国) | 9mm 全球最薄、汽车碰撞测试级 | 询价 | 中国平替,超薄/磨抛 |
|
||||
| **鑫精诚 Forsentek/XJC** | 鑫精诚(中国) | 结构解耦、3C 起家、高性价比 | 较低 | 中国平替,成本敏感 |
|
||||
|
||||
### 14.9 推荐配置(面向多感官数据采集)
|
||||
|
||||
**配置 A —— 性能/生态优先(论文复现友好,推荐)**
|
||||
|
||||
- 触觉:**GelSight Mini ×1–2**(主力)+ 选配 **DIGIT** 装夹爪指尖
|
||||
- 视觉/点云:**Intel RealSense D435i/D405**(近距)或 **ZED 2**(大场景)
|
||||
- 温度:**FLIR Lepton/Boson** 模组
|
||||
- 音频:专业**接触式麦克风**(撞击声)+ **ReSpeaker 麦阵**(环境声)
|
||||
- 机械臂:**Franka Research 3**(关节力矩 + 1kHz 力控)
|
||||
- 末端:**Robotiq 2F-85**(接触采集)或 **Allegro Hand**(灵巧采集)
|
||||
- 力觉:**ATI Nano** 或 **坤维**(力控闭环保护触觉传感器)
|
||||
- 同步:转台 + 标定板 + ROS2 时间同步/硬件触发
|
||||
|
||||
**配置 B —— 中国平替优先(成本可控,国产生态)**
|
||||
|
||||
- 触觉:**戴盟 DM-Tac / 纬钛 GF225**(视触觉)+ **帕西尼 / 他山**(多维力阵列)
|
||||
- 视觉/点云:**Orbbec Gemini 335 / Femto Bolt**
|
||||
- 温度:**艾睿 InfiRay / 海康微影 / 高德** 模组
|
||||
- 音频:通用压电接触片 + 前置放大 + 国产麦阵
|
||||
- 机械臂:**睿尔曼 RM65-B** 或 **JAKA/遨博**
|
||||
- 末端:**因时 RH56 / LinkerHand / BrainCo Revo 2**
|
||||
- 力觉:**坤维 / 宇立 / 鑫精诚**
|
||||
|
||||
### 14.10 采集与工程注意事项
|
||||
|
||||
- **力控保护**:视触觉凝胶易磨损(DM-Tac 标称 >500 万次按压),务必用力矩臂或六维力传感器限制接触力。
|
||||
- **跨传感器一致性**:不同触觉传感器输出不可直接混用(VTV150K 跨 GelSight Mini/DIGIT/Tac3D 正是为此);若混采,需记录传感器型号并考虑 UniTouch/TLV-CoRe 式的跨传感器对齐。
|
||||
- **多模态时间同步**:撞击声是**瞬时事件**,必须与触觉/视觉精确对齐(硬件触发优于软件时间戳)。
|
||||
- **标定**:RGB-D 内外参、热像与可见光配准(MSX 式)、力传感器零偏,采集前都要标定。
|
||||
- **数据规格对标**:想直接对接现有工作,可参考 ObjectFolder Real(网格+视频+撞击声+触觉)、TVL(视-触成对 + 语言标注)、VTV150K(视触觉视频 + 4 属性 + QA)的字段组织。
|
||||
|
||||
---
|
||||
|
||||
## 15. 超声感知:测距与材质/厚度检测
|
||||
|
||||
> 本章把**超声(ultrasound)**作为一种独立的物体感知模态纳入综述。它的独特定位是:**主动发射声波、非接触、且能"穿透"到次表面**——正好补上视觉(怕遮挡/透明/暗光)与触觉(必须接触)的盲区,介于"被动听撞击声"和"主动接触"之间。
|
||||
> 两个核心能力:① **测距(ranging)**——隔空测物体距离/轮廓;② **测厚与材质识别**——靠声速、声阻抗、回波结构反推材料厚度与种类。
|
||||
|
||||
### 15.0 为什么超声值得纳入多感官物体感知
|
||||
|
||||
- **非接触 + 不怕光**:超声靠声波而非光,全黑、强光、烟尘下都能工作,且**不受物体颜色/透明度影响**(玻璃、透明塑料这些视觉/红外的"硬骨头",超声照测不误)。
|
||||
- **可探次表面**:声波能进入材料内部,从回波里读出**厚度、分层、内部缺陷**——这是纯表面模态(视觉、视触觉)做不到的。
|
||||
- **材质判别的物理基础**:不同材质的**声速**和**声阻抗 Z=ρc**(密度×声速)不同,回波的到达时间与幅度因此携带材质信息。
|
||||
- 与本综述其他模态互补:视觉给外观、触觉给接触面微观几何、撞击声给"敲击后"的材质线索,而**超声能在"接触之前"就隔空给出距离 + 材质预判**。
|
||||
|
||||
### 15.1 测距:脉冲回波 / 飞行时间(ToF)
|
||||
|
||||
原理极简:发射一个超声脉冲,测它碰到目标反射回来的**飞行时间(Time-of-Flight, ToF)**,距离 = 声速 × ToF ÷ 2。工程上常用**互相关(cross-correlation)**而非简单阈值来精确估计 ToF。
|
||||
|
||||
**传感器从"大块头"走向 MEMS 化**。传统压电换能器体积大、与空气声阻抗不匹配(需匹配层)。新一代 **MEMS 微机械超声换能器**有两类:
|
||||
|
||||
- **PMUT(压电式)**:低驱动电压、低功耗、与空气声阻抗匹配好、工艺成本低——是**空气中小型测距的主流**;缺点是窄带,空气中高分辨 3D 测距能力有限。
|
||||
- **CMUT(电容式)**:带宽更好,但需要高 DC 偏压和亚微米间隙,限制了声功率与测距应用。
|
||||
|
||||
**商用代表:TDK Chirp(PMUT)**。把 PMUT + 超低功耗 SoC 封进 3.5×3.5mm 的微型封装:
|
||||
|
||||
- **CH101**:量程约 1.2m;**CH201**:量程达 5m;新一代 **ICU-10201/20201** 量程 5m、FOV 可配置。
|
||||
- 亮点:毫米级精度、**不受光照/颜色/透明度影响**、大视场、**功耗约 15µA(比红外 ToF 低约 500 倍)**,片上自主运算可让主控休眠。非常适合**机器人避障、接近觉、液位检测**。
|
||||
- 局限:PMUT 窄带、空气衰减限制远距离(小型超声一般 ≤5m),多径/连续波在极近距离误差大(可用多频脉冲 MFPW 缓解),盲区需靠宽带设计压缩(已有把盲区降到 ~4.4mm、±0.3mm 误差的研究)。
|
||||
|
||||
### 15.2 测厚与材质识别
|
||||
|
||||
#### 测厚(thickness gauging)
|
||||
|
||||
同样是 ToF:脉冲在材料里来回一趟,**厚度 = 声速 × ToF ÷ 2**。探头有三种主流形态:
|
||||
|
||||
- **单晶探头 + 延迟线(delay line)**:测**薄/高精度**材料;延迟线拉开发射与回波的时间间隔,避免太薄时回波分不开。
|
||||
- **双晶探头(dual element,pitch-and-catch)**:一发一收成"V"形路径,对**腐蚀、粗糙面**信噪比更好,是腐蚀测厚主力。
|
||||
- **回波-回波(echo-to-echo)/ 穿透涂层(THRU-COAT)**:用两次背壁回波的时间差测厚,从而**忽略涂层只测基材**;多层结构可用**去卷积(deconvolution)**分离各层厚度。
|
||||
|
||||
**EMAT(电磁声换能器)——免耦合剂的特殊路线**:靠线圈涡流 + 磁场在金属/铁磁体内**直接激发超声**(洛伦兹力或磁致伸缩),天然产生**水平剪切波(SH 波)**。优点是**无需耦合剂、可隔着油漆/氧化层/空气层、耐高温**(锅炉管在 >800°C 氧化层下仍可测),适合粗糙/高温/涂覆表面;缺点是频率低、对极薄/细分层分辨率受限、只能单晶、对点蚀检测弱、仪器更贵。
|
||||
|
||||
#### 材质识别(material characterization)
|
||||
|
||||
物理上:回波幅度由**界面两侧声阻抗失配**决定,声速因材质而异——把回波信号喂给模型即可分类材质。
|
||||
|
||||
### 15.3 前沿:超声 + 机器学习
|
||||
|
||||
非接触超声 + ML 做材质识别正成为视觉的有力补充(不怕暗光/烟尘):
|
||||
|
||||
- **经典 ML**:用经验模态分解(EMD)从回波提 16 维特征,喂 KNN / 决策树 / SVM,并配声学理论模型——显著提升机器人在黑暗/粉尘/危险环境下的材质识别。
|
||||
- **深度学习**:如 **AE-CS-TCN** 直接从原始回波联合学习空间/时序/多尺度特征(含空间注意力 + 时序卷积 + 跨尺度融合 + 交叉注意力),在机器人平台上做可复现的材质识别。
|
||||
- **双模态 / 实时**:一种同时测**接近距离 + 材质**的双模态超声系统对 13 种工业材料达 **98% 分类准确率**、测距误差 **<3mm**、毫秒级响应;也有**柔性超声传感阵列**兼顾接近觉与材质识别用于机器人安全控制。
|
||||
- **多传感器数据集**:**MatSense2025**(超声 + 毫米波)面向材质分类、无损检测与传感器融合研究。
|
||||
|
||||
> 深入阅读:本节有一份独立深度子专题《超声+ML材质识别_深度子专题.md》,详细展开物理可分性、信号特征、模型方法谱系、机器人 pre-touch 应用、数据流水线与核心挑战(距离/角度/温度/跨传感器泛化)。
|
||||
|
||||
### 15.4 与多感官框架 / MultiPLY 的关系
|
||||
|
||||
把超声放进本综述的模态地图,它是一种**"主动声学探测"模态**:
|
||||
|
||||
- 与"听"(被动撞击声,ObjectFolder 的 AudioNet)相比,超声是**主动发射 + 接收**,可控、可隔空、可探内部;
|
||||
- 与"触"相比,超声**无需接触**就能给出距离与材质预判,可作为接触前的"预探测",降低碰坏脆弱触觉凝胶的风险;
|
||||
- 在 MultiPLY 式的具身 LLM 框架里,超声天然可成为一个新的**动作 token(如 `<probe>` 超声探测)+ 状态 token(回波/距离/材质特征)**,让智能体"先隔空扫一下再决定要不要去摸/敲"。
|
||||
- 在数据采集装置里(见第 14 章),超声可作为**第五路传感通道**,尤其适合采集"透明/暗色/内部结构"这类视觉与视触觉都吃力的样本。
|
||||
|
||||
### 15.5 硬件选型:国际主流 vs 中国平替
|
||||
|
||||
超声硬件分两条线:**消费/机器人测距传感器**(避障、接近觉)与**工业测厚/无损检测(NDT)设备**。
|
||||
|
||||
**A. 测距 / 接近觉传感器(含 MEMS 超声 ToF)**
|
||||
|
||||
| 型号/品牌 | 厂商/产地 | 特点 | 备注 |
|
||||
|-----------|-----------|------|------|
|
||||
| **Chirp CH101 / CH201 / ICU 系列** | TDK(美/日) | PMUT MEMS ToF,3.5×3.5mm,1.2–5m,mm 级,15µA 超低功耗 | 机器人/无人机首选,生态新 |
|
||||
| **车规/工业超声雷达** | Murata 村田(日) | 车载超声龙头,倒车雷达/避障 | 车规生态成熟 |
|
||||
| **MB 系列** | MaxBotix(美) | 测距/液位/接近,OEM 友好 | 模块化易集成 |
|
||||
| **UC/RU 系列** | Pepperl+Fuchs、SICK、Banner(欧美) | 工业级、IO-Link、可调声束 | 工业自动化标杆 |
|
||||
| **AK2 超声雷达 / 材质识别 / 水下测距传感器** | 奥迪威 Audiowell(广东) | 国产超声传感器龙头,**已量产"材质识别传感器"与"水下测距传感器"**,车载与机器人布局 | 中国平替首选,与本主题高度契合 |
|
||||
|
||||
**B. 测厚仪 / 无损检测(NDT)设备与探头**
|
||||
|
||||
| 型号/品牌 | 厂商/产地 | 特点 | 备注 |
|
||||
|-----------|-----------|------|------|
|
||||
| **38DL PLUS / 39DL PLUS** | Evident(原 Olympus,日/美) | 测厚 0.08–635mm,单/双晶、THRU-COAT/回波-回波、高分辨 0.001mm | 行业标杆(39DL 为新款,含 Wi-Fi/蓝牙) |
|
||||
| **便携测厚仪 / 探伤仪** | Dakota、Elcometer、Baker Hughes(欧美) | 腐蚀测厚、涂层穿透 | 工业常用 |
|
||||
| **CTS 系列探伤仪 / CTS-409 EMAT 测厚** | 汕头超声 ST-NDT(广东) | "中国超声第一家",相控阵/3D 全聚焦/EMAT,免耦合剂电磁超声测厚 | 中国平替,NDT 全线 |
|
||||
| **HS 系列探伤 / HS F91 EMAT 测厚 / HS P9s 笔式测厚** | 武汉中科创新(汉威 HS) | 数字探伤、电磁超声测厚、应力检测、自动化检测系统 | 中国平替,产品线全 |
|
||||
|
||||
### 15.6 局限与工程注意事项
|
||||
|
||||
- **耦合剂**:接触式压电测厚通常需耦合剂(凝胶/水);要免耦合剂选 EMAT(但分辨率、成本有代价)。
|
||||
- **空气衰减与距离**:空气中高频超声衰减快,小型 MEMS 测距一般 ≤5m;测厚则是贴合/近场。
|
||||
- **分辨率与盲区**:窄带 PMUT 分辨率有限,近距有盲区,需宽带设计或多频脉冲缓解。
|
||||
- **难测目标**:强吸声(海绵/泡沫)、镜面斜反射、极薄涂层等会削弱回波。
|
||||
- **温度影响声速**:声速随温度/介质变化,精密测距/测厚需做温度补偿与零点标定。
|
||||
- **多径与串扰**:复杂场景多径反射会污染 ToF,阵列/编码波形/互相关可改善。
|
||||
|
||||
---
|
||||
|
||||
## 来源(Sources)
|
||||
|
||||
- [ObjectFolder 1.0 (2109.07991)](https://arxiv.org/abs/2109.07991)
|
||||
- [ObjectFolder 2.0 (2204.02389)](https://arxiv.org/abs/2204.02389)
|
||||
- [ObjectFolder Benchmark/Real (2306.00956)](https://arxiv.org/abs/2306.00956)
|
||||
- [VTV-LLM (2505.22566)](https://arxiv.org/abs/2505.22566)
|
||||
- [Octopi (2405.02794)](https://arxiv.org/abs/2405.02794)
|
||||
- [TVL (2402.13232)](https://arxiv.org/abs/2402.13232)
|
||||
- [UniTouch (2401.18084)](https://arxiv.org/abs/2401.18084)
|
||||
- [TLV (2403.09813)](https://arxiv.org/abs/2403.09813)
|
||||
- [Touch100k (2406.03813)](https://arxiv.org/abs/2406.03813)
|
||||
- [TLV-CoRe (2511.11512)](https://arxiv.org/abs/2511.11512)
|
||||
- [Tactile-VLA (2507.09160)](https://arxiv.org/abs/2507.09160)
|
||||
- [SSVTP (2209.13042)](https://arxiv.org/abs/2209.13042)
|
||||
- [Touch and Go (2211.12498)](https://arxiv.org/abs/2211.12498)
|
||||
- [TACTO (2012.08456)](https://arxiv.org/abs/2012.08456)
|
||||
- [Taxim (2109.04027)](https://arxiv.org/abs/2109.04027)
|
||||
- [DiffTactile (2403.08716)](https://arxiv.org/abs/2403.08716)
|
||||
- [See, Hear, and Feel (2212.03858)](https://arxiv.org/abs/2212.03858)
|
||||
- [MidasTouch (2210.14210)](https://arxiv.org/abs/2210.14210)
|
||||
- [Impact Makes a Sound (2208.02680)](https://arxiv.org/abs/2208.02680)
|
||||
|
||||
硬件方案(第 14 节)来源:
|
||||
- [GelSight Mini / DIGIT / Digit 360 官方](https://www.gelsight.com/)
|
||||
- [Meta DIGIT 开源平台](https://digit.ml/)
|
||||
- [ReSkin (2111.00071)](https://arxiv.org/abs/2111.00071)
|
||||
- [XELA Robotics uSkin](https://www.xelarobotics.com/tactile-sensors)
|
||||
- [帕西尼 PaXini 官网](https://paxini.com/)
|
||||
- [因时机器人 Inspire-Robots 官网](https://www.inspire-robots.com/)
|
||||
- [人形机器人触觉传感器国内供应商盘点(艾邦机器人)](https://www.aibangbots.com/a/4289)
|
||||
- [深度相机选型(RealSense/ZED/Orbbec, SVRC 2026)](https://www.roboticscenter.ai/blog/best-depth-cameras-robotics)
|
||||
- [Teledyne FLIR Lepton OEM 模组](https://oem.flir.com/products/lepton/)
|
||||
- [InfiRay/FLIR/Seek 热像对比(Yole)](https://www.yolegroup.com/press-release/infiray-teledyne-flir-seek-thermal-the-ultimate-thermal-camera-comparison/)
|
||||
- [Franka Research 3 官网](https://franka.de/franka-research-3)
|
||||
- [机器人臂价格指南 2026(SVRC)](https://www.roboticscenter.ai/learn/robot-arm-pricing-2026)
|
||||
- [Robotiq FT-300 力矩传感器](https://robotiq.com/products/ft-300-force-torque-sensor)
|
||||
- [六维力传感器国产替代深度报告(东方财富)](https://pdf.dfcfw.com/pdf/H3_AP202404151630231635_1.pdf)
|
||||
|
||||
超声感知(第 15 节)来源:
|
||||
- [TDK Chirp CH101 超声 ToF 传感器](https://invensense.tdk.com/en-us/news-media/press/tdk-announces-worldwide-availability-chirp-ch101-ultrasonic-tof-sensor-platform)
|
||||
- [TDK SmartSonic 超声 ToF 产品总览](https://product.tdk.com/en/techlibrary/productoverview/smart-sonic-products.html)
|
||||
- [PMUT 测距综述(PMC)](https://pmc.ncbi.nlm.nih.gov/articles/PMC9961946/)
|
||||
- [超声测厚原理(Elcometer)](https://www.elcometer.com/en/how-do-ultrasonic-ndt-thickness-gauges-work)
|
||||
- [EMAT 电磁超声测厚(Evident)](https://ims.evidentscientific.com/en/applications/thickness-boiler-tubes-emat-transducers)
|
||||
- [Evident/Olympus 38DL PLUS 测厚仪](https://ims.evidentscientific.com/en/insights/the-38dl-plus-ultrasonic-thickness-gauge-is-an-asset-to-asset-reliability-inspections)
|
||||
- [非接触超声回波 + 深度学习材质分类(ScienceDirect)](https://www.sciencedirect.com/science/article/pii/S1877050924007361)
|
||||
- [机器人超声材质识别(Wiley)](https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218)
|
||||
- [双功能柔性超声阵列:接近觉+材质识别(Wiley)](https://onlinelibrary.wiley.com/doi/10.1002/rob.70225)
|
||||
- [奥迪威 Audiowell 官网(含材质识别/水下测距传感器)](https://www.audiowell.net/)
|
||||
- [汕头超声 ST-NDT 官网](https://www.st-ndt.com/)
|
||||
- [武汉中科创新(汉威)官网](https://www.zkcx.com/)
|
||||
@@ -0,0 +1,210 @@
|
||||
# 超声 + 机器学习 材质识别:深度子专题
|
||||
|
||||
> 定位:本篇是《多感官物体感知与触觉_方向综述.md》第 15 章"超声感知"的深化子专题,专注一个问题——**如何用超声回波 + 机器学习判别物体材质**。
|
||||
> 面向研究者,覆盖:物理可分性来源 → 信号与特征 → 模型方法谱系 → 机器人/具身应用 → 数据与流水线 → 核心挑战 → 与多感官框架的关系 → 未来方向。
|
||||
|
||||
---
|
||||
|
||||
## 1. 问题定义与范围
|
||||
|
||||
**任务**:给定超声换能器对目标物体发射脉冲并接收回波(或穿透信号),用模型推断该物体的**材质类别**(金属/塑料/木头/玻璃/海绵/布料……)或**材质物理属性**(声阻抗、弹性模量、黏弹性、厚度、分层)。
|
||||
|
||||
按耦合方式与几何分三种典型设置:
|
||||
|
||||
- **接触式脉冲回波**:探头贴合(需耦合剂),信噪比高,常见于 NDT 测厚/探伤,可顺带材质表征。
|
||||
- **非接触/空气耦合(air-coupled)脉冲回波**:探头隔空发射,最贴近"机器人隔空识材"的场景,但有严重阻抗失配(见 §2)。
|
||||
- **穿透 / 隔容器(through-transmission / through-container)**:一发一收夹住样品,或贴在容器外壁识别内部液体。
|
||||
|
||||
本篇重点是**用 ML 把回波里的材质信息解码出来**,尤其是非接触场景(与机器人/具身最相关)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 为什么超声能区分材质:物理可分性来源
|
||||
|
||||
材质识别不是"黑盒玄学",它有清晰的物理基础。三个材质相关量决定了回波长什么样:
|
||||
|
||||
### 2.1 声阻抗 Z = ρc 与反射/透射
|
||||
|
||||
声阻抗 `Z = 密度 ρ × 声速 c`。声波在两种介质界面上,**反射比例由两侧声阻抗失配决定**:失配越大,反射越强、透射越少。所以**回波幅度直接编码了"目标相对周围介质的声阻抗"**——金属(高 Z)和塑料(低 Z)的回波强度天然不同。
|
||||
|
||||
### 2.2 声速 c 因材质而异
|
||||
|
||||
声速取决于材料的弹性模量与密度(`c ≈ √(模量/ρ)`)。这使得**飞行时间(ToF)/到达时刻**携带材质信息,也是测厚(厚度=c·ToF/2)的基础。声速与"储能模量"相关。
|
||||
|
||||
### 2.3 频率相关衰减(attenuation)
|
||||
|
||||
材料对超声的吸收/散射随频率上升而增大,且**不同材质衰减差异显著**:塑料/复合材料衰减远高于金属(例:聚丙烯、PVDF 在 300kHz 约 2 dB/cm、500kHz 约 5 dB/cm)。衰减与"能量耗散和散射"相关——于是**回波的频谱形状、包络衰减速率**成为强判别特征。
|
||||
|
||||
### 2.4 空气耦合的"双刃剑"
|
||||
|
||||
非接触时空气声阻抗极低,固/气界面**只透射约 1% 能量**,整条路径相比水耦合可多损耗约 100 dB。坏处是信噪比差;**好处是这个损耗本身强烈依赖材质**(金属比塑料损耗更高),反而成了判别线索。空气在 ~2MHz 以上吸收急剧上升,故空气耦合换能器多在该频率以下工作。导波(如 A0 Lamb 模态)的频散(速度随频率变化)则提供额外的材质指纹。
|
||||
|
||||
> 小结:**幅度(声阻抗)、到达时间(声速)、频谱/衰减(吸收散射)、频散(导波)**——这四类物理量就是 ML 模型要从回波里"读"出来的可分性来源。理解它们,才能设计对的特征与不变性。
|
||||
|
||||
---
|
||||
|
||||
## 3. 测什么信号 / 信号形态
|
||||
|
||||
最原始的单通道回波叫 **A-scan**(幅度 vs 时间)。从中可提三类表征:
|
||||
|
||||
- **时域**:ToF、首回波幅度、**包络(Hilbert 变换取 envelope)**、多次回波间隔、衰减速率。
|
||||
- **频域**:功率谱、**衰减谱**(不同频率的损耗)、共振峰、谱质心。
|
||||
- **时频域**:STFT 频谱图(spectrogram)、**小波/小波包系数**——兼顾"何时"与"何频",适合非平稳回波。
|
||||
|
||||
采集模式:脉冲回波(同侧)、穿透法(两侧)、隔容器(贴外壁,靠"壁后是否有液体改变反射系数"判别液体)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 特征工程 vs 端到端:两条技术路线
|
||||
|
||||
### 4.1 手工特征 + 经典 ML
|
||||
|
||||
传统做法是先用信号处理提特征,再喂经典分类器:
|
||||
|
||||
- **EMD/IMF 特征**:经验模态分解得本征模态函数,提 16 维特征向量,喂 KNN/决策树/SVM;并配声学理论模型。显著提升机器人在**黑暗/粉尘/危险环境**下的材质识别能力。
|
||||
- **小波/小波包**:对非平稳回波提时频特征;衰减相关的连续小波变换(CWT)可区分不同热处理/硬度的钢。
|
||||
- **FFT + PCA 降维**:在频域提特征再降维,维持精度。
|
||||
- **统计/谱特征**:均值、方差、谱质心、过零率等。
|
||||
|
||||
经典分类器:**SVM(含 wavelet+SVM、EMD+SVM)、KNN、随机森林、决策树、Fuzzy ARTMAP**。
|
||||
|
||||
### 4.2 端到端深度学习
|
||||
|
||||
直接吃原始回波(或包络/频谱图),让网络自动学特征。**已被证明优于手工特征**:一项工作把 FFT/小波手工特征与 CNN 自动特征对比,CNN 端到端达 **0.982** 准确率,超过手工特征分类器。
|
||||
|
||||
---
|
||||
|
||||
## 5. 模型方法谱系与代表结果
|
||||
|
||||
| 方法 | 输入 | 任务/材料 | 结果 | 出处 |
|
||||
|------|------|-----------|------|------|
|
||||
| **1D-CNN**(Hilbert 包络) | 原始回波包络 | 玻璃/木/金属/海绵/布 5 类 | 准确率 96%、F1 95% | 非接触超声回波材质分类(Procedia CS 2024) |
|
||||
| **CNN vs 手工特征** | 原始信号 / FFT / 小波 | 超声信号分类 | CNN 端到端 0.982,胜手工特征 | Automated Classification via CNN(MDPI 2022) |
|
||||
| **DCNN + 小波 + SVM 顶层** | 小波系数 | 复合材料超声信号 | 紧凑表示 + 线性 SVM 分类 | Composite materials via DCNN(Neurocomputing 2017) |
|
||||
| **AE-CS-TCN**(注意力+时序卷积+跨尺度融合+交叉注意力) | 原始回波 | 机器人材质识别 | 联合学空间/时序/多尺度特征,机器人平台验证 | 非接触超声回波+DL(Signal Processing 2025) |
|
||||
| **EMD + SVM/KNN/决策树** | 16 维 IMF 特征 | 多材质 | 提升暗/尘/危险环境识别 | EMD+经典 ML |
|
||||
| **双模态超声系统** | 接近 + 材质 | 13 种工业材料 | **98% 分类、测距误差 <3mm**、毫秒级 | 双模态接近+材质 |
|
||||
| **柔性超声阵列** | 阵列回波 | 接近觉 + 材质 | 机器人安全控制 | 双功能柔性超声阵列(J. Field Robotics) |
|
||||
| **NN on 脉冲回波 / TOFD** | A-scan | 缺陷/状态分类 | 脉冲回波 72.5%、TOFD 77.5%,预处理后 TOFD→97.5% | ML 综述(J. Mech. Eng. 2025) |
|
||||
|
||||
**趋势**:从"手工特征 + SVM" → "1D-CNN 端到端" → "时序卷积 / 多尺度 / 注意力(TCN、AE-CS-TCN)",并向**多模态融合**(超声 + 毫米波 + 视觉)演进。
|
||||
|
||||
---
|
||||
|
||||
## 6. 机器人与具身应用:把"识材"用起来
|
||||
|
||||
材质识别在机器人里最有价值的位置是 **pre-touch(预触觉)**——比远距视觉近、比接触触觉远,在"接触前的最后几厘米"给出几何 + 材质信息,避免接触触觉碰飞轻物、避免视觉对透明/暗光失效。
|
||||
|
||||
代表性工作(声学/超声 + 机器人):
|
||||
|
||||
- **非接触超声回波 + DL 预触识材**:在配自研超声模块的机器人平台上,直接从原始回波联合学空间/时序/多尺度特征,做接触前材质识别(AE-CS-TCN)。
|
||||
- **Active Acoustic Sensing for Robot Manipulation**([2308.01600](https://arxiv.org/abs/2308.01600)):振动作动器 + 压电麦克风,利用**物体共振**(与材质/形状/内部结构/接触状态相关)感知;**对光照与自遮挡不敏感**,把局部接触与全局状态(形状、材质、抓取点、内部变化、外部接触)联系起来。
|
||||
- **SonicSense**([2406.17932](https://arxiv.org/abs/2406.17932)):从**手内声学振动**做物体感知(材质/几何),展示接触式声学感知的丰富信息。
|
||||
- **Acoustic Sensing for Universal Jamming Grippers**([2603.00351](https://arxiv.org/abs/2603.00351)):把声学感知用于颗粒阻塞夹爪。
|
||||
- **预抓取光谱夹爪**([2207.00942](https://arxiv.org/abs/2207.00942)):非超声但同思路——夹爪集成光谱,递归 SVM 在接近过程中逐步提升材质判别置信度。
|
||||
- **"海螺效应" pre-touch**:检测手指接近物体时**环境声共振频率漂移**,兼具测距与材质选择性。
|
||||
|
||||
工业/场景应用:
|
||||
|
||||
- **NDT**:缺陷探测 + 材质/微结构表征(热处理、硬度、焊缝)。
|
||||
- **隔容器液体识别**:贴容器外壁,靠**声速、衰减、密度、频率相关吸收**与"壁后反射系数"识别内部液体/混合状态(蜂蜜-水、面糊混合的"是否混匀"分类)。
|
||||
- **油气测井**:CNN 把声阻抗信号翻译成套管环空类型。
|
||||
- **分拣/回收、农业、食品**:非接触识材用于不透明系统的实时在线检测。
|
||||
|
||||
---
|
||||
|
||||
## 7. 数据与实验流水线
|
||||
|
||||
一条可复现的"超声 + ML 识材"流水线:
|
||||
|
||||
1. **硬件**(呼应综述第 14/15 章):空气耦合换能器 / MEMS PMUT(如 TDK Chirp)/ 压电探头;可加阵列或多频。匹配层(气凝胶、PVDF、1-3 复合压电)对空气耦合信噪比至关重要。
|
||||
2. **数据采集**:**严格控制并记录距离、入射角、表面朝向、温度**(这些都会混入回波——见 §8);用转台/导轨系统化扫描;每材质多样本多姿态。
|
||||
3. **预处理**:时间门控(gating)截取目标回波、去噪、**Hilbert 取包络**、幅度/能量归一化(抑制距离影响)。
|
||||
4. **特征 / 输入**:原始 A-scan、包络、频谱、或频谱图/小波系数(喂 2D-CNN)。
|
||||
5. **数据增强**:加噪、时移、幅度扰动、距离/角度合成。
|
||||
6. **模型与评估**:经典(SVM/RF)做基线,DL(1D-CNN/TCN/2D-CNN-spectrogram)做主力;务必做**留一材质/留一距离/留一传感器**的泛化评估,而非随机划分。
|
||||
7. **数据集**:公开的 **MatSense2025**(超声 + 毫米波多传感器,面向材质分类/NDT/传感器融合)可作起点;多数工作仍自采,缺乏统一基准。
|
||||
|
||||
---
|
||||
|
||||
## 8. 核心挑战(这是"更深"的关键)
|
||||
|
||||
超声识材在论文里准确率漂亮,但落地难,难在**回波把材质和一堆干扰因素纠缠在一起**:
|
||||
|
||||
- **距离依赖**:回波幅度随传播距离衰减,模型容易把"距离"误学成"材质"。需幅度归一化、距离不变特征或显式建模距离。
|
||||
- **角度/朝向/形状混淆**:曲面、斜入射改变回波结构,**几何与材质强耦合**——同一材质不同形状回波差异可能大于不同材质。
|
||||
- **表面粗糙度散射**:粗糙面散射使回波弥散,干扰频谱特征。
|
||||
- **温度漂移**:声速随温度变化,精密任务需温度补偿。
|
||||
- **跨传感器/跨频率泛化**:不同换能器、频率、带宽输出不可直接迁移(与触觉领域"跨传感器泛化"难题同源)。
|
||||
- **难测材质**:强吸声(海绵/泡沫)回波弱、镜面斜反射丢信号、极薄/多层结构难分辨。
|
||||
- **空气耦合低信噪比**:~1% 透射 + 空气高频吸收,远距更糟。
|
||||
- **对未见材质泛化与可解释性**:闭集分类易、开集/未见材质难;模型决策与物理量(Z、衰减)的对应需可解释性支撑。
|
||||
- **数据稀缺与缺基准**:公开数据集少、采集条件不统一,难横向比较;sim2real(声学仿真到真实)尚不成熟。
|
||||
|
||||
> 一句话:**让模型学"材质本身"而非"采集条件",是这个方向真正的难点。** 距离/角度/温度/传感器不变的表示学习,是落地的关键。
|
||||
|
||||
---
|
||||
|
||||
## 9. 与多感官框架 / MultiPLY 的关系
|
||||
|
||||
- **互补定位**:超声识材是**接触前、非接触、可探次表面**的声学模态,补视觉(透明/暗光/遮挡)与触觉(须接触)的盲区,且比被动撞击声更可控(主动发射)。
|
||||
- **作为 pre-touch 决策**:在 MultiPLY 式具身 LLM 里,可设 `<probe>`(超声探测)动作 token 与"回波/距离/材质"状态 token,让智能体"先隔空扫一下材质,再决定要不要去摸/敲/抓"。
|
||||
- **多模态融合**:超声(材质/距离)+ 毫米波(穿透/距离)+ 视觉(外观)+ 视触觉(接触面)+ 撞击声(敲击后材质)天然互补;MatSense2025 的"超声+毫米波"即此思路。
|
||||
- **表示学习借鉴**:可借鉴触觉领域 UniTouch/TLV 的"跨传感器对齐"与"绑定到视觉/语言",做**声学材质表示 → 对齐视觉/语言**,从而零样本识材或用语言描述材质。
|
||||
|
||||
---
|
||||
|
||||
## 10. 未来方向
|
||||
|
||||
- **跨距离/跨角度/跨传感器不变表示**:用对比学习/域泛化把"材质本质"与"采集条件"解耦。
|
||||
- **声学材质基础模型**:大规模多材质、多传感器、多距离数据上自监督预训练,做可迁移的超声材质 encoder。
|
||||
- **多模态融合与对齐**:超声 + 毫米波 + 视觉 + 触觉 + 语言的统一材质表示。
|
||||
- **可微声学仿真 + sim2real**:用可微/物理仿真造数据并做真实标定,缓解数据稀缺。
|
||||
- **面向具身的 pre-touch 策略**:把"何时探、探哪里、探完怎么决策"做成可学习的主动感知策略(接入 VLA/具身 LLM)。
|
||||
- **开集与可解释**:开放材质识别 + 把模型决策映射回声阻抗/衰减等物理量。
|
||||
- **统一基准**:建立公开、标准化、含干扰因素标注的超声材质识别 benchmark。
|
||||
|
||||
---
|
||||
|
||||
## 11. 参考与资源
|
||||
|
||||
### 机器人 / 具身声学感知
|
||||
- Active Acoustic Sensing for Robot Manipulation<https://arxiv.org/abs/2308.01600>
|
||||
- SonicSense: Object Perception from In-Hand Acoustic Vibration<https://arxiv.org/abs/2406.17932>
|
||||
- Acoustic Sensing for Universal Jamming Grippers<https://arxiv.org/abs/2603.00351>
|
||||
- Pregrasp Object Material Classification with Integrated Spectroscopy<https://arxiv.org/abs/2207.00942>
|
||||
|
||||
### 超声回波 + ML 材质/信号分类
|
||||
- Material Classification based on Non-contact Ultrasonic Echo Signal Using Deep Learning (1D-CNN, 96%)<https://www.sciencedirect.com/science/article/pii/S1877050924007361>
|
||||
- A non-contact material recognition method using ultrasonic echo signals and deep learning (AE-CS-TCN, 2025)<https://www.sciencedirect.com/science/article/abs/pii/S0165168425005249>
|
||||
- Automated Classification of Ultrasonic Signal via CNN (0.982, MDPI 2022)<https://www.mdpi.com/2076-3417/12/9/4179>
|
||||
- Ultrasonic signal classification for composite materials via deep CNN (Neurocomputing 2017)<https://www.sciencedirect.com/science/article/abs/pii/S0925231217301522>
|
||||
- Surrounding Object Material Detection and Identification for Robots Based on Ultrasonic Echo (Wiley 2023)<https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218>
|
||||
- Dual-Functional Flexible Ultrasonic Sensor Array: Proximity + Material Recognition (J. Field Robotics)<https://onlinelibrary.wiley.com/doi/10.1002/rob.70225>
|
||||
- Machine learning in ultrasonics-based defect detection and material characterization: a review (2025)<https://journals.sagepub.com/doi/10.1177/16878132251347390>
|
||||
|
||||
### 物理与空气耦合
|
||||
- Review of air-coupled ultrasonic materials characterization (Ultrasonics)<https://www.sciencedirect.com/science/article/abs/pii/S0041624X14000377>
|
||||
- Air-coupled Ultrasound – A Millennial Review<https://www.ndt.net/article/wcndt00/papers/idn507/idn507.htm>
|
||||
|
||||
### 数据集
|
||||
- MatSense2025: Multi-Sensor Dataset of Ultrasonic and mmWave for Material Classification<https://ieee-dataport.org/documents/multi-sensor-dataset-ultrasonic-and-mmwave-material-classification-matsense2025>
|
||||
|
||||
---
|
||||
|
||||
## 来源(Sources)
|
||||
|
||||
- [非接触超声回波 1D-CNN 材质分类 (Procedia CS 2024)](https://www.sciencedirect.com/science/article/pii/S1877050924007361)
|
||||
- [超声回波 + 深度学习材质识别 AE-CS-TCN (Signal Processing 2025)](https://www.sciencedirect.com/science/article/abs/pii/S0165168425005249)
|
||||
- [CNN 自动分类超声信号 0.982 (MDPI Applied Sciences 2022)](https://www.mdpi.com/2076-3417/12/9/4179)
|
||||
- [复合材料超声信号 DCNN (Neurocomputing 2017)](https://www.sciencedirect.com/science/article/abs/pii/S0925231217301522)
|
||||
- [机器人超声回波材质识别 (Wiley 2023)](https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218)
|
||||
- [双功能柔性超声阵列:接近+材质 (Wiley J. Field Robotics)](https://onlinelibrary.wiley.com/doi/10.1002/rob.70225)
|
||||
- [超声 ML 缺陷检测与材质表征综述 (2025)](https://journals.sagepub.com/doi/10.1177/16878132251347390)
|
||||
- [Active Acoustic Sensing for Robot Manipulation (2308.01600)](https://arxiv.org/abs/2308.01600)
|
||||
- [SonicSense (2406.17932)](https://arxiv.org/abs/2406.17932)
|
||||
- [Acoustic Sensing for Universal Jamming Grippers (2603.00351)](https://arxiv.org/abs/2603.00351)
|
||||
- [Pregrasp Material Classification with Spectroscopy (2207.00942)](https://arxiv.org/abs/2207.00942)
|
||||
- [空气耦合超声材质表征综述 (Ultrasonics)](https://www.sciencedirect.com/science/article/abs/pii/S0041624X14000377)
|
||||
- [Air-coupled Ultrasound 综述 (NDT.net)](https://www.ndt.net/article/wcndt00/papers/idn507/idn507.htm)
|
||||
- [MatSense2025 数据集 (IEEE DataPort)](https://ieee-dataport.org/documents/multi-sensor-dataset-ultrasonic-and-mmwave-material-classification-matsense2025)
|
||||
@@ -0,0 +1,203 @@
|
||||
# 连续(非 Token)模型:面向空间与时间的模型与理论
|
||||
|
||||
> 主题:不把世界切成离散 token / 网格,而是用**连续函数 / 连续动力学**来建模——尤其针对**空间**与**时间**。
|
||||
> 覆盖四大家族:① 连续空间表示(神经场)② 连续时间动力学(Neural ODE 族)③ 算子学习 / 物理时空(Neural Operator)④ 非 Token 预测架构 / 世界模型(JEPA 族)。
|
||||
> 面向研究者;与本目录 world-model / 具身 / 多感官研究相呼应。
|
||||
|
||||
---
|
||||
|
||||
## 1. 动机:为什么要"非 Token、连续"
|
||||
|
||||
主流大模型(Transformer/LLM)的范式是**离散化**:把图像切 patch、把序列切 token、把空间切体素网格,再在离散符号上做注意力。这种"tokenization"在语言上极成功,但对**连续的物理世界(空间几何、时间演化)**有几处先天不适:
|
||||
|
||||
- **分辨率受限 / 网格伪影**:体素/像素网格的精度被离散步长锁死,内存随分辨率立方增长。
|
||||
- **丢失连续性与导数**:物理信号常以微分方程定义,token 化难以表达"在任意点的值及其空间/时间导数"。
|
||||
- **不规则采样难处理**:真实传感器是异步、非均匀采样的,离散步进模型(RNN/Transformer)天然假设等间隔。
|
||||
- **重建无关细节的浪费**:像素级生成式模型被迫预测大量与任务无关的高频细节。
|
||||
|
||||
**连续模型**的共同主张:**用一个神经网络去参数化一个连续对象**——空间上的场 `f(x)`、时间上的轨迹 `dz/dt = f(z,t)`、函数空间之间的算子 `G: a(·)↦u(·)`、或抽象潜在空间里的预测。由此获得**分辨率无关、可微(可取导数)、能处理不规则采样、可嵌入物理先验**等好处。
|
||||
|
||||
> 一句话:**Token 把世界离散成符号;连续模型把世界参数化成函数与流。**
|
||||
|
||||
---
|
||||
|
||||
## 2. 总览:四大家族一张图
|
||||
|
||||
```
|
||||
"用神经网络参数化一个连续对象"
|
||||
┌──────────────┬───────────────┬────────────────┬──────────────────┐
|
||||
│ ① 连续空间 │ ② 连续时间 │ ③ 算子学习 │ ④ 非Token预测 │
|
||||
│ 神经场 │ 动力学 │ /物理时空 │ /世界模型 │
|
||||
│ f(x)=值 │ dz/dt=f(z,t) │ G:a(·)↦u(·) │ 在潜在空间预测 │
|
||||
│ NeRF/SIREN │ Neural ODE │ FNO/DeepONet │ JEPA/V-JEPA2 │
|
||||
│ DeepSDF/GS │ CDE/SDE/LTC │ PINN/算子 │ DINO-WM │
|
||||
│ 空间连续 │ 时间连续 │ 函数空间连续 │ 表示空间连续 │
|
||||
└──────────────┴───────────────┴────────────────┴──────────────────┘
|
||||
```
|
||||
|
||||
四者的"连续"作用在不同对象上:①空间坐标 → ②时间 → ③整个函数(输入/输出都是函数)→ ④抽象表示空间。下面逐一展开。
|
||||
|
||||
---
|
||||
|
||||
## 3. 家族一:连续空间表示 / 神经场(Neural Fields / INR)
|
||||
|
||||
**核心思想**:用一个 MLP 把**连续坐标**映射到**信号值**——`f_θ(x, y, z, [方向/时间]) → (颜色/密度/占据/距离…)`。物体/场景不再存成网格,而是存成"网络权重",可在任意分辨率查询。
|
||||
|
||||
代表工作:
|
||||
|
||||
- **Occupancy Networks**(CVPR 2019,[1812.03828](https://arxiv.org/abs/1812.03828)):把形状表示为连续**占据概率函数** `o(x)∈[0,1]`,无限分辨率、内存友好。
|
||||
- **DeepSDF**(CVPR 2019,[1901.05103](https://arxiv.org/abs/1901.05103)):学习连续**有符号距离函数(SDF)**,零等值面即表面;用 latent code 表示一整类形状。
|
||||
- **SIREN**(NeurIPS 2020,[2006.09661](https://arxiv.org/abs/2006.09661)):用**周期激活函数(sin)**的 MLP 表示连续可微信号,关键性质是**任意阶导数仍是 SIREN**(sin 的导数是 cos),因此特别适合表示信号的空间/时间导数、求解 Eikonal/Poisson/Helmholtz/波动等 PDE。
|
||||
- **NeRF**(ECCV 2020,[2003.08934](https://arxiv.org/abs/2003.08934)):把 3D 场景表示为连续**辐射场** `(x,方向)→(颜色,密度)`,配可微体渲染做新视角合成;引爆了"神经场"研究。
|
||||
- **3D Gaussian Splatting**(SIGGRAPH 2023,[2308.04079](https://arxiv.org/abs/2308.04079)):把场景表示为一堆各向异性 3D 高斯(显式、可栅格化),实时渲染。它**保留了连续体积辐射场的优良性质,却用显式基元规避空白区计算**——是"连续 vs 显式"张力的代表性折中。
|
||||
- **动态/4D 扩展**:把空间场再加时间轴。如 **D-NeRF**([2011.13961](https://arxiv.org/abs/2011.13961))用形变场建模动态场景;**NeRFPlayer**([2210.15947](https://arxiv.org/abs/2210.15947))按静态/形变/新增区域分解 4D 时空;**4D Gaussian Splatting**(CVPR 2024)把 3DGS 扩到动态。
|
||||
|
||||
> 与本目录研究的连接:**ObjectFolder**(多感官物体数据集,见《多感官…综述》)正是用**隐式神经场**(VisionNet/AudioNet/TouchNet)表示视/听/触——它就是"神经场 + 多感官"的典范。
|
||||
|
||||
---
|
||||
|
||||
## 4. 家族二:连续时间动力学(Neural ODE 族)
|
||||
|
||||
**核心思想**:不再堆叠离散层 / 离散时间步,而是把隐状态的**演化**写成微分方程,用 ODE 求解器积分——**深度/时间变成连续变量**。
|
||||
|
||||
代表工作:
|
||||
|
||||
- **Neural ODE**(NeurIPS 2018,[1806.07366](https://arxiv.org/abs/1806.07366)):把隐状态导数参数化为网络 `dh/dt = f_θ(h,t)`,用黑盒 ODE 求解器前向、**伴随法(adjoint)**反传;常数内存、可在精度与速度间权衡。是"连续深度"的奠基。
|
||||
- **Latent ODE / ODE-RNN**(NeurIPS 2019,[1907.03907](https://arxiv.org/abs/1907.03907)):编码器(RNN/GRU)得初始潜状态,再用 Neural ODE 在潜空间演化——**天然处理不规则采样时间序列**,可在任意时刻插值/预测。
|
||||
- **Neural CDE**(NeurIPS 2020,[2005.08926](https://arxiv.org/abs/2005.08926)):Neural ODE 的解只由初值决定、无法吸收后续观测;CDE 用"受控微分方程"让轨迹**持续响应到来的数据流**,是"连续时间 RNN",擅长部分观测/不规则多元时间序列。
|
||||
- **Neural SDE**:加入随机项,做生成式建模与不确定性量化。
|
||||
- **Liquid Time-Constant Networks(LTC)**(AAAI 2021,[2006.04439](https://arxiv.org/abs/2006.04439)):连续时间、时间常数可变的 ODE-RNN,稳定有界、表达力强,时间序列预测表现好。
|
||||
- **CfC(Closed-form Continuous-time)**([2106.13898](https://arxiv.org/abs/2106.13898)):给出 LTC 的**闭式解**,**无需 ODE 求解器**即可推理,大幅提速;训练好的 LTC 可"编译"为 CfC。
|
||||
- **S4 / 结构化状态空间**(ICLR 2022,[2111.00396](https://arxiv.org/abs/2111.00396)):底层是**连续时间状态空间模型** `dx/dt=Ax+Bu, y=Cx+Du`,再离散化;以低秩修正稳定对角化高效计算,擅长超长程依赖(首个攻克 Path-X 16k)。其后继 **Mamba** 引入选择性机制——可视为"连续时间 SSM"到现代序列模型的桥梁。
|
||||
|
||||
> 直觉:ResNet 是 Neural ODE 的离散欧拉近似;RNN 是连续时间动力学的离散采样。连续时间模型把这些"步数"还给了微积分。
|
||||
|
||||
---
|
||||
|
||||
## 5. 家族三:算子学习 / 物理时空(Neural Operators)
|
||||
|
||||
**核心思想**:前两家族学的是"函数"(坐标→值)或"轨迹",而算子学习直接学**函数到函数的映射**(无穷维 → 无穷维),即 PDE 的**解算子** `G: 参数/初值/边界函数 a(·) ↦ 解函数 u(·)`。关键性质是**离散无关(mesh-independent)**:训练后可在任意网格/分辨率上评估,零样本超分辨。
|
||||
|
||||
代表工作:
|
||||
|
||||
- **PINN(物理信息神经网络)**(Raissi 等 2017,[1711.10561](https://arxiv.org/abs/1711.10561);JCP 2019):把 PDE 残差作为损失约束,让网络在满足数据的同时**遵守物理定律**;分连续时间与离散时间两类。局限:换参数/初值要重训(学的是"某一个解"而非"算子")。
|
||||
- **DeepONet**([1910.03193](https://arxiv.org/abs/1910.03193);Nature MI 2021):基于**算子万能逼近定理**,用 **branch 网(编码输入函数在传感点的采样)+ trunk 网(编码输出位置)**学非线性算子;可一次学一族 PDE。
|
||||
- **FNO(傅里叶神经算子)**(ICLR 2021,[2010.08895](https://arxiv.org/abs/2010.08895)):把积分核**直接在傅里叶空间参数化**(FFT→低频模态线性变换→逆 FFT),高效捕捉非局部相关;首个零样本超分辨建模湍流,比传统求解器快达三个数量级。FNO-3D 直接在"空间×时间"上做卷积。
|
||||
- **变体生态**:Geo-FNO([2207.05209](https://arxiv.org/abs/2207.05209),复杂几何)、Graph/Multipole Neural Operator、L-DeepONet(潜空间)、通用 Neural Operator 理论框架等。
|
||||
|
||||
> 与本目录的连接:算子学习是**可微物理仿真 / 世界模型的"物理引擎"候选**——比如把流体/接触动力学学成一个快速可微算子,正好契合具身世界模型对"快而准的动力学预测"的需求。
|
||||
|
||||
---
|
||||
|
||||
## 6. 家族四:非 Token 预测架构 / 世界模型(JEPA 族)
|
||||
|
||||
**核心思想**:不在像素/token 层面重建,而是**在抽象表示(潜在)空间里做预测**——预测"被遮挡/未来部分的表示",从而聚焦高层本质、忽略不可预测的无关细节。这是 LeCun 对"自主机器智能"的核心主张。
|
||||
|
||||
代表工作:
|
||||
|
||||
- **LeCun《A Path Towards Autonomous Machine Intelligence》**(2022,立场论文):提出以**世界模型**为核心的认知架构蓝图,JEPA 作为其世界模型模块;理论上可视为在**表示空间上的能量模型(EBM)**。
|
||||
- **I-JEPA**(CVPR 2023,[2301.08243](https://arxiv.org/abs/2301.08243)):图像版——从可见 patch 的表示预测被遮挡区域的**表示**(而非像素);高效且表征强(632M ViT,16×A100,<72h,ImageNet 低样本 SOTA)。
|
||||
- **V-JEPA**(2024):视频版,特征预测学习视频表示。
|
||||
- **V-JEPA 2**(2025,[2506.09985](https://arxiv.org/abs/2506.09985)):在 >100 万小时视频上自监督预训练**动作无关**的视频世界模型,再用极少机器人交互数据(<62h Droid)训练**动作条件预测器 V-JEPA 2-AC**,在 MPC 框架下做**零样本机器人规划**(抓取/搬运成功率显著超过 VLA 基线 Octo)。这是 JEPA 从"表示学习"走向"可规划世界模型"的关键一步。
|
||||
- **DINO-WM**(ICML 2025,[2411.04983](https://arxiv.org/abs/2411.04983)):在 **DINOv2 预训练 patch 特征**的连续潜空间里建模动态、预测未来潜表示(不重建像素),用 CEM 做零样本规划;在迷宫/推物等任务零样本求解。
|
||||
- **seq-JEPA**([2505.03176](https://arxiv.org/abs/2505.03176)):把 JEPA 与序列处理归纳偏置结合,同时学等变与不变表示。
|
||||
|
||||
> 注意:JEPA 的"连续"指的是**在连续/稠密的表示空间里预测**(非离散 token、非像素重建),与前三家族的"空间/时间连续"是不同维度上的"非 Token"。它与具身世界模型(V-JEPA 2、DINO-WM)直接相关。
|
||||
|
||||
**相关的连续生成线**:**Flow Matching**(ICLR 2023,[2210.02747](https://arxiv.org/abs/2210.02747))用连续归一化流(CNF)学连续概率路径的向量场,是扩散的连续时间推广——常作为连续潜在世界模型/生成式动力学的训练工具。
|
||||
|
||||
---
|
||||
|
||||
## 7. 理论主线:四家族其实在说同一件事
|
||||
|
||||
把四者放在一起,能看到一条统一线索——**把"离散堆叠/网格"替换为"连续数学对象 + 神经参数化"**:
|
||||
|
||||
- **微分方程视角**:ResNet ≈ Neural ODE 的离散欧拉步;RNN ≈ 连续时间动力学的采样;S4/Mamba 底层是连续时间 SSM 的离散化。**深度与时间都可连续化**。
|
||||
- **函数 / 场视角**:神经场把"信号"看成坐标的连续函数;算子学习把"映射"看成函数空间之间的连续算子。SIREN 既是神经场又能解 PDE,**正好是家族①与③的交汇**。
|
||||
- **物理先验视角**:PINN 把 PDE 写进损失;FNO/DeepONet 把 PDE 解算子学出来;SIREN/神经场天然可微以满足 PDE——三者都在**让网络尊重连续物理**。
|
||||
- **预测目标视角**:JEPA 把"预测"从像素/token 移到连续表示空间——**用连续表示而非离散符号做世界建模**。
|
||||
- **可微性这条暗线**:连续 ⇒ 可取导数 ⇒ 可做梯度规划、可嵌物理约束、可微仿真。这是它们对**世界模型 / 控制 / 科学计算**特别有吸引力的根本原因。
|
||||
|
||||
---
|
||||
|
||||
## 8. 与你的研究(world model / 具身 / 多感官)的关系
|
||||
|
||||
- **连续世界模型已成主流候选**:V-JEPA 2、DINO-WM 证明"在连续潜空间预测 + 规划"可做零样本机器人控制——这正是 MultiPLY 式具身智能体可借鉴的"非 token、可规划"路线。
|
||||
- **神经场 = 多感官物体的连续容器**:ObjectFolder 的隐式神经表示就是神经场;超声/触觉/声场都可用连续场建模(连续而非逐点采样)。
|
||||
- **连续时间 = 多模态异步融合的天然工具**:视/触/听/超声采样率不同、异步到达,Neural CDE/Latent ODE 能在连续时间轴上对齐与融合不规则采样的多感官流。
|
||||
- **算子学习 = 具身世界模型的物理引擎**:接触动力学、声波传播(超声/撞击声)都可学成可微算子,用于快速预测与规划。
|
||||
- **可微贯穿全栈**:连续表示让"感知→预测→规划"可端到端求导,契合具身闭环。
|
||||
|
||||
---
|
||||
|
||||
## 9. 连续 vs Token:权衡与开放问题
|
||||
|
||||
**连续模型的优势**:分辨率无关、可微、可取导数、处理不规则采样、嵌入物理先验、表示紧凑、避免重建无关细节。
|
||||
|
||||
**代价与开放问题**:
|
||||
|
||||
- **训练/推理成本**:ODE 求解器慢(CfC 用闭式解缓解);神经场逐场景优化慢(GS 用显式基元加速)。
|
||||
- **可扩展性与工程生态**:Token/Transformer 有成熟的硬件与扩展规律(scaling laws),连续模型的大规模扩展与稳定训练仍在早期(JEPA 易表示坍塌、需 EMA/复杂损失)。
|
||||
- **离散 vs 连续的回摆**:3D Gaussian Splatting(显式)反超 NeRF(隐式连续)、Mamba(离散选择性)源自连续 SSM——说明"纯连续"并非总最优,**混合(连续性质 + 显式/离散效率)**往往胜出。
|
||||
- **理论保证**:算子学习有逼近定理,但连续世界模型的可规划性、泛化、稳定性理论仍不完善。
|
||||
- **统一框架缺失**:四家族目前各自为政,缺一个把"空间连续 + 时间连续 + 函数空间 + 表示预测"统一起来的框架。
|
||||
|
||||
---
|
||||
|
||||
## 10. 论文与资源清单
|
||||
|
||||
### ① 连续空间表示 / 神经场
|
||||
- Occupancy Networks(CVPR 2019)<https://arxiv.org/abs/1812.03828>
|
||||
- DeepSDF(CVPR 2019)<https://arxiv.org/abs/1901.05103>
|
||||
- SIREN(NeurIPS 2020)<https://arxiv.org/abs/2006.09661>
|
||||
- NeRF(ECCV 2020)<https://arxiv.org/abs/2003.08934>
|
||||
- 3D Gaussian Splatting(SIGGRAPH 2023)<https://arxiv.org/abs/2308.04079>
|
||||
- D-NeRF(动态)<https://arxiv.org/abs/2011.13961> / NeRFPlayer(4D)<https://arxiv.org/abs/2210.15947>
|
||||
|
||||
### ② 连续时间动力学
|
||||
- Neural ODE(NeurIPS 2018)<https://arxiv.org/abs/1806.07366>
|
||||
- Latent ODE / ODE-RNN(NeurIPS 2019)<https://arxiv.org/abs/1907.03907>
|
||||
- Neural CDE(NeurIPS 2020)<https://arxiv.org/abs/2005.08926>
|
||||
- Liquid Time-Constant Networks(AAAI 2021)<https://arxiv.org/abs/2006.04439>
|
||||
- CfC 闭式连续时间网络<https://arxiv.org/abs/2106.13898>
|
||||
- S4 结构化状态空间(ICLR 2022)<https://arxiv.org/abs/2111.00396>
|
||||
|
||||
### ③ 算子学习 / 物理时空
|
||||
- PINN(2017)<https://arxiv.org/abs/1711.10561>
|
||||
- DeepONet(2019)<https://arxiv.org/abs/1910.03193>
|
||||
- FNO 傅里叶神经算子(ICLR 2021)<https://arxiv.org/abs/2010.08895>
|
||||
- Geo-FNO(复杂几何)<https://arxiv.org/abs/2207.05209>
|
||||
|
||||
### ④ 非 Token 预测架构 / 世界模型
|
||||
- I-JEPA(CVPR 2023)<https://arxiv.org/abs/2301.08243>
|
||||
- V-JEPA 2(2025,机器人世界模型)<https://arxiv.org/abs/2506.09985>
|
||||
- DINO-WM(ICML 2025)<https://arxiv.org/abs/2411.04983>
|
||||
- seq-JEPA<https://arxiv.org/abs/2505.03176>
|
||||
- Flow Matching(ICLR 2023,连续生成)<https://arxiv.org/abs/2210.02747>
|
||||
|
||||
---
|
||||
|
||||
## 来源(Sources)
|
||||
|
||||
- [Occupancy Networks (1812.03828)](https://arxiv.org/abs/1812.03828)
|
||||
- [DeepSDF (1901.05103)](https://arxiv.org/abs/1901.05103)
|
||||
- [SIREN (2006.09661)](https://arxiv.org/abs/2006.09661)
|
||||
- [NeRF (2003.08934)](https://arxiv.org/abs/2003.08934)
|
||||
- [3D Gaussian Splatting (2308.04079)](https://arxiv.org/abs/2308.04079)
|
||||
- [D-NeRF (2011.13961)](https://arxiv.org/abs/2011.13961)
|
||||
- [NeRFPlayer (2210.15947)](https://arxiv.org/abs/2210.15947)
|
||||
- [Neural ODE (1806.07366)](https://arxiv.org/abs/1806.07366)
|
||||
- [Latent ODE / ODE-RNN (1907.03907)](https://arxiv.org/abs/1907.03907)
|
||||
- [Neural CDE (2005.08926)](https://arxiv.org/abs/2005.08926)
|
||||
- [Liquid Time-Constant Networks (2006.04439)](https://arxiv.org/abs/2006.04439)
|
||||
- [CfC (2106.13898)](https://arxiv.org/abs/2106.13898)
|
||||
- [S4 (2111.00396)](https://arxiv.org/abs/2111.00396)
|
||||
- [PINN (1711.10561)](https://arxiv.org/abs/1711.10561)
|
||||
- [DeepONet (1910.03193)](https://arxiv.org/abs/1910.03193)
|
||||
- [FNO (2010.08895)](https://arxiv.org/abs/2010.08895)
|
||||
- [Geo-FNO (2207.05209)](https://arxiv.org/abs/2207.05209)
|
||||
- [I-JEPA (2301.08243)](https://arxiv.org/abs/2301.08243)
|
||||
- [V-JEPA 2 (2506.09985)](https://arxiv.org/abs/2506.09985)
|
||||
- [DINO-WM (2411.04983)](https://arxiv.org/abs/2411.04983)
|
||||
- [seq-JEPA (2505.03176)](https://arxiv.org/abs/2505.03176)
|
||||
- [Flow Matching (2210.02747)](https://arxiv.org/abs/2210.02747)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 700 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user