一句话定位

把场景体素化成 100³ 网格、用 Perceiver Transformer 逐体素分类”下一个最佳体素动作”,从每任务几条示范就能学会语言条件的多任务 6-DoF 操作——奠定了”体素/关键帧 3D 动作图”这一路线的开山之作。

背景与定位

PerAct(Perceiver-Actor)出自 UW 与 NVIDIA(Mohit Shridhar、Lucas Manuelli、Dieter Fox),CoRL 2022。它要回答的问题是:机器人操作数据既少又贵,Transformer 还能不能受益?作者的答案是”换对问题形式”——不要像 Gato、BC-Z 那样把 2D 图像直接映射到 6-DoF 动作(那需要几周到几个月采数据),而是借鉴 James 等人的 C2FARM(rlbench 上的 3D ConvNet coarse-to-fine Q-attention)把观测与动作都放进体素空间,用”检测下一个最佳体素”的分类形式来做行为克隆(BC)。

范式上 PerAct 是 CLIPort 的 3D 版:CLIPort 在 2D 图像像素上做 what/where 通道检测动作,PerAct 把像素换成 3D 体素、把 top-down 2D pick-and-place 扩展到全 6-DoF。相比 C2FARM 的局部感受野(coarse-to-fine 分层,最细层看不到全局),PerAct 用 Transformer 拿到全局感受野;相比 C2FARM 用 RL,PerAct 用 BC + 语言条件,因而能轻松把多个任务塞进一个多任务智能体。它与 implicit-bc-ibc(隐式 BC)、calvin(语言条件长程操作 benchmark)同属这一时期”语言条件操作策略”的探索。核心贡献被后续 RVT / Act3D / 3D Diffuser Actor 等”3D 动作检测”工作直接继承。

模型架构

策略骨干 = PerceiverIO Transformer(潜空间 Transformer),动作头 = 逐体素离散分类 Q-function。

  • 输入体素观测:默认 100³ 体素网格(对应真实 1.0 m³),每体素 10 通道 = 3 RGB + 3 point(机器人坐标系笛卡尔坐标)+ 1 occupancy + 3 position index。由标定后的多相机 RGB-D 点云经三角化融合、用 PyTorch scatter 构建。另加 4 维本体感觉标量:gripper open、左右手指关节位置、动作序列 timestep。
  • 语言编码:用 CLIP 文本编码器(作者强调换任何预训练语言模型都行),CLIP tokenizer 固定输出 77 token,编码为 R^{77×512}。
  • Patch 化:体素网格先经 1×1 3D 卷积把通道 10→64;再用 kernel=stride=5 的 3D 卷积切成 5³ patch,得到 20×20×20×64 的 patch 张量(= 8000 个 voxel patch,类比 ViT 的 2D patch);本体感觉 tile 成 3D 拼到通道 → 20³×128 → 展平成 R^{8000×128};语言特征线性降到 128 维后拼上 → 输入序列 R^{8077×128},再加可学习位置编码。
  • Perceiver 瓶颈:8000+ patch 做标准 O(n²) 自注意力放不下商用 GPU 显存。Perceiver 先让输入与一小组潜向量 2048×512(随机初始化、端到端训练)做 cross-attention,潜向量经 6 层 self-attention 编码,再与输入 cross-attention 还原到输入尺度。默认 2048 latents;消融里 512 latents 也很有竞争力(体现压缩能力)。
  • 解码为 Q-function:输出经 3D 卷积 + tri-linear 上采样得到 100³×64 体素特征,并有来自处理阶段的 UNet 式 skip-connection。
    • 平移:体素特征 1×1 3D 卷积降到 1 通道 → 100³ 的 3D 平移 Q-function,argmax 取最近夹爪中心体素。
    • 旋转 / gripper / collide:体素特征沿 3D maxpool 成 1×64 向量,三个独立线性层输出各自 Q。旋转每轴离散成 5° bin → 72 bin/轴,共 216 logits;gripper open 二值(R²);collide 二值(R²,指示运动规划器是否避让体素网格里所有物体,用于在接触型/非接触型运动间切换)。
  • 动作靠采样式运动规划器执行,形成 observe-act 闭环,直到任务完成(评测里由 oracle 判完成)。跨具身/多相机在此体现为体素融合天然支持任意数量相机视角。

