深度⏱ ~3 min
里程碑
⭐ 为何重要

Ze 等的 DP3 把稀疏点云 3D 表征接上极简 MLP+pooling,再喂入扩散策略头,在 72 个 RLBench 任务上比原 2D Diffusion Policy 平均提升约 24.2%,且仅需 10 条示教。它用最少的设计证明 3D 几何对策略泛化的关键作用,是 T05(Diffusion Policy 谱系)从 2D 走向 3D 的标志节点,也直接启发 iDP3、FlowPolicy、3D-based VLA 等后续工作。

机器人机械臂
数据集自采(72 任务)
上真机
实时
输入模态vision

论文:Yanjie Ze\, Gu Zhang\, Kangning Zhang, Chenyuan Hu, Muhan Wang, Huazhe Xu. 3D Diffusion Policy: Generalizable Visuomotor Policy Learning via Simple 3D Representations. RSS 2024,上海期智研究院 / 上海交通大学 / 清华大学 IIIS / 上海 AI Lab(\* 共同一作). arXiv:2403.03954. 🌐 · 真机平台:Franka + Allegro 手 / Franka + 夹爪,单 RealSense L515 深度相机

一句话直觉

让机械臂只用十个示范就学会精细动作。

秘诀是把"眼睛"从平面彩照换成一团立体点云。

立体点云之于机械臂视觉,就像立体眼镜之于看立体电影。

换个角度、挪个位置,深度关系一眼就看出来。

是什么·为什么

要解决的问题:教机械臂照着人录的示范学动作。

以前最好的办法看的是平面彩照。

物体挪几厘米、相机换个角度,它就不认得了。

换个桌布、变个光照也崩。

要凑效,常常得录一两百段示范。📎

老办法的根子:平面彩照学到的是"图里第几行第几列有东西"。

不是"物体在三维空间里相对机械手在哪"。

所以一点点空间偏移就完蛋。

这项工作的转身:把视觉输入从平面彩照换成单视角的立体点云。

点云是相机测距反推出来的一团三维点,直接长在三维空间里。

物体挪、相机转,点云跟着挪,相对几何关系不变。

配上一个故意做得极简的编码器,十个示范就够学。📎

方法核心(大白话):分两段。

第一段是"看"。

相机只拍深度,不拍颜色。

这是故意的,免得被桌布花纹和光照带偏。

把深度反投影成一团三维点。

裁掉桌面、地板这些多余点。

再均匀抽稀到五百或一千个点。

然后过一个非常朴素的编码器。

它就是三层小网络,每个点单独过一遍变成一小段数。

接着把所有点的小段数按位置取最大值合并。

这一步很关键,不论点的输入顺序怎么打乱,合并结果都一样。

最后压成六十四个数,交给决策网络。

第二段是"决定"。

决策网络就是普通的扩散策略。

它看着这六十四个数,加上机械臂当前姿态,一步步去噪出一段动作。

两段一起从头训,绝不冻结编码器。

最反直觉的点:编码器越简单越好。

那些为图像分类设计的复杂点云网络,在这里反而栽跟头。

原因不是它们不强。

是示范太少,它们的成见盖过了真正的任务信号。

里面有两个零件特别碍事。

一个管空间变换,一个管按批归一化

把它们拆掉,效果立刻追上来。📎

为什么简单反而赢:动作模仿的数据极少,只有十个示范。

复杂编码器是为百万级图像数据调出来的。

搬到小数据上,它的成见就盖过了任务本身。

朴素编码器没成见,把所有容量都用来学"三维几何到动作"这一件事。📎

你会看到:十个示范,在七十二个仿真任务上平均比老办法高两成多。

真机上做可变形面团卷、捏饺子褶、握电钻,四十段示范就做到七到十成成功。

物体换个位置、相机挪一挪、换个同类物体,它都还认得。📎

一句话类比:立体点云之于机械臂视觉,就像戴上立体眼镜之于看立体电影。

平面彩照认不出的深度关系,戴上眼镜一眼就看出来。

怎么做

核心机制·感知与决策解耦但端到端训

