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:
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)
|
||||
Reference in New Issue
Block a user