数据

  • 仿真:CoppeliaSim + PyRep,Franka Panda + 平行夹爪。选 rlbench 100 个任务里有 ≥2 变体的 18 个任务,共 249 个变体(变体类型:placement / color / size / shape / count / category,如 close_jar 20 变体、stack_blocks 60 变体、push_buttons 50 变体)。每 episode 抽取 2–17 个关键帧(平均 keyframe 见附录 Table 3,如 put_item_in_drawer 12.0、stack_blocks 14.6)。
  • 相机:4 个 RGB-D(front / left shoulder / right shoulder / wrist,wrist 随末端移动),128×128,无噪声。
  • 划分:每任务 train/val/test = 100 / 25 / 25 demos。训练用 10 或 100 demos/task 两档。全套预生成 zip ~116 GB。
  • 关键帧抽取(heuristic):沿用 C2FARM——一个动作是关键帧当且仅当 (1) 关节速度接近 0 且 (2) gripper open 状态未变。每个数据点都被转成”预测下一个最佳关键帧动作”。消融显示随机/固定间隔关键帧会导致零性能,说明好的关键帧抽取是监督训练的关键。
  • 真机:Franka Emika Panda + 单个 Kinect-2(512×424 @ 30Hz,三脚架斜向下),HTC Vive 手柄采示范,MoveIt + RRT-Connect 执行。7 个真实任务、18 个变体、总共仅 53 条示范,从零训练(无 sim-to-real、无预训练)。
  • 数据增强:SE(3) 扰动——平移 ±0.125 m(三轴),旋转仅 yaw ±45°(保证 Franka 可达;pitch/roll 会大幅拉长训练时间);把动作推出体素网格的扰动直接丢弃。真机额外用 ±45° yaw + ±0.125 m。

训练方法

  • 目标:纯监督学习的分类,交叉熵损失,四路相加: L = -E[log V_trans] - E[log V_rot] - E[log V_open] - E[log V_collide],V 均为对应 Q 的 softmax。 ground-truth 平移是 one-hot 体素编码,旋转是每轴 one-hot(R=5° bin),open/collide 是二值 one-hot。
  • 动作 tokenization:平移=最近体素索引;旋转=每轴 5° bin 的欧拉角;gripper、collide=二值。全部离散分类,无连续回归、无扩散头。
  • 多任务采样:为避免长程任务被过采,每 batch 先均匀采一组任务(batch 长度)再各取一条 input-action tuple,保证所有任务梯度更新等权。
  • 优化器LAMB(跟随 Perceiver 原文);作者试过 Adam 但仿真+真机都更差。
  • 关键超参:batch size 16;多任务智能体训 600K 迭代;单任务智能体训 40K 迭代。评测按 train→val(挑最优 checkpoint)→test 四阶段流程;真机因不采 val 集,直接取最后一个 checkpoint。

Infra(训练 / 推理工程)

  • 仿真多任务训练:batch 16,8× NVIDIA V100,训 16 天(600K 迭代)(正文 3.4 节)。代码库基于 James 等人的 ARM 仓库,多卡从论文时的 PyTorch DataParallel 迁到发布版的 DDP。
  • 真机训练8× NVIDIA P100(16 GB)× 2 天(附录 D);README 的硬件要求也写 8× P100 16GB、Intel Xeon 四核、32GB RAM、Ubuntu 16.04/18.04。
  • 推理:单卡即可;真机推理用单张 Titan X。附录 M(涌现能力·物体跟踪)给出动作检测网络推理速度 2.23 FPS(0.45 s/帧),作者称可”近实时闭环”;但操作任务里 PerAct 是离散时间关键帧策略,每步动作还要交采样式运动规划器执行(非高频闭环),端到端每步延迟由规划器主导,正文未单列操作时的 control-Hz。
  • 工程社区补丁:把 replay pickle 从 fp32 改 fp16 可显著提速并降存储(Ishika 对 YARR 的修改)。
  • 精度:正文未明确训练精度(默认 fp32);并行=DDP(8 卡数据并行)。