把"看懂三维场景"和"决定动作"拆成两段,但一起从头训。📎

端到端训是简单编码器能反超复杂编码器的关键。

冻住预训练的大编码器再训个头,反而更差。

感知段·点云获取(Sec.III.B)

  • 输入是单相机深度图(84×84),不用颜色,为了更好的外观泛化
  • 用相机内参外参把深度反投影成点云。
  • 裁掉 bounding box 外的冗余点(桌面、地面)。
  • FPS(farthest point sampling,最远点采样) 抽稀到 512 或 1024 点。FPS 比 uniform sampling 覆盖更均匀。📎

感知段·DP3 Encoder(Sec.III.B + Fig.2):三层 MLP 堆叠 + max-pool + projection。


Points (N, 3)
   ├─ Linear(3→64) → LayerNorm → ReLU
   ├─ Linear(64→128) → LayerNorm → ReLU
   ├─ Linear(128→256) → LayerNorm → ReLU
   ├─ Max Pool(over N points)→ (256,)
   └─ Projection Linear(256→64) → LayerNorm → v ∈ R^64

设计要点:📎

  • max pool 是 order-equivariant 操作——点云没有内在顺序,max pool 让输出与点的输入顺序无关。
  • LayerNorm 而不是 BatchNorm模仿学习的 batch 小且变化,BatchNorm 会把小 batch 训练搞崩。
  • 最终压到 64 维:很紧凑,下游扩散控制器容易消费。

决策段·扩散策略骨干(Sec.III.C):条件去噪扩散,条件是 $v$(三维特征)+ $\mathrm{MLP}(q)$(机械臂姿态过 2 层 MLP 编成 64 维),拼成 128 维。

  • 默认用 sample prediction(直接预测干净动作 $a^0$),不是 epsilon prediction(噪声预测)——PDF Sec.III.C 原文如此;Fig.7 消融显示 sample prediction 收敛更快,epsilon prediction 也 competitive。📎
  • 去噪骨干是 1D 卷积网络,沿用 Diffusion Policy。
  • 噪声调度用 DDIM,100 训练 timesteps / 10 推理 timesteps(论文 Sec.III.C 原文)。📎

关键消融·为什么简单编码器反超(Table V/VI):6 个任务平均成功率——DP3 Encoder 78.3;PointNet 15.7;PointNet++ 2.2;PointNeXt 2.3;Point Transformer 1.0。📎

几乎所有复杂编码器都崩了(多数任务 0%)。

Table VI 揭示根因:PointNet 里的 T-Net 和 BatchNorm 是主要 inhibitor(性能杀手)

相机固定,不需要 T-Net 学空间变换;小 batch 下 BatchNorm 不稳。

拆掉这两个,PointNet 能到 72.3,接近 DP3 的 78.3。📎

常见误区(先抛一个,完整版见末尾):"换个更 SOTA 的点云编码器一定更好吧?"

——错。论文实测 PointNeXt 只有 2.3%。

visuomotor control 数据极少(10 demo),分类任务的 inductive bias 反而是 overfit 来源。

正确做法:用极简编码器 + 端到端训。📎

深度

前向/反向扩散。条件去噪:$a^{k-1} = \alpha_k a^k - \gamma_k \epsilon_\theta(a^k, k, v, q) + \sigma_k \mathcal{N}(0,I)$。📎

其中 $a^k$ 是第 $k$ 步去噪中的动作,$\epsilon_\theta$ 是去噪网络,$v$ 是三维特征,$q$ 是机械臂姿态,$\alpha_k,\gamma_k,\sigma_k$ 是噪声调度系数。

训练目标形式上按论文 Eq.2 写成标准 DDPM 噪声预测:$\mathcal{L}=\mathbb{E}\big[\|\epsilon_\theta(a^k,k,v,q)-\epsilon\|^2\big]$,$\epsilon\sim\mathcal{N}(0,I)$;但实现默认 sample prediction(预测 $a^0$ 而非 $\epsilon$)——公式记号与实现参数化不是一回事。📎

