AGILE:遮挡下的手-物交互跟踪(2026-02)
论文:AGILE(2026-02,据参考材料)
论文全名 / arXiv / 项目主页 / 代码:参考材料未提供,待补充
这篇论文解决什么问题
AGILE 做的是视频级的手-物交互(hand-object interaction)跟踪:输入一段手抓物体(例如瓶子)的视频,逐帧估计:
MANO 手模型参数(姿态、尺度、平移)
物体的 6-DoF pose(旋转 R_o、平移 T_o,可能带各向异性尺度 s_o)
核心难点是手对物体的严重遮挡:手抓住瓶子时,瓶子的大部分表面看不到,普通的外观 / 轮廓约束都会失效。
AGILE 的思路是组合多个互补的约束,逐帧做 test-time 优化:
手的位置/姿态 -> 2D 关节点重投影
物体轮廓 -> SAM2 mask 对齐
物体朝向/局部语义 -> DINO 3D-2D 语义对应
手-物相对关系 -> 交互稳定性(物体跟着手走)
一句话版本
AGILE 每帧先用手部关节点把 MANO 手拟合好,再在“手已固定”的前提下,用 mask、DINO 语义对应、抓取相对位置三个损失把物体 pose 拟合出来;当物体被手大面积遮挡时,让“手”充当物体的代理跟踪器。
两步逐帧优化
每帧的跟踪分两步:
Step 1:优化手
固定 、(手的旋转与尺度),主要优化手的平移 ,用关节重投影损失 让 MANO 手投影后的 2D 关节点贴合图像检测到的关键点。
Step 2:优化物体
手 pose 已固定,优化物体的旋转、平移(、),用三个损失:
L_mask 物体轮廓对齐(SAM2 mask)
L_dino 物体表面点与图像语义位置对齐(DINOv3)
L_interact 抓取区域在手-物相对坐标中保持稳定
核心组件
| 组件 | 作用 |
|---|---|
| MANO | 手模型,提供 21 个 3D 手关节点 |
| SAM2 | 提供物体的 2D 分割 mask |
| DINOv3 | 提供稠密语义特征,建立“canonical 3D 点 ↔ 图像 2D 位置”的对应 |
四个损失
1. 关节重投影损失(管手的位置)
其中:
- :MANO 的第 个 3D 手关节点;
- :图像中检测到的对应 2D 关节点;
- :相机投影,。
透视投影可以理解为:
这一项的本质:让 3D 手投影后与图像中的手一致。在 Step 1 中 、 固定,主要就是在优化 。
2. Mask 对齐损失(管物体的轮廓)
其中:
- :SAM2 得到的真实物体 mask;
- :当前 3D mesh 按 、 渲染出的 alpha silhouette。
它约束物体的投影位置、大小和轮廓:真实 mask 与渲染 silhouette 越重合越好。
为什么它能处理遮挡:AGILE 比较的是可见 silhouette,只要 GT mask 正确处理了遮挡边界,渲染物体的可见区域就会尽量贴合真实观察。
它的明显缺陷:mask 不太能约束物体朝向。例如近似圆柱的瓶子, 和 可能得到几乎一样的 silhouette, 但 logo 方向完全错了。所以还需要 约束语义和纹理方向。
3. DINO 语义对应损失(管物体的朝向 / 局部语义)
思路:用 DINOv3 特征建立“物体表面 3D 点 ↔ 当前图像 2D 位置”的语义对应,再反过来优化物体 pose。这比 mask 更细:mask 只管轮廓,DINO 管“物体某个具体部位应该投影到哪个位置”。
步骤:
第一步:在 canonical mesh 上采样 3D 点。
是 canonical object coordinate 下的 3D surface points(例如瓶盖上的点、logo 上的点、瓶身上的点),固定贴在 mesh 上。
第二步:给每个 3D 点建一张 DINO similarity map。
把 mesh 渲染成一张图,取 对应位置的 DINO feature ;真实视频帧过 DINO 得到 。然后让 与真实图像每个位置的 feature 做相似度:
就是一张热力图:“真实图像里哪个位置最像 mesh 上的这个 3D 点?”
第三步:按当前 pose 投影 3D 点。
正在优化 、,3D 点先经过(可能是各向异性的)尺度,再旋转平移:
注意这里用 (逐元素乘),因为可能是 anisotropic scale,即 x / y / z 三个方向可分别缩放。再投影:
就是按当前 pose,“作者认为这个 surface point 应该出现在图像中的位置”。
第四步:在 similarity map 上查分数,加遮挡 mask。
如果 pose 是对的, 应该正好投影到真实图像中对应语义部位, 应该很高;pose 错了(例如 logo 点被投到瓶子背面), 就很低。
其中:
为什么前面有负号:优化器最小化 ,但希望 similarity 越大越好,所以写成 ,。
为什么需要 :如果某个瓶身点被手挡住, 就不参与 loss,否则系统可能强迫一个“实际看不见的物体点”去匹配手上的 DINO feature,把 pose 拉错。所以只相信当前可见的 object points。
整体链条:
p_i (3D canonical) -> f_i -> S_i(x, y) -> 真实图像中的对应 2D 区域
p_i (3D canonical) -> 当前 pose 投影 -> u_i (2D)
要求:u_i 落在 S_i 的高响应区域
为什么用 DINO 而不是普通 RGB:RGB loss 容易受光照、阴影、高光、曝光影响;DINO feature 偏语义和结构,亮一点 / 暗一点通常不会让 feature 完全失效,所以跟踪更稳定。
4. 交互稳定性损失(管手-物相对关系)
核心思想一句话:抓住物体以后,手和物体的相对位置应该基本保持不变。当物体被手严重遮挡、仅靠 mask / DINO 不够稳定时,用这个物理先验约束物体。
为什么把手变换到 object coordinate:
第 帧手顶点在 camera coordinate 中是 ,物体 pose 是 、。把手顶点变换到物体局部坐标:
这就是对 做逆变换 。
如果手和物体真的一起刚性运动,那么虽然它们在 camera coordinate 中一直移动(),手相对于物体的位置应该基本不变:
例子:手指一直捏着瓶盖,整体向右移动,手的 3D 坐标当然变了;但换到瓶子坐标系后,手指相对瓶盖的位置没变。
不是所有手顶点都该被锁住:
拇指、食指正在抓瓶子,小指离瓶子很远,显然不能要求整只手都与物体保持固定相对位置。所以给每个手顶点一个权重 :靠近物体表面 ,离得远 。
用物体 SDF 判断远近:
是带符号距离函数(表面 ,外部 ,内部 )。手点就在表面附近时 ,离得很远时 。
再把距离转成权重:
- :,,接触点强约束;
- :,,远处手点基本不管;
- 控制衰减速度。
最终:
含义:对上一帧靠近物体的手顶点,要求它们在 object coordinate 中的位置不要发生太大变化,contact region 在 object frame 中保持稳定。
它实际上怎么约束 object pose:
Step 2 中手 pose 已固定, 基本固定;但 依赖 、。如果物体 pose 跑偏,手在 object coordinate 中的位置会突然变化, 变大,优化器就会把物体拉回来。本质是:
物体应该跟着抓它的手一起运动
一个值得注意的细节:
这其实不是严格的 contact loss,而更像 relative-pose stability loss:它没有明确要求 finger surface = object surface,而是利用上一帧已经建立好的手-物相对关系,要求当前帧不要突然改变,因此非常适合 tracking。
遮挡下的分工
三个物体损失各管一件事:
L_mask 轮廓位置
L_dino 语义 / 朝向
L_interact 抓取时的物理相对关系
如果物体 80% 被手遮住:
- :可用信息变少;
- :可能找不到可靠 feature;
- 但手依然能通过 2D joints 追踪。
于是 hand tracking → → object tracking,手成为物体的“代理 tracker”。
值得注意的细节
- 是逐元素(各向异性)缩放,不是整体标量尺度。
- DINO 对应比 photometric loss 对光照变化更鲁棒。
- 是相对位姿稳定性 loss,不是严格接触 loss。
- 让 loss 只相信当前可见的物体点,避免被遮挡点把 pose 拉错。
官方资料
参考材料中未提供 AGILE 的论文全名、arXiv 编号、项目主页或代码链接,待补充。