具身智能领域有个长期隐痛:机器人需要理解"动作",但高质量的动作数据极度稀缺。于是大家把目光投向 YouTube 上海量的人类操作视频——做饭、组装、打扫,这些视频里藏着丰富的动作语义。问题是,从这些"旁观视角"的视频里学到的表征,到底能不能迁移到机器人的控制上?LARYBench 第一次给出了系统化的答案,而且结论出乎意料:通用视觉模型的动作表征,在泛化和精度上全面碾压专门为具身智能设计的动作专家模型。
LARYBench 量的是什么
LARYBench 的全称是 Latent Action Representation Yielding Benchmark,核心任务只有一个:评测从视觉数据中提取的隐式动作表征(latent action representation),能不能在未见过的场景和任务上泛化,并精确驱动控制。
具体来说,它把评测拆成两条主线:
- 动作泛化——同一个表征模型,面对全新的环境、物体、任务组合,还能不能正确识别和区分不同的动作意图。
- 控制精度——把学到的隐式动作表征直接当作指令喂给策略网络,机器人执行的动作和预期偏差有多大。
这两条线直击要害。过去很多工作只看"视频里动作分类准不准",但分类准不等于能控制。LARYBench 把泛化和控制绑在一起量,逼着表征模型同时过两道关。
通用模型为什么赢了
实验中最反直觉的发现:DINOv2、VideoMAE 这类通用视觉模型提取的动作表征,在泛化和控制精度上都显著优于专为具身智能设计的动作专家模型(如 R3M、VIP)。
原因并不神秘:
- 数据规模碾压。通用模型在数亿级图像/视频上预训练,见过的人类动作多样性远超具身专用数据集。动作专家模型的数据量通常只有几百到几千条机器人轨迹,覆盖的动作空间极其有限。
- 表征粒度更粗但更鲁棒。通用模型学到的语义偏"高层"——它更擅长区分"拿起"和"放下",而不是精确到关节角度的细微差异。但在泛化场景里,高层语义恰恰是最需要的:新环境里关节映射会变,"拿起"的语义不会变。
- 动作表征是从人类视频中涌现的。不需要专门的动作标注,不需要机器人数据,只要视频量够大、场景够杂,动作语义就会在隐空间里自然聚类。这和 ImageNet 时代"分类能力从数据中涌现"的逻辑一模一样。
换句话说,LARYBench 证明了一件事:具身动作表征的 ImageNet 时刻已经到了——大规模人类视频就是那个数据源,通用视觉模型就是那个基座。
动作表征涌现长什么样
用最直觉的方式理解:把一段人类操作视频喂给 DINOv2,提取每一帧的特征向量,在隐空间里做时序差分(后一帧减前一帧),得到的残差向量就是"这一步发生了什么动作"的隐式编码。
不同类型的动作——推、拉、旋转、静止——在隐空间里会自然聚成不同的簇,不需要任何动作标签。这就是"涌现"。
下面用一个最小可运行示例,展示如何从视频帧提取隐式动作表征并做简单聚类可视化:
# 依赖:pip install torch torchvision timm scikit-learn matplotlib
# 假设你已有一段人类操作视频,拆成了帧图片存放在 frames/ 目录
import torch
import timm
import numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from torchvision import transforms
from pathlib import Path
from PIL import Image
# ---- 1. 加载通用视觉模型(DINOv2 替代:用 timm 的 ViT 大模型) ----
model = timm.create_model("vit_large_patch14_dinov2.lvd142m", pretrained=True)
model.eval()
device = "cuda" if torch.cuda.is_available() else "cpu"
model = model.to(device)
# DINOv2 的特征提取接口
feat_extractor = timm.models.create_feature_extractor(
model, outindices=["head"] # 取最后一层输出
)
# ---- 2. 图像预处理 ----
transform = transforms.Compose([
transforms.Resize((518, 518)),
transforms.CenterCrop(518),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
# ---- 3. 从帧序列提取特征,计算时序差分作为隐式动作表征 ----
frame_dir = Path("frames") # 改成你的帧目录
frame_paths = sorted(frame_dir.glob("*.png")) # 按时间顺序排列
features = []
for p in frame_paths:
img = Image.open(p).convert("RGB")
tensor = transform(img).unsqueeze(0).to(device)
with torch.no_grad():
feat = feat_extractor(tensor)["head"] # shape: [1, dim]
features.append(feat.cpu().numpy().flatten())
features = np.stack(features) # [T, dim]
# 时序差分:动作 = 状态变化
delta = features[1:] - features[:-1] # [T-1, dim]
# ---- 4. 聚类:看动作是否自然分组 ----
n_actions = 5 # 假设视频里有 5 种粗粒度动作
kmeans = KMeans(n_clusters=n_actions, random_state=42, n_init=10)
labels = kmeans.fit_predict(delta)
# PCA 降到 2D 可视化
pca = PCA(n_components=2)
delta_2d = pca.fit_transform(delta)
plt.figure(figsize=(8, 6))
scatter = plt.scatter(delta_2d[:, 0], delta_2d[:, 1], c=labels, cmap="tab10", s=12, alpha=0.7)
plt.colorbar(scatter, label="Cluster ID")
plt.title("Latent Action Representation Clustering (DINOv2 Δ-features)")
plt.xlabel("PCA-1")
plt.ylabel("PCA-2")
plt.tight_layout()
plt.savefig("action_clusters.png", dpi=150)
print(f"Saved action_clusters.png | {len(delta)} deltas, {n_actions} clusters")
print(f"Cluster distribution: {np.bincount(labels)}")
运行前需要做的准备:
- 从任意人类操作视频(比如 YouTube 上的做饭视频)用 ffmpeg 拆帧:
ffmpeg -i video.mp4 -vf fps=2 frames/%04d.png - 安装依赖:
pip install torch torchvision timm scikit-learn matplotlib - timm 中 DINOv2 模型名可能随版本更新变化,用
timm.list_models("*dinov2*")查看可用模型,按显存选择合适大小(large 需要 ~4GB 显存,如果不够换成vit_base_patch14_dinov2.lvd142m)。
跑完后打开 action_clusters.png,你会看到不同动作的时序差分在隐空间里形成了可区分的簇——这就是动作表征的涌现,零标注。
对具身智能实践的影响
LARYBench 的结论不是"动作专家模型没用",而是当前路径的选择优先级变了:
| 维度 | 通用视觉模型路线 | 动作专家模型路线 |
|---|---|---|
| 数据获取 | 人类视频,几乎无限 | 机器人轨迹,成本极高 |
| 泛化能力 | 强,跨场景跨任务 | 弱,绑定特定机器人 |
| 控制精度 | 高层语义精确,低层需对齐 | 低层精确,但迁移困难 |
| 起步成本 | 预训练模型 + 视频即可 | 需要采集机器人数据 |
实践建议:
- 起步阶段,直接用通用视觉模型提取隐式动作表征。DINOv2 或 VideoMAE 的时序差分特征已经足够做动作分类和粗粒度控制指令。
- 精细控制需要额外对齐层。通用模型给的是高层语义,要映射到具体关节空间,加一个轻量 adapter(几层 MLP 或小 transformer)在少量机器人数据上微调即可。
- 评测时用 LARYBench 的双维度框架。不要只看分类准确率,一定要同时测控制偏差——否则会选到"分类准但控不住"的表征。
- 数据策略:先堆人类视频量,再补少量机器人数据做对齐。反过来做(先机器人数据再试图泛化)目前看是低效路径。
还没解决的问题
LARYBench 打开了视角,但几道坎还在:
- 跨 embodiment 对齐。人类手和机器人夹爪的运动学差异不是 adapter 能完全消化的,需要更结构化的对齐方案。
- 细粒度动作的精度天花板。通用模型在"缓慢旋转 10°"和"缓慢旋转 15°"之间的区分力有限,精细操作场景仍需专用数据。
- 视频质量过滤。不是所有人类视频都有用,大量视频动作模糊、视角单一、遮挡严重,需要自动筛选管线。
这些问题的答案,大概率还是"更多数据 + 更好的对齐",而不是"回到小数据训练专用模型"。LARYBench 已经把方向指出来了——具身动作表征的 ImageNet 路径是可行的,而且目前跑在这条路上的,是通用视觉模型。