DP3 Encoder 本质 = PointNet 去掉 T-Net 和 BatchNorm📎

PointNet 的核心是"per-point MLP + symmetric max-pool",DP3 保留这一骨架,只换归一化为 LayerNorm、去掉 T-Net。

这呼应 Hansen et al. ICML 2022《On Pre-training for Visuo-motor Control》(DP3 引用 [20])的观察:visuomotor policy 用小而 task-specific 的编码器,比用 frozen ImageNet 编码器更好。

仿真实验(Sec.IV.A,72 任务):任务套件 Adroit (3) + Bi-DexHands (6) + DexArt (4) + DexDeform (6) + DexMV (2) + HORA (1) + MetaWorld (Easy 28 / Medium 11 / Hard 6 / Very Hard 5) = 72 任务。多数任务仅 10 demo(DexArt 和 HORA 因难度高用 100 demo)。📎

主要结果(Table I):72 任务平均成功率——DP3 74.4 ± 29.9Diffusion Policy 59.8 ± 35.9(DP3 相对提升 24.2%)。DP3 在 9/10 任务子类上 > DP,仅 DexDeform(可变形物体)略低(87.8 vs 90.5)。📎

Table II 进一步对比 IBC、BCRNN 及其 3D 变种(10 任务平均):DP3 74.4 > Diffusion Policy 44.0 > BCRNN+3D 14.5 > IBC+3D 10.4 > BCRNN 9.8 > IBC 5.0——给 BCRNN/IBC 加 3D 编码器也救不回来(BCRNN 9.8→14.5、IBC 5.0→10.4,远不及 DP3),证明骨干(扩散)和编码器(DP3)缺一不可。📎

真机实验(Sec.V,4 任务 / 40 demo):硬件 Franka arm + Allegro hand(3 任务)/ Franka + gripper(Pour),单个 RealSense L515。

四任务(各 40 demo,因多阶段多指加可变形让采集昂贵):

  1. Roll-Up:Allegro 多次按压 plasticine 卷成卷;
  2. Dumpling:先包 plasticine 再捏饺子褶;
  3. Drill:抓电钻→移动→用钻头碰绿方块;
  4. Pour:抓碗→倒肉松→放碗。📎

真机结果(Table VIII,10 trials)DP3 85.0 ± 11.2(Roll-Up 90、Dumpling 70、Drill 80、Pour 100);Diffusion Policy (RGB) 35.0 ± 25.0;Diffusion Policy (Depth) 20.0 ± 12.2。📎

有趣观察:RGB-DP 在 Drill 拿了 70(最高),但 Roll-Up 0;Depth-DP 在 Roll-Up 拿了 40。不同模态有 task-specific 优势,DP3 全局最稳——论文未深入解释 Drill 上 RGB-DP 接近 DP3 的原因,可能钻头颜色信息有用。📎

四类泛化(Sec.V.C + Table IX–XII)

  1. Spatial(Pour,Table IX,5 个 unseen 位置):DP3 4/5 通过,baselines 全失败。
  2. Viewpoint(Roll-Up,Table XII,相机移动):DP3 鲁棒。
  3. Appearance(Drill,Table X,cube 颜色变化):DP3 全过。
  4. Instance(Drill,Table XI,Mouse / Espeon / Cup / Mug / Hand 等不同物体):DP3 work。📎

推理速度(Sec.IV.C + Fig.1):DP3 略快于 Diffusion Policy——极简编码器加 64 维 feature 比 CNN over RGB 更快;论文未给绝对 FPS 数字,但相对位置远高于 PerAct 的 2.23 FPS。📎

局限

  1. 单视角点云:遮挡区域看不到,复杂场景(多物体堆叠、内部空腔)受限。📎
  2. 不用颜色:纯几何丢失了"区分同形状不同材质"的能力(如识别按钮颜色)。论文称这是为了外观泛化,但牺牲了部分任务。📎
  3. 10 demo 仍依赖 demo 质量:复杂多阶段任务(Dumpling)demo 采集时间成本高,这是真机只能给 40 demo 的原因。📎
  4. FPS downsample 固定 512/1024:未做 learned pooling 或 attention📎
  5. 只在 Allegro/gripper 上验证:未覆盖 humanoid hand、bimanual、legged manipulation。📎
  6. 论文未明示:CNN backbone 具体层宽、优化器/lr、是否用 EMA、Allegro hand demo 的 retargeting 细节。[未确认]