评测 benchmark

主结果 Table 1:18 个 RLBench 任务、每任务 25 评测 episode(0/100 计分、无部分分),对比 Image-BC(CNN / ViT,类 BC-Z + FiLM + CLIP)与 C2FARM-BC(把 James 的 3D ConvNet 从 RL 换成 BC)。

  • PerAct 显著胜出:比 image-to-action 智能体好约 34×;比最强基线 C2FARM-BC 好 1.33×(10 demos)/ 2.83×(100 demos),在 36 组评测里赢 25/36
  • 典型任务成功率(100 demos,PerAct):open_drawer 80、slide_block 72、meat_off_grill 84、turn_tap 80、close_jar 60、drag_stick 68、put_in_drawer 68、sweep_to_dustpan 56、screw_bulb 24、put_in_safe 44、push_buttons 48。Image-BC 在多数任务近 0。
  • 高精度任务全军覆没:insert_peg / stack_cups / place_cups 所有方法都近 0(差几厘米/几度就不可恢复);附录 H 显示单独训单任务智能体能略缓解。
  • 消融(open_drawer):(1) skip-connection 让训练略快;(2) 去掉 Perceiver(即失去全局感受野)性能崩——在需要区分三个视觉相同抽屉把手的 open drawer 上,PerAct >70%,各版 C2FARM-BC 都在 ~33% 随机水平;(3) 随机/固定间隔关键帧 → 零性能;(4) w/o Lang 无语言条件时表现如随机(不知道要做哪个任务)。
  • 敏感性(附录 G):512 latents 常与 2048 相当甚至更好;32³ 粗网格对部分任务够用,但 sort_shape 等高精度任务需要完整 100³;yaw 旋转增强对多旋转变体任务(stack_blocks)有益,但对旋转受限任务(place_wine)反而有害。
  • 真机(Table 2,各 5–10 次评测):Press Handsan 90、Put Marker 70、Place Food in Drawer 60、Put in Drawer 40、Hit Ball 60、Stack Blocks 40、Sweep Beans 20。最常见失败=预测错 gripper open 导致进入未见状态。

创新点与影响

  • 贡献:一个用 Transformer 感知/行动/指定目标的新问题形式;一个把语言 grounding 到 6-DoF 动作的高效”动作中心”框架;在大量仿真+真机任务上验证多任务智能体。核心是”把观测与动作都体素化、用逐体素分类检测下一个最佳关键帧动作”——用 Perceiver 潜向量把百万级体素(100³)压进小潜空间,从而拿到全局感受野又不爆显存。
  • 改变了什么:确立”体素 / 关键帧 3D 动作图 + next-best-voxel 检测”成为语言条件操作的主流路线之一,是 RVT、Act3D、GNFactor、3D Diffuser Actor 等一大批 3D 操作策略的直接前身;也证明了在数据稀缺的机器人操作里,正确的问题形式(离散 3D 检测)比更大数据的 image-to-action 更省数据、更鲁棒(几条示范 vs Gato 的 15K/94K episode)。
  • 作者自陈局限(附录 L):依赖采样式运动规划器(对路径敏感的任务如倒水不行);离散时间离散动作难做动态/实时闭环任务;难扩展到多指灵巧手等 N-DoF 欠驱动系统;纯反应式、只看当前观测,需要历史的任务(计数、逐个翻抽屉找物)不可行;语言 grounding 紧绑示范(“清扫”只等于示范里那套动作);需 oracle 判任务完成;数据增强不考虑运动学可达性;少示范易被数据集偏置带偏(总把蓝块放黄块上);无 sim-to-real、未测试未见物体泛化。

原始链接

一手源存档(sources/)

  • peract—github-readme — GitHub README 快照(安装/训练/推理命令、checkpoint 规格、硬件要求、FAQ、限制)
  • peract—project-page — peract.github.io 项目页快照
  • 论文全文见上方 arXiv 链接(arXiv 原文 PDF,不入 git)