研究者视角

图谱定位:DP3 是 Diffusion Policy 的 3D 进化版,T05(扩散策略)线索的 3D 分支节点。📎

它把 DP 的视觉输入从 2D RGB 换成 3D 点云,把 spatial/viewpoint/appearance/instance 四类泛化一次推到实用水平。

更重要的副产品是揭示 PointNet 家族在 visuomotor control 上的失败模式:T-Net 和 BatchNorm 是 inhibitor,去掉就接近 DP3。

这反过来提醒社区:视觉 RL/模仿学习不能盲目套用 vision 分类的 SOTA 编码器。📎

继承与催生

  • 建立在:Diffusion Policy [Chi et al. 2023](决策骨干直接复用)、DDPM/DDIM、PointNet [Qi et al. 2017](去 T-Net + BN 即 DP3)。📎
  • 同期/后续iDP3 [Ze et al. 2024, arXiv:2410.10803]——DP3 的 iterative variant;3D-VLA、RVT-2、PerAct2、GR00T N1(VLA 用 3D)。🌐

副产品·3D 表示的几何归纳偏置:spatial/viewpoint/appearance/instance 泛化本质都来自"3D 几何 + order-equivariance"。

这给后续 VLA/VLA-3D 工作奠定了表示层基础——把 RGB 换成点云,几乎是后续 3D manipulation 的默认起点。[未确认]

Open problems

  1. 多视角融合:单视角点云遮挡严重,DP3 未做。多视角或主动视角融合是开放方向。[未确认]
  2. 何时 DP3 会输给 RGB-DP:Drill 任务 RGB-DP 反超(70 vs 80),论文未深入解释。颜色信息何时有用、何时该混入,仍是开放问题。📎
  3. learned pooling 替代 FPS:FPS 固定下采样,未做可学习 pooling 或 attention。能否端到端学到更好的点采样,开放。[未确认]

常见误区

"换个更 SOTA 的点云编码器一定更好" —— 错。论文实测 PointNeXt 只有 2.3%、PointNet++ 只有 2.2%。📎 visuomotor control 数据极少(10 demo),分类任务的 inductive bias 反而是 overfit 来源。

极简编码器 + 端到端训。

"DP3 是因为 3D 编码器更强才赢" —— 错。赢在两点:(a) 输入从 2D RGB 换成 3D 点云(表示层红利);(b) 极简编码器去掉 T-Net 和 BatchNorm,让小数据下端到端训能学透。📎

3D 表示 + 极简架构,两者缺一不可。

"用 BatchNorm 更标准,应该换回来" —— 错。小 batch(imitation learning 常见)下 BatchNorm 统计量不稳,会让训练崩。📎

LayerNorm 是小 batch 场景的标配,不是可选项。

"DP3 不用颜色是偷懒" —— 部分错。不用颜色是刻意选择,目的是更好的外观泛化(不受纹理、光照影响)。代价是丢失"区分同形状不同材质"的能力。📎

颜色 on/off 是泛化 vs 任务特异性的 trade-off,不是疏忽。

"DP3 解决了所有泛化问题" —— 部分错。它大幅改善 spatial/viewpoint/appearance/instance 四类泛化,但单视角遮挡、复杂堆叠场景仍受限。📎

DP3 把泛化从"差几厘米就崩"推到"实用水平",不是终点。

检查点

Q1

老办法(Diffusion Policy)用平面彩照做视觉输入。物体只挪几厘米、相机只换个角度,它为什么就崩了?从"平面图学到的是什么"这个角度解释。

💡 参考答案

  • 老办法学到的是'图里第几行第几列有东西'(像素坐标),不是'物体在三维空间里相对机械手在哪'(空间坐标)。
  • 因为只记住了像素位置,物体挪几厘米或相机换个角度,物体在图里的行列就变了,模型就不认得了。
  • 根子是表示方式:2D 像素坐标不随视角/位置 covariant,一点点空间偏移就破坏匹配。
Q2

DP3 把视觉输入换成了什么?这个新表示为什么对"物体挪位置、相机换角度"鲁棒?用"立体眼镜之于平面照片"或自己举的类比说一说。

💡 参考答案

  • 换成了一团立体点云(相机测距反推出来的三维点,直接长在三维空间里)。
  • 鲁棒的原因:物体挪、相机转,点云跟着挪,但物体相对机械手的几何关系不变(表示和三维空间对齐/covariant)。
  • 类比要点:立体眼镜能看出深度关系(平面照片看不出);点云之于机械臂就是提供了这种'立体/深度'信息,换个角度还认得。
Q3

DP3 用了一个故意做得极简的三层编码器,而不是更复杂的 PointNet++/PointNeXt。为什么在只有十个示范的情况下,简单编码器反而赢了那些"更先进"的编码器?

💡 参考答案

  • 复杂编码器是为百万级图像分类数据调出来的,带着分类任务的'成见/先入之见/inductive bias'。
  • 示范数据极少(只有十个),复杂编码器的成见会盖过真正的任务信号,反而 overfit/帮倒忙。
  • 简单编码器没成见,把所有容量都用来学'三维几何到动作'这一件事,所以小数据下反而赢。
Q4

DP3 的编码器里有一步"把所有点的小段数按位置取最大值合并"。这一步为什么对点的输入顺序不敏感?不做这一步会出什么问题?

💡 参考答案

  • 点云没有内在顺序(同一团点,输入排序怎么打乱都该是同一个物体)。
  • 取最大值(max pool)是对称操作:无论点的输入顺序怎么变,逐位置取最大得到的结果一样,所以输出与顺序无关。
  • 不做这一步的危害:网络会把输入顺序当成有意义的信息来学,同一团点换个排序就给出不同结果,学不稳/无法泛化(或答'点的顺序不该影响对物体的判断'即可)。
Q5

DP3 的相机只拍深度、不拍颜色。这是为了什么?代价又是什么?

💡 参考答案

  • 为了更好的外观泛化——不受纹理、光照、桌布花纹影响(颜色是'外观'信息,会带偏泛化)。
  • 代价是丢失'区分同形状不同材质/颜色'的能力(比如认不出按钮颜色、分不清红绿方块)。
  • 这是一个泛化 vs 任务特异性的 trade-off,不是疏忽。

FAQ

Q1:DP3 能在真机上实时跑吗?

能。极简编码器 + 64 维 feature 让推理略快于 Diffusion Policy;论文未给绝对 FPS,但相对位置远高于 PerAct 的 2.23 FPS。📎

Q2:为什么不用颜色?

为了更好的外观泛化——不受纹理、光照、桌布花纹影响。📎 代价是丢失"区分同形状不同材质"的能力(如识别按钮颜色)。Drill 任务上 RGB-DP 接近 DP3,可能正是因为钻头颜色信息有用。

Q3:FPS 抽稀到 512 还是 1024?

论文实测这两个值够所有任务,更多没收益。📎 FPS(最远点采样)比 uniform sampling 覆盖更均匀、降低采样随机性。

Q4:为什么必须端到端训,不能冻住预训练编码器?

预训练的大编码器(PointNet++/PointNeXt pre-trained)反而更差(6.8/8.8 vs DP3 78.3)。📎 10 demo 数据量下,预训练的 inductive bias 是 overfit 来源。端到端训让网络把所有容量用在学习"3D 几何→控制"这一映射上。

Q5:DP3 和 Diffusion Policy 是什么关系?

DP3 直接复用 Diffusion Policy 的扩散决策骨干(1D 卷积去噪网络)。📎 改的是感知段:把 RGB 编码器换成极简 3D 点云编码器。可以理解为"Diffusion Policy 的 3D 进化